linux 2.6 输入子系统 键盘驱动的实现

来源:互联网 发布:java.util.zip jar包 编辑:程序博客网 时间:2024/05/29 09:43

好久没来了!写点东西.关于linux 2.6下面的键盘驱动的实现.
    2.6内核采用"input sub system" 的概念.将输入驱动分成三块: driver,input core和Event handler. "一个输入事件,如鼠标移动,键盘按键按下,joystick的移动等等通过 Driver -> InputCore -> Eventhandler -> userspace 的顺序到达用户空间传给应用程序。"
    关于输入子系统详细的文章有一个老兄写了一篇:
    http://blog.csdn.net/colorant/archive/2007/04/12/1561837.aspx
    在这里我肤浅得讲一下如何实现一个驱动.todo

正文

2.6输入子系统使得用户空间可以通过字符设备接口毫无遗漏的获得原始的输入消息。比如说有些智能鼠标,除了坐标滚球,三键,滚轮之外还有其他的输入装置,,比如控制系统音量的按钮.

如何注册设备       

/*
       *Input interface, not finished yet
       */

       int key,code;
       button_dev = input_allocate_device(); /*static struct input_dev *button_dev defined outside*/
       init_input_dev(button_dev);
      
       set_bit(EV_KEY,button_dev->evbit);
       //@set_bit(EV_REP,button_dev->evbit);       //repeat
       for(key=0;key<16;key++)
              set_bit(keypad_keycode[key],button_dev->keybit);
       button_dev->name = PCA9554_DRV_NAME;
       button_dev->id.bustype = BUS_HOST;
      
       input_register_device(button_dev);
                     

如上述代码所示,首先分配一个输入设备,之后对其进行初始化,然后配置参数. “set_bit(EV_KEY,button_dev->evbit);”将该输入设备定义为键盘输入,这样input core在分发消息的时候会将其发送到keyboard event handler.

接着就是初始化键盘定义,这里keybit是由若干个long型变量组成的数组,我所用的kernel直至最大按键数目为0x1ff.
       for(key=0;key<16;key++)
              set_bit(keypad_keycode[key],button_dev->keybit);

我的开发板上有16个按键,因为项目是播放器,所以我对其作了定义:
int keypad_keycode[] = {
              KEY_UP,  KEY_DOWN,     KEY_A,   KEY_B,              // 1 - 4
              KEY_LEFT, KEY_RIGHT,    KEY_C,   KEY_D,             // 5 - 8
              KEY_PLAYPAUSE,KEY_PLAY,KEY_NEXTSONG,KEY_VOLUMEUP,   // 9 - 12
              KEY_CANCEL,KEY_OK,KEY_PREVIOUSSONG,KEY_VOLUMEDOWN,  // 13 - 16
              KEY_UNKNOWN,
       };


 

键盘定义示意图

 

input.cinput_event函数中会对keybit进行判断,确定某个按键对应的位是否被打开,否则不予上传键值.
              case EV_KEY:
                     printk("haigang;:%s: code:%d,value=%d/n",__FUNCTION__,code,value);
                     if (code > KEY_MAX || !test_bit(code, dev->keybit) || !!test_bit(code, dev->key) == value){
                            printk("haigang:%s: code too big/n",__FUNCTION__,code);
                            return;
                     }
                     if (value == 2)
                            break;
                     change_bit(code, dev->key);
                     if (test_bit(EV_REP, dev->evbit) && dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] && dev->timer.data && value) {
                            dev->repeat_key = code;
                            mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]));
                     }
                     break;

 

input_event部分代码

 


如何传送输入键值比较简单,只需要使用   函数void input_event即可,该函数定义
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)

include/linux/input.h中对该函数作了封装
static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
{
       input_event(dev, EV_KEY, code, !!value);
}

这里code是键值,value应该是键盘状态,按下或者释放(仅是猜测,有待考证)




我的驱动中的建值传输代码,当键值是0x16时候,表示松开键盘事件
       unsigned char key;
       static unsigned char oldKey=0x16;
       key = pca9554_readKey();

       //@printk("KEY:%d/n",key);
      
       if(key!=0x16){
              input_report_key(button_dev,keypad_keycode[key],1);
              input_sync(button_dev);
       }else{
              input_report_key(button_dev,keypad_keycode[oldKey],0);
              input_sync(button_dev);
       }

       set_irq_type(IRQ_KEYPAD,IRQT_FALLING);
       s3c_gpio_cfgpin(S3C_GPF4,S3C_GPF4_EINT4);/*reconfigure the GPF4 as EINT4*/

       oldKey=key;

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 招嫖诈骗微信转账被骗怎么办 朋友在深圳龙岗被传销骗了要怎么办 怀疑家里人被传销组织骗去了怎么办 怀疑家人被骗进传销了该怎么办 b本扣3分了怎么办2018 抖音里面就剩人头的视频怎么办 自学参加普通高考那小高考怎么办 如果小学生长胸只长了一个该怎么办 脸上毛多导致的毛孔粗怎么办 吃了激素药头发掉的厉害怎么办 剪发的剪子中间的螺丝扣总掉怎么办 染完头发后一段时间长新头发怎么办 睡觉头发老被老公压着怎么办 漆盖关节不自在怎么办?吃什么好 摆床头的位置后面是弧形位怎么办 君子兰的根全烂掉了只剩茎怎么办 老板不发工资怎么办 没签合同的 牙套粘在牙齿上的松了怎么办 缝的线长在肉里怎么办 小孩喜欢用舌头顶牙齿缝怎么办 1岁多小宝贝全身长红点怎么办 生完胸好涨但很难把奶吸出来怎么办 怀孕快9个月内裤上有白带怎么办 一早起来发现内裤有白色液体怎么办 阴部骚痒白带多白带多小腹痛怎么办 15岁一周鲁了3次怎么办 月经摊迟三天内裤有白带怎么办 怀孕内裤上有黄黄的分泌物怎么办 老公出轨想离婚但舍不得孩子怎么办 老婆出轨离婚又舍不得家我该怎么办 怀孕一个月刚刚自慰有点流血怎么办 老公出轨还不知道悔改妻子怎么办 离婚了前妻户口还在再婚怎么办 怀孕六个月内裤老是湿有异味怎么办 怀孕五个月内裤总是湿有异味怎么办 耳朵里面有个洞老是流水冒浓怎么办 宝宝拉粑粑有臭酸味怎么回事怎么办 老婆晚上回家内裤是湿的尿味怎么办 怀孕五个月下身痒内裤湿怎么办 哺乳期奶水太多经常弄湿衣服怎么办 麻料裙子一坐下就皱怎么办