Linux USB驱动架构
《Linux设备驱动开发详解:基于最新的Linux4.0内核》—— USB主机、设备、与Gadget驱动架构USB驱动分为主机侧和从机侧:主机侧由设备驱动、USB核心、USB主机控制器驱动组成,从机侧由:Gadget Function驱动、Gadget Function API、UDC驱动组成,此外OTG协议既能当主机也能当从机:主机侧:USB核心将USB控制器驱动与USB设备驱动分层向USB核心
·
《Linux设备驱动开发详解:基于最新的Linux4.0内核》
—— USB主机、设备、与Gadget驱动
架构
USB驱动分为主机侧和从机侧:主机侧由设备驱动、USB核心、USB主机控制器驱动组成,从机侧由:Gadget Function驱动、Gadget Function API、UDC驱动组成,此外OTG协议既能当主机也能当从机:
-
主机侧:USB核心将USB控制器驱动与USB设备驱动分层
- 向USB核心注册USB控制器驱动
- USB设备驱动调用USB核心层API
- 从机侧的Gadget API层相似
-
传输方式
- 中断传输
- 控制传输
- 批量传输
- 同步传输
-
结构
- 设备 设备描述符 usb_device_descriptor
- 配置 配置描述符 usb_config_descriptor
- 接口 接口描述符 usb_interface_descriptor
- 端点 端点描述符 usb_endpoint_descriptor
-
主机侧
- USB主机控制器驱动
- 主机控制器规格
- OHCI
- UHCI
- EHCI
- xHCI
- usb_hcd描述主机控制器驱动
- hc_driver 操作主机控制器的钩子函数
- usb_create_hcd()
- usb_add_hcd() 向核心层添加驱动
- urb_enqueue()
(上层 usb_submit_urb()->usb_hcd_submit_urb()->urb_enqueue()) - platform_device和platform_driver匹配上后调用probe()向核心层注册主机控制器驱动
- 主机控制器规格
- USB设备驱动
- usb_device
- usb_driver
- usb_register()
- 匹配后在usb_driver的probe()函数中再注册相应设备,如tty设备
- usb设备所属设备的write()\read()等其中都是对urb操作
- usb_driver本身只是管理设备的连接和断开,具体还是要实现相应所属设备驱动
- USB请求块:urb结构体(类似网卡设备的sk_buff)
- 每个端点处理一个URB队列
- URB流程
- 一个USB设备驱动创建
- 初始化,安排给一个USB设备的特定端点
- 被USB设备驱动提交给USB核心 usb_submit_urb()
- 被USB核心提交给指定的USB控制器驱动
- 被USB主机控制器处理,进行一次到USB设备的传输
- 当URB完成,USB主机控制器驱动通知USB设备驱动
- USB主机控制器驱动
-
从机侧:UDC与Gadget驱动(如:手机作为U盘连接电脑)
- UDC驱动
- usb_gadget
- usb_gadget_ops
- usb_ep
- usb_ep_ops
- usb_add_gadget_udc()
- Function驱动
- usb_interface_descriptor
- usb_endpoint_descriptor
- usb_descriptor_header
- usb_function
- usb_function_register()
- usb_request 描述一次请求
- UDC驱动
-
USB OTG驱动
- 新增主机通令协议HNP和对话请求SRP
- 通过ID引脚区分主机和从机
- usb_otg
- 一般在usb phy端实现
更多推荐
所有评论(0)