input子系统 软件设计流程及相关API
2012-08-26 21:28
176 查看
input子系统的软件设计流程
软件设计流程如下所示:
分配一个输入设备——注册一个输入设备——上报输入事件——注销一个输入设备——释放一个输入设备
设计有关的API
分配一个输入设备
1 struct input_dev *input_allocate_device*(void);
注册一个输入设备
1 int input_register_device(struct input_dev *dev);
驱动实现-事件支持
1 Set_bit(EV_KEY,button_dev.evbit)
2 //Set_bit告诉inout子系统它支持哪些事件
3 //Struct input_dev中有两个成员,一个是evbit;一个是keybit;分别用来表示设备所支持的事件类型和按键类型。
事件类型
Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):
1 EV_SYN 0x00 同步事件
2 EV_KEY 0x01 按键事件
3 EV_REL 0x02 相对坐标
4 EV_ABS 0x03 绝对坐标
5 EV_MSC 0x04 其它
6 EV_LED 0x11 LED
7 EV_SND 0x12 声音
8 EV_REP 0x14 Repeat
9 EV_FF 0x15 Force feedback事件
按键类型
当事件类型为EV_KEY时,还需指明按键类型:
1 BTN_LEFT 鼠标左键
2 BTN_RIGHT 鼠标右键
3 BTN_MIDDLE 鼠标中键
4 BTN_0 数字0键
5 BTN_1 数字1键
上述set_bit函数实则完成了把EV_KEY赋值到button_dev.evbit
驱动实现-报告事件
1 Void input_event(struct input_dev *dev,unsigned int type,unsigned int code,intvalue);//报告指定type,code的输入事件
2 Void input_report_key(struct input_dev *dev,unsigned int code,int value);/*报告键值,code
: 事件的代码,如果事件是ev_key,该代码则为设备的键盘代码。例如鼠标按键代码为0x110~0x116,其中0x110(BTN_LEFT),0x111(BTN_RIGHT),0x112(BTN_MIDDLE)。其它带按摩含义参考include/linux/input.h文件 value : 事件的值,如果事件的类型是EV_KEY,当按键按下时值为1,松开时为0。 */
3 Void input_report_rel(struct input_dev *dev,unsigned int code,int value);//报告相对坐标
4 Void input_report_abs(struct input_dev *dev,unsigned int code,int value);//报告绝对坐标
5 Void input_sync(struct input_dev *dev);/*报告同步事件,input_sync()用于高速input core 此次报告已经结束,能够根据上报的信息往后面处理了*/
在触摸屏驱动设计中,一次坐标及按下状态的整个报告过程如下:
1 Input_report_abs(input_dev,ABS_X,x);//X坐标
2 Input_report_abs(input_dev,ABS_Y,y);//Y坐标
3 Input_report_abs(input_dev,ABS_PRESSURE,pres);//压力
4 input_sync(struct input_dev *dev);//同步
释放与注销设备
1 Void input_free_device(struct input_dev *dev);
2 Void input_unregister_device(struct input_dev *);
#include <asm/irq.h>
#include <asm/io.h>
static struct input_dev *button_dev;/*输入设备结构体*/
static irqreturn_t button_interrupt(int,irq,void *dummy)/*中断处理函数*/
{
input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1);
/*向输入子系统报告产生按键事件*/
input_sync(button_dev);
/*通知接收者,一个报告发送完毕*/
return IRQ_HANDLED;
}
static int __init button_init(void) /*加载函数*/
{
int error;
if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL))
/*申请中断处理函数*/
{
/*申请失败,则打印出错信息*/
printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq);
return -EBUSY;
}
button_dev = input_allocate_device(); /*分配一个设备结构体*/
if (!button_dev) /*判断分配是否成功*/
{
printk(KERN_ERR "button.c: Not enough memory\n");
error = -ENOMEM;
goto err_free_irq;
}
button_dev->evbit[0] = BIT_MASK(EV_KEY);/*设置按键信息*/
button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);
error = input_register_device(button_dev); /*注册一个输入设备*/
if (error)
{
printk(KERN_ERR "button.c: Failed to register device\n");
goto err_free_dev;
}
return 0;
err_free_dev: /*以下是错误处理*/
input_free_device(button_dev);
err_free_irq:
free_irq(BUTTON_IRQ, button_interrupt);
return error;
}
static void __exit button_exit(void)
/*卸载函数*/
{
input_unregister_device(button_dev);
/*注销按键设备*/
free_irq(BUTTON_IRQ, button_interrupt); /*释放按键占用的中断线*/
}
module_init(button_init);
module_exit(button_exit);
软件设计流程如下所示:
分配一个输入设备——注册一个输入设备——上报输入事件——注销一个输入设备——释放一个输入设备
设计有关的API
分配一个输入设备
1 struct input_dev *input_allocate_device*(void);
注册一个输入设备
1 int input_register_device(struct input_dev *dev);
驱动实现-事件支持
1 Set_bit(EV_KEY,button_dev.evbit)
2 //Set_bit告诉inout子系统它支持哪些事件
3 //Struct input_dev中有两个成员,一个是evbit;一个是keybit;分别用来表示设备所支持的事件类型和按键类型。
事件类型
Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):
1 EV_SYN 0x00 同步事件
2 EV_KEY 0x01 按键事件
3 EV_REL 0x02 相对坐标
4 EV_ABS 0x03 绝对坐标
5 EV_MSC 0x04 其它
6 EV_LED 0x11 LED
7 EV_SND 0x12 声音
8 EV_REP 0x14 Repeat
9 EV_FF 0x15 Force feedback事件
按键类型
当事件类型为EV_KEY时,还需指明按键类型:
1 BTN_LEFT 鼠标左键
2 BTN_RIGHT 鼠标右键
3 BTN_MIDDLE 鼠标中键
4 BTN_0 数字0键
5 BTN_1 数字1键
上述set_bit函数实则完成了把EV_KEY赋值到button_dev.evbit
驱动实现-报告事件
1 Void input_event(struct input_dev *dev,unsigned int type,unsigned int code,intvalue);//报告指定type,code的输入事件
2 Void input_report_key(struct input_dev *dev,unsigned int code,int value);/*报告键值,code
: 事件的代码,如果事件是ev_key,该代码则为设备的键盘代码。例如鼠标按键代码为0x110~0x116,其中0x110(BTN_LEFT),0x111(BTN_RIGHT),0x112(BTN_MIDDLE)。其它带按摩含义参考include/linux/input.h文件 value : 事件的值,如果事件的类型是EV_KEY,当按键按下时值为1,松开时为0。 */
3 Void input_report_rel(struct input_dev *dev,unsigned int code,int value);//报告相对坐标
4 Void input_report_abs(struct input_dev *dev,unsigned int code,int value);//报告绝对坐标
5 Void input_sync(struct input_dev *dev);/*报告同步事件,input_sync()用于高速input core 此次报告已经结束,能够根据上报的信息往后面处理了*/
在触摸屏驱动设计中,一次坐标及按下状态的整个报告过程如下:
1 Input_report_abs(input_dev,ABS_X,x);//X坐标
2 Input_report_abs(input_dev,ABS_Y,y);//Y坐标
3 Input_report_abs(input_dev,ABS_PRESSURE,pres);//压力
4 input_sync(struct input_dev *dev);//同步
释放与注销设备
1 Void input_free_device(struct input_dev *dev);
2 Void input_unregister_device(struct input_dev *);
#include <asm/irq.h>
#include <asm/io.h>
static struct input_dev *button_dev;/*输入设备结构体*/
static irqreturn_t button_interrupt(int,irq,void *dummy)/*中断处理函数*/
{
input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1);
/*向输入子系统报告产生按键事件*/
input_sync(button_dev);
/*通知接收者,一个报告发送完毕*/
return IRQ_HANDLED;
}
static int __init button_init(void) /*加载函数*/
{
int error;
if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL))
/*申请中断处理函数*/
{
/*申请失败,则打印出错信息*/
printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq);
return -EBUSY;
}
button_dev = input_allocate_device(); /*分配一个设备结构体*/
if (!button_dev) /*判断分配是否成功*/
{
printk(KERN_ERR "button.c: Not enough memory\n");
error = -ENOMEM;
goto err_free_irq;
}
button_dev->evbit[0] = BIT_MASK(EV_KEY);/*设置按键信息*/
button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);
error = input_register_device(button_dev); /*注册一个输入设备*/
if (error)
{
printk(KERN_ERR "button.c: Failed to register device\n");
goto err_free_dev;
}
return 0;
err_free_dev: /*以下是错误处理*/
input_free_device(button_dev);
err_free_irq:
free_irq(BUTTON_IRQ, button_interrupt);
return error;
}
static void __exit button_exit(void)
/*卸载函数*/
{
input_unregister_device(button_dev);
/*注销按键设备*/
free_irq(BUTTON_IRQ, button_interrupt); /*释放按键占用的中断线*/
}
module_init(button_init);
module_exit(button_exit);
相关文章推荐
- input子系统学习笔记一 软件设计流程及相关API
- input子系统学习笔记一 软件设计流程及相关API
- input子系统学习笔记四 软件设计流程及相关API
- input子系统学习笔记四 软件设计流程及相关API
- input子系统学习笔记四 软件设计流程及相关API
- activiti学习-02环境准备+安装流程设计器+对流程设计器的使用+对流程设计器的使用+核心API的认识
- Linux驱动学习笔记----------input输入子系统(基本概念与流程)
- 试用socket api借口设计一个文件传送软件,并编程实现,可自定义文件传输的通信。
- 软件开发流程实例之三 :系统设计
- 软件项目管理总体流程设计
- 基于OpenCV的运动目标检测跟踪系统在PC上的软件设计流程
- 软件分析设计与管理 的相关问题
- MySQL架构设计相关的方式方法和软件介绍
- input子系统整体流程全面分析
- API设计的基本工作流程及需求分析
- linux驱动之input子系统之按键驱动编写流程(三)
- 从软件开发的流程来认识六大设计原则
- API设计小手册(下) — 设计流程和设计原则
- git相关工作流。利用git开发软件工作流程
- 小达同学的软件测试设计流程