关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > USB主机控制器的设计

USB主机控制器的设计

作者: 时间:2010-04-02 来源:网络 收藏

ML405板上的EZ-Host控制器工作在异步模式。因此opb_epc需配置为支持异步外设模式。这里使用PowerPC控制接口,因此EZ-Host工作于协处理器模式。并通过HPI接口与外设控制器opb_epc相连。

本文引用地址://www.cghlg.com/article/202547.htm

3 驱动程序设计
3.1 主机端的软件结构
Linux 主机驱动协议栈由3部分组成:USB驱动(HCD)、USB驱动(USBD)和各种不同的USB设备类驱动,如图2所示。


USB设备类驱动(如插入主机的U盘、鼠标、键盘等设备驱动)是最终与应用程序交互的软件模块,负责建立虚拟连接、配置,与设备进行通信,将数据集成一个USB请求块(URB),然后通过USB驱动(USBD)提供的编程接口将URB发送到USBD。USBD部分是整个USB主机驱动的核心。
USBD完成以下工作:USB设备的枚举和配置,根据需要装载或卸载设备驱动程序,向上为设备驱动程序提供编程接口,向下为驱动提供编程接口,实现与设备驱动程序、主机控制驱动程序的通信。
处于最底层USB驱动(HCD)是USB主机直接与硬件交互的软件模块。HCD作为底层硬件的驱动程序,一方面控制和管理底层硬件,负责将USB事务发送给USB主机控制器,并最终将串行数据发送到电缆上;另一方面为上层的USB系统软件提供统一接口HCI(Host ControllerInterface),将各种不同的HC映射到USB系统。HC一般都集成有Root Hub的功能,HCD也要实现Root Hub Port访问。
USBD部分由操作系统实现,一般不需要用户修改。USB设备类驱动,对于常用的设备Linux内核中有较成熟的驱动。针对特定的主机控制器硬件应该实现HCD部分,以解决基本的通信问题。故这里主要介绍EZ-Host主机控制器驱动(HCD)的设计。
3.2 EZ-Host主机控制器驱动(HCD)设计
开发过程主要针对EZ-Host主机控制器编写USB主机控制器驱动程序。该驱动程序是嵌入式Linux开发平台下USB协议栈和EZ-Host主机控制器的一个接口,其作用类似于Linux中由Intel制定的UHCI标准,其硬件设计比较简单,但软件较为复杂。
USB主机控制器的驱动(HCD)在USB子系统中的功能主要有:硬件初始化,为上层(USBD)提供调用接口,管理根Hub,完成数据传输以及中断处理。根据主机控制器驱动(HCD)在整个USB子系统中的功能,可将EZ-Host HCD分为HCD接口、HCD初始化、数据传输、中断处理、读写操作、主机协议等模块。HCD接口模块表现为一套API函数,通过这一套API函数使HCD与USBD进行通信。图3为EZ-Host主机控制器驱动模块结构。


1)初始化。该初到始化涉及到复位EZ-Host控制器,并将其初始化到一个已知的状态;初始化必要的USB数据结构并为其分配空间;注册USB host driver和USB host bus interface到USB host core;注册USB host core的中断服务程序;为每一个主端口建立一个虚拟根Hub,并且注册根hub到USBhost eore。2)中断处理。EZ-Host主控制器中断采用电平触发,当中断服务程序注册到USB子系统后,EZ-Host主控制器开始处理中断。3)传输数据。传输处理程序在初始化的过程中注册到USB主端子系统,它由USB host core唤醒并配置外围设备,发送块数据,或确认块数据的接收。4)接收数据。接收处理程序处理数据包的接收,它由中断处理程序唤醒。数据接收处理程序询问EZ-Host主控制器是否有接收错误,如果没有错误,则接收处理程序从EZ-Host主控制器的缓冲区中提取数据并将数据存储到一个数据结构,然后接收程序将数据传送到USB host eore,等待进一步处理。5)主机协议实现。HCD从Linux USB协议栈接收并解析USB请求,然后建立基于该请求的USB交互(transactions),该交互被合理调度安排并发送到USB总线上。
3.3 HCD的关键接口设计
实际工作过程中,应用程序通过文件系统接口访问相应的USB设备类驱动程序和USBD;USB设备类驱动程序则通过USBD提供的相关接口(USBDI)将数据请求包传递给USBD;USBD通过HCD提供的接口(HCI)进一步将数据包传递给HCD;HCD最终将数据发送到USB总线。
主机控制器驱动中,最重要的接口是主机控制器驱动HCD与USBD之间的接口。在Linux内核中,用usb_hcd结构体表示USBD接口,用来描述主机控制器(HC)的基本信息、硬件资源、状态描述和用于操作主机控制器的hc_driver等。其中usb_hcd中的hc_driver成员非常重要,它包括具体用于操作主机控制器的钩子函数。在Linux内核中,使用如下函数创建HCD:
struct USB_hcd*USB_create_hcd(const stroct hc_driver*driver,struct device*dev,char*bus_name);
struct hc_driver可看作USBD模块定义的需要底层主机控制器驱动实现的接口,通过实现这些接口,USBD可将更上层软件的请求传递给HCD以及HC,HC及HCD完成后,也会通过这些接口通知USBD。



关键词: USB 主机控制器

评论


相关推荐

技术专区

关闭