以前阅读过《圈圈教你学USB》,介绍USB比较详细,但一直没有总结,今天简单总结一下~
USB支持热插拔,使用方便,越来越受欢迎
USB2.0支持60M/B/s的速率。
最新的USB3.0最高可支持500MB/s。
USB按主机控制器可分为如下:
UHCI 通用主机控制器接口;
OHCI 开发主机控制器接口;
EHCI 增强型主机控制器接口;
USB OTG控制器
传输模式:
控制传输模式;
批量传输模式;
中断传输模式;
等时传输模式;
寻址是个比较重要的概念,USB设备里每个可寻址单元称作端点,为每个端点分配的地址就是端点地址。每个端点都有对应上说说的一种传输模式。
地址为0的端点专门用来配置设备,控制管道和它连接,完成设备枚举过程。
每个端点可上行或下行传输数据,分别对应IN传输和OUT传输。
以上是写基本概念,对于linux 的USB子系统;
USB核心:主要包含结构体和一些函数;
HCD:驱动不同的主机控制器;
hub驱动,内核辅助线程kuubd;
驱动程序的数据结构:
usb_device 结构体,对于不同的外设,linux内核都抽象成一个对应的结构体,比如pci_dev/net_device等,
具体的结构体定义可以看内核源码,在include/linux/usb.h 中
另一个比较重要的结构体积是URB,也定义在include/linux/usb.h中,urb主要供USB协议栈使用,
URB使用主要是,分配内存(usb_alloc_urb), 初始化 urb相关的kobject和锁,最后进行提交,usb_submit_urb.
urb使用完成后,需要调用usb_free_urb释放,
管道:
端点地址;
数据传输方向;
数据传输模式;
描述符:
设备描述符;
配置描述符;
接口描述符;
端点描述符
枚举的过程:
1.插入一个USB设备后,集线器驱动器检测到电平变化后,根集线器会报告,系统唤醒khubd线程,
2.识别到插入设备的端口后,khubd在1~127中分配批量端点,
3.khubd利用端口0使用的可控制urb从驱动器获得设备描述,配置描述符。
4.khubd请求usb核心使驱动程序和设备帮点,紧接着执行probe.
至此,usb设备与驱动匹配完成,当然实际会有更多细节,先从概念入手,会建立整体框架,磨刀不误砍柴~