DSP

开发DSP硬件驱动程序的一种方法

2019-07-13 10:18发布

开发DSP硬件驱动程序的一种方法           行,雷 (四川大学电气信息学院 四川 成都610065) l       传统的DSP程序开发包含两方面程序:即配置、控制、中断等管理DSP片内外设、接口的硬件相关程序和基于应用的算法程序。这样的系统结构,应用程序与硬件相关程序紧密的结合一起,限制了程序的可移植性和通用性,软件开发总要从零开始,存在诸多重复工作。一旦硬件平台有变化,往往与硬件程序捆绑一起的应用程序也需改动,代码的维护性和可移植性均不高。   通过建立硬件驱动程序的开发模式,可使上述现象得到改善。因此,本文介绍一种开发TI公司DSP片内及片外硬件外设驱动程序的方法,并以C5000 DSPMcBSP/DMATMS320C5509USB驱动程序开发为具体对象,介绍这种方法的应用。   2 基于DSP/BIOSIOM硬件驱动 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函数,可通过阻塞线程读写数据,直接与"迷你"驱动通信。SIOPIPGIO模块集成在DSP/BIOS中,SIO通道、PIP管道可在DSP/BIOS的输入输出模块图形化界面(GUI)中静态设置并创建,也可以在应用程序中动态创建。DIOPIO适配模块(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系列DSPMcBSPDMA硬件驱动开发。系统以TMS320VC5410CPUTLC320AD50C为音频编解码芯片,TLC320AD50CDSPMcBSP0通道接口,数据传输采用DMA方式。在传统的软件开发结构中,应用程序一般通过DMA中断服务程序控制硬件设备及数据管理。在本文推荐的软件开发结构中,硬件设备驱动程序与应用程序隔离开,他们之间通过DSP/BIOSAPI接口,包括硬件设备初始化参数的传递。 具体开发过程如下:  (1)IOM驱动程序 mdBindDevDSP/BIOS启动时调用,具体完成硬件设备初始化参数传递、获取McBSPDMA资源,McBSPDMA的初始化参数用CSL配置,注意McBSP使用的是通道OmdCreateChan在应用层与硬件设备创建两个逻辑通道,即DMA接收、发送通道。分别设置初始化参数。mdSubmitChanIOM数据包数据结构的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通道45,设置TLC320AD50C4个控制寄存器初始化参数,即"迷你"驱动程序注册信息的设备参数指针所指内容。 然后,应用程序通过调用DSP/BIOSAPI,动态创建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(USB Buffer Manager)负责数据缓冲管理,管理数据在SIE和缓冲RAM的输入输出,CPUUSBDMA控制器在缓冲RAM收发数据。   本硬件驱动的软件开发结构与上述McBSP/DMA硬件驱动开发类似,上层为""驱动,即DSP/BIOS GIOSIO,或PIP模块,提供针对USB"迷你"驱动的各种输入输出请求。"迷你"驱动是基于DSP/BIOS关于USB模块的CSL(Chip Support Library),调用CSLAPI完成底层硬件各种复杂操作。  (1)IOM驱动程序 C5509 USB mdBindDevDSP/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",属性如图4(b)所示。 应用程序动态创建USB的某端点为输入、输出通道,如: 由上可知,应用层""驱动程序开发的通用性是很强的。 5 本文推荐的这种DSP硬件驱动开发方法,通过构建应用程序与硬件外设输入输出的统一数据接口,将接口代码层次化。当硬件设备改