编写input_dev驱动框架

一、参考资料

  • Documentation/input/input-programming.txt
  • Documentation/input/event-codes.txt

二、编写input_dev驱动

2.1 分配/设置/注册 input_dev

2.2 硬件相关的操作

  • 申请中断
  • 在中断服务程序里
    • 读取硬件获取数据
    • 上报数据

三、现场编程

在这里插入图片描述

  • 在设备树里创建一个节点
    • 指定硬件资源等信息
  • 编译一个platform_driver驱动
    • 在probe函数里
      • 从设备树获得资源
      • 分配/设置/注册input_dev
      • 硬件相关的操作
        • request_irq等

代码(未测试)

#include <linux/moudule.h>
#include <linux/init.h>

static struct input_dev *g_input_dev;
static int g_irq;

static irqreturn_t input_dev_demo_irq(int irq, void *dev_id)
{
	/* read data */

	/* report data */
	input_event(g_input_dev, EV_KEY, XX, 0);
	input_sync(g_input_dev);

	return IRQ_HANDLED;
}

static int input_dev_demo_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	int error = 0;
	struct resource *irq;

	/* get hardware info from device tree */

	/* alloc/set/register input_dev */
	g_input_dev = devm_input_allocate_device(dev);

	g_input_dev->name = "input_dev_demo";
	g_input_dev->phys = "input_dev_demo";
	g_input_dev->dev.parent = dev;

	g_input_dev->id.bustype = BUS_HOST;
	g_input_dev->id.vendor  = 0x0001;
	g_input_dev->id.product = 0x0001;
	g_input_dev->id.version = 0x0001;


	/* set 1: which type event ? */
	__set_bit(EV_KEY, g_input_dev->evbit);
	__set_bit(EV_ABS, g_input_dev->evbit);

	/* set 2: which event? */
	__set_bit(BTN_TOUCH, g_input_dev->keybit);
	__set_bit(ABS_MT_SLOT, g_input_dev->absbit);
	__set_bit(ABS_MT_POSITION_X, g_input_dev->absbit);
	__set_bit(ABS_MT_POSITION_Y, g_input_dev->absbit);

	/* set 3: event params ? */
	input_set_abs_params(g_input_dev, ABS_MT_POSITION_X, 0, 0xffff, 0, 0);
	input_set_abs_params(g_input_dev, ABS_MT_POSITION_Y, 0, 0xffff, 0, 0);

	error = input_register_device(g_input_dev);

	/* hardware operation  */
	irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	g_irq = irq->start;
	request_irq(irq->start, input_dev_demo_isr, IRQF_TRIGGER_RISING, "input_dev_demo_irq", NULL);

	return 0;
}

static int input_dev_demo_remove(struct platform_device *pdev)
{
	free_irq(g_irq, NULL);
	input_unregister_device(g_input_dev);
	return 0;
}

static struct of_device_id input_dev_demo_of_match = {
	{ .compatible = "100ask,input_dev_demo", },
	{ },
};

static struct platform_driver input_dev_demo_driver = {
	.probe = input_dev_demo_probe,
	.remove = input_dev_demo_remove,
	.driver = {
		.name = "input_dev_demo",
		.of_match_table = input_dev_demo_of_match,
	}
};

static int __init input_dev_demo_init(void)
{
	return platform_driver_register(&input_dev_demo_driver);
}

static void __exit input_dev_demo_exit(void)
{
	platform_driver_unregister(&input_dev_demo_driver);
}

module_init(input_dev_demo_init);
module_exit(input_dev_demo_exit);
MODULE_LINCESE("GPL");

设备树设置

/ {
    input_dev_demo {
        compatible = "100ask,input_dev_demo";
        interrupts = <...>;
    };
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

习惯就好zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值