阅读:1383回复:7
字符设备驱动问题
我写了一个字符设备的驱动,其中用register_chrdev()注册了一个字符设备,而且定义了open(),release(),ioctrl(),read(),write()这几个函数。将这个模块加入到内核中后,用cat /proc/devices可以看到这个设备,但是编程时无法用open()打开他。
请问诸位,有人知道这是为什么吗? |
|
|
沙发#
发布于:2003-02-08 10:54
我写了一个字符设备的驱动,其中用register_chrdev()注册了一个字符设备,而且定义了open(),release(),ioctrl(),read(),write()这几个函数。将这个模块加入到内核中后,用cat /proc/devices可以看到这个设备,但是编程时无法用open()打开他。 1)可以在/proc/modules里看到你的模块吗? 还有你指出了其相应的设备吗? 比如/dev/yourchardevice,查一下其MAJOR号是否被用了, 还有权限的问题。 如果这些都没问题, 而且你的open定义也没什么问题, 你应该可以打开这个设备的。 2)你是动态的(/sbin/insmod)注册这个设备还是静态的(编译到内核)? 当然这个不太影响接口的一些表现。 你在用open打开时提示的错误是什么呢, 最好能描述一下, 这样回答你的问题也比较容易些 |
|
|
板凳#
发布于:2003-02-08 11:28
引用:
1)可以在/proc/modules里看到你的模块吗? 还有你指出了其相应的设备吗? 比如/dev/yourchardevice,查一下其MAJOR号是否被用了, 还有权限的问题。 如果这些都没问题, 而且你的open定义也没什么问题, 你应该可以打开这个设备的。 2)你是动态的(/sbin/insmod)注册这个设备还是静态的(编译到内核)? 当然这个不太影响接口的一些表现。 你在用open打开时提示的错误是什么呢, 最好能描述一下, 这样回答你的问题也比较容易些 ―― 我是动态加载这个模块的,并且可以看到我加载的这个模块,major号是系统分配的(254),open的定义应该没有任何问题,编译过程中没有任何warning。还有root用户的权限应该没有什么问题吧。 另外“还有你指出了其相应的设备吗? ”是什么意思,我不太明白,谢谢。 |
|
|
地板#
发布于:2003-02-08 13:24
引用: 既然你的设备主设备号是254, 那么应该用mknod建立一个设备节点(inode), 这个文件建立在哪个目录底下无所谓, 一般建在/dev下。 比如可以建立一个这样的设备文件 mknod /dev/yourdefinedname(随便叫个什么名字就可以了, 因为打开是用主 设备号和次设备号) c 254 10 然后你可以写一个程序来检测: int main(int argc, char *argv[]) { int fd; if ((fd = open(\"/dev/yourdefinedname\", O_RDWR)) == -1) { perror(\"open\"); exit(1); } return 0; } 注意不能打开的提示是什么 |
|
|
地下室#
发布于:2003-02-09 17:31
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2003-02-12 14:27
hometown,分数已经给出。
另外,还有一些问题想向大家请教。 我用request_irq()申请了4号串口中断,但是中断服务程序只响应了一次,此后当中断条件再次被满足的时候,中断始终无法得到响应。 不知道是什么原因,请指教。 |
|
|
6楼#
发布于:2003-02-12 15:12
hometown,分数已经给出。 响应一个中断是硬件和软件共同完成的(见INTEL的手册, 要建立中断向量表, 设置ldtr, 同时还与全局描述符表相关, 比较的复杂, 这里不详细说了)。 一般PC机的4号中断是给串口1使用的。 因此如果你的设备不是连到这个地方, 那么一定在硬件电路上有一个中断线和INTEL8259A(后来的CPU已经把这个晶片集成在一起了)的4号中断相连, 或者还有种可能是因为有的总线支持好几个中断, 连到这个总线上的设备可以选择某个中断(实现软件选择), 这就要看具体的硬件要求了。 根据你说的情况, 我认为有以下几个方面值得考虑 1)4号中断是否已经被占用。 linux可以让不同的设备共享一个中断, 它通过确定不同的设备来调用不同的中断例程, 软件实现是采用同一中断挂上不同的中断例程来完成的 2)硬件上你的设备的中断线是否和8259A的中断线相连 希望这些对你有所帮助~~~。 |
|
|
7楼#
发布于:2003-02-12 15:33
我要驱动的正是一个串口设备,我在dos下也写过类似的东西,而且运行良好。
|
|
|