USB控制器作为Device时,驱动框架主要由5层构成。最顶层是Gadget Function驱动,代表具体设备驱动,如大容量存储、通讯类、USB音频设备。Gadget Funcation API层提供统一API,屏蔽差异,提升兼容性。Composite层为可选中间层,支持多种功能设备开发,当前最流行的是基于Composite和configfs的USB gadget configfs。UDC驱动直接操作硬件,管理USB设备与主机通信。USB设备控制器通过USB线缆与USB主机控制器相连,负责数据传输。
Linux内核的USB Gadget Function驱动位于drivers/usb/gadget/function目录下,涵盖多种设备类驱动,如通讯、USB音频、大容量存储、USB视频等。
Gadget Function驱动入口使用usb_function_driver结构描述,需要实现alloc_inst和alloc_func函数。Composite驱动通过Gadget Function API调用这些函数。usb_function描述Gadget Function驱动,关键在于实现回调函数。宏DECLARE_USB_FUNCTION_INIT用于初始化usb_function_driver实例。
Gadget Funcation API提供注册和注销功能,上层Gadget Function驱动使用此API注册,下层Composite驱动使用API与Gadget Function驱动绑定和匹配。注册过程包括将usb_function_driver挂载到func_list链表。
USB Composite的核心数据结构为usb_composite_driver。Composite驱动实现设备描述符dev和bind回调函数。Composite设备使用usb_composite_dev自动创建,不需要驱动创建。gadget指向dwc3结构体中的usb_gadget,req提前分配用于控制请求,config当前使用的usb配置,desc是设备描述符,driver指向usb_composite_driver。
legacy USB gadget驱动使用composite_driver_template数据结构,通过usb_composite_probe注册,内核在注册时将数据拷贝到usb_composite_driver的gadget_driver成员。
USB Gadget Configfs在Linux 3.11版本引入,是一种基于ram的文件系统,允许用户层直接控制内核对象。该系统提供API用于定义USB Gadget设备的功能和配置,简化设备配置和使用。
UDC驱动用于管理USB设备控制器。初始化UDC驱动时创建udc_class并设置uevent回调函数。使用usb_add_gadget_udc注册UDC驱动,分配并初始化usb_udc数据结构,将其添加到udc_list链表中。删除UDC驱动时执行相应回调并从链表中移除。Composite驱动与UDC驱动匹配后,通过设置usb_composite_driver的gadget_driver地址绑定两者。UDC驱动提供接口用于操作USB设备控制器,例如开启和关闭控制器、端点管理、I/O请求处理等。
UDC驱动使用usb_udc数据结构描述,包含usb_gadget用于实现设备功能,usb_gadget_ops包含硬件操作函数,如启动、停止、电源管理等。ep0表示端点0,用于控制请求,其他端点数据结构挂载到ep_list链表中。speed表示当前设备速度,max_speed表示最大速度。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。