- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
DSP/BIOS中的IO设备驱动编程技术
2 低级设备驱动(LIO)
LIO(Low Level I/O)是一组基于DSP/BIOS设计的API函数。它由控制函数、I/O缓冲区管理函数、信令函数组成,如表1所示。应用程序可以通过LIO函数控制一个或多个外设通道。
表1 LIO API函数
LIO函数不考虑数据的转送方向,也就是说仅执行输出设备、仅执行输入设备和能执行输入、输出的设备执行的是同样的函数。输入与输出之间的主要不同点是传送到缓冲区队列函数的参数意义不同。既然所有其它的操作都是同样的,大多数控制代码能在单个驱动程序中被所有通道共享。
2.1 总体设计、设想和命名规范
所有的驱动程序函数都不能设置成全局中断。驱动程序应不影响全局中断使能标记的状态,仅影响由它控制的外设所能触发的中断所对应使能标记的状态。这样可以阻止一个驱动程序与其它驱动程序或应用程序争夺CPU资源。
为了避免由不同驱动程序使用同一函数名引起的命名空间冲突,也为了改变驱动程序而不需再编译应用程序代码,可以通过函数表访问驱动程序函数。用这种方式,仅需要为每个驱动程序定义一个外部符号。这种符号有其命名规范。此命名规范通过接线板、在片外设、LIO接口等来区分。如包含应用程序注释的源代码为TI TMS320VC5402 DSK的AD50音频编解码器执行基于DMA的驱动程序,驱动程序函数表名是DSK5402_DMA_AD50_TI_ILIO。
设备驱动程序支持的各通道半双工(输入或输出)通道。每个函数对应一个通道变量。一个能执行输入和输出的物理设备,如连接到音频编解码器的DSP串口,可通过两个半双工通道(一个输入,一个输出)来访问。一个驱动程序支持多少个物理设备和通道依具体实现而实。一般一个驱动程序应能控制一个物理设备,此设备可能有多个通道。通道号与物理设备通道的映射执行时确定。通道号应约定从0开始。对I/O设备,一般约定偶数号为输入,奇数号为输出。
2.2 三类函数
LIO接口中有三类函数:控制函数、缓冲区和队列管理函数、信令函数。
2.2.1 控制函数
控制函数用来实现设备的启动、关闭和控制。其初始函数为驱动程序保存资源(物理外设和内存)。它使用结构指针作为可选变量,此结构是一种设备的特殊变量结构。
2.2.2 队列管理
假定每个设备至少有一个用来传送数据的缓冲区。许多设备(如McBSP和DMA)带有允许双缓冲的缓冲队列。图1是一个有三个存储单元的LIO驱动程序,驱动程序中有:由外设填满或清空的缓冲区"todevice"(到设备)队列,将传送的缓冲区返回到应用程序的缓冲区管理程序的"from device"(来自设备)队列和当前传送数据的缓冲区。在虚线框里的认为是在驱动程序里面。当前传送数据的缓冲一般由外设寄存器控制,如DMA源寄存器或目标寄存器,在图1中画在"外设"中。含硬件队列(如DMA重新如载寄存器)的设备也会含一个或多个存储单元用业存储指针为以后传送用,此队列为"to device"队列。能包含缓冲区指针的第三个存储单元是"from device"队列,在驱动程序中为一变量。当设备准备传送缓冲区时,缓冲区从输入队列传送到外设寄存器。这些缓冲区然后移到输出队列以完成传送,作为对CPU中断的响应。
PutBuf()将缓冲区从应用程序传送到驱动程序的输入队列。GetBuf()从输出队列得到缓冲区。IsEmpty()和IsFull()返回输入队列、输出队列的状态。如果输入队列满,因为无空间装新缓冲区,调用putBuf()会返回错误代码。若IsFull()返回false,接下来可调用putBuf()。如果IsFull()返回true,但若在IsFull()返回true和调用putBuf()之间完成传送,则调用putBuf()也可能会成功。
2.2.3 信令
如图1所示,当传送结束一般会触发CPU中断。此中断会使应用程序将传送的缓冲区转移到输出队列,然后调用calback()传到驱动程序。Callback()应向应用程序发信号告知传送完毕。
来源:电子技术应用
上一篇:大唐移动MSC
POOL解决方案
下一篇:基于DSP的FIR数字滤波器的实现