本程序基于TINY4412开发板,程序已经验证过,完全正确:
那么,如何来写这样的一个驱动程序呢?
1、分配一个input_dev结构体
2、设置
3、注册
4、硬件相关的代码,比如中断,定时器,休眠等等的操作
#include <linux/module.h> #include <linux/fs.h> #include <linux/sched.h> #include <linux/delay.h> #include <linux/atomic.h> #include <linux/types.h> #include <linux/interrupt.h> #include <linux/kthread.h> #include <linux/slab.h> #include <linux/io.h> #include <linux/gpio.h> #include <linux/dma-mapping.h> #include <linux/platform_device.h> #include <linux/ioport.h> #include <linux/miscdevice.h> #include <linux/uaccess.h> #include <linux/input.h> #define DEV_NAME "test-dev" //中断处理函数 irqreturn_t handler(int num, void *data) { struct input_dev *dev; dev = data; printk("%d: irq handler\n", num); //input_report_key(dev, KEY_ESC, 1); //上报事件 #if 1 input_report_key(dev, KEY_ESC, !gpio_get_value(EXYNOS4_GPX3(2))); #endif input_sync(dev); return IRQ_HANDLED; } void input_dev_init(struct input_dev *dev) { __set_bit(EV_SYN, dev->evbit); //设置位 __set_bit(EV_KEY, dev->evbit); //设置一个按键类事件,表示能够产生按键事件。 __set_bit(KEY_ESC, dev->keybit);//表示能产生哪些按键 } struct input_dev *dev; int test_init(void) { int ret; printk("test init\n"); //分配一个input_dev结构体 dev = input_allocate_device(); //如果分配失败就返回 if(IS_ERR_OR_NULL(dev)) { ret = -ENOMEM; goto ERR_alloc; } //初始化设备 input_dev_init(dev); //注册这个设备 ret = input_register_device(dev); if(IS_ERR_VALUE(ret)) { goto ERR_input_reg; } //注册中断--->中断号26代表tiny4412板子上的第一个按键 ret = request_irq(IRQ_EINT(26), handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, DEV_NAME, dev); if(IS_ERR_VALUE(ret)) { goto ERR_request_irq; } return 0; //对错误返回进行处理 ERR_request_irq: input_unregister_device(dev); ERR_input_reg: input_free_device(dev); ERR_alloc: return ret; } //出口函数 void test_exit(void) { printk("test exit\n"); free_irq(IRQ_EINT(26), dev); input_unregister_device(dev); input_free_device(dev); } module_init(test_init); module_exit(test_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Y.X.YANG"); MODULE_VERSION("1.1");
时间: 2024-11-10 10:41:33