l 引 言
目前,TI公司的DSP应用很广泛,随着DSP的功能越来越强大,片上外设种类及应用日趋复杂。传统的DSP程序开发包含两方面程序:即配置、控制、中
断等管理DSP片内外设、接口的硬件相关程序和基于应用的算法程序。这样的系统结构,应用程序与硬件相关程序紧密的结合一起,限制了程序的可移植性和通用
性,软件开发总要从零开始,存在诸多重复工作。一旦硬件平台有变化,往往与硬件程序捆绑一起的应用程序也需改动,代码的维护性和可移植性均不高。 通过建立硬件驱动程序的开发模式,可使上述现象得到改善。因此,本文介绍一种开发TI公司DSP片内及片外硬件外设驱动程序的方法,并以C5000 DSP的McBSP/DMA及TMS320C5509的USB驱动程序开发为具体对象,介绍这种方法的应用。
2 基于DSP/BIOS的IOM硬件驱动
在CCS应用环境中集成的实时操作系统DSP/BI-OS[1]中,硬件驱动程序最终以函数库的形式被封装起来,应用程序可不关心底层硬件外设的具体操
作,通过调用DSP/BIOS相关的标准API与不同外设接口。接口按统一标准定义,即在DSP/BIOS中创建并配置硬件设备驱动模块为IOM(I/O Mini-driver)模式。
IOM[2]是DSP/BIOS的设备驱动模块的一种接口方式,配置硬件设备驱动模块为IOM模式可在DSP/BIOS的图形化界面(GUI)中方便完
成。IOM模式将设备驱动程序分为两个层次:上一层是"类"驱动程序(class
driv-er),这部分程序负责对存储缓冲区管理、由DSP/BIOS各类标准的API函数与应用程序接口,与设备硬件无关。下一层是"迷你"驱动程序
(mini-driver),这部分程序集成了实际硬件相关的代码。IOM接口将"迷你"驱动程序与"类"驱动程序联系一起,包括定义I/O数据包
(IOM_Packet)以提交"迷你"驱动程序读写,定义功能函数包(IOM
Fxns)完成相关初始化,打开或关闭通道,提交I/O数据传输与控制等任务,确保"迷你"驱动程序与"类"驱动程序运行协调一致。 "类"驱动程序直接在应用程序中出现,并且根据数据输入/输出的处理方式不同,有相应"类"驱动程序。主要是3种:流输入输出型"类"驱动(SIO)、管道型"类"驱动(PIP)和通用输入输出型"类"驱动(GIO)。
其中,SIO"类"驱动由两部分组成:SIO模块和DIO适配模块(Adapter),前者负责创建通道、数据流输入/输出,DIO提供负责缓冲管理、
信号同步、将API及参数与下层"迷你"驱动程序接口;PIP"类"驱动由两部分组成:PIP模块和PIO适配模块(Adapter),前者创建管道、数
据管道输入/输出,PIO提供负责缓冲管理、信号同步、将API及参数与下层"迷你"驱动程序接口。GIO"类"驱动是一种通用输入输出接口,调用的
API函数,可通过阻塞线程读写数据,直接与"迷你"驱动通信。
SIO,PIP,GIO模块集成在DSP/BIOS中,SIO通道、PIP管道可在DSP/BIOS的输入输出模块图形化界面(GUI)中静态设置并创
建,也可以在应用程序中动态创建。DIO,PIO适配模块(Adapter)创建在DSP/BIOS的设备驱动模块图形化界面(GUI)中完成。
由上可见,"类"驱动程序均为标准的API函数,故编写驱动程序的重点是"迷你"驱动程序方面。"迷你"驱动通过创建统一接口标准的功能函数包(IOM
Fxns),应用程序就可以由DIO适配模块或PIO适配模块或GIO"类"驱动调用"迷你"驱动,控制底层硬件设备。这些统一接口标准的功能函数包括: mdBindDev:设备与"迷你"驱动绑定函数; mdControlChan:设备通道控制函数; mdCreateChan:设备通道创建函数; mdDeleteChan:设备通道删除函数; mdSubmitChan:按IOM数据包命令执行函数; mdUnBindDev:设备从"迷你"驱动释放函数。
IOM数据包是其中一关键数据结构,为IOM驱动程序内部数据的输入输出服务。应用程序本身不会涉及IOM数据包访问,是IO适配模块、PIO适配模块
或GIO"类"驱动通过他访问"迷你"驱动层,其中,数据结构的cmd项,即"类"驱动命令"迷你"驱动的mdSubmitChan功能函数执行硬件设备
的读写等操作。"迷你"驱动完成相应操作,通过回调函数后向上返回该数据包。
3 McBSP/DMA驱动程序开发 这是基于C5000系列DSP的McBSP和DMA硬件驱动开发。系统以
TMS320VC5410为CPU,
TLC320AD50C为音频编解码芯片,
TLC320AD50C与DSP的McBSP0通道接口,数据传输采用DMA方式。 在传统的软件开发结构中,应用程序一般通过DMA中断服务程序控制硬件设备及数据管理。
在本文推荐的软件开发结构中,硬件设备驱动程序与应用程序隔离开,他们之间通过DSP/BIOS的API接口,包括硬件设备初始化参数的传递。
具体开发过程如下:(1)IOM驱动程序
mdBindDev在DSP/BIOS启动时调用,具体完成硬件设备初始化参数传递、获取McBSP及DMA资源,McBSP及DMA的初始化参数用
CSL配置,注意McBSP使用的是通道O。mdCreateChan在应用层与硬件设备创建两个逻辑通道,即DMA接收、发送通道。分别设置初始化参
数。mdSubmitChan按IOM数据包数据结构的cmd项,命令"迷你"驱动执行向硬件设备的IOM写操作,即通过McBSP0输出数据。相应工程
编译链接生成驱动库函数,完成IOM驱动程序。(2)DMA/McBSP应用程序
在应用工程中,首先在DSP/BIOS配置工具中User-Defined
Devices项进行"迷你"驱动程序注册,命名为"co-dec"。属性如图3(a)所示。注册信息中设置了驱动程序的初始化函数、IOM函数包指针、
设备参数指针的名称。本应用采用IOM驱动程序的流输入输出"类"驱动(SIO/DIO),DIO适配模块与上述"迷你"驱动程序"codec''接
口,DIO适配模块在DSP/BIOS配置工具中添加,命名为"dio codec。
本应用选择DMA通道4,5,设置
TLC320AD50C的4个控制寄存器初始化参数,即"迷你"驱动程序注册信息的设备参数指针所指内容。
然后,应用程序通过调用DSP/BIOS的API,动态创建DMA/McBSP输入、输出通道,如:
SIO输人、输出通道均采用双缓冲管理。获取双缓冲资源,管理缓冲数据的工作,同样由SIO相关API完成,API的使用方法可参见参考文献中所列手册。
4 USB驱动程序开发
这是基于C5000系列DSP(TMS320C5509A)的USB硬件驱动开发。TMS320C5509A内部集成符合USB
2.0标准的全速模式USB接口。SIE[3](Serial Interface
En-gine)负责将数据按照USB物理电平信号串行转并行输入或并行转串行输出,并且具有错误校验机制。UBM(USBBuffer
Manager)负责数据缓冲管理,管理数据在SIE和缓冲RAM的输入输出,CPU或USB的DMA控制器在缓冲RAM收发数据。
本硬件驱动的软件开发结构与上述McBSP/DMA硬件驱动开发类似,上层为"类"驱动,即DSP/BIOS
GIO,SIO,或PIP模块,提供针对USB的"迷你"驱动的各种输入输出请求。"迷你"驱动是基于DSP/BIOS关于USB模块的CSL(Chip
Support Library),调用CSL的API完成底层硬件各种复杂操作。(1)IOM驱动程序
C5509 USB mdBindDev在DSP/BIOS启动时调用,完成USB初始化参数传递,中断向量设置,初始化USB模块; C5509
USB mdControlChan接受如SIOcontrol等"类驱动"命令,可复位USB数据通道,连接主机USB接口等工作;C5509
USB mdCreateChan创建某个USB端点的数据通道及配置数据传输方向;C5509 USB
mdSubmitChan负责USB数据流输入输出管理。(2)USB应用程序
在DSP/BIOS配置工具中User-Defined
Devices项进行"迷你"驱动程序注册,命名为"usb"。属性如图4(a)所示。本应用也采用流输入输出(SIO/DIO),DIO适配模块与上
述"迷你"驱动程序"usb"接口,DIO适配模块在DSP/BIOS配置工具中添加,命名为"dio_usb。
应用程序动态创建USB的某端点为输入、输出通道,如:
由上可知,应用层"类"驱动程序开发的通用性是很强的。
5 结 语 本文推荐的这种DSP硬件驱动开发方法,通过构建应用程序与硬件外设输入输出的统一数据接口,将接口代码层次化。当硬件设备改动后,应用程序可不做修改,应用程序的通用性、可移植性大大加强,硬件驱动程序也具有反复利用的特点。