if(!(inb(card->iobase CODEC_CMD_INT_STATUS)&0x80000000)) return;//识别中断类型
request_irq(irq,*handler,flags,PCI9656,*dev_id);//向系统注册PCI9656的中断
如果中断注册成功,则返回值IRQ_RETVAL为0,这时在/proc/interrupts文件中可以看申请成功的中断。在2.6内核下,request_irq和free_irq从sched.h改到了interrupt.h中定义。
synchronize_irq(irq);//中断同步
if(wait_event_interruptible(waitqueue,condition)>0) return;//判断中断等待使能
outb(intstat&card->iobase CODEC_CMD_INT_HLDCLR 2);//使能并行端口的中断报告
//系统响应PCI9656的中断,执行数据读写、寄存器访问等操作
free_irq(irq,*dev_id);//释放设备中断、I/O资源和缓冲区
5 实验与测试
我们设计了Makefile文件和一个简单的应用程序,在动态加载驱动程序后,对PCI9656开发板进行了大批量数据的读写实验。基于64位PCI总线和100MHz的时钟频率,我们对芯片的数据读写速率进行了采集,实验结果统计如图3所示。
从上图可以看到,在2.6内核下应用PCI9656作为总线接口芯片,数据的读写传输速率随着数据包的大小有大幅度的提高,这在工程应用中有很大的现实意义。
6 结束语
本文通过Linux2.6内核所提供的一系列标准函数调用接口,用C 语言开发了PCI9656的设备驱动程序,并在Fedora Core2平台下调试通过,能正确发送和接收各种大小的数据包。当通信的数据包大小为64KB时,DMA通道的读写速度最大可达1.8Gbps,能够很好的满足日益庞大的数据处理需要。同时,Linux操作系统源代码的开放性还能较好的保证数据存储运算和通信的安全性。
参考文献
[1]Alessandro Rubini & Jonathan Corbet,Linux Device Driver (3rd Edtion)[M],USA:O'Reilly & Associates Inc,2005
