曙海教育集团论坛VxWorks专区VxWorks技术讨论区 → VxWorks实时操作系统的USB驱动程序原理与分析


  共有6794人关注过本帖树形打印

主题:VxWorks实时操作系统的USB驱动程序原理与分析

美女呀,离线,留言给我吧!
wangxinxin
  1楼 个性首页 | 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:青蜂侠 帖子:1393 积分:14038 威望:0 精华:0 注册:2010-11-12 11:08:23
VxWorks实时操作系统的USB驱动程序原理与分析  发帖心情 Post By:2010-11-17 10:38:17

1、问题的提出
   

        通用串行总线(USB)作为一种中高速的数据方式,已经很普遍地应用于外设与主机的通信中。VxWorks是当今十分流行的实时操作系统,在通信、国防、工业控制、医疗设备等嵌入式实时应用领域。很多VxWorks系统中都有USB设备,可是关于USB的驱动实现并没有相关的资料可以参考,给实际工作带来了难题。本文通过详细地分析VxWorks下的USB驱动栈,具体提出了其实际应用的方法,为USB在应用VxWorks的嵌入式系统的开发扫清了技术障碍。

        2、VxWorks简介
   

        VxWorks是WindRiver公司开发的具有工业领导地位的高性能实时操作系统(Real Tim Operation System,RTOS)内核,具有先进的网络功能。VxWorks的开放式结构和对工业标准的支持,使得开发人员易于设计高效的嵌入式系统,并可以很小的工作量移植到其它不同的处理器上。

        作为一种先进的实时操作系统,它具有以下特点:

        可裁剪微内核结构。 
        高效的任务管理:
        ① 多任务,具有256个优先级。
        ② 具有优先级排队和循环调度。
        ③ 快速的、确定性的上下文切换。 
        灵活的任务间通讯:
        ① 三种信号灯:二进制、计数、有优先级继承特性的互斥信号灯。
        ② 消息队列。
        ③ 套接字(Socket)。
        ④ 共享内存。
        ⑤ 信号(Signals) 
        微秒级的中断处理。 
        支持POSIX 1003.1b实时扩展标准。 
        支持多种物理介质及标准的、完整的TCPIP网络协议。 
        灵活的引导方式。支持从ROM、flash、本地盘(软盘或硬盘)或网络引导。 
        支持多处理器并行处理。 
        快速灵活的l/O系统。 
        支持MS-DOS和RT-11文件系统。 
        支持本地盘,flash,CD-ROM 的使用。 
        完全符合ANSI C标准。 
        多个系统调用。

        3、 USB驱动程序的结构概述

        图1提供了一个USB主驱动栈结构的简单概括。图2显示了USB主驱动栈的各模块之间的功能联系。

图片点击可在新窗口打开查看

 图1 USB主驱动栈结构简单模型

图片点击可在新窗口打开查看

                                      图2 USB主驱动栈各模块之间的功能联系
   

       在栈的最底部是USB主控制器(USB HC, 即USB Host Controller), 这是主系统中控制每一个USB设备的硬件部分。
   

       目前,市场上主要有两大类USB主控制器,一种是支持由ime1公司最先提出的通用主控制器接口(Universal Host Controller Interface,简称UHCI),另一种是支持由微软、康柏和国家半导体公司联合设计提出的开放主控制器接口(Open Host Controller Interface,简称OHCI)。硬件厂商一般根据这两个规范设计他们的USB主控制器。
   

       对于每一类型的主控制器都有一个与硬件独立的USB主控制器驱动(Host Controller Driver,简称HCD)。WindRiver提供了两个驱动:usbHcdUhciLib (UHCI 主控制器库)和usbHedOheiLib (OHCI主控制器库)。USB主驱动(USB host driver,简称USBD)和HCD之间的接口允许一个或超过一个的底层主控制器。而且,WindRiver的USBD能够同时连接多个USB HCD。这样的设计特点可以使开发者建立复杂的USB系统。
   

       USBD是在HCD之上的与硬件独立的模块。USBD管理每一个与主机相连的USB设备, 向更高层次提供了可与USB设备通信的路径。它还负责自动处理USB电力管理以及USB带宽管理。而且,USBD还管理USB hub,Hub功能是一个驱动能否对USB正确操作的评价之一。因此WindRiver的USBD设计者要使USBD透明地处理hub的功能。这意味着,USBD 还能处理USB hub和设备的动态插拔。
    USB Client模块在USB主驱动栈的顶端。USB类驱动(USB Class Driver)是Client模块的典型例子。USB类驱动负责管理连接到USB上的不同类型的设备; 它们依靠USBD来提供与每个设备的通信路径。USB client模块的其他例子就是那些利用USBD与USB设备通信的应用程序。

       4、 USBD驱动详解
   

       这一部分将要描述USBD(USB Host Driver)的典型应用。例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性。这部分是VxWorks下USB驱动的核心。

       4.1 初始化USBD:分为两步

       (1)必须至少调用一次函数usbdInitialize()。在一个给定的系统中,usbdlnifialize()初始化内部USBD数据结构,并依次调用其它USB驱动栈模块的入口。usbdinitialize()可以在启动时调用一次,也可以对每一个设备各调用一次。USBD 自己记录了调用usbdInitialize()(‘+’)和usbdShutDown()(‘-’)的次数。只有大于等于1时才是真正初始化了,而等于0是关闭了。

       (2)用USBD 的lisbdHedAttaeh()函数来把至少一个HCD连接到USBD上。这一过程既可以在VxWorks启动时,也可以在运行时把HCD 连接到USBD 上去。后一种机制可以支持“热插拔”,而不用象前一种那样需要重新启动。

       4.2 HCD的连接(attaching)与断开(detaching)
   

       当HCD连接到USBD 时,调用者为usbdHedattaeh函数传递HCD执行入口(表HCD_EXEC_FUNC)和HCD连接参数(HCD attach parameter)。USBD用HCD FNC ATYACH 服务请求依次激活HCD的执行入口,传递同样的HCD attach参数。
   

       需要强调虽然可以改变用HCD定义的参数,但是最好不应该有所改变。对于WindRiver提供的UHCI和OHCI的HCD,HCI attach参数是一个指向结构PCI_CFG_HEADER (定义在pciConstants.h) 的指针。

       该结构用UHCI和OHCI主控制器的PCI配置头来初始化,而HCD用这个结构中的信息来定位,管理特定的主控制器。典型的,调用者用usbPeiClassFind ()和usbPciConfigHeaderGet()来得到想要的主控制器的PCI配置头- 这两个函数定义在usbPciLib 中(stubUsbarchPciLib.h中)。如果有UHCI或OHCI要连接到USBD,就要调用这些函数来获得每一个主控制器的PCI_CFG_HEADER。然后利用usbdHedAttaeh来激活已鉴别出的每一个主控制器。
   

       注意:底层BSP可能不支持USB的HCD断开,因为当中断向量表重新使能时,如果还应用的是过期的向量表,会导致错误。

       4.3 启动顺序
   

       必须在所有USBD函数前执行函数usbdInitialize()。存在以下两种调用方式:
(1)传统的“启动”初始化。执行顺序与其意义如下:
a.usbdInitialize();
b.usbdPciClassFind():定位一个USB主控制器;
c.usbdPeiConfigHeaderGet():读USB主控制器配置头;
d.usbdHedAttaeh():连接HCD,将其作为特定的主控制器:
e.调用USB class driver初始化入口点;
f.USB class driver调用usbdlnitialize()。

      


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

VxWorks实时操作系统的USB驱动程序原理与分析








签名