6.4

来源:互联网 发布:达内java培优班笔试题 编辑:程序博客网 时间:2024/05/17 23:18

record 6.4

android hal start

各层之间通信的基本单位就是事件,任何一个输入设备的动作都可以抽象成一种事件,如键盘的按下,触摸屏的按下,鼠标的移动等。事件有三种属性:类型(type),编码(code),值(value),Input子系统支持的所有事件都定义在input.h中,包括所有支持的类型,所属类型支持的编码等。事件传送的方向是 硬件驱动层-->子系统核心-->事件处理层-->用户空间

设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键模拟,具体 方法就是操作/dev/input/event1文件,向它写入个input_event结构体就可以模拟按键的输入了。


linux/input.h中有定义,这个文件还定义了标准按键的编码等

struct input_event {

struct timeval time; //按键时间

__u16 type; //类型,在下面有定义

__u16 code; //要模拟成什么按键

__s32 value;//是按下还是释放

};

code:

事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h文件. 如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码 为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).

value:

事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.

type: 

/*

 * Event types功能实现
 */

#define EV_SYN0x00 // 
表示设备支持所有的事件
#define EV_KEY 0x01 // 键盘或者按键,表示一个键码
#define EV_REL 0x02 // 鼠标设备,表示一个相对的光标位置结果(相对坐标)
#define EV_ABS 0x03 // 手写板产生的值,其是一个绝对整数值
#define EV_MSC 0x04 // 其他类型
#define EV_SW  0x05 //
#define EV_LED 0x11 // LED灯设备
#define EV_SND 0x12 // 输入声音
#define EV_REP 0x14 // 允许重复按键类型
#define EV_FF  0x15 //
#define EV_PWR 0x16 // 电源管理事件
#define EV_FF_STATUS0x17
#define EV_MAX 0x1f


有哪些API

分配/释放一个输入设备:

struct input_dev *input_allocate_device(void);

void input_free_device(struct input_dev *dev);

注册/注销输入设备:

int __must_check input_register_device(struct input_dev *);

void input_unregister_device(struct input_dev *);

报告输入事件:    

void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);/* 报告指定type、code的输入事件 */

void input_report_key(struct input_dev *dev, unsigned int code, int value);/* 报告键值 */

        void input_report_rel(struct input_dev *dev, unsigned int code, int value);/* 报告相对坐标 */

       void input_report_abs(struct input_dev *dev, unsigned int code, int value);/* 报告绝对坐标 */

                                    void input_sync(struct input_dev *dev);/* 报告同步事件 */


Input驱动编写步骤

1.分配一个输入设备;
2.注册一个输入设备;
3.驱动支持什么事件;
Set_bit告诉inout子系统它支持哪些事件
Set_bit(EV_KEY,button_dev.evbit)
Struct input_dev中有两个成员,一个是evbit;一个是keybit.分别用来表示设备所支持的事件类型和按键类型。
4.驱动事件报告;
5.释放和注销设备;

0 0