核心輸入子系統 設定能產生哪類事件和那些事件總結:
在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位。