- documentation/input/input-programming.txt
- documentation/input/event-codes.txt
- 申请中断
- 在中断服务程序里
- 读取硬件获取数据
- 上报数据
三、现场编程
- 在设备树里创建一个节点
- 指定硬件资源等信息
- 编译一个platform_driver驱动
- 在probe函数里
- 从设备树获得资源
- 分配/设置/注册input_dev
- 硬件相关的操作
- request_irq等
- 在probe函数里
#include#include static struct input_dev *g_input_dev; static int g_irq; static irqreturn_t input_dev_demo_irq(int irq, void *dev_id) { 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; 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_bit(EV_KEY, g_input_dev->evbit); __set_bit(EV_ABS, g_input_dev->evbit); __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); 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); 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 = <...>;
};
};



