输入子系统---按键
来源:互联网 发布:java classloader级别 编辑:程序博客网 时间:2024/04/30 22:25
一、
linux输入子系统——基础知识
1、首先我们要知道什么时候我们可以用到input输入子系统,以及为什么我们要用input输入子系统?
像按键、触摸屏、鼠标等输入设备我们都可以采用input接口函数来实现设备驱动。那么采用input输入子系统有什么优点呢?其实一句话,采用input输入子系统可以使驱动程序变得异常简单。
2、input输入子系统体系结构
我们看到输入子系统体系结构大概包括三部分:drivers、inputcore、handlers,其中input core、handlers是由内核来实现的,程序员要做的就是利用inputcore提供的接口函数来实现drivers。下面我们来具体说一下这三层的功能:
驱动层(drivers):将底层的硬件输入转化为统一事件形式,向输入核心层(inputcore)汇报。
输入核心层(inputcore):为驱动层提供输入设备注册与操作接口,如input_register_device;通知事件处理层对事件进行处理;在/proc下产生相应的设备信息;
事件处理层(handlers):主要作用是和用户空间交互,我们知道linux在用户空间将所有设备当成文件来处理,在一般的驱动程序中都有提供fops接口,以及在/dev下生成相应的设备文件节点,而在输入子系统中,这些工作由事件处理层来完成。
3、驱动的实现
(1)事件支持:
set_bit(EV_KEY,button_dev.evbit)
参数button_dev.bit是structinput_dev类型的,它有两个成员evbit(事件类型)和keybit(按键类型)(但并非只有这两个成员),关于具体的事件类型和按键类型请看下图:
set_bit(EV_KEY,button_dev.bit)//事件为按键
set_bit(BTN_1,button_dev.keybit)//按键类型为按键一
(2)注册
当input设备支持了相应的事件之后,就可以将设备注册进内核:input_register_device(&button_dev);
(3)报告事件与完成报告
那么当在底层发生了中断(比如按键中断)时候,用户空间如何知道呢?这就需要inputcore提供的接口函数来向input_core报告。由于报告事件是在中断函数中完成的,所以需要在开始处注册中断:request_irq(BUTTON_IRQ,button_interrupt,0,"button",NULL)
然后在中断处理函数中完成报告事件:
static void button_interrupt(int irq,void*dummy,struct pt_regs *fp)
{
}
注释:inb(BUTTON_PORT1)用于读取按键1的状态,并报告给input core
(4)用户空间怎样获取驱动操作硬件获取的原始数据
输入设备产生的原始数据经输入设备子系统处理后,最后会被保存在struct
};
二、驱动程序和测试
static struct input_dev *buttons_dev;
static int buttons_open(struct input_dev*dev);
static void buttons_close(struct intput_dev*dev);
static struct timer_list buttons_timer;//定义一个定时器
struct pin_desc{
int irq; //中断号
char *name;//按键名称
unsigned int pin;//按键引脚
unsigned int key_val; //按键值
int pin_set;//按键引脚设置(中断)
};
struct pin_desc pins_desc[4] = {
{IRQ_EINT0,
//{IRQ_EINT11, "Key2", S3C2410_GPG(3),KEY_S,S3C2410_GPG3_EINT11},
//
//{IRQ_EINT14, "Key4", S3C2410_GPG(6),KEY_LEFTSHIFT,S3C2410_GPG6_EINT14},
};
static irqreturn_t buttons_irq(int irq, void*dev_id)
{
mod_timer(&buttons_timer,jiffies+HZ/100);
struct pin_desc * pindesc = (struct pin_desc*)dev_id;
return IRQ_RETVAL(IRQ_HANDLED);
}
static void buttons_timer_function(unsigned longdata)
{
unsigned int pinval;
pinval =s3c2410_gpio_getpin(pins_desc[0].pin);
if(pinval)
{
}
else
{
}
}
static int buttons_init(void)
{
int err;
//s3c2410_gpio_cfgpin(pins_desc[0].pin,2<<0);
buttons_dev = input_allocate_device();;
if(!buttons_dev)
{
}
//s3c2410_gpio_cfgpin(S3C2410_GPF(0),);配置为中断
buttons_dev->name = "buttonsinput";//初始化设备的名字
//buttons_dev->id.bustype =BUS_HOST; //初始化设备ID。在注册设备之前,名字和ID是必须初始化的。
//buttons_dev->id.product =0xBEEF;
//buttons_dev->id.version =0x0100;
set_bit(EV_KEY,buttons_dev->evbit);//按键事件
set_bit(EV_REP,buttons_dev->evbit);//连击事件
//
//
//
//set_bit(KEY_L,buttons_dev->keybit);
//set_bit(KEY_S,buttons_dev->keybit);
//set_bit(KEY_ENTER,buttons_dev->keybit);
//set_bit(KEY_LEFTSHIFT,buttons_dev->keybit);
err=input_register_device(buttons_dev);
if(err)
//DPRINTK("buttons_dev initalized ok!\n");
init_timer(&buttons_timer);
buttons_timer.function =buttons_timer_function;
add_timer(&buttons_timer);
//for (i = 0; i < 4;i++)
//
//
//
return 0;
err1:
//DPRINTK("buttons_dev initalizederror\n");
input_free_device(buttons_dev);
}
static void buttons_exit(void)
{
//int i;
//for (i = 0; i < 4;i++)
//{
//}
del_timer(&buttons_timer);
input_unregister_device(buttons_dev);//注销设备
input_free_device(buttons_dev);//释放已分配设备结构体空间
}
module_init(buttons_init);
module_exit(buttons_exit);
MODULE_LICENSE("GPL");
测试程序:
int main(void)
{
}
转自http://blog.sina.com.cn/s/blog_b20e901301018yk9.html
- 输入子系统---按键
- S3C6410输入子系统按键驱动程序
- 输入子系统之按键驱动
- linux输入子系统--按键驱动
- 输入子系统 OK6410按键驱动
- 4412驱动-输入子系统按键
- linux输入子系统, 按键输入驱动程序
- 输入子系统简单(按键)测试
- input输入子系统之按键驱动
- 输入子系统实现的mini2440按键驱动
- linux输入子系统之按键驱动
- linux输入子系统之按键驱动
- linux输入子系统之按键驱动
- linux输入子系统之按键驱动
- linux的输入子系统---按键事件
- 输入子系统(3):按键驱动实现
- 按键驱动之使用输入子系统架构
- MINI2440 按键输入子系统 驱动及测试代码分析
- 分析共享Spring配置数据源四种方式(附相应jar包)
- 数据挖掘:数据挖掘导论第四章
- 黑马程序员_学习笔记第16天——Collections、jdk1.5新特性
- 【Linux 入门笔记】文件系统挂载管理
- Session和Cookie的区别
- 输入子系统---按键
- 微医疗解决方案
- HiberateTemplate
- [Unity3D]Unity3D游戏开发之数据持久化PlayerPrefs的使用
- 看看国外的本科生能做什么?
- linux grep命令详解
- 黑马程序员_学习笔记第17天——IO流、字符流
- NYOJ 155高精度计算
- 系统测试和集成测试的区别