USB 驱动相关基础知识记录

1. usb基本概念,速度,发展状况等
usb_20.pdf中解释了USB(Universal Serial Bus,通用串行总线)的最初目的:
        ○ Connection of the PC to the telephone ——> 廉价的方案实现计算机领域和通信领域的连接
        ○ Ease-of-use ——> 支持即插即用
        ○ Port expansion ——> 接口统一
    a. usb理论传输速度:
        USB 1.0的传输速度是1.5Mbps=192KB/s,称为低速USB,如USB键盘鼠标等
        USB 1.1的传输速度是12Mbps=1.5MB/s,称为全速USB
        USB 2.0的传输速度是480Mbps=60MB/s,称为高速USB,如USB存储器等
        USB 3.0的传输速度是5Gbps=600MB/s,称为超高速USB,如USB移动硬盘等
        USB 3.2···
    b. usb接口类型及引脚定义
        USB的接口类型,根据接口形状不同,主要可以分为三大类:
            i. 普通的硬件直接叫做Type
            ii. 小型版本的叫Mini迷你的
            iii. 更加小的,叫做Micro微小的
    其中每一种大类中,又都可以分为两类
            i. A类(Type A)
            ii. B类(Type B)

    下面详细对比USB的各种接口,包括对应的插头和插座:

引脚定义:

                    USB 2.0                                                        USB 3.0

        USB2.0向下兼容USB1.0和1.1,host和设备之间的速度识别,依靠D+和D-线的电平高低及枚举时双方通信确定的。
    c. USB主机控制器分类:
            i. UHCI(Universal Host Controller Interface,通用主机控制器接口):该标准有Intel提出,常用在基于Intel的PC机上
            ii. OHCI(Open Host Controller Interface,开放主机控制器接口):由Compaq,Microsoft等公司提出.
            共同点:都是基于USB 1.1的标准的,完全符合USB协议标准。
            不同点:
                    OHCI更多地把要做的事情,用硬件来实现,因此实现OHCI的USB控制器(HCD->Host Controller Drivers)的软件驱动的开发工作,相对要容易些,软件要做的事情相对较少。对应地,OHCI更多地应用在扩展卡,尤其是嵌入式领域中,常见的很多开发板中的USB的控制器,很多都是OHCI的。而UHCI把更多的功能,留给了软件,相对来说软件做的事情,即负担要重些。但是实现对应的UHCI的硬件的USB控制器,价格上,就相对便宜些。对应地,UHCI更多地应用在PC机中的主板上的USB控制器。
            iii. EHCI(Enhanced Host Controller Interface,增强型主机控制器接口),基于USB2.0协议标准,但是兼容UHCI和OHCI控制器用于支持低速USB设备

            iv. xHCI(Extensible Host Controller Interface,扩展主机控制器接口),基于USB3.0协议标准。


        

        v. USB OTG(On-The-Go)控制器:常用于嵌入式微控制器领域,该技术使每个通信终端都能充当DRD(Dual-Role Device,双重角色设备),即可以利用主机沟通协议根据功能需要在主机模式和设备模式之间任意切换。

2. USB子系统在内核中的位置
        如下图所示,USB 驱动位于不同的内核子系统(块设备, 网络设备, 字符设备等等)和USB硬件控制器之间. USB 核心为 USB 驱动提供了一个接口用于访问和控制 USB 硬件, 而不必考虑出现在系统中的不同的 USB 硬件控制器.

        USB Device Driver 向下利用 USB Core 提供的接口访问和控制硬件(Hardware),向上表现为将 USB 设备抽象成块设备,网络设备或字符设备同 User 使用。


3. usb设备连接星形拓扑图
    一个 USB host 最多支持128个地址,地址0作为默认地址,只在设备枚举时临时使用,而不能分配给任何一个设备,因此一个host最多同时支持127个地址。若一个设备占用一个地址,USB hub也是需要占用地址的,所以一个USB host实际可支持的设备一定少于127个。

        USB 体系采用分层的星形拓扑连接所有USB设备,以HOST-ROOT Hub为起点,最多支持7层,也就是说一个USB系统中最多允许使用5个USB Hub级联。

                                                            usb_20.pdf->ch4 4.1.1 Bus Topology

