2012-09-14 42 views
2

我正在練習在VirtualBox guest Linux中編寫簡單的鍵盤驅動程序。問題是,我的代碼只是註冊一箇中斷處理程序並將日誌文件打印到scancode。而且我不會將這些傳入的掃描代碼發送到任何上位代碼,如Linux input core。在insmod之後,我可以看到使用dmesg捕獲的掃描碼。但爲什麼我的終端仍然得到正確的輸入?終端不應收到任何東西。VirtualBox如何處理來賓Linux的中斷?

我的代碼如下所示:

static int __init init_simple_keyboard_driver(void) 
{ 
    free_irq (IRQ_1, NULL); 
    return request_irq (IRQ_1, my_handler, ...); 
} 

static irqreturn_t my_handler(int irq, void *dev_id) 
{ 
    unsigned char scancode = get_scancode_from_port_0x60(); 
    printk(...scancode...); 
} 

insmod後,我可以看到在內核日誌消息。

  1. 我的free_irq調用導致一些消息,如Can't free already freed IRQ。 (我不知道爲什麼......它不應該被釋放)
  2. atkbdatkbd驅動程序抱怨有人要求處理IRQ_1而不是。
  3. 那些掃描碼可以正確打印。
  4. [最怪異的]主動控制檯仍然得到正確的鍵盤輸入。因此,我可以使用這個簡單的驅動程序執行rmmod
  5. rmmod之後,來賓Linux剛剛死機,因爲它再也收不到任何鍵盤。

你有什麼想法嗎?謝謝!

+0

因此,您正試圖編寫一個驅動程序來管理已由現有驅動程序管理的硬件(而不是附加第二個鍵盤以供您的驅動程序使用)?我想這可能不是真的可行... – twalberg

+0

@twalberg謝謝你的評論。是的,我正在寫驅動程序來替換原來的驅動程序。這是不可能的嗎?你能否告訴我正確的做法?只在啓動時加載它? –

+0

@twalberg而且,我只是'cat/proc/interrupts',在'IRQ 1'上看到'my_handler'和原來的'i8042'。我認爲這意味着我未能釋放原始中斷。 –

回答

1

驅動程序不應該也不能註銷未註冊的中斷處理程序。 爲了防止原來的驅動程序處理鍵盤中斷,你可以做醚:

1)在你的中斷處理程序返回IRQ_HANDLED:此值指示中斷處理得好和Linux內核的中斷處理機制將停止調用一箇中斷處理程序。或

2)清除硬件中的輸入緩衝區,可以參考原始鍵盤驅動程序的代碼,以瞭解鍵盤命中事件期間使用的狀態寄存器和輸入緩衝區。

+0

謝謝你的回答。這很聰明,謝謝! –