Gadget框架构造描述符

描述

假设你要【模拟】一个 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 结构体

它把各层串联起来,里面构造有设备描述符、配置描述符、接口描述符、端点描述符

框架

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分