rs232转usb驱动for server 2008_采用USB控制器实现USB主机功能的设计研究

通用串行总线(USB)接口具有简单灵活、高带宽、易于扩展和热插拔等优点,它目前已成为数码设备的标准接口之一,小到 U 盘、MP3,大到数码相机、打印机,USB 接口的身影无处不在。但我们目前所使用的 USB 移动设备多为 USB 的外设(Device) , 比如 USB 的移动硬盘、USB 接口的数码相机,一般只能在 PC上使用,即只能通过 PC 实现文件和数据的交换。

业界和用户的需求呼唤 USB 主机的嵌入式化,因此在嵌入式系统中实现 USB 主机功能成了 USB 设计领域的热点之一。

迄今为止,嵌入式 USB 主机的最大市场和增长点在移动消费电子设备领域, 比如 PDA 与 USB 记忆棒传递数据、MP3 之间传递歌曲、数码相机连接打印机等。

嵌入式 USB 主机也逐渐用于工业测控领域,用来实现数据的采集和交换。原来数据采集和交换大多是使用软盘、串行接口(RS232/RS485)或以太网等方式。软盘存储容量小、可靠性差,而串行接口或以太网都需要布线施工,接入成本大,而且不具备移动性。现在,越来越多的嵌入式系统采用通过 USB 总线连接的测控设备。

USB 控制器 ISP1161 简介

一个 USB 系统一般由一个 USB 主机(HOST)、一个或多个 USB 集线器(HUB)和一个或多个 USB 设备节点(NODE)组成。USB 协议规定了 USB 主机与 USB 设备的主从关系,所以 USB 接口产品的应用离不开 USB 主机的开发。USB 主机是包含 USB 软件驱动和 USB 主机硬件功能接口的计算机系统实体。USB 主机硬件是指 USB 主机控制器,它规定了 USB 主机硬件接口,因而在设计 USB 协议栈时必须了解相关的 USB 主机控制器规范。

针对嵌入式系统应用的 USB 主机控制器规范是康柏、微软、松下等公司提出的 OHCI(开放式主机控制器接口)标准。

飞利普公司的 ISP1161 芯片支持 OHCI 标准,它是一个符合 USB2.0 全速规范的单片主机控制器和设备控制器。ISP1161 可以仅作为主机控制器或设备控制器使用,也可以同时作为主机和设备控制器使用。

ISP1161 可分为四大功能模块:

1)主机控制器模块:实现主机控制器的功能。提供两个下行端口,每个下行端口都有自己的过流检测输入管脚和电源转换控制输出管脚。

2)设备控制器模块:实现设备控制器的功能。提供一个上行端口,有其自身的 VBUS 检测输入管脚。

3)微处理器接口模块:两个 USB 控制器共用一个微处理器总线接口,它们有相同的数据总线,I/O 地址不同。它们也有各自的中断请求输出管脚和独立的 DMA 通道。

4)电源调整和上电复位模块:除了可以软件复位外,还可以通过 RESET_N 管脚实现硬件复位。ISP1161 只接受 5V 或 3.3V 的电压,当输入 5V 电压时,电源调整器会将其调整为 3.3V。

ISP1161 主机控制器子模块的功能框图示于图 1,主机控制器的下行端口可与任意一个符合 USB 规范的 USB 设备和包含 USB 上行端口的 USB 集线器相连。类似地,设备控制器的上行端口可与任意一个符合 USB 规范的 USB 主机和包含 USB 下行端口的 USB 集线器相连。

9873f4d7b86fbcf510fd20f840ac54fd.png

相关嵌入式应用系统的架构

本文涉及的嵌入式系统是一个指纹验证系统,其总体结构如图 2 所示。系统采用英特尔公司的 32 位 400MHz 微处理器 PXA255 以满足指纹识别系统计算量大的需要,PXA255 具有丰富的外围接口,如:LCD 控制器、串口、CF 卡接口、USB 客户端口,但没有 USB 主机控制器。此外,硬件平台还包括存储模块、数据采集模块、USB 模块、网络通信模块和调试及下载接口模块,系统总体结构框图如图 2 所示。

825e2bc624f5faa25fdab9679c907bdf.png

