1. 程式人生 > >核心輸入子系統 設定能產生哪類事件和那些事件總結:

核心輸入子系統 設定能產生哪類事件和那些事件總結:

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