老古开发网首页
导航:老古开发网首页文章索引文章分类技术文章→[USB嵌入式主控制器设计]
| -文章搜索 - 最新文章 - |

USB嵌入式主控制器设计

发布时间:2002年1月21日 点击次数:915
来源:   作者:
 

USB嵌入式主控制器设计
Design embedded USB host controller


赛普拉斯半导体公司高级应用工程师 Mark Schultz
摘 要:介绍了μPSD32XX单片机的主要特性和开发环境,结合税控器的设计开发,介绍其软硬件的实现方案。
关键词:μPSD3234;税控器;模块化设计;API函数
引言
---从推出至今,USB技术的应用范围主要局限在电脑和外设领域,但在嵌入式系统中,USB的巨大发展潜力还有待挖掘,其典型应用包括KVM接线器、数码相机、PDA、打印机、机顶盒和手机,任何具有处理器的电子设备都可以成为一个嵌入式USB主机。
在一个基于PC的系统中,USB操作需要三种主要元件,即主控制器(常常是PCI子系统的一部分)、USB堆栈和USB类驱动器。主控制器是集成母板芯片组的组成部分,目前的大多数PC都在母板上实现了USB2.0。USB堆栈包括用于母板上的驱动器以及UCHI(通用主控制器接口)、OHCI(开放式主控制器接口)和USB驱动程序(usbd.sys)。
在一个嵌入式USB系统中,主要元件与基于PC的系统相似,即:嵌入式主控制器硅片、具有OHCI堆栈的实时操作系统(RTOS)和专用驱动器。
主控制器有多种选择,有的具有处理器,有的则基于寄存器。RTOS可以从销售商那里直接购置。最佳方法是选择能够配套运行的处理器和RTOS,然后再在其上增加应用代码。如果不使用真正的RTOS,则可编写简单的操作系统,以履行RTOS的功能。后文将介绍一个这样的例子。
当在PC上实现USB时,可用资源十分充足,包括512MB的存储器、20GB~60GB的硬盘驱动器和工作频率为2GHz(或更高)的微处理器。此外,Windows、MAC OS和Unix等操作系统对USB提供完善的支持,还有许多从事基于PC的USB应用和设备驱动器研究的工程师。
另一方面,嵌入式系统通常具有容量小于64KB的存储器和工作频率范围为12MHz~33MHz的处理器,且没有硬盘驱动器。由于USB对于嵌入式系统而言是一个比较陌生的领域,因此只有少数工程师拥有相关的经验。本文将着力说明如何开发能够控制许多USB设备的嵌入式USB主机系统。

USB基础知识
先简要介绍USB的传输类型。现在共有4类USB传输,即控制型、中断型、等时型和成批型。中断、等时和成批型传输用于完成点对点数据移动。控制型传输用于识别和设置将能够与USB主机进行通信的设备。之后,这些设备将能够采用中断、等时和成批传输来进行数据传递。
图1对这些传输类型进行了图示。每个USB事务处理都是由0个或更多个级(通常为1级或3级)所组成的,这些级是“设置”(Setup)、“数据”(Data)和“确认”(Acknowledge)。每一级包括两个阶段或三个阶段。这些阶段为“权标”(Token)、“数据”(Data)和“信号交换”(Handshake)。
权标级采用一个PID(分组ID),定义的PID有16种,包括图1中所示的设置、输入和输出分组ID。图1示出了控制读取传输,此类传输将被用来收集有关一部连接设备的信息,控制型传输实现了一个设置级。正如其名称所表示的那样,该级被用来对一部设备进行设置。USB需要做出响应的设置请求有很多。这里的要点是,控制型传输将被嵌入式USB主机用来对连接设备进行识别和初始化,这些事务处理的细节由固件的驱动器层固件来控制。
与控制型传输不同,成批和中断型传输只有一级。这一级具有常见的三个阶段,即:权标、数据和信息交换。等时型传输与成批和中断型传输相似,只是其没有信息交换阶段。
人机接口设备(HID)和USB设备用于实现用户与PC之间的互动。鉴于人机接口的低速特性,因而只需采用低速USB。低速USB具有800KB/s的数据吞吐量,这对应于每次传输8字节和每秒传输100次(每10ms进行一次传输)。用于从HID设备获取数据的传输类型为中断型传输。
来自键盘和鼠标装置的数据被格式化为“HID报表”。用于一个键盘和鼠标的HID报表分别为8字节和4字节。键盘和鼠标HID报表的内容如表1所示。
HID报表的数据可由应用层来分析。在本例中,HID数据将从系统串行端口送出,并通过HyperTerminal来查看。

案例研究
下面将说明如何构建一个用于控制键盘和鼠标的简单嵌入式USB设计方案,该设计还能够控制一个USB集线器,从而可在仅采用嵌入式USB主芯片的单个端口的情况下同时对键盘和鼠标提供支持。该设计的另一个好处是其还能够支持组合式键盘/集线器。
该实现方案采用了一个基于寄存器的USB主控制器和一个基于RISC、用于控制主IC的处理器。RISC处理器的代码只需通过改变硬件专用层便能够容易地移植到另一种处理器。

