標籤:
一、概述
借wiki(http://wiki.osdev.org/%228042%22_PS/2_Controller)的圖:
其中黃色的就是PS/2 KBC(KeyBoard Controller)。這裡可以明顯看出,KBC和Keyboard(後簡稱KBD)是兩個完全不同的東西,KBC是一個簡單的chip,KBD則是我們常使用的普通外部裝置。
還可以看到,PS/2的鍵盤滑鼠是與PS/2 KBC交換資料的。而只有KBC最終向CPU report了資料,才會最終反饋給使用者(比如說在螢幕上顯示我們的按鍵內容等)。簡單來說,KBC就是PS/2鍵盤滑鼠與系統溝通的“中介”。
這裡插入一個討論,我們筆記本基本沒有PS/2的介面,那還需要KBC嗎?
答案是需要。因為在Legacy OS(比如DOS,Legacy Win7等等)環境,即使是USB的鍵盤滑鼠,它們的資料也是轉換成PS/2資料,回傳給KBC,再通知CPU的。具體這裡不詳述,我們知道目前KBC為什麼還存在就好~等到哪一天徹底淘汰LegacyOS,或者說我們只做UEFI BIOS,大概就可以高興的跟KBC say goodbye了。
二、從KBC兩種工作模式來瞭解低速裝置(= =)
在介紹工作模式前,有必要大概瞭解KBC是如何工作的。
首先,KBC內部可以參考下面的,大概有這麼幾個寄存器:Input/Output Buffer,Status Register。Buffer用來暫存資料,Status主要就是來記錄Buffer的狀態。
知道KBC結構,再結合概述裡的圖,KBC的基本工作流程就清楚了:PS/2鍵盤滑鼠的資料發送給KBC,暫存在KBC的Buffer,再由KBC轉寄給CPU。
從這個工作流程分析,鍵盤滑鼠的資料是由使用者產生的,一旦產生就發送給KBC,這部分的行為更多由裝置的firmware決定。而KBC什麼時候把資料轉寄給CPU呢?終於可以說到它的兩種工作模式了。
KBC的工作模式分Polling和Interrupts兩種。詳述可以參考wiki裡“Recieving Bytes From Device/s”這部分(其實按我的理解叫Ready to send bytes to system可能更合適),這裡主要是談談我所理解的。Polling更多依賴於系統軟體(也就是BIOS)行為,在BIOS部分會透過timer,定期檢查KBC的status register,一旦被標記為output buffer full,就意味著有東西要輸出了,此時就可以透過KBC的資料連接埠讀出資料。而Interrupt工作模式,是一旦資料連接埠有資料,就向CPU發IRQ,CPU通過IRQ編號知道來自什麼裝置,這部分更多是硬體行為了。
可以看出,Polling模式下受限於KBC buffer空間,Interrupt模式受限於發中斷本身。
三、在實際應用中的經驗(不完整,待補充)
首先,如果需要KBC工作在Interrupt模式,需要特別注意IRQ的配置。最近新平台DOS下鍵盤無法使用,問題就出在IRQ。講清楚這個問題,需要先對wiki上的圖再進行補充。天色已晚,改日再續~
8042 PS/2 Controller的工作筆記