32 位微处理器 PXA255 中央处理器结合一个 51 单片机完成对整个系统的控制操作。

8M 的 FLASH 和 32M 的 SDRAM 用作存储模块。

具有 USB 设备接口的富士通公司指纹传感器芯片 MBF200 实现对指纹数据的采集和转换。

通过 USB 主机接口实现嵌入式系统与 USB 设备——MBF200 之间的通信。

鉴于该指纹验证系统要实现网络化,因而配置了 CF 接口无线网卡。

通过 PXA255 本身的串口控制器与 PC 通信,用于调试和下载 Windows CE 镜像文件。

人机交互用于显示运行结果和注册 / 增删指纹数据。

对于 PXA255 处理器而言,ISP1161 类似于一个具有 16 位数据总线的存储设备。ISP1161 工作在并行 I/O(PIO)模式,只占用两个 I/O 端口和微处理器两个内存空间。微处理器用两根地址线 A0 和 A1 来读写 ISP1161 内部寄存器和 FIFO 缓冲 RAM。地址线 A0 用来选择传输命令数据:A0=1,处理器访问 ISP1161 的命令端口;A0=0,处理器访问 ISP1161 的数据端口。地址线 A1 用来选择主机控制器或设备控制器模式:A1=0,切换至主机控制器模式;A1=1,切换至设备控制器模式。本系统中 ISP1161 和 PXA255 的硬件接口如图 3 所示。用可编程 I/O 模式实现数据通信,即 ISP1161 的数据总线经总线驱动接到 PXA255 的数据总线 D[0:15],A0 和 A1 分别接到 PXA255 的 A1 和 A2 以实现主机和设备、命令和数据端口的选择。I/O 口地址的完全解码包括芯片选择信号 CS 及地址线 A1 和 A0。I/O 口的访问方向由 RD 及 WR 信号控制:当 RD 为低时,微处理器从 ISP1161A1 数据口读取数据;当 WR 为低时,微处理器向指令端口写入一个指令,或向数据端口写入数据。

0b18597ad1859f9ecccdbb87aaf4e005.png

USB 主机软件设计

系统的软件平台是微软公司的 Windows CE。

ISP1161 软件模型

USB 主机软件系统包括通用串行总线驱动程序(USBD)、主机控制器驱动程序(HCD)和客户端软件。客户端软件是应用代码或 USB 类驱动程序。USBD 和 HCD 共同用作 USB 主机堆栈。USBD 以 I/O 请求包的形式指定某一特定通道传输数据,并把请求分解成多个事务。HCD 与 ISP1161 之间以 PTD(Philips Transfer Description)的形式进行通信。I/O 请求包的数据在底层被打包成 PTD 的格式后再与 ISP1161 进行通信。

ISP1161 只提供了一部分符合 OHCI 标准的寄存器,而其硬件是支持 OHCI 标准的。所以为使它完全符合 OHCI 标准,我们设计时在系统内存中定义一套完全符合 OHCI 规范的操作寄存器和 HCCA 控制器通信区,软件读写其中数据,以软件模拟硬件来实现完整的 OHCI 规范,并按照 OHCI 规范的要求,在系统内存中维护了一套完整的数据结构,以完成对主机控制器初始化、状态读取并收集 USB 主机与设备通信的详细信息。

ISP1161 的数据传输模式

ISP1161 提供了 HC 控制和状态寄存器、ATL 缓冲区和 ITL 缓冲区。其中 HC 控制和状态寄存器包括一套可操作的符合 OHCI 的寄存器(32 位)和一套 ISP1161 特定的寄存器(16 位)。通过对相应寄存器的操作,主机控制器驱动程序就可以完成对主机控制器初始化和配置工作。ATL 缓冲区和 ITL 缓冲区用来实现 USB 系统支持的四种不同数据传输:控制传输、批量传输、中断传输和实时传输。ITL 是实时传输的缓冲的 FIFO,而 ATL 是 USB 其它三种类型传输的缓冲 FIFO。

ISP1161 数据传输的具体过程为:硬件初始化完成后,调用 HCD 的 MakePTDdata 函数在系统存储器中以 PTD 数据结构定义一块数据缓冲区。再调用 SendPTD 函数发送 PTD 数据,其中的 WritePTDtoATL 函数将数据复制到 ATL 或 ITL 缓冲区。通过 ISP1161 硬件扫描 ATL 或 ITL 缓冲区以实现与 USB 终端设备进行通信。

