内核输入子系统 设置能产生哪类事件和那些事件总结:

在jz2440上编写使用输入子系统驱动程序时,经常会遇到设置产生哪类事件和哪些事件,这里自己总结了一下代码里的2种方法:

下面是一些宏和结构体定义:

struct input_dev {

    .........

    unsigned long evbit[512];
    unsigned long keybit[32];

    ........

}

#define set_bit(nr,p)            ATOMIC_BITOP_LE(set_bit,nr,p)

#define ATOMIC_BITOP_LE(name,nr,p)    _##name##_le(nr,p)

extern void _set_bit_le(int nr, volatile unsigned long * p);   //这个汇编函数会把*p的bit nr 置为1

#define BITS_PER_LONG 32

#define NBITS(x) (((x)/BITS_PER_LONG)+1)
#define BIT(x)    (1UL<<((x)%BITS_PER_LONG))
#define LONG(x) ((x)/BITS_PER_LONG)

#define LONG(x) ((x)/BITS_PER_LONG)

#define BIT(x)    (1UL<<((x)%BITS_PER_LONG))

方法1:

 set_bit(BTN_TOUCH, dev->keybit);

相当于: keybit |= 1UL << BTN_TOUCH;

方法2:

dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);

相当于:dev->keybit[BTN_TOUCH/32] = 1UL << (BTN_TOUCH%32);

总结:

结果都是一样的,都是把keybit的第BTN_TOUCH位置为1,也就是keybit[BTN_TOUCH/32] 的第BTN_TOUCH%32位。

猜你喜欢

转载自blog.csdn.net/z1026544682/article/details/85013390
今日推荐