发布: 11.3_从构造描述符的角度理解Gadget框架

This commit is contained in:
weidongshan
2023-01-07 16:24:07 +08:00
parent e800217a06
commit 59fa69d472
13 changed files with 70 additions and 8 deletions

View File

@@ -188,16 +188,44 @@ USB传输的核心是endpoint使用endpoint可以收发数据。在endpoint
## 3. 从构造描述符的角度理解Gadget框架
假设你要模拟一个USB串口芯片
假设你要模拟一个USB设备
* 这个USB串口芯片含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
* 这个USB设备含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
* 这个芯片可能有多种配置,这也是由你决定,所以配置描述符应该由你提供
* 某个配置下多个接口接口就是功能Linux内核里事先提供了很多功能的驱动程序所以接口描述符是内核提供的
* 某个接口下需要什么端点,也是内核提供的,所以:端点描述符是内核提供的
* 某个接口下需要什么端点,也是内核里各类功能的驱动程序提供的
以zero.c为例,从下到上涉及这些文件
以zero.c为例
* 配置1loopbackHost写数据给它就可以读出原样的数据
* 配置2sourcesinkHost写数据给它(它只是记录下数据)Host还可以读数据(读到的都是0)
从下到上涉及这些文件:
![image-20230105114718135](pic/88_desc_files.png)
阅读源码时,入口函数是`usb_composite_probe(&zero_driver)`
![image-20230105112648324](pic/90_zero_entry.png)
函数调用过程中主要的函数如下,重点关注"xxx_bind"函数可以认为bind就是初始化的意思
* usb_composite_probe
* composite_bind
* zero_bind
* sourcesink_bind/loopback_bind
![](pic/91_gadget_init_call.png)
深入解读描述符的构造过程,可以得到下面的图:
* 构造出一个usb_composite_dev结构体
* 它把各层串联起来,里面构造有设备描述符、配置描述符、接口描述符、端点描述符
![](pic/89_create_desc.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 KiB

View File

@@ -720,6 +720,12 @@ git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
11.2_从硬件软件角度理解Gadget框架2_上层驱动
```
* 2023.01.07 发布"USB子系统"
```shell
11.3_从构造描述符的角度理解Gadget框架
```

View File

@@ -188,16 +188,44 @@ USB传输的核心是endpoint使用endpoint可以收发数据。在endpoint
## 3. 从构造描述符的角度理解Gadget框架
假设你要模拟一个USB串口芯片
假设你要模拟一个USB设备
* 这个USB串口芯片含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
* 这个USB设备含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
* 这个芯片可能有多种配置,这也是由你决定,所以配置描述符应该由你提供
* 某个配置下多个接口接口就是功能Linux内核里事先提供了很多功能的驱动程序所以接口描述符是内核提供的
* 某个接口下需要什么端点,也是内核提供的,所以:端点描述符是内核提供的
* 某个接口下需要什么端点,也是内核里各类功能的驱动程序提供的
以zero.c为例,从下到上涉及这些文件
以zero.c为例
* 配置1loopbackHost写数据给它就可以读出原样的数据
* 配置2sourcesinkHost写数据给它(它只是记录下数据)Host还可以读数据(读到的都是0)
从下到上涉及这些文件:
![image-20230105114718135](pic/88_desc_files.png)
阅读源码时,入口函数是`usb_composite_probe(&zero_driver)`
![image-20230105112648324](pic/90_zero_entry.png)
函数调用过程中主要的函数如下,重点关注"xxx_bind"函数可以认为bind就是初始化的意思
* usb_composite_probe
* composite_bind
* zero_bind
* sourcesink_bind/loopback_bind
![](pic/91_gadget_init_call.png)
深入解读描述符的构造过程,可以得到下面的图:
* 构造出一个usb_composite_dev结构体
* 它把各层串联起来,里面构造有设备描述符、配置描述符、接口描述符、端点描述符
![](pic/89_create_desc.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 KiB