4. USB设备组织及端点寻址
        在USB设备的逻辑组织中,包含设备,配置,接口和端点4个层次,一个设备通常有一个或多个配置,一个配置有一个或多个接口,一个接口有零个或多个端点。同一设备的不同配置使设备对外表现出不同的功能组合(在探测/连接时选择一个配置)。在USB协议中,接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象。

举例:
    一个USB播放器带有音频、视频、旋钮和按钮。
    配置1:音频(接口)+ 旋钮(接口)
    配置2:音频(接口)+ 旋钮(接口)+ 视频(接口)
    配置3:音频(接口)+ 视频(接口)
    而音频接口,视频接口,按钮接口,旋钮接口均需要一个驱动程序。
    USB设备中唯一可寻址的部分是端点,可以抽象成USB设备上的一个数据缓冲区,用来存放和发送USB的各种数据。主机和设备的通信最终作用于省的各个端点,它是主机和设备间通信的一个逻辑终端。
    每个USB设备在USB总线上都有一个唯一的地址,在连接主机时由主机分配,而USB设备中的每个端点在设备内部有唯一的端点号,是在设计设备是指定的。所以在USB设备被枚举时,必须向主机报告自己所有端点的特性,包括端点号,通信方向,端点支持的最大包大小等(详见usb_endpoint_descriptor结构体)。每个设备必须有端点0,用于设备枚举时对设备进行基本的控制功能,除了端点0其余端点在设备配置之前不能与主机通信,只有向主机报告这些端点的特性并确认后才能被激活。

5. USB描述符
标准USB设备5种USB描述符,包括:
    设备描述符(usb_device_descriptor)->usb_20.pdf->ch9 Table 9-8
    配置描述符(usb_config_descriptor)->usb_20.pdf->ch9 Table 9-10
    接口描述符(usb_interface_descriptor)->usb_20.pdf->ch9 Table 9-12
    端点描述符(usb_endpoint_descriptor)->usb_20.pdf->ch9 Table 9-13
    字符串描述符(usb_string_descriptor)->usb_20.pdf->ch9 Table 9-16
各描述符关系:
    与USB设备组织类似,一个USB设备只有一个USB描述符,而一个USB描述符可以包含多个配置描述符,一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点就有几个端点描述符,字符串描述符是可选的,包含一些设备的描述信息。

各种描述符在源码中的联系:


例如在设备上插入U盘,使用lsusb命令:
# lsusb -d 1976:1307 -v

查看到U盘信息->HYUNDAI.lsusb

Bus 001 Device 003: ID 1976:1307 Chipsbrand Microelectronics (HK) Co., Ltd. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x1976 Chipsbrand Microelectronics (HK) Co., Ltd.
  idProduct          0x1307 
  bcdDevice            1.00
  iManufacturer           1 ChipsBnk
  iProduct                2 USB Reader
  iSerial                 3 110074973765
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)
6. USB数据传输
四种传输模式:
控制传输(control)->传送主机和外设之间的设置、控制、状态等信息
等时传输(isochronous)->传输实时数据,传输速率预先可知。可容忍偶尔错误,一般用于麦克风,音响,usb视频设备等
批量传输(bulk)->传输大量时延要求不高的数据,但是要求不能出错,适用于打印机,存储设备等
中断传输(interrupt)->传输数据量小,但是对传输时延敏感,要求马上响应,如键盘鼠标等。

    USB通信最基本的形式是通过端点(endpoint),USB端点只能往一个方向传输数据,从host到device(称为输出端点)或从device到host(称为输入端点)。对应时钟传输模式,端点也分成4种:
控制端点:
        用来允许对 USB 设备的不同部分存取. 通常用作配置设备, 获取关于设备的信息, 发送命令到设备, 或者获取关于设备的状态报告. 每个 USB 设备有一个控制端点称为"端点 0", 被 USB 核用来在插入时配置设备(枚举). 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.
等时端点:
        可以传送大量数据, 但是这个数据常常不能保证传输完全正确. 这些端点用在可以处理数据丢失的设备中, 并且更多依赖于保持持续的数据流. 实时数据收集, 例如音频和视频设备, 一直都使用这些端点.
批量端点:
        用来传送大量的数据. 对于需要传送不能有任何数据丢失的数据. 这些传送不被 USB 协议保证来一直使它在特定时间范围内完成. 如果总线上没有足够的空间来发送整个 BULK 报文, 它被分为多次传送到或者从设备. 这些端点普遍在打印机, 存储器, 和网络设备上
