在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位。