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的格式


2. USB设备间的通讯的基本单位为endpoint,有4种ep,对应到4中USB传输类型:control,bulk,interrupt,isochronous。所谓的pipe,也就是指定了的目的ep,很形象的,可以想象成一个管道。表征起来就是一个int类型,包含了目的ep信息(8位)和一些其他信息。

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设备