一、USB基础概念:
1、USB(Universal Serial Bus,通用串行总线),用于规范电脑和外部设备的连接和通讯。最后可连接127个设备
2、热插拔技术:
    1)在usb集线器上的每个下游端口的D+和D-上,分别接一个15K的下拉电阻到地,即端口悬空时,被下拉电阻拉成低电平
    2)usb设备端,在D+或D-上接1.5k的上拉电阻,对于全速和高速设备,上拉电阻接在D+上,对于低速设备,上拉电阻接在D-上拉电阻接在D
3、usb设备不能主动的发起任何一次传输,所有的传输都是usb主机发起的
4、USB枚举:
    枚举是让HOST认得这个usb设备,并且为该设备准备资源,建立好主机和设备之间的数据传送机制。
    基于Pnp机制,设备被枚举时,必须向主机报告各个断电的特性,包括端点号、通信方向、端点支持的最大包大小(数据有效负载),带宽要求等。
    每个设备必须要求端点0,用于控制设备枚举和对设备进行一些基本的控制功能。
    标准的枚举步骤:
        1)获取设备描述符
        2)复位设备
        3)设置地址
        4)再次获取设备描述符
        5)获取配置描述符6
        6)获取接口,端点描述符
        7)获取字符串描述符
        8)发送设备配置
5、usb数据传输 -- 小端传输
    usb的数据传输首先是基于传输(transfer)的:中断传输、批量传输、同步传输、控制传输、
    一次传输由一个或多个事务(transaction)构成,分为:IN事务、OUT事务、SETUP事务
    一个事务由一个或多个包(packet)构成,分为:令牌包(setup)、数据包(data)、握手包(ack)和特殊包。
    一个包由多个域构成,分为:同步域(sync)、标识域(PID)、地址域(ADDR)、端点域(ENDP)、帧号域(FRAM)、数据域(DATA)、校验域(CRC)
二、USB控制器驱动
驱动框架:
    usb设备驱动 <-> USB Core <-> usb主控制器驱动(driver/usb/host)<-> 硬件usb主控制器
主控制器功能:
1、解析和维护URB
2、负责不同usb传输类型的调度工作
3、负责usb数据的实际传输工作
4、实现虚拟根HUB的功能
三、USB设备驱动
1、描述符类型
    1)设备描述符
      struct usb_device_descriptor
    2)配置描述符 - 不同的配置使设备表现出不同的功能组合
      struct usb_config_descriptor
    3)接口描述符 - 代表一个基本的功能,是usb设备驱动程序控制的对象,每个接口需要一个驱动程序
      struct usb_interface_descriptor
    4)端口描述符 - usb通信的最基本单位,是一个数据缓冲区,用来存放和发送usb的各种数据
      struct usb_endpoint_descritptor 
2、端点endpoint
   1)端点智能往一个方向传送数据,或者IN,或者OUT(端口0除外)
   2)端点存在于USB设备端
   3)主机和端点之间的数据传输是通过管道
3、usb传送方式
    1)控制传输 - 获取、配置设备
    2)中断传输 - 例如:usb鼠标(是主机控制器在保证不大于某个时间间隔内安排一次传输)
    3)批量传输 - 用于大批量数据传输,没有固定的传输速率,例如:usb打印机,扫描机,U盘,大容量的存储设备
    4)等时传输/同步传输 - 可以传输大批量数据,但是对数据是否达到没有要求,对实时性要求高,例如:音频设备,视频设备
4、USB请求块(usb request block,urb)
    1)usb主控制器和usb外设通信协议
    2)主控制发送urb的方式:
       同步方式 - 等待urb提交成功
       异步方式 - 只管发出去,不管成功与否
    urb是usb设备驱动中用来描述与usb设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是usb主机与设备通信的电波
    urb和端点不是一一对应的关系,一个urb可以被发向多个不同 的端点
5、管道
    每个端点通过管道和usb主控制器连接,包括以下几个部分
    1)端点地址
    2)数据传输方向
    3)数据传输模式