程序流程
程序流程应按下述步骤来进行。在上电复位时,微处理器将对所有的寄存器、计数器以及全部的设备结构进行初始化,随后将进入一个按下列方式执行操作的环路中。
1.检查主USB端口所发生的任何状态变化(设备的插入或移除)。
2.检查所有连接集线器的端口的状态变化(在集线器端口上进行设备的插入或移除)。
3.检查任何其他连接设备,以编制HID报表。
检查主USB端口的状态变化只需通过主USB控制器的简单寄存器读操作便可完成。如果发现一部设备,则其将被计数。如果变更值表示设备已被移除,则采用“0”来改写对应的设备数据。
检查连接集线器的变更值是利用一个从集线器至主机的中断型传输来完成的。如果有设备被添加或移除,则与上一种情况一样对其进行计数。
在检查设备的插入和移除的同时还有两项附加任务。如果一部连接设备是一个集线器,则必须检查其端口,以察看它们是否也包含设备。如果被移除的设备是一个集线器,则所有与其相连的设备也都必须被移除。下面的固件流程部分将对这些程序做进一步概述。
对来自连接HID设备的数据进行检查也是通过中断型传输来完成的,中断传输的间隔时间为10ms,传输的定时将交由应用代码来处理。

固件概述
用于该设计的固件是以一种分层方式来提供的,该分层结构对应于上述模型(应用->驱动器->硬件)。
应用层定义了三种功能,即FindDevices(发现设备)、GetData(获取数据)和SendData(发送数据)。FindDevices对新连接的USB设备进行定位和计数,并删除被移走的设备。GetData从连接设备获取HID报表。SendData将数据发送至设备。由于没有理由将数据写至键盘或鼠标,因此,该功能在这里似乎并不需要。然而,在一种情形下这种功能却有可能被派上用场,那就是为控制Caps、Scroll和NumLock LED而将数据写至键盘。由于并不是所有的键盘都支持用于此类写操作的中断端点,因而将需要为此采用一个控制型传输。
驱动器层实际上被分为两个区。上部驱动器层功能包括各种与连接外设、端口和集线器的识别、配置和状态检查相关的任务。
CheckHub负责执行主机与集线器之间的中断型传输,以检查端口变化。FindUSBDevices命令采用控制型传输来对设备进行初始化和计数。SetAddress向设备分配USB地址,而SetConfiguration则负责设定当前的设备配置。该驱动器层中的其他关键命令包括GetHidDesc和GetHubDesc,它们分别获取用于人机接口设备和集线器的设备描述符。同样,GetHubStatus和GetPortStatus命令用于获取集线器或端口的当前状态。PortFeature命令用于设定或清除诸如Port Enable(端口使能)、Port Power(端口电源)或Port Reset(端口复位)等集线器端口功能,而GetDesc功能则用于从USB设备获取设备描述符。
下部驱动层包括VendorRequest命令,该命令用于对控制型传输的设置相进行配置。EP0Xfer负责控制一个控制型传输的三个级,而InterruptXfer则用于控制单级传输。
在硬件层上,UsbXfer命令对USB主控制器进行写操作,以控制一个USB传输的单个级。所有的硬件专用寄存器读和写代码也都位于该层之上。

数据结构
除了设备驱动器之外,还必须定义数据结构。如果嵌入式解决方案允许连接8部设备,则需要维持一系列8部设备结构。设备结构中的数据将按下列方式写入。
设备类型可由其类代码来识别。同一类型的设备可通过其销售商ID和产品ID来区分。协议字段用于确定HID报表的大小,4字节用于鼠标,8字节用于键盘。
设备由其USB地址来区分。USB地址是用于对与某个USB端口相连的所有节点进行寻址的逻辑值。在这里所描述的键盘/鼠标实例中,设备的数量必须被限制为8个。这意味着地址的数量也将被限制为8个,再加上一个每个未初始化设备都必须响应的缺省地址—地址“0”。一旦某个逻辑地址被分配给一部设备,固件将采用SetAddress命令来向该设备发出通知,告知其应对用于该地址的事务处理做出响应。

