HCD ; host controller drivers 主机控制器驱动
传送模式:
1. 控制传输模式,用来传送外设和主机之间的控制,转态,配置等信息。
2.批量传输模式,传输大量时延要求不高的数据
3.中断传输模式,传输数据量小,但是对传输时延敏感,要求马上响应。
4.等时传输模式,传输实时数据,传输速率要预先可知。
USB和I2C协议采用主从结构
设备地址不占用CPU寻址范围,地址位数为7位
设备内存没有映射到CPU内存和IO内存,因此不占用CPU资源
USB和PCI驱动程序结构都采用probe()函数和disconnect/remove 函数,都含识别设备的ID表。
用户空间 用户应用
USB用户模式(设备驱动程序) /dev ,/sys
内核空间
usbfs usbcore
usb主机控制器驱动程序 usb客户驱动程序、
硬件
usb主机控制器
驱动程序的数据结构
usb_device 结构体
URB:usb request block USB请求块 是USB数据传输机制使用的核心数据结构
urb 使用分三步
分配内存,初始化,提交
urb_alloc_urb()
管道 :管道是URB的重要成员,为USB数据传输提供地址信息。
端点地址
数据传输方向(in.out)
数据传输模式
linux描述结构
1.设备描述存放设备的普通信息,如产品ID和设备ID。usb_device_descriptor
2.配置描述,如设备自己供电还是总线供电,usb_config_description接口描述
3.端点描述,存放设备最终的端点信息,usb_endpoint_descriptor结构体描述。
endpoint address=1 端点地址
4. 接口描述,usb设备能支持多种功能,usb_interface_descriptor
枚举
枚举是热插拔USB设备的起始步骤,该过程中,主机控制器获得设备的相关信息并配置好设备,设备的枚举过程如下:
1.根集线器报告插入设备导致的端口电流变化,集线器检测到这一状态百年哈,唤醒Khubd线程
2.khub识别出电流电流变化的那个端口
3.接着,khub在1-127之中挑一个数分配给驱动器的批量端点,这是通过给控制端点0发送控制URB来实现的
4.Khub利用端口0使用的控制USB从驱动器那里获得设备描述符,然后重新配置描述符,并选择一个合适的
5.Khub 请求USB核心把对应的客户驱动程序和给usb设备挂钩。
类驱动程序
1.大量存储设备
mout/dev/sda1/mnt 用户空间
/dev/sd*./dev/sr* 内核空间
USB存储设备 硬件
USB -串行端口转换器
应用程序(系统调用接口)
N_TTY(n_tty.c) 线路规程 核心模块(tty_io.c)
tty层 serial_core.c
底层驱动程序(8250.c) usb_register()
物理层 16550 (uart)
人机接口设备
gadget驱动程序
嵌入驱动设备通过usb接口连接到主机上。嵌入式计算机被看做USB连接的设备端,而PC被看作USB连接的主机端。
数据结构
urb include/linux/usb.h usb数据传输机制的核心机构
pipe include/linux/usb.h 提供URB的地址信息
usb_device_descriptor include/linux/usb/ch9.h 存放USB设备信息的描述符
usb_config_decriptor
usb_device include/linux/usb.h usb设备在内核里的抽象
usb_device_id include/linux/mod_devicetable 标示一个USB设备
usb_driver include/linux/usb usb驱动程序
usb_gadget_driver i include/linux/usb_gadget usb gadget驱动程序
内核编程
usb_register() include/linux/usb.h 向UUSB核心注册usb_driver结构体
drivers/usb/core/driver.c
usb_buffer_alloc() drivers/usb/core/usb. c 分配一个一致性DMA传输缓冲区
usb_buffer_free() drivers/usb/core/usb.c 释放缓冲区
usb_alloc_urb drivers/usb./core/urb.c 创建URB