写一个驱动,并注册Linux内核的中断
时间: 2023-06-19 20:06:31 浏览: 137
以下是一个简单的驱动程序示例,它将注册一个中断,当中断请求发生时,将打印一条消息到内核日志中:
```c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
MODULE_LICENSE("GPL");
irqreturn_t irq_handler(int irq, void *dev_id)
{
printk(KERN_INFO "Interrupt %d occurred\n", irq);
return IRQ_HANDLED;
}
static int __init my_driver_init(void)
{
int irq = 1; // 中断号
int result;
printk(KERN_INFO "My Driver: Initializing\n");
// 注册中断处理程序
result = request_irq(irq, irq_handler, IRQF_SHARED, "my_driver", &irq_handler);
if (result)
{
printk(KERN_ERR "My Driver: Failed to register interrupt handler\n");
return result;
}
printk(KERN_INFO "My Driver: Registered interrupt handler for IRQ %d\n", irq);
return 0;
}
static void __exit my_driver_exit(void)
{
int irq = 1; // 中断号
printk(KERN_INFO "My Driver: Exiting\n");
// 解除中断处理程序
free_irq(irq, &irq_handler);
printk(KERN_INFO "My Driver: Unregistered interrupt handler for IRQ %d\n", irq);
}
module_init(my_driver_init);
module_exit(my_driver_exit);
```
在该示例中,`request_irq` 函数用于注册中断处理程序,参数包括中断号、中断处理程序、中断标志、驱动程序名称和一个指向中断处理程序的指针。`free_irq` 函数用于解除中断处理程序的注册。在这个示例中,中断号设为1,中断处理程序为 `irq_handler`。当中断请求发生时,`irq_handler` 函数会被调用,并打印一条消息到内核日志中。
要编译和加载此驱动程序,需要在Linux内核源代码目录下进行以下操作:
```bash
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
insmod my_driver.ko
```
加载驱动程序后,可以使用 `dmesg` 命令查看内核日志中的消息。要卸载驱动程序,可以使用以下命令:
```bash
rmmod my_driver
```
阅读全文