usb 协议简述


原文链接:https://docs.google.com/document/d/1EEPLoyupLXS5vCMVo1E9iZbsxmYarQ79EhDxKsMVsak/edit


2008-5-3  


USB,几乎天天在用,俺多普达的水货手机,就是USB的数据线,同时兼作充电, 所以有电脑的地方就有能源..暂时以UHCI为例:Universal Host

 Controller interface, 由intel 制定.虽然驱动高速设备需要EHCI, 但是这里仍旧以UHCI为例. 详细信息参考linux官方网站的FAQ:

http://www.linux-usb.org/

http://www.lrr.in.tum.de/Par/arch/usb/usbdoc/   UBS device driver Guid



USB2.0 specification


 在USB的两根信号线上(采用了双绞线,抗干扰D+,D-,串行,PCIE和USB让串行通讯再度辉煌),传输着各种报文(很像packet 网络),和以太网比

较,俺做网络时间长了,难免这么比较:以太网上,每个以太网报文都是独立由驱动发送和接受,并且对实时的支持并不好,但是usb标准充分考虑

了实时性应用要求,并且驱动能(UHCI host controler interface)操作的最小单位是transaction,而不是packets.

 对于UHCI,其实时性要求通过host controler硬件予以保证,UHC以1个毫秒为单位,调度transaction的报文收发,这样保证1秒内,实时传输

的数据和中断传输的数据总和不超过传输带宽的90%,而控制传输和批量传输则使用剩余部分的带宽.

 传输(transfer)是比transaction更大的一个概念. transaction译为事务?交互?都容易使人忽略transaction是一种把几个操作组合成一

个原子操作的方法的这个含义.一个传输是可以跨越一毫秒这个调度单位的,而transaction则不能.而packet更为原始,基本OS不可直接操作.其

实只有control transfer 最为复杂包含了几个不同的trnsaction: 一个setup transaction+data(bulk) +status (bulk transaction).bulk

ISO, int只不过是几个相同的transaction的不断重复.


 

 这里列举下packet的报文格式,至于内核代码,因为packet只能间接操作,而且是分散在UHCI驱动中,并且在驱动只能操作transaction,而每个

中就包含了几个packet:见uhci_submit_control,uhci_submit_bulk,uhci_submit_interrupt,uhci_submit_isochronous.(

这几个函数操作的是transfer, 包含几个transaction,在UHCI中transfer由几个TD构成,一个td代表一个transaction,每个transaction包含

几个packet).

1. token 报文格式

  PID = IN/OUT/setup

  IN: function to host transaction

  OUT:host to function transaction

2.Split Transaction Special Token Packets

 这两种token报文只用在host controler和高速hub之间,并且只有在高速的hub接入一个full speed或者low speed设备时使用.

3. SOF

 host以每毫秒一个的速度发送SOF,代表一个frame的开始,也是一个调度单位.

4.DATA packet

PIDs: DATA0, DATA1, DATA2,and MDATA

DATA0 and DATA1 are defined to support data togglesynchronization

All four data PIDs are used in data PID sequencing for highbandwidth high-speed isochronous endpoints

MDATA, DATA0,DATA1 are used in split transactions .

5. Handshake Packet

PIDS: ACK NACK STALL NYET ERR


什么文档才能准确解释并效验内核的USB驱动? 那就是USB标准文档了.


Transactions


Transaction的类型由通讯的对象:endpoint的类型所决定. 每个tansaction分成几个阶段,每个阶段包含一个或几个报文, 每个报文内都含

有PID /pak-context/CRC几个域.

 

1. Ping

为High Speed Device所支持的NACK协议, 主机发送PING token来查询设备是否能够接受长度为wMaxPacketSize的报文(data buffer是否够长),如果buffer足够就回应ACK否则回应NAK.

低俗设备没有这个机制,在其回应NCK的时候,bus的带宽已经被浪费掉了.(handsake阶段才发送NACK呢!) 这个机制有效提高高速设备的bus带宽利用率.

2. Bulk Transaction

3.control Transaction

SETUP PID和OUT类似,代表一个输出操作,输出一个setup packet给设备,用此决定下一个stage的数据的方向.(有可能没有数据stage)

一个control transfer由一个setup transction 加上几个bulk transaction, uihou一个是status stage 是一个IN类型的bulk

transaction比较而言,control transfer是最复杂的transfer了.其他的transfer只包含几个同类型的transaction,主要由数据长

度决transaction的数量.




4.Interrupt Transaction

5.Iso Transaction



USB host controler:UHCI


下图是UHCI标准的系统结构框图.UHC在每个1ms内调度ISO,INT,CNTL,BULK的transfer运行,并保证ISO+INT传输总带宽不超过USB总线带宽的

90%.


下图是UHCI的结构框图.




 UHCI通过调度一个frame list的结构来完成USB trasaction以及保证带宽分配.其数据结构包括Frame List,Queue Heads和Transfer

Descriptors. 一个TD代表一个transaction.其典型的组织结构如下图所示.


TD的link指针和QH的element指针都能指向TD或者QH,其最低极为有类型域. 一般ISO直接作为TD来执行,之后依次是INT,control,和bulk的QH.


深度优先 --- 如果是QH,处理完其所有TD再进行下一个QH,linux下urb提交的传输是在一个QH上的,这显然不公平.

广度优先 ----区一个QH下地第一个TD,然后处理下一个QH.问题是,到达QH尾端的时候,UHC就不干活了,但是这个ms可能还有剩余资源可以利用,

这些剩余资源的回收就叫做FSBR.

