linux USB 编程
Linux USB架构
可以看出一个USB体系需要4个驱动:USB设备驱动(主要编写这部分),USB主控制器驱动,Gadget驱动,UDC驱动。
USB主要有4个功能:
MassStorage:大容量存储,如硬盘,U盘。
USB-HID:人体接口设备,鼠标,键盘。
RNDIS:网卡。
CDC-ACM:u转串口。
USB描述符:
USB驱动程序位于不同的内核子系统和USB主控制器之间,USB核心为USB驱动提供了用于访问和控制USB硬件的软件接口,使得USB设备驱动程序不必考虑USB硬件控制器。
从上图看,一个USB驱动是对应一个接口的,所以一个设备可能有多个驱动。
USB总线驱动与设备
驱动结构体
一个USB驱动使用struct usb_driver来描述(每种总线都有driver这种结构):
而上图中设备列表中的usb_device_id如下:
填充上面的ip_table需要定义通过USB_DEVICE来定义一种USB设备的USB_DEVICE(vend,prod)
上面是定义一种,下面的宏是定义一类
注册驱动:
设备结构体
配置描述符:
配置结构体:
Linux内核使用Struct usb_host_config来描述一个USB配置:
配置描述符结构体:
接口描述符:
接口结构体:
Linux kernel使用struct usb_interface来描述usb接口:
接口设置结构体
设置和配置是有区别的:
一个配置包含一个或多个接口
一个接口包含一个或多个设置
下面是一个例子:
Linux kernel使用struct usb_host_interface来描述USB接口设置:
接口描述符结构体
端点描述符:
端点结构体
Linux kernel使用struct usb_host_endpoint来描述USB端点:
端点描述符结构体
Linux内核使用struct usb_endpoint_decriptor来对USB描述符中的端点描述符进行描述
URB:
USB请求块是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是USB主机与设备通信的“电波”。
URB处理的流程如下:
1. USB设备驱动程序创建并且初始化一个访问特定USB设备特定端点的urb,并提交给USB core;
2. USB core提交该urb到USB主控制器驱动程序;
3. USB主控制器驱动程序根据该urb描述的信息,来访问USB设备。
4. 当设备访问结束后,USB主控制器驱动程序通知USB设备驱动程序。
流程一
创建urb:
初始化URB:
流程二
流程三,流程四: