驱动入门求助

各位高手,我准备写ISA数据采集卡的驱动程序,但是不知从何入手,我简单看了帮助文档的resource manager部分,但是看不大懂,我理解其中只提到用户进程和resource manager之间的C/S关系,而且resource manager和硬件之间的关系,我没看出来。

1.请问硬件的寄存器IO口和中断是通过什么和resource manager联系的呢?

2.除了resource manager这部分看哪些文档对驱动有帮助呢?

3.帮助中的DDK部分,有没有用,是不是只是面向特定的驱动程序的开发工具?

谢谢!

resource manager不是一个驱动程序所“必需”的。一个设备驱动,只是将用户的要求进行硬件操作而已。或者是用户的数据,通过硬件传出去。或者是从硬件上传来的数据怎么样还给用户。这些,你也可以定义自已的驱动<->用户程序介面来完成。Resource Manager只是给出一种通用的实现方法。

打个比方,用户进程可以write()到你的驱动程序,resource manager保证你会得到用户要写的数据。至于如何通过寄存器IO,如何接收中断,则都是你自己的事了。比方说中断,你可以写自己的ISR,然后调InterruptAttach(),也可以自建一个Channel,Connect它以后,用一个发到这个Connection的Pulse来 InterruptAttachEvent().

DDK介绍了特定的驱动程序的大致构造,但是具体到某一个硬件,需要读写什么样的寄存器,什么时候会发生中断等,你要找硬件的编程手册才行。

感谢您的回复!您的意思,综合我看的资料,我这样理解,首先要对硬件有充分的了解,如寄存器地址及操作,中断设置等;其次,要通过学习resource manager这种通用的编写驱动规范来与用户进程打交道即通过dispatch层接受连接和I/O消息,用resmgr层来处理I/O消息;与硬件打交道就要靠resmgr层具体的I/O处理函数来实现。不知道这样看对不对?但我还有疑问:

ISA硬件的基地址和跳线设置好了,QNX怎样来识别和检测ISA卡呢?

如果检测到了,通过I/O函数,是否就可以对寄存器来操作?

首先,忘掉资源管理器。数据采集卡就是从硬件得到数据,然后存在内存里(最后传给用户程序)对不对?把这段程序先写出来,确定你能够从硬件得到合理的数据,存在你的内存里。然后再考虑怎么传给用户程序的问题。

我的理解,ISA的“识别和检测”就是读写已知的寄存器,看看可不可以读到合理的状态数据。没有别的非常可靠的“检测”方法。

你的驱动可以假设硬件已经存在了,直接开始读写寄存器。没有什么很特殊的,就是直接用in8(), out16()什么的就行了。记得在main()里,在使用io函数前,调用一下ThreadCtl(_NTO_TCTL_IO, 0)以获得io特权。

如果你能把这部份完成了,用资源管理器把数据传回给用户就容易多了。

我明白你的意思了, 先把卡插上,地址中断搞清楚。QNX就可以通过in8(),out16()来访问端口,即采集数据了。至于资源管理器是可用可不用的,完全可以抛开自己编程来读取内存中的数据来处理!如果用那它用户程序就可以以标准的形式来与硬件交互!非常感谢您的解答!如果我测试成功,会把这部分所用函数和心得发出帖子!再次谢谢!

我有个问题请教一下:
如果是PCI 或者PXI的数据采集卡,可以 直接in8 out8吗? 还有如果可以直接in out 还要写驱动做什么呢. 用in out 操作也挺简单的, 应该比写相应的驱动容易多了.

所谓写驱动,就是利用in out 来实现资源管理器的相关部分, 为用户提供一个统一的接口了,不知道我的理解对不对, 呵呵

对。

in/out用来操作硬件,资源管理器则是为用户程序提供一个标准接口。这样一个,或是几个用户程序,都可以通过标准的open()/read()/write()来操作硬件。

Thanks xtang!
那么一个采集卡有可能多个程序同时使用吗, 想不出具体的应用情况, :laughing:
如果同时使用,是不是写驱动的时候要考虑一些读写,写写互斥。 其他还有什么吗? :slight_smile: 我该看一看采集卡驱动相关的资料了 :sunglasses: