在 Android 项目开发中,经常需要编写 Linux 设备驱动程序,现以红外传感器驱动程序为例,介绍如何从零开始编写 Linux 设备驱动程序。
1、在平台 .dts 文件增加红外传感器设备节点:
infrared: infrared {
compatible = "mediatek,infrared";
};
2、在项目 .dts 文件添加红外传感器添加属性,包括电源、配置和中断等GPIO:
&infrared {
compatible = "mediatek,infrared";
/* 中断配置 */
interrupt-parent = <&pio>;
interrupts = <123 IRQ_TYPE_EDGE_FALLING>;
/* 电源 GPIO */
gpio_infrared_pwr = <&pio 121 0>;
/* 配置 GPIO */
gpio_infrared_config = <&pio 122 0>;
/* 中断 GPIO */
gpio_infrared_int = <&pio 123 0>;
status = "okay";
};
3、红外传感器驱动程序实现芯片上电、参数配置、中断处理、数据读取和消息上报等功能,其总体框架如下:
static irqreturn_t infrared_interrut_handler(int irq, void *desc)
{
disable_irq_nosync(infrared_irq);
... // 数据读取和上报
enable_irq(infrared_irq);
return IRQ_HANDLED;
}
int infrared_irq_registration(void)
{
... // 省略部分代码
request_irq(infrared_irq, infrared_interrut_handler, IRQF_TRIGGER_FALLING, "infrared", NULL));
enable_irq_wake(infrared_irq);
return 0;
}
static int infrared_probe(struct platform_device *pdev)
{
... // 请求 GPIO,芯片上电,配置参数等操作
infrared_irq_registration(); // 中断注册
return 0;
}
static int infrared_remove(struct platform_device *pdev)
{
... // 省略部分代码
return 0;
}
static const struct of_device_id infrared_of_match[] = {
{.compatible = "mediatek,infrared"},
{},
};
static struct platform_driver infrared_driver = {
.probe = infrared_probe,
.remove = infrared_remove,
.driver = {
.name = "infrared",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(infrared_of_match),
},
};
static int __init infrared_init(void)
{
return platform_driver_register(&infrared_driver);
}
static void __exit infrared_exit(void)
{
platform_driver_unregister(&infrared_driver);
}
module_init(infrared_init);
module_exit(infrared_exit);