USB驱动程序
1. device,configuration,interface,endpoint
我的理解:
1)首先,一个device包含多个configuration,
一个configuration包含多个interface
一个interface使用多个endpoint来完成功能
2)其次,interface对应到USB device的功能,可以理解为一个独立的逻辑设备。一个configuration就包含了多个这样的逻辑设备,它实际上就对应了某一个时刻的USB device。也就是说一个USB device在不同的时刻,需要有不同的用途,而这个用途由多个逻辑设备来达成。举例来说:一些USB设备需要下载固件到其上,则这些设备在不同的时候扮演不同的角色(存储设备,或者无线网卡等等)。
usb_interface -- usb_host_interface (altsetting) -- usb_interface_descriptor -- bAlternateSetting:altsetting编号
| |- + bInterfaceNumber:interface编号
| |- extra: following usb_host_interface_descriptor in this interface (hence usb_interface)
| |- usb_host_endpoint: 此配置下的endpoint数组,其中包含了每个ep的desc和urb_list
|- usb_host_interface (altsetting[1])
3)如上图,每个interface可以包含多种配置,每一个配置是一个altsetting,类型是usb_host_interface,每个altsetting包含了一个descriptor(记录了当前interface和当前interface的altsetting的信息),和一组endpoint(包含了endpoint的descriptor和对应的urb_list)。
Alternate settings allow a portion of the device configuration to be varied while other interfaces remain in operation. -- USB 2.0 spec.
The default setting for an interface is always alternate setting zero.The SetInterface() request is used to select an alternate setting or to return to the default setting. -- USB 2.0 spec.
4)注意不同的DescriptorType值,会有不同descriptor的格式
3. USB sysfs名字解析
sysfs中只显示了和当前配置和接口,所有可选的其他配置可以通过查看usbfs(/proc/bus/usb)来获得需要的信息
4. 1)USB设备之间的通信通过urb来实现,这是一种异步通信的方式,也可以通过同步通信的方式,即绕开urb直接传输数据,这种同步方式只有两个函数可以支持,分别为usb_bulk_msg和usb_control_msg。
2)控制,中断,批量,等时四种urb只有等时urb需要自己手动的初始化。其他的均可以通过形为usb_fill_xxx_urb的函数来作初始化。
3)通过usb_submit_urb来提交urb给USB core。urb被处理完后会调用urb注册的complete回调函数做结束工作。
5. usb_driver通过usb_device_id数组告诉USB core,本驱动支持什么样的USB设备。当有设备插入时,USB core来判断哪个驱动支持该设备,找到了之后,调用usb_driver->probe回调函数。并在退出时调用disconnect回调函数。
6. 为了使用传统的字符驱动程序的接口,可以调用usb_register_dev来注册USB设备