发布: 11.3_从构造描述符的角度理解Gadget框架
BIN
IMX6ULL/doc_pic/12_USB/11.3_从构造描述符的角度理解Gadget框架.tif
Normal file
@@ -188,16 +188,44 @@ USB传输的核心是endpoint,使用endpoint可以收发数据。在endpoint
|
||||
|
||||
## 3. 从构造描述符的角度理解Gadget框架
|
||||
|
||||
假设你要模拟一个USB串口芯片,
|
||||
假设你要模拟一个USB设备,
|
||||
|
||||
* 这个USB串口芯片含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
|
||||
* 这个USB设备含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
|
||||
* 这个芯片可能有多种配置,这也是由你决定,所以配置描述符应该由你提供
|
||||
* 某个配置下多个接口,接口就是功能,Linux内核里事先提供了很多功能的驱动程序,所以:接口描述符是内核提供的
|
||||
* 某个接口下需要什么端点,也是内核提供的,所以:端点描述符是内核提供的
|
||||
* 某个接口下需要什么端点,也是内核里各类功能的驱动程序提供的
|
||||
|
||||
以zero.c为例,从下到上涉及这些文件:
|
||||
以zero.c为例:
|
||||
|
||||
* 配置1:loopback,Host写数据给它,就可以读出原样的数据
|
||||
* 配置2:sourcesink,Host写数据给它(它只是记录下数据),Host还可以读数据(读到的都是0)
|
||||
|
||||
从下到上涉及这些文件:
|
||||
|
||||

|
||||
|
||||
|
||||
阅读源码时,入口函数是`usb_composite_probe(&zero_driver)`:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
函数调用过程中主要的函数如下,重点关注"xxx_bind"函数,可以认为bind就是初始化的意思:
|
||||
|
||||
* usb_composite_probe
|
||||
* composite_bind
|
||||
* zero_bind
|
||||
* sourcesink_bind/loopback_bind
|
||||
|
||||

|
||||
|
||||
深入解读描述符的构造过程,可以得到下面的图:
|
||||
|
||||
* 构造出一个usb_composite_dev结构体
|
||||
* 它把各层串联起来,里面构造有设备描述符、配置描述符、接口描述符、端点描述符
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
BIN
IMX6ULL/doc_pic/12_USB/pic/88_desc_files.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
IMX6ULL/doc_pic/12_USB/pic/89_create_desc.png
Normal file
|
After Width: | Height: | Size: 10 MiB |
BIN
IMX6ULL/doc_pic/12_USB/pic/90_zero_entry.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
IMX6ULL/doc_pic/12_USB/pic/91_gadget_init_call.png
Normal file
|
After Width: | Height: | Size: 765 KiB |
@@ -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框架
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
STM32MP157/doc_pic/12_USB/11.3_从构造描述符的角度理解Gadget框架.tif
Normal file
@@ -188,16 +188,44 @@ USB传输的核心是endpoint,使用endpoint可以收发数据。在endpoint
|
||||
|
||||
## 3. 从构造描述符的角度理解Gadget框架
|
||||
|
||||
假设你要模拟一个USB串口芯片,
|
||||
假设你要模拟一个USB设备,
|
||||
|
||||
* 这个USB串口芯片含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
|
||||
* 这个USB设备含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
|
||||
* 这个芯片可能有多种配置,这也是由你决定,所以配置描述符应该由你提供
|
||||
* 某个配置下多个接口,接口就是功能,Linux内核里事先提供了很多功能的驱动程序,所以:接口描述符是内核提供的
|
||||
* 某个接口下需要什么端点,也是内核提供的,所以:端点描述符是内核提供的
|
||||
* 某个接口下需要什么端点,也是内核里各类功能的驱动程序提供的
|
||||
|
||||
以zero.c为例,从下到上涉及这些文件:
|
||||
以zero.c为例:
|
||||
|
||||
* 配置1:loopback,Host写数据给它,就可以读出原样的数据
|
||||
* 配置2:sourcesink,Host写数据给它(它只是记录下数据),Host还可以读数据(读到的都是0)
|
||||
|
||||
从下到上涉及这些文件:
|
||||
|
||||

|
||||
|
||||
|
||||
阅读源码时,入口函数是`usb_composite_probe(&zero_driver)`:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
函数调用过程中主要的函数如下,重点关注"xxx_bind"函数,可以认为bind就是初始化的意思:
|
||||
|
||||
* usb_composite_probe
|
||||
* composite_bind
|
||||
* zero_bind
|
||||
* sourcesink_bind/loopback_bind
|
||||
|
||||

|
||||
|
||||
深入解读描述符的构造过程,可以得到下面的图:
|
||||
|
||||
* 构造出一个usb_composite_dev结构体
|
||||
* 它把各层串联起来,里面构造有设备描述符、配置描述符、接口描述符、端点描述符
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
BIN
STM32MP157/doc_pic/12_USB/pic/88_desc_files.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
STM32MP157/doc_pic/12_USB/pic/89_create_desc.png
Normal file
|
After Width: | Height: | Size: 10 MiB |
BIN
STM32MP157/doc_pic/12_USB/pic/90_zero_entry.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
STM32MP157/doc_pic/12_USB/pic/91_gadget_init_call.png
Normal file
|
After Width: | Height: | Size: 765 KiB |