硬件扫描过程就是把数据发送到总线上,以硬件扫描 ATL 缓冲区为例:当 HCD 通过 HcTransferCounter 寄存器向 ATL 缓冲区写入 HcATLBufferPort 寄存器指定的字节数时,主机控制器硬件开始扫描 ATL 缓冲区;当操作完成后,HcBufferStatusPort 寄存器中的位 ATLBufferFull 被置位,ATLBufferFull 位从逻辑 0 到逻辑 1 的跳变使硬件开始扫描 ATL 缓冲区内的 PTD;当 ATLInt 中断产生时,表明硬件停止扫描 ATL 缓冲区,HcBufferStatus 寄存器中的位 ATLBufferDone 被置位,HCD 又可以访问 ATL 缓冲区了。相关的部分伪代码如下:

#define hccport base_address | 0x02

#define hcdport base_address

#define CMD_RD 0x00

#define CMD_WR 0x80

void SendlPTD(UINT16 *pPTDdata){ // pPTDdata 指针指向 PTD 数据内容;

WritePTDtoATL(pPTDdata, 16); // 把 PTD 数据写入 ATL 缓冲区,16 为写入数据字节数;

do {ReadPTDfromATL(pPTDdata, 72); // 从 ATL 缓冲区读取 PTD 数据,72 为读取的字节数;

bfAcTIve = (*pPTDdata) & PTD_ACTIVE; // 检查有效位,PTD 结束后主控器将把该位清零。

}while(bfAcTIve != 0)}

void WritePTDtoATL(UINT16 *pPTDdata, UINT totalbytes){

WriteHCR_UINT16(IDX_HcTransferCounter, databytes);// 向 HcTransferCounter 寄存器写入要传输的字节数;

*hccport = IDX_HcATLBufferPort | COM_WR; // 向 ATLBuffer 端口写入写命令;

DisableInterrupts; // 禁止所有中断;

for (UINT m= totalbytes; m》0; m -=4 ){ // 为了维护 PTD 数据在 ATL 缓冲区中的结构,采取每四字节循环

*hcdport = * pwPTDdata ++; // 的方式;

*hcdport = * pwPTDdata ++; }

EnableInterrupts;} // 使能中断;

void ReadPTDfromATL(UINT16 * pPTDdata, UINT totalbytes){

WriteHCR_UINT16(IDX_HcTransferCounter, totalbytes);

*hccport = IDX_HcATLBufferPort | COM_RD;

DisableInterrupts;

for (UINT m= totalbytes; m》0; m -=4 ){

* pwPTDdata ++ = *hcdport;

* pwPTDdata ++ = *hcdport; }

EnableInterrupts;}

数据结构链表的处理

在 HCD 将 PTD 从系统内存复制到 ATL 或 ITL 缓冲区之前,HCD 必须通过集合数据结构来建立和追踪 PTD。HCD 的责任是追踪所有已连接设备的每个端点的属性,如端点最大封包大小、端点地址和该端点从属的设备地址。另外,HCD 必须管理每个端点新的 PTD 的产生和已经完成的 PTD 的处理。所以使用一个有效的数据结构体系可以加快主机控制器的操作。本设计实现的数据结构类似于 OHCI 中定义的数据结构,如图 4 所示。此数据结构由三部分组成:三种类型端点的队列(控制传输端点、批量传输端点和中断传输端点)、每种端点的一个 PTD 列和一个完成队列。每个列队由一个全局指针指定,这个全局指针保持队列中第一个端点(EP)队列头的地址。每个 EP 队列头指向一个 PTD 列。一个 PTD 列保留着等待被主机控制器处理的 PTD。在控制、批量和中断传输中,PTD 被复制到 ATL 缓冲区。一旦 PTD 被放入 ATL 缓冲区,主机控制器就在下一帧中处理该 PTD。

407183b9e5002c1754bc9ad09f483773.png

结束语

在 USB 主机端功能实现后,我们又开发了 USB 设备——指纹传感器 MBF200 的驱动程序,并按照规定要求实现了指纹数据的采集和传输。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值