Char设备驱动程序使用中断--linux

时间:2013-05-31 07:23:41

标签: linux-device-driver

我有一个关于char驱动程序的问题。 使用GPIO引脚与硬件设备通信的char驱动程序,包括中断接口。 缺少驱动程序的“release()”方法。 函数元素应该放在什么顺序?

一个。删除cdev并取消注册设备

B中。免费的GPIO资源

℃。释放IRQ资源

d。非注册人主要/次要号码

“release()”方法中的顺序是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

根据我的理解,正确的顺序看起来像C,B,A和D :-)。 说明:需要释放IRQ,因为gpio引脚(用作中断引脚),IRQ号是通过将此gpio引脚传递给 gpio_to_irq 而在此之后只有你可以去提前释放gpio的东西。之后删除cdev进入图片文件操作,设备节点信息( dev_t,32位无符号整数。其中12位用于主要no,剩余20位用于次要no )和次要号码信息(次要没有起始值以及有多少次要求)被关联。最后继续并取消注册驱动程序。

答案 1 :(得分:0)

实际上,其中一些可以release()函数中完成,其中一些必须module_exit()中完成功能。这完全取决于你在哪里做的事。

首先,一些术语:在模块加载insmod时调用module_init()。相反的函数是module_exit(),当使用rmmod卸载模块时调用该函数。当用户进程尝试使用open()系统调用打开设备文件时调用open(),并且在打开设备文件的进程(以及同时)调用相反的函数release()从原始进程分支出来的所有进程都调用文件描述符上的close()系统调用。

module_exit()函数与module_init()函数相反。假设您正在使用CDev API,在模块初始化函数中,必须首先使用alloc_chrdev_region()register_chrdev_region()注册主要/次要编号(D),然后再将cdev添加到具有cdev_init()然后cdev_add()的系统。

理所当然地,当调用module_exit()时,你应该以相反的顺序撤消你所做的事情;即先使用cdev_del()删除cdev,然后使用unregister_chrdev_region()取消注册主要/次要号码。

module_init()功能的某个时刻,您可以通过request_mem_region()& ioremap(),然后是request_irq()的IRQ资源。另一方面,您可能请求open()函数中的GPIO资源和IRQ资源。

如果您在module_init()函数中请求这些资源,那么您应该在module_exit()函数中释放这些资源。但是,如果您在open()中执行此操作,则应跟踪设备文件打开的进程数,以及所有进程释放设备文件后,释放release()函数中的资源。

同样,无论您请求资源的顺序如何,通常您应该以相反的顺序释放资源。但是,我会说,在释放IRQ资源之前释放内存资源(在你的情况下是GPIO资源)几乎总是不正确的,因为IRQ很可能想要与硬件通信,无论是在上半部分还是在下半部处理程序。

总之,顺序取决于您首先如何实现驱动程序来请求资源,但是,如果您像我一样实现驱动程序,那么通常在release()中执行C然后执行B,然后在module_exit()中执行A,然后执行D.