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



我有一个关于字符驱动程序的问题。使用GPIO引脚与硬件设备通信的字符驱动程序,包括中断接口。驱动程序的"release()"方法缺失。功能元素应该按什么顺序排列?

。删除cdev并注销设备

B。免费GPIO资源

C。释放IRQ资源

D。注销主辅修号

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

谢谢

根据我的理解,正确的顺序应该是C, B, A和D:-)。解释:需要释放IRQ,因为gpio引脚(用作中断引脚),IRQ号是从传递这个gpio引脚到gpio_to_irq中获得的,在此之后,只有你可以继续释放gpio的东西。说明删除cdev进入图片后要对哪个文件进行操作,设备节点info(dev_t, 32位无符号整数。-其中12位用于major no,其余20位用于minor no)和minor number info (minor no的起始值和请求的minor no的个数)相关联。最后,继续并注销驱动程序。

实际上,有些可以release()函数中完成,而有些必须module_exit()函数中完成。这完全取决于你在哪里做什么。

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

module_exit()函数与module_init()函数相反。假设您正在使用CDev API,在模块init函数中,您必须首先使用alloc_chrdev_region()register_chrdev_region()注册主/副号码(D),然后使用cdev_init()cdev_add()将CDev添加到系统中。

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。

最新更新