2014-04-14 194 views
2

我所有的代碼是基於文章linuxjournal.com here is the article I based my code onLinux的輸入設備讀取的ioctl(EVIOCGKEY())與讀(input_event)

我正在寫一個嵌入式應用程序,我想讀取鍵盤上的按鍵。
這裏是我使用

uint8_t key_b[KEY_MAX/8 + 1]; 
memset(key_b, 0, sizeof(key_b)); 
ioctl(fd, EVIOCGKEY(sizeof(key_b)), key_b); 

for (yalv = 0; yalv < KEY_MAX; yalv++) { 
    if (test_bit(yalv, key_b)) { 
     /* the bit is set in the key state */ 
     printf(" Key 0x%02x ", yalv); 
     switch (yalv) 
     { 
     case KEY_RESERVED : 
      printf(" (Reserved)\n"); 
      break; 
     case KEY_ESC : 
      printf(" (Escape)\n"); 
      break; 
     /* other keys/buttons not shown */ 
     case BTN_STYLUS2 : 
      printf(" (2nd Stylus Button)\n"); 
      break; 
     case KEY_1: 
      printf("The key 1 was pressed"); 
      break; 
     case KEY_2: 
      printf("The key 2 was pressed"); 
      break; 
     case KEY_A: 
      printf("The key A was pressed"); 
      break; 
     default: 
      printf(" (Unknown key)\n"); 
     } 
    } 
} 

對於此代碼的工作,大部分的代碼,除非我按「一」。

根據input.h將KEY_A設置爲值30.但是當我按下鍵盤上的'a'時,它將返回值102而不是30.我測試了鍵盤上的其他鍵,並且它看起來像1-6鍵返回KEY_1,KEY_2等的期望值,但在此之後返回的值不正確。

我試過直接從/ dev/input/eventX文件讀取。預計在事件中返回的代碼。

size_t rb; 
/* the events (up to 64 at once) */ 
struct input_event ev[64]; 
int yalv; 
int keybrdToCapture; 

    if((keybrdToCapture = open(EVENT2, O_RDONLY)) == -1) { 
    perror("opening device"); 
    exit(EXIT_FAILURE); 
    printf("L2\n"); 
} 

rb=read(keybrdToCapture,ev,sizeof(struct input_event)*64); 

for (yalv = 0; yalv < (int) (rb/sizeof(struct input_event)); yalv++) 
{ 
    printf("yalv is %d\n", yalv); 
    if (EV_KEY == ev[yalv].type) 
     printf("type %d code %d value %d\n",ev[yalv].type,ev[yalv].code, ev[yalv].value); 
} 

上面的代碼在打'a'鍵時會打印出來。 類型1代碼30值1

此時您可能會想知道爲什麼我不會簡單地讀取輸入事件來讀取鍵盤輸入。這是因爲read()是一個阻塞函數。而ioctl()不阻塞。

如果有人可以請幫我弄清楚爲什麼EVIOCGKEY()返回不正確的鍵值,我會非常感激。謝謝!

回答

3

好的,我找出了問題所在。

我的test_bit()宏寫入不正確。
基本上,key_b []表示鍵的狀態,逐位。這意味着如果按下了KEY_A,那麼位30將被設置爲1.在這種情況下,位30將在key_b [3]中顯示爲值0x40。

下面是幾個如何將每個鍵映射到key_b []中的示例。

  • KEY_1 = 2在key_b中表示爲 - > key_b [0] = 0x04;
  • KEY_2 = 3在key_b中表示爲 - > key_b [0] = 0x08;
  • KEY_3 = 4在key_b中表示爲 - > key_b [0] = 0x10;
  • KEY_4 = 5在key_b中表示爲 - > key_b [0] = 0x20;
  • KEY_5 = 6在key_b中表示爲 - > key_b [0] = 0x40;
  • KEY_6 = 7在key_b中表示爲 - > key_b [0] = 0x80;
  • KEY_7 = 8在key_b中表示爲 - > key_b [1] = 0x01; KEY_8 = 9在key_b中表示爲 - > key_b [1] = 0x02;在key_b中表示爲KEY_6 =
  • KEY_9 = 10在key_b中表示爲 - > key_b [2] = 0x04;
  • KEY_0 = 11在key_b中表示爲 - > key_b [3] = 0x08;