Linux 从零开始编写红外传感器驱动程序

在 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);

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值