本程序基于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");