假设你要【模拟】一个 USB 设备:
这个 USB 设备含有厂家信息:它记录在设备描述符里,所以设备描述符应该由你提供
这个芯片可能有多种配置,这也是由你决定,所以配置描述符应该由你提供
某个配置下多个接口,接口就是功能,Linux 内核里事先提供了很多功能的驱动程序,所以:接口描述符是内核提供的
某个接口下需要什么端点,也是内核里各类功能的驱动程序提供的
以 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 结构体
它把各层串联起来,里面构造有设备描述符、配置描述符、接口描述符、端点描述符
全部0条评论
快来发表一下你的评论吧 !