32 位ARM 嵌入式系统扩展USB 接口设计
采用PDIUSBD12 USB标准组件与S3C44B0X接口,减小了开发的时间、风险以及费用,是最快捷、最经济的方法实现ARM嵌入式系统扩展USB的解决方案之一。PDIUSBD12与S3C44B0X ARM7处理器的电路图见图2。因ARM7用存储器影射方法扩展I/O接口,一般按16bit方式寻址,所以U2的A0连到U1的Addr1引脚, 片选信号nGCS1的基地址是0x0200_0000。
本文引用地址:http://www.eepw.com.cn/article/151956.htm
3 ARM 端USB 设备程序
设备端程序主要完成:ARM BIOS 和ucLinux 的加载、启动通信进程、USB 控制器初始化、响应主控制器标准PnP 及其他命令、建立USB 端点(End point)逻辑通道、数据传输操作等功能,图3 是基于ARM 的USB 设备与PC 间音频通信的程序功能结构图。
操作USB 芯片的接口函数的宏定义为:
typedef unsigned short int U16 ;
#define pD12_CMD ( ( U16 *) 0x02000002 ) //指向D12 命令寄存器指针
#define pD12_DAT ( ( U16 *) 0x02000000 ) //指向D12 数据寄存器指针
#define D12WriteCmd( data ) (*p D12_CMD = (U16)(data) 0xff )
#define D12WriteData( data ) (* pD12_DAT = (U16)(data) 0xff )
#define D12ReadData() (* pD12_DAT 0xff )
4 音频码流USB 设备驱动程序
Windows2000 中各种USB 设备客户驱动程序结构框架基本相同,可以从Windows2000DDK 中获得USB 设备驱动程序范例代码,对范例代码作少量修改就可以满足特定功能需要。图1 显示了驱动程序各层间的数据传递关系,底层USB 主控制器驱动程序(USB Host Driver)由操作系统提供支持,设备驱动程序只需要对USB Host Driver 上传的I/O 数据包IRP 作出响应,并把要输出数据以IRP 形式下传给USB Host Driver 即可。
在ISO(实时型)模式下传输音频码流,USB 客户程序除了WDM(Windows Driver Model)驱动常规处理外,必须计算好带宽,并为驱动程序在非分页存储区内分配好环行缓冲区(Ringbuffer),以便USB 主控制器可以不间断输出实时数据。RingBuffer 的大小按下式
计算:
每帧字节数 × 每缓冲帧数 × 缓冲区数 ;
每传完一缓冲区,USB Host Driver 回调(CallBack)一次客户驱动程序,USB 带宽按每1ms 传送1 帧数据来分配,要实现8kHz 采样频率、8bits 编码的音频PCM 码流传输,帧数据包大小必须设为8Bytes,若设置4 个缓冲区交替工作,每缓冲区分20 帧传送, 则RingBuffer 的大小为640Bytes,那么USB 主控制器每20ms 的频率中断回调一次客户驱动程序是合适的。
驱动程序通过IoSetCompletionRoutine()函数给每个IRP 设置回调函数入口地址,每完成一个IRP 缓冲区数据传送操作,回调一次该地址指向的函数,以便把下一缓冲包数据压入到IRP 栈,直到全部数据流传送完毕或人为终止传送。
5 结束语
扩展USB 接口,大幅提升了32 位ARM 嵌入式系统数据通信的吞吐能力,有即插即用特性和多种数据传输模式,方案适合于嵌入式系统的多种应用。文章具体阐述了方案硬件、软件设计的关键问题,并讨论了如何分配USB 总线带宽,实现恒速音频PCM 码流传送,实验结果表明该方案能流畅地接收Windows2000 通过USB 接口输出话音编码信号,方案可行,具有较高参考价值
评论