C64x系列DSP/BIOS中设备驱动程序的设计
Uns bufcnt; /* 未处理的缓存数目 */
IOM_TiomCallback cbFxn; /* 回调函数 */
Ptr cbArg; /* 回调函数参数地址 */
}ChanObj,*ChanHandle;
3.3 I/O请求发送函数
微型驱动中的I/O请求发送函数(mdSubmitChan)用来处理IOM_Packet包中的命令字段。根据不同命令字段,微型驱动将处理命令或返回错误信息(IOM_ENOTIMPL)。
微型驱动支持的命令字段有:IOM_READ、IOM_WRITE、IOM_ABORT和IOM_FLUSH。微型驱动创建的输入通道由IOM_READ命令来执行输入任务,创建的输出通道则由IOM_WRITE命令来执行输出任务。要放弃或者刷新已经发送的I/O请求,可以使用IOM_BORT或IOM FLUSH命令。当放弃时,I/O请求包队列中的所有输入输出请求都将被放弃。当刷新时,所有的I/O输出包顺序执行,而所有的输入I/O包都被放弃。
3.4 中断服务函数
微型驱动的中断功能就是去处理外部设备的触发事件,例如周期性的中断。中断通常是表示外设采样完数据或者处理完数据,也可以用于为DMA提供同步信号,微型驱动必须处理这些中断。通常微型驱动中的中断服务函数ISRs必须完成以下功能: 出列IOM_Packet请求;设置下一次传送或服务请求;调用类驱动的回调函数以保证和应用程序同步,并返回IOM_Packet。
3.5 设备控制函数
微型驱动支持的控制操作因不同的外部设备而异。IOM定义了一些通用的控制代码供驱动程序调用。特定设备独有的控制代码必须自己编写,其特征值必须大于128(IOM_CNTL_USER)。目前IOM支持的通用的控制代码有:
IOM_CHAN_RESET:将创建的通道实例重新恢复到初始状态。
IOM_CHAN TIMEDOUT:当应用程序或类驱动超时时,此控制代码将进行超时操作。例如,一个超时的IOM_Packet,如果没执行回调函数,可能会被返回类驱动。
IOM_DEVICE_RESE:外部设备重新恢复到初始状态,它将影响为这个外部设备创建的所有通道实例。
微型驱动支持的控制代码和控制操作必须告诉使用微型驱动的应用程序开发者,特别要注明该代码的针对对象(是针对通道实例还是针对设备实例)。例如:改变外设波特率的控制代码,必须注明是针对某个通道或者所有通道的,否则容易给应用程序带来错误。
4 类/微型驱动模型驱动应用实例——C64x系列DSP/BIOS中PCI设备的驱动
4.1 微型驱动的设计与编写
(1) 设计mdBindDev的部分程序代码:
static Int mdBindDev(Ptr *devp,Int devid,Ptr devParams)
{
……
QUE_new(&device.hiShPrioQue)/*户建立IOM包队列*/
QUE_new(&device.lOwPrioQue);
……
《C64x系列DSP/BIOS中设备驱动程序的设计(第4页)》