1、通用串行总线数据传输陈青松 ,王 健(东南大学计算机科学与工程系,江苏 南京 210096)摘 要:数据传输与调度是关于USB研究的一个重要问题。从介绍USB 的体系结构开始,详细分析了USB各种类型的数据传输的特点及对系统的要求,继而剖析UHCI (由Intel提出的一套关于USB主机控制器及驱动程序的规范)给出的数据传输模型、主要数据结构与调度过程,以及 Linux实现该规范时所做的改进与面临的问题。关键词:USB; UHCI; Linux; 数据传输;调度中图分类号:TP334USB Data TransferCHEN Qing-song , WANG Jian( Dept. of Co
2、mputer Science UHCI; Linux; data transfer; schedule1 引 言USB,即通用串行外部总线,是 PC体系结构一种扩展的工业标准,因其普遍性、易用性、可扩展性的特征,在业界得到了广泛的支持和应用。作为一种外部总线标准,USB 的数据传输是一个极为重要的问题,而且十分复杂,实时性要求高,需要软硬件配合才能解决。对于软硬件的划分,目前有 UHCI和 OHCI两种规范。本文主要探讨 UHCI1.1规范对 USB数据传输的支持,Linux 内核中对该规范的实现,及对其实现过程的若干改进。2 USB系统及USB数据传输的基本概念2.1 USB体系结构USB是
3、 20世纪 90年代发展起来的一种“通用串行外部总线”,其体系结构可从以下两个方面来概括:物理总线拓扑与软硬件模块划分。从物理拓扑上看,USB 设备通过 USB主机控制器连接到PC或其他主机,集线器为 USB设备提供连接点。采取强行分层,以避免产生环形连接,由此 USB物理总线拓扑成为树型结构。 从软硬件功能模块上来看,USB 系统包括客户软件、USB 系统软件、USB主机控制器、USB 总线接口、USB 逻辑设备、功能设备等几个部分。其中系统软件需要提供驱动程序,以支持 USB主机控制器、USB 设备及客户软件,具体对应关系见图 1,该图也说明了以上各模块间的通信流。 客户软 件 功能设 备
4、U S B 系统设 备U S B 总线接 口U S B 系 统 软 件U S B 主机控制器主 机 互 连 物理 设备物理通信流逻辑通信流功能层U S B 设备层U S B 总线接 口层图 1 USB系统软硬件模块与通信流2.2 USB数据传输的基本概念USB的数据传输按速度分为低速(1.5Mb/S)、全速(12Mb/s)、高速(480Mb/S)三种。USB1.1支持低速和全速传输,USB2.0支持高速传输。按数据的性质则分为4种,其划分及特点阐述如下:控制型:突发的、非周期的、主机软件初始化的请求/响应通信,用于命令/状态操作。USB整个带宽的10(USB1.1)要保证用于此种传输,没有足够
5、多的控制型传输,这部分带宽方可用于其他类型。中断型:低频的、延时有限的通信。实质上USB设备不具备主动向主机发中断的能力,只能被动地接受USB主机控制器的查询。(USB主机控制器有向主机发中断的能力,这不属于USB数据传输范畴)。对USB系统的要求 交互类型 信包类型传 输类 型周期性可靠性实时性占USB总线带宽SETUP交互数据交互状态交互TOKEN信包数据信包握手信包等时型 中断型 90成块型 控制型 10 表1 USB数据传输类型及特点等时型:主机与设备之间周期的、连续的通信,数据必须以恒定的速率或在规定的时间内传输,所以USB要保证其带宽。USB整个带宽的90(USB1.1)要分配给中
6、断型与等时型传输(如果有足够多的周期性传输)。成块型:非周期的、大型包的突发通信,可以延时到带宽可用时执行。USB系统必须同时满足以上4种数据传输的各种要求(周期性、可靠性、实时性、带宽),并且从整体上要满足USB总线带宽的要求。表1综合了这4种传输对系统的要求(USB1.1)。为满足中断型与等时型传输的周期性、实时性的特点,USB支持时间帧(Frame)的概念(USB1.1支持1ms的帧,USB2.0支持125us的微型帧)。在90的USB总线带宽中(如果有足够多的等时型传输时),中断型和等时型传输得到执行,并且在每一帧(或者每几桢)中都得到执行,达到其周期性的要求。USB系统的传输分为若干
7、个交互,对于控制型传输,共有3种交互,分别为SETUP交互、数据交互(如果有需要的话)、状态交互。SETUP交互传递高层控制命令,数据交互传递与本次命令相联系的数据,状态交互传递与操作目标有关的状态信息。其他传输只有数据交互一种。每个交互又包括3个信包(等时传输只有2个信包),分别为传令信包、数据信包、握手信包,由软硬件配合执行,加上容错机制,可满足可靠性的要求。3 软件接口主机控制器驱动程序(USBHD)一般需提供如下的函数接口供客户软件调用:URB * USB_Control_Message( USB_DEVICE *dev, uint pipe,uint req_type,uint re
8、quest, uint wValue, uint wIndex, uint wLength,void * callback ) (USB_Data_Message与此类似)。URB(USB Request Block)是客户软件提交传输请求的基本单位。USBHD的上层软件将所有的URB组织为环形链表依次调度,下层软件则负责将每一个URB分解为若干交互(Transfer Descriptor:TD),并将这些交互插入相应的调度队列供执行。交互是执行的基本单位。一帧时间到达的时候(或出错时),USB主机控制器(USBHC)向主机发送中断,中断处理程序根据这一桢里交互执行的状态重新安排调度,客户软件
9、通过回调函数(callback)处理在这一帧中完成的URB请求。4 UHCI1.1的数据结构与传输调度UHCI是由Intel提出的一套关于USB主机控制器及其驱动程序的规范,这里探讨其支持USB数据传输的部分。主要是如何安排交互调度的问题。4.1 主要数据结构UHCI定义了若干数据结构以满足USB数据传输的要求,主要为帧指针(Frame List Pointer)数组、传输描述(Transfer Descriptor: TD)、队列头(Queue Head: QH)。帧数组共1024维,每个元素代表一帧,指向这一帧中需要执行的交互队列。USB主机控制器在每1ms的框架内执行一帧,下一个ms跳到
10、下一个帧,这通过硬件控制。第一个执行的队列是等时队列(如果有的话),每一个等时队列最后一个TD指向一个QH队列,QH队列每一个元素实际上只是一个真正得到执行的TD队列(中断型、成块型、控制型)的队列头。这些TD队列按照深度优先或者广度优先的规则执行。QH前两个域与主机控制器寄存器相关:Link指向下一个QH,相应地也就指向了下一个TD队列;Element指向本队列中的第一个TD,在特殊情况下(将两个TD队列合并时)同Link。TD前四个域也与主机控制器寄存器相关:Link:相当于“连接寄存器”,指向下一个TD的连接指针。Status:相当于“控制/状态”寄存器,表明TD的执行情况,其中TD_C
11、TRL_ACTIVE位指示在当前桢中该TD是否要执行,交互完成时,硬件自动将该位复位,TD_CTRL_IOC位指示当前桢结束时是否向中断发送中断请求。在中断服务程序中,如果完成的TD是周期性的,就将TD_CTRL_ACTIVE置位,使该TD在下一桢中仍然得到执行。Info: 相当于“命令寄存器”,其内容包括传输的类型与目标,实际上就是TOKEN信包的主体。Buffer: 指向用于发送或接受的缓冲区。这些与硬件相关指针的内容都是物理地址,主机按照物理地址链路调度执行,并根据状态变化,选择是否将TD从物理地址链路中脱链(因其周期性,等时型、中断型传输TD不脱链)。在TD执行之前,USBHD在处理U
12、RB时是按照虚拟地址将TD组成队列的,TD执行出错或者一帧执行完毕,产生中断,中断处理程序重新按照虚拟地址链路调整调度队列。UHCI定义的主要数据结构及交互调度见图3。帧数组基址寄存器 帧计数器基址 索引0 0帧 队 列帧指针帧指针Q TQ TQ TQ TT D T D T DQ H Q H Q H Q HT D T D T DT D T D T DT DT DT DT DT DT DT DT DT DT D帧指针帧指针水平方向水平方向队 列 头等时传输中断传输成块与控制传输队 列 头垂直方向图2 UHCI 1.1 主要数据结构与交互调度 4.2 调度的改进根据UHCI1.1的调度,中断传输在
13、每一桢中都会得到一次执行, 对于周期大于1ms的中断传输这会带来资源浪费。扩充TD数据结构,引入一个interval域,作为中断传输周期计数器。TD初始化时,interval域赋值为中断传输的执行周期;一桢执行完毕,中断服务程序将该域减1,如果该域变为0,将status中TD_CTRL_ACTIVE位置位, 使该TD在下一桢中得到执行, 并将interval域重新赋值为中断周期值。如果interval不为0,代表该TD执行周期未到,TD_CTRL_ACTIVE不置位(每一次TD完成,USBHC将TD_CTRL_ACTIVE位复位),在下一桢就不会得到执行。这样可以保证中断传输按指定的周期执行,
14、而相应的开销却很小。5 UHCI规范在Linux中的实现与改进Linux在实现UHCI规范时,将各种传输进一步细分, 将它们挂入各自的队列中供调度执行。5.1 Linux实现的USB传输调度0 21帧指针数组 S k e l t d 0 S k e l t d 1 S k e l t d 8 S k e l t d 2 S k e l q h 3 S k e l q h 2 S k e l q h 0 S k e l q h 1 T D T DT DT DT DT DT DT D T DT D T DS k e l t d 9 控制传输成块传输中断传输空处理中断传输骨架等时传输图3 Linux
15、实现的USB传输调度Linux实现的调度如图3所示。帧指针数组仍然代表1024个1毫秒的帧,每个表项都是一个指向等时传输TD队列的指针。每个等时队列中的最后一个TD指向其他队列(一开始没有等时传输,等时传输队列为空)。在QH队列之前,添加了一个skeltd数组(称作“中断传输骨架”),该数组每一个元素都是一个TD,这些TD都是一个中断传输TD队列的入口,而它们本身在调度时不执行。先假定帧指针数组都指向skeltd0,让其代表的中断传输队列在每一帧中都得到执行。如果帧的序列号为奇数,则将指针调整为指向skeltd1,这样,skeltd1所代表的中断传输队列每隔一帧都会得到一次执行,而skeltd
16、1的link域指向skeltd0,这样,skeltd0代表的中断传输队列在每一帧中都会得到执行。同理,如果帧序列号末两位为3,则让其指向skeltd2,使它代表的队列每3帧得到一次执行,而skeltd0,skeltd1代表的队列执行情况不变。余类推。最后,如果帧序列号末7位为127,则让其指向skeltd7,使它代表的队列每127帧得到一次执行。这样,skeltd指向的各TD队列就会在每1ms、2ms、4ms、128ms各不同的周期中得到一次执行。这样对于中断传输只要根据其周期插入不同skeltd所代表的队列中,便会在不同的周期中得到执行。Skelqh是控制型(分为低速LS和高速HS)、成块型
17、传输的骨架,分别指向各自的TD队列。skelqh3指向skeltd9,二者用于空操作,其目的是回收一帧中空余的时间。5.2 关于中断传输流量均匀问题的分析Linux引入“中断传输骨架”skeltd,可以解决不同周期的中断传输调度执行的问题,但不能解决流量均匀分配的问题。假设,有多个USB设备,中断传输的周期都为4ms,按照Linux的设计,这些中断只能在桢序列号末两位为3(即第3ms、7ms、11ms、)时执行,而好的调度策略应该是第一个中断传输在第3ms、7ms、11ms、时执行,第二个中断传输在第4ms、8ms、12ms、时执行。 而且对周期为57ms的中断传输,只能挂入执行周期为4ms的
18、队列中;对周期为915ms的中断传输,只能挂入执行周期为8ms的队列中 这都带来一定的资源浪费。Linux对于USB中断传输的处理略显僵化,相反UHCI规范则更为灵活。如果考虑到USB设备挂入USB系统的随机性,中断传输第一次执行所在的桢的序列号将是一个随即值,这在一定程度上解决了流量均匀的问题。另外,TD中interval域定义为周期的值,没有Linux中浪费资源的问题。5.3 关于等时传输流量均匀与实时性的处理 对于等时型也有流量均匀的问题。如果一个周期性传输包括多个交互,要尽量把这些交互分布到不同的帧中。等时传输以交互为单位挂入调度系统。首先查找第一个TD可以插入的帧;然后递加帧序列号(
19、以帧数组的大小1024为一个循环),插入下一个TD。这样等时传输可以均匀分布到不同的帧中。对于等时传输,USBHD一般需要把传输的单位分得较小。将整个流量分成N次传输,相应构造N个URB,并将这些URB连接成环,再分配N个缓冲区以接受数据。当有一个传输完成发生中断时,一方面USBHD向客户软件提交此次传输处理的结果;另一方面USBHD把这个传输从调度系统中脱链开来,同时将以前脱链的传输再提交回调度系统,与目前还在调度系统中的URB一起准备调度执行。这样的实现一方面可以较好地满足实时性要求,另一方面可以实现主机与USB系统并行处理。Linux实现的这种URB脱链及重新安排调度的流程可以优化。因为
20、TD的执行可以由控制位来决定,通过在主机中断服务程序中写TD.status的TD_CTRL_ACTIVE 位就可以控制URB的循环调度。6 结束语本文阐述了USB数据传输的基本特点及实现机制,分析了其中存在的若干问题,这对于开发USB应用软件与产品是极有必要的。参考文献1 Universal Serial Bus SpecificationRevision1.1Z.Compaq, Intel, Microsoft, NEC.September 23,19982 Universal Serial Bus Specification Revision2.0Z.Compaq, Hewlett-Pac
21、kard, Intel, Lucent, Microsoft, NEC, Philips. April 27,20003 Universal Host Controller Interface Design Guide Revision1.1Z.Intel Corporation. March 19964 周立功等 USB2.0与OTG规范及开发指南M.北京:北京航空航天大学出版社. 2004,95 王凯,陈泳章.通用串行总线(USB)数据传输模型J. 计算机工程与设计 2002,23(10):50-546 毛德操,胡希明 LINUX内核源代码情景分析M.浙江:浙江大学出版社. 2001,9作者简介: 陈青松(1979 ) ,男,湖北松滋人,硕士生,主要研究方向为嵌入式系统; 王 健,男,副教授,主要研究方向为嵌入式系统、操作系统。联系方式:陈青松 王健: 江苏省南京市东南大学计算机科学与工程系系统结构教研室 210096电 话: 02582031805,83792403 email: