Skip to content

Latest commit

 

History

History
81 lines (69 loc) · 4.7 KB

USB驱动.md

File metadata and controls

81 lines (69 loc) · 4.7 KB

USB

USB描述符

  • 描述符的类型

    描述符类型 名字
    设备描述符 1
    配置描述符 2
    字符串描述符 3
    接口描述符 4
    端点描述符 5
    • 设备描述符

      • 描述 USB 设备的一般信息, USB 设备只有一个设备描述符。设备描述符里面记录了设备的 USB 版本号、设备类型、 VID(厂商 ID)、 PID(产品 ID)、设备序列号等
    • 配置描述符

      • 定义了一个 USB 设备的配置描述符数量,一个 USB设备至少有一个配置描述符。配置描述符描述了设备可提供的接口(Interface)数量、配置编号、供电信息等
    • 字符串描述符

      • 字符串描述符是可选的,字符串描述符用于描述一些方便人们阅读的信息,比如制造商、设备名称啥的。如果一个设备没有字符串描述符,那么其他描述符中和字符串有关的索引值都必须为 0
    • 接口描述符

      • 配置描述符中指定了该配置下的接口数量,配置可以提供一个或多个接口,接口描述符用于描述接口属性。接口描述符中一般记录接口编号、接口对应的端点数量、接口所述的类等
    • 端口描述符

      • 接口描述符定义了其端点数量,端点是设备与主机之间进行数据传输的逻辑接口,除了端点 0 是双向端口,其他的端口都是单向的。端点描述符描述了树传输类型、方向、数据包大小、端点号等信息

USB数据包类型

  • 4种包 结构:
    • 令牌(Token)包、数据(Data)包、握手(Handshake)包和特殊(Special)包
    • 四种包通过包标识符 PID 来区分, PID 共有 8 位, USB 协议使用低 4 位 PID3PID0,另外的高四位 PID7PID4 是PID3PID0 的取反,传输顺序是 PID0、 PID1、 PID2、 PID3…PID7。令牌包的 PID10 为 01,数据包的 PID10 为 11,握手包的 PID10 为 10,特殊包的 PID1~0 为 0

USB传输类型

  • 控制传输
  • 同步传输
    • 同步传输用于周期性、低时延、数据量大的场合,比如音视频传输,这些场合对于时延要求很高,但是不要求数据 100%正确,允许有少量的错误。因此,同步传输没有握手阶段,即使数据传输出错了也不会重传
  • 批量传输
    • 批量传输就是用于大批量传输大块数据的,这些数据对实时性没有要求,比如 MSD 类设备(存储设备), U 盘之类的。批量传输分为批量读(输入)和批量写(输出),如果是批量读的话第一阶段的 IN 令牌包,如果是批量写那么第一阶段就是 OUT 令牌包
  • 中断传输
    • 一种保持一定频率的传输,中断传输适用于传输数据量小、具有周期性并且要求响应速度快的数据,比如键盘、鼠标等。中断的端点会在端点描述符中报告自己的查询时间间隔,对于时间要求严格的设备可以采用中断传输

内核使能USB

  • make menuconfig

    • 使能HID
        -> Device Drivers
          -> HID support
            -> HID bus support (HID [=y])
              -> <*> Generic HID driver //使能通用 HID 驱动
    • 使能鼠标、键盘
        -> Device Drivers
            -> HID support
                -> USB HID support
                    -> <*> USB HID transport layer //USB 键盘鼠标等 HID 设备驱动
      可在系统中使用 'hexdump /dev/input/event3' 命令来查看鼠标键盘输入的原始值
    
    • 使能U盘
        -> Device Drivers
            -> USB support (USB_SUPPORT [=y])
                -> Support for Host-side USB (USB [=y])
          <*> USB Mass Storage support //USB 大容量存储设备
```
    U盘插上去后,通过命令`ls /dev/sda`来查看U盘的分区
        创建一个任意文件夹,用来挂载U盘
        ```
            mkdir /mnt/usb_disk -p
            mount /dev/sda1 /mnt/usb_disk -t vfat -o iocharset=utf8     //-t指定的文件系统类型 、 -o iocharset 设定硬盘的编码格式,否则乱码
        ```
        随后在挂载的文件路径(自己创建的 /mnt/usb_disk)即可查看U盘里面的文件内容,(在该路径下)也可以对U盘进行正常的读写操作,
    U盘拔出,需使用命令`sync`来进行同步,然后使用`unmount`来进行U盘的卸载
        ```
            sync                        //同步
            cd /                        //退出挂载文件夹的路径,否则提示设备正在忙
            unmount /mnt/usb_disk       //卸载
        ```