驱动之USB基础概念和框架
总览
- 嵌入式linux学习目录
- 驱动之input子系统
- 驱动之platform概念
- 驱动之RTC分析
- 驱动之LCD驱动框架和实现
- 驱动之触摸屏驱动框架和实现
- 驱动之USB基础概念和框架
- 驱动之USB设备驱动程序
本文使用 linux-2.6.22.6 内核, 使用jz2440开发板.
USB基础知识
- USB是主从结构的
- 所有的USB传输,都是从USB主机这方发起! USB设备没有”主动”通知USB主机的能力。
- 例子:USB鼠标滑动一下立刻产生数据,但是它没有能力通知PC机来读数据,只能被动地等得PC机来读。
- USB的传输类型:
- 控制传输(Control Transfers):可靠,时间有保证,比如:USB设备的识别过程
- 批量传输(Bulk Transfers):可靠, 时间没有保证, 比如:U盘
- 中断传输(Interrupt Transfers):可靠,实时,比如:USB鼠标
- 实时传输(Isochronous Transfers):不可靠,实时,比如:USB摄像头
- USB的识别过程
- 硬件上(USB2.0)
- USB主机端D-和D+接有15K下拉电阻, 未接USB设备时为低电平.
- USB设备端D-或D+接有1.5K上拉电阻.
- 当USB设备插入USB主机端口时, 就会把D-或D+拉高, 让主机知道有设备接入了
- 把D-拉高是低速设备, 把D+拉高是高速设备
- 软件上
- USB核心驱动程序负责: 识别USB设备, 给USB设备找到对应的驱动程序
- 当USB设备接入USB主机端后, 其默认的address是0. PC使用此adress与之通讯.
- 建立通讯后, USB核心驱动会给它分配一个新的address, 并查找有没有对应的驱动.
- 硬件上(USB2.0)
- USB通讯速率
- 低速设备(USB1.1, Low speed): 1.5Mb/s
- 全速设备(USB1.1, Full speed): 12Mb/s
- 高速设备(USB2.0, High speed): 480Mb/s
- 超高速设备(USB3.0, Super speed): 5Gb/s, 全双工
USB主机端驱动框架
各层作用如下:
- USB设备驱动 (USB Device Driver):
- 让USB主机知道特定设备的数据含义
- linux USB驱动开发就是在这一层. 更底层都是由linux内核完成的.
- USB核心层 (USB Core):
- 识别USB设备: 分配并设置USB设备的address, 然后发出命令获取描述符.
- 查找并安装匹配的设备驱动
- 提供USB读写函数 (只是一个接口, 不知道数据含义)
- USB主机控制器 (USB HCD):
- 需要支持的USB接口规范, 譬如USB2.0的设备要向下兼容必须包含USB1.1
- OHCI: USB1.1 microsoft等创立的标准. 硬件功能强于软件功能
- UHCI: USB1.1 intel创立的标准. 软件功能强于硬件功能, 因此芯片价格更低
- EHCI: USB2.0
- xHCI: USB3.0
USB设备端概念
在USB从设备的结构中,从上到下分为:
- 设备(device)
- 设备即硬件概念上的USB从设备.
address
的概念就是对设备而言的. 一条USB总线最多外接127个USB设备.- 软件数据结构
usb_device
usb_device_descriptor
- 配置(config)
- 设备可以有一个或多个配置. 但任一时刻只有一个有效配置.
- 这里其实不难理解. 一个USB硬件设备可以允许多种功能.
- 个典型的例子是手机, 目前手机自动连接后, 都会弹出问你要用哪种模式连接电脑. 对应了不同的配置
- 因此选中一个配置后, 就从软件上决定了该USB设备的具体功能.
- 软件数据结构
usb_device
usb_host_config
usb_config_descriptor
- 接口(interface)
- 接口表示逻辑设备, 包含零个或多个endpoint打包.
- Linux的USB设备驱动是绑定到接口上的, 每个接口在主机看来都是一个独立的功能设备.
- 譬如录音接口, 播放接口, 数据接口等等.
- 软件数据结构
usb_host_interface
usb_interface_descriptor
.
- 端点(endpoint)
- 传输数据时, USB使用的就是endpoint概念. endpoint是数据通道.
endpoint0
用于控制传输, 可双向传输.- 除了
endpoint0
以外, 每个端点只支持一个方向的数据传输. - 每个 endpoint 都有传输类型和传输方向.
- 传输类型: 控制传输, 批量传输, 中断传输, 实时传输.
- 传输方向: 输入(IN), 输出(OUT). 注意, 都是基于USB主机来说的! 读U盘, 数据方向就是输入.
- 譬如”读写U盘”, 软件上的概念是: 把数据写到U盘的 endpoint1 上去, 从U盘的 endpoint2 里读数据.
- 软件数据结构
usb_device
usb_host_endpoint
usb_endpoint_descriptor
Linux的USB驱动框架
以下我们用“usb_skel”的USB接口驱动实例(Linux/drivers/usb/usb-skeleton.c)来看看Linux的USB驱动框架:
USB核心层源码分析
把USB设备接到开发板上,看输出信息:
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
拔掉后, 显示断开
usb 1-1: USB disconnect, address 2
尝试寻找源码: grep "USB device using" -nR
, 找到 drivers/usb/core/hub.c:2186
文件.
由此开始分析.
hub_irq // 硬件检测到USB总线状态变化 |
下面, 简单分析一下USB的几个描述符结构体
结构体内各个变量的具体含义可参考: USB Descriptors
// usb_device 和 usb_host_XXX 可以在 include\linux\usb.h 看到 |
参考资料
- Linux的USB驱动分析
- Linux USB驱动工作流程
- 浅谈USB驱动架构
- Linux usb子系统(一) _写一个usb鼠标驱动
- USB in a NutShell
- USB Descriptors
- USB控制器类型:OHCI,UHCI,EHCI,xHCI
原创于 DRA&PHO