写一个linux驱动platform格式中断代码包含probe函数
时间: 2024-12-24 22:32:03 浏览: 9
在Linux内核编程中,编写一个平台格式的中断驱动通常涉及到`struct platform_device`和`struct platform_driver`结构体,以及几个关键函数,包括probe、remove等。下面是一个简化的示例,展示如何编写probe函数,该函数在设备注册时被调用:
```c
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
static int my_probe(struct platform_device *pdev)
{
struct resource *res;
irqreturn_t ret;
// 获取中断资源
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!res) {
dev_err(&pdev->dev, "Failed to get interrupt resource\n");
return -ENODEV;
}
// 初始化中断处理
dev = pdev->dev.parent; // 获取设备实例
irq_init_name(res->irq, dev_name(&dev)); // 设置中断名称
// 配置中断处理器
if (request_irq(res->irq, handle_my_int, IRQF_DISABLED, dev_name(&dev), dev)) {
dev_err(&pdev->dev, "Failed to request interrupt\n");
return -EBUSY;
}
// 设置中断处理函数,并允许中断
dev_info(&pdev->dev, "Interrupt probe successful, irq %d enabled\n", res->irq);
enable_irq(res->irq);
return 0;
}
static struct platform_driver my_driver = {
.probe = my_probe,
.driver.name = "my_driver",
.driver.owner = THIS_MODULE,
};
module_platform_driver(my_driver);
/* 在这里添加remove函数的实现,当设备移除时会调用 */
static void my_remove(struct platform_device *pdev)
{
// 清理中断资源
disable_irq(platform_get_irq(pdev));
free_irq(platform_get_irq(pdev), NULL); /* 或者直接使用 resource->irq */
// 可能还需要其他清理工作...
}
//
阅读全文