下面两个图就是TD和QH的结构.其详细含义请参考intel的UHCI标准,这里做一提示而已. 主义其中的Vf bit ==0 时作广度优先遍历.linux初始华TD的

时候没有理会这个bit,默认采用广度优先遍历.



TD的第一个长字是link指针用以形成链表.接下来的长字用于status和control,第三个个长字用于token,最后一个长字是这个transaction的 数据指针.

不要忽略TD代表一个transaction,一个transaction典型的由一个Token报文+几个数据报文+一个handshake报文组成, ISO不需要 handshake,而CNT

L则可能没有数据报文. 注意,在建立一个transfer的时候由几个TD组成,代表由几个transaction组成. 再次提下control transfer,control transfer由

几个stage 组成,并且其transaction类型不同.

第三个长字的PID仅容许setup/in/out三种token. (再注:data1/0 这种PID并不是token,所以操作UHC的时候根本用不到的...,只是用Dbit来 控制

data Toggle而已.)

ISO transaction直接以TD的方式挂载在frame list上,就是说不在一个QH的context内,执行完成后依然存在于hw的frame list内,但是 Activebit会

被硬件清除,从而下次调度到这个tD的时候不会被执行.


linux下control/intrrupt/bulk transaction都是在一个QH的队列中被执行的, 硬件会更新qh->element域,从而使td在下一次调度的时候不会被执行

,就是说被硬件自动脱链了. 祥见UHCI标准或参考下图.




 这里不准备对USB驱动详加研究,仅仅从代码的角度理解一下.每个USB设备由几个端点(end point)组成, 每个USB的trasaction都是和一个端点

进行报文传输,类似与tcp 端口号.端点可以以不同的方式组合成一个接口(比如类似T1,E1通道绑定的概念,或者ISDN的那种绑定通道的方式),这些组合方式叫做一个配置.

 从软件的角度来讲,就是一个设备有一个设备Descriptor,和可能有的一个或者几个配置,称为配置表比较好,因为配置中包含接口Desc,EP Desc.

Class Desc以及Vendor Desc:每个配置表内包含一个配置Descriptor,几个接口Desc,每个接口的Desc后面跟着和这个接口相关的几个EndPoint的描述符. 基本上就是如图下所示:

有了从Standard中提取的这个图,看懂usb_get_configuration不再困难!



 



USB协议是一种广泛应用于计算机和外围设备之间进行数据交换的通信协议,其技术细节和通信机制覆盖了从物理层到应用层的多个层面。USB协议的设计目标是实现高效、可靠、错误纠正能力强的数据传输,同时保持接口的易用性和广泛的兼容性。 ### USB协议的层次结构 USB协议的架构可以分为多个层次,包括物理层、数据链路层、传输层和应用层。每一层都有其特定的功能,共同协作以确保数据的正确传输。 - **物理层**:负责数据的物理传输,包括电压电平、信号格式和传输速率等。USB 3.2标准通过改进信号处理技术和协议,实现了更高的数据传输速率,最高可达20Gbps[^3]。 - **数据链路层**:这一层处理数据帧的封装、错误检测、流控制以及事务处理机制。这些机制确保了USB通信的高效性和可靠性。例如,数据链路层能够检测并纠正传输过程中发生的错误,从而保证数据的完整性[^1]。 - **传输层**:传输层负责定义数据如何在主机和设备之间传输。USB支持多种传输类型,包括控制传输、批量传输、中断传输和同步传输。每种传输类型都有其特定的应用场景和特点。例如,控制传输通常用于设备的配置和状态查询,而批量传输则用于需要大量数据传输且对时间不敏感的应用[^1]。 ### USB通信机制 USB通信机制基于主从架构,主机(Host)负责发起和管理所有通信,而设备(Device)则响应主机的请求。这种架构简化了设备的设计,同时也提高了系统的稳定性和安全性。 - **事务处理**:USB通信中的数据传输是由一系列事务组成的,每个事务包含一个或多个数据包。事务处理机制确保了数据的有序传输和错误恢复。 - **流控制**:为了防止发送方的数据溢出接收方的缓冲区,USB协议中引入了流控制机制。当接收方无法处理更多的数据时,它可以发送一个暂停信号给发送方,直到它准备好继续接收数据为止。 - **错误检测与纠正**:USB协议中采用了多种错误检测和纠正技术,如循环冗余校验(CRC)和重传机制,以确保数据的完整性和可靠性。 ### USB 3.2的特性 USB 3.2作为USB标准的一个重要版本,不仅提高了数据传输速率,还增强了USB接口的灵活性和兼容性。USB 3.2支持多通道操作,允许同时进行多个数据流的传输,进一步提升了数据吞吐量。此外,USB 3.2还引入了新的编码方案,减少了数据传输中的冗余,提高了传输效率[^3]。 ### 示例代码:USB设备枚举过程简述 USB设备的枚举过程是设备连接到主机后,主机识别设备并为其分配地址的过程。以下是一个简化的USB设备枚举过程的伪代码示例: ```c // USB设备枚举过程的伪代码 void usb_enumeration() { // 主机检测到设备连接 detect_device_connection(); // 主机发送复位命令 send_reset_command(); // 设备进入默认状态 device_enter_default_state(); // 主机分配地址给设备 assign_address_to_device(); // 设备进入地址状态 device_enter_address_state(); // 主机获取设备描述符 get_device_descriptor(); // 主机选择设备配置 select_device_configuration(); // 设备进入配置状态 device_enter_configured_state(); } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值