《Linux设备驱动开发详解:基于最新的Linux4.0内核》
—— USB主机、设备、与Gadget驱动

架构

I2C SPI USB 驱动架构对比
USB驱动架构
USB驱动分为主机侧和从机侧:主机侧由设备驱动、USB核心、USB主机控制器驱动组成,从机侧由:Gadget Function驱动、Gadget Function API、UDC驱动组成,此外OTG协议既能当主机也能当从机:

  • 主机侧:USB核心将USB控制器驱动与USB设备驱动分层

    • 向USB核心注册USB控制器驱动
    • USB设备驱动调用USB核心层API
    • 从机侧的Gadget API层相似
  • 传输方式

    • 中断传输
    • 控制传输
    • 批量传输
    • 同步传输
  • 结构

    • 设备 设备描述符 usb_device_descriptor
    • 配置 配置描述符 usb_config_descriptor
    • 接口 接口描述符 usb_interface_descriptor
    • 端点 端点描述符 usb_endpoint_descriptor
  • 主机侧

    • USB主机控制器驱动
      • 主机控制器规格
        • OHCI
        • UHCI
        • EHCI
        • xHCI
      • usb_hcd描述主机控制器驱动
      • hc_driver 操作主机控制器的钩子函数
      • usb_create_hcd()
      • usb_add_hcd() 向核心层添加驱动
      • urb_enqueue()
        (上层 usb_submit_urb()->usb_hcd_submit_urb()->urb_enqueue())
      • platform_device和platform_driver匹配上后调用probe()向核心层注册主机控制器驱动
    • USB设备驱动
      • usb_device
      • usb_driver
      • usb_register()
      • 匹配后在usb_driver的probe()函数中再注册相应设备,如tty设备
      • usb设备所属设备的write()\read()等其中都是对urb操作
      • usb_driver本身只是管理设备的连接和断开,具体还是要实现相应所属设备驱动
      • USB请求块:urb结构体(类似网卡设备的sk_buff)
      • 每个端点处理一个URB队列
      • URB流程
        1. 一个USB设备驱动创建
        2. 初始化,安排给一个USB设备的特定端点
        3. 被USB设备驱动提交给USB核心 usb_submit_urb()
        4. 被USB核心提交给指定的USB控制器驱动
        5. 被USB主机控制器处理,进行一次到USB设备的传输
        6. 当URB完成,USB主机控制器驱动通知USB设备驱动
  • 从机侧:UDC与Gadget驱动(如:手机作为U盘连接电脑)

    • UDC驱动
      • usb_gadget
      • usb_gadget_ops
      • usb_ep
      • usb_ep_ops
      • usb_add_gadget_udc()
    • Function驱动
      • usb_interface_descriptor
      • usb_endpoint_descriptor
      • usb_descriptor_header
      • usb_function
      • usb_function_register()
    • usb_request 描述一次请求
  • USB OTG驱动

    • 新增主机通令协议HNP和对话请求SRP
    • 通过ID引脚区分主机和从机
    • usb_otg
    • 一般在usb phy端实现
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