固件流程
设置一旦完成,第一项任务便是检查增加或移除的设备。从USB主端口开始,端口变更中断可被用来察看在至USB主机的连接线路上是否发生了改变。如果有变化,则可对增加的设备进行计数,或对移走的设备进行逻辑删除。此后,如果仍有一部设备与USB主端口相连,则需进行检查,以确定其是否为集线器。这可以通过检查设备结构中的bClass字段来完成。如果该字段为一个“9”(用于HubClass),则检查其端口的变更状态。如果集线器报告一个状态变化,则执行下列操作。
确定端口变更是设备插入还是移除。如果是插入,则需对设备进行计数。如果端口变更是由设备移除所致,则需清除相关联的设备结构。如果被移除的设备是集线器,则还需将其所有设备全部予以清除。
当发现一部新设备时,需对其进行计数。计数过程包括询问设备的描述符并设定其逻辑地址。以下为对一部设备进行计数所需处置的一系列事项。
1.采用GetDecriptor命令来从逻辑地址“0”获取设备描述符,一个未初始化设备将对地址“0”做出响应。
2.采用SetAddress命令来设定设备地址,利用GetNextAddr功能来获取下一个可用地址。GetNextAddr将仔细查看一系列设备结构,并采用第一个具有一个地址“0”的设备结构。
3.采用GetDescriptor命令和逻辑地址来获取设备描述符。
4.获取配置描述符的8个字节。这里有一个长度字段,它将通告设备所具有的总描述符数据量。
5.再次获取配置描述符,此次采用由第4步得到的新长度字段。利用这一组完整的描述符数据,固件便能够将信息确定为各种不同的描述符结构类型。这一过程可通过填充诸如端点的数量和类型等剩余设备信息的方法来完成。
6.如果类代码表示的是一部HID设备,则调用GetHidDesc命令,以获取一些HID专用描述符。此外,这里需要用于键盘的、有可能采用了特殊字符集的国家代码。
7.如果类代码表示的是一部集线器设备,则执行以下操作。
a.采用GetHubDesc来获取集线器专用描述符;
b.采用GetHubStat来获取集线器的状态信息;
c.采用PortFeature来清除所有集线器端口上的端口连接;
d.采用PortFeature来给所有的集线器端口加电;
e.采用PortStatus来获取所有集线器端口的状态信息;
f.给设备结构做标记,以表示该设备为集线器。
当一部设备被移除时,固件将执行下列任务。
1.将该设备结构从设备阵列中清除,这样该地址就可以被另一部设备重新使用。
2.如果被移除的设备是集线器,则需移除所有与其相连的设备。查看设备阵列,并清除每一部具有一个与集线器设备的逻辑地址相同的bParentAddr的设备。
用于对插入设备和移除设备进行计数的流程如图2所示。
固件的数据收集部分比计数部分简单得多。对于数据收集,察看设备结构阵列,并搜寻每一个具有非零逻辑地址字段的结构和一个与HID设备对应的类代码“3”,调用InterruptXfer功能并将逻辑地址作为一个参数来传送。如果该功能返回选中状态(TRUE),则缓冲器中存在数据。对于键盘,将存在8字节数据(见上面的HID报表部分)。对于鼠标,数据字段的长度将为4字节。HID报表被显示于HyperTerminal之上。其他实现方案可以将该数据传送至一个应用程序,以便进行处理。

结论
与PC相比,为嵌入式系统添加USB功能需要相应的计算资源和USB主系统开发经验,但目前已有多款现成的USB主IC可被用来实现该功能,USB主堆栈和实时操作系统既可以采购,也可以自行开发,开发人员能够非常简便地添加USB功能。
本文讨论了仅通过采用一个附加IC(无需使用第三方软件)来实现嵌入式USB主机的方法。赛普拉斯公司的嵌入式USB主机能够在不增加编码处理的情况下对HID设备和集线器提供支持。目前,该系统最多能够支持8部设备和两个集线器层,代码长度约为10KB,所需做的全部工作就是增加用于一个完整系统的专用代码。

 

欢迎进入老古论坛进行讨论
[技术文章] 相关文章:
基于FPGA的生物芯片扫描仪的位置检测
简介:
基于FPGA的生物芯片扫描仪的位置检测 Design of position spector in biochip scanner based on FPGA 中国科学院光电技术研究所 严航 唐小萍 摘 要: 基于FPGA实现了生物芯片扫描仪中X-Y二维扫描台的位置检测电路,解决原有电路存在的计数误差和误清零问题,提高系统的可靠性。详细阐述了FPGA中辨向细分、可逆计数器,接口电路的设计实现,并给出了仿真波......

使用SignalTap II逻辑分析仪调试FPGA
多波长锁模激光器在WDM光纤通信中的重要应用
难以衡量的失败成本
Cirrus Logic公司新款音频系统处理器芯片
集成功能强劲的32位DSP及CobraNettm界面

RDMA技术分析
数字电视向我们走来
铁电存储器及其关键集成工艺
采用MPC5200实现高速视频探测的车内应用
用ADIsimADC选择高速数据转换器
 
下一个:[技术文章]FPGA在软件无线电中的应用
简介:
FPGA在软件无线电中的应用 The application of FPGA in Soft Defined Radio Altera公司技术市场经理 Joel A. Seely 摘 要 :本文结合各种实际测试介绍了罗德与施瓦茨公司的手持式频谱仪R&S FSH在发射机与天馈线测试、无线电干扰查处以及电磁兼容诊断测试中的应用。 关键词 :发射机与天馈线测试;无线电干扰定位;电磁场强......
 

上一个:[技术文章]采用PIC16X711实现基于维根码的信息钮序列号

老古开发网版权所有 2006年9月 asp.Net V2.0 设计:老古
页面缓存:10分钟 执行时间:16毫秒