中断端点:
        传送小量的数据, 以固定的速率在每次 USB 主请求设备数据时. 这些端点对 USB 键盘和鼠标来说是主要的传送方法. 它们还用来传送数据到 USB 设备来控制设备, 但通常不用来传送大量数据. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.

注意:
    a. 所有传输都是有USB主机发起的,不能由USB设备发起传输。
    b. 注意此处的中断区别于硬件中断,而是CPU一直在轮询设备状态,有数据则发起中断取走数据。

    c. 一个设备也可能会使用多种传输模式,如USB存储设备使用控制传输模式完成磁盘访问命令,使用批量传输模式和主机交换数据。

7. USB数据组织
USB的数据传递首先是基于传输(Transfer)的,四种传输:控制传输,等时传输,批量传输,中断传输;
一次传输由一个或多个事务(transaction)构成,三种事务:IN事务,OUT事务,SETUP事务;
一个事务有一个或多个包(Packet)构成,四种包:令牌包(SETUP),数据包(DATA),握手包(ACK),特殊包(PRE);

一个包由多个域(字段)构成,多种域:同步域(SYNC),标识域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)等


8. USB设备枚举
USB设备枚举8个步骤:
        a. 获取设备描述符
        b. 设备复位
        c. 设置设备地址
        d. 再次获取设备描述符
        e. 获取配置描述符
        f. 获取接口描述符、端点描述符
        g. 获取字符串描述符
        h. 选择设备配置

利用软件分析usb协议(传输过程)->usb_mouse.usb

9. usb基本函数及数据结构->usb-DS+FUNC

Data Structures: 
数据结构						路径									说明
urb 					include/linux/usb.h				USB数据传输机制的核心结构
pipe 					include/linux/usb.h				存放URB的地址信息等 Line 1796
usb_device_descriptor 		        include/linux/usb/ch9.h				usb设备描述符
usb_config_descriptor									usb配置描述符
usb_interface_descriptor								usb接口描述符
usb_endpoint_descriptor									usb端点描述符
usb_device 				include/linux/usb.h				USB设备在内核里的抽象
usb_interface				include/linux/usb.h				USB设备接口
usb_device_id 				include/linux/mod_devicetable.h		        标识一个USB设备,用于.id_table
usb_driver 				include/linux/usb.h				USB客户驱动程序
usb_gadget_driver 			include/linux/usb_gadget.h			USB gadget驱动程序


Kernel Function: 
内核接口						路径									说明
usb_register() 				include/linux/usb.h				向USB核心注册usb_driver结构体
					drivers/usb/core/driver.c			
usb_deregister() 			driver/usb/core/driver.c 			从USB核心注销usb_driver结构体
usb_set_intfdata() 			include/linux/usb.h 				把设备相关的数据附着到usb_interface
usb_get_intfdata() 			include/linux/usb.h				从usb_interface中获得相关数据
usb_register_dev() 			drivers/usb/core/file.c				把字符设备接口和USB客户驱动程序关联起来
usb_deregister_dev() 		        drivers/usb/core/file.c 			解除关联
usb_alloc_urb() 			drivers/usb/core/urb.c 				创建并置零、初始化URB->kerf等
usb_fill_[control
|int|bulk|_urb()			include/linux/usb.h 				初始化URB
usb_[control|interrupt
|bulk]_msg()				drivers/usb/core/message.c 			URB同步提交函数
usb_submit_urb() 			drivers/usb/core/urb.c 				URB异步提交函数
usb_free_urb() 				drivers/usb/core/urb.c 				释放URB
usb_unlink_urb() 			drivers/usb/core/urb.c				取消URB的提交
usb_[rcv|snd][ctrl
|int|bulk|isoc]pipe()		        include/linux/usb.h 				创建URB管道 Line 1820
usb_find_interface() 		        drivers/usb/core/usb.c 				获得与USB客户驱动程序相关的usb_interface变量
usb_buffer_alloc() 			drivers/usb/core/usb.c 				分配一致性DMA传输缓冲区
usb_buffer_free() 			drivers/usb/core/usb.c 				释放usb_buffer_alloc函数分配的缓冲区
usb_serial_register() 		        drivers/usb/serial/usb_serial.c 	        向USB-Serial核心注册驱动程序
usb_serial_deregister() 	        drivers/usb/serial/usb_serial.c 	        从USB-Serial核心注销驱动程序

10. USB驱动基本框架 usb-skeleton.c 简析
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值