欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

i8042與i8048鍵盤控制器芯片端口操作總結

系統 2124 0

主板的鍵盤有一塊專用的接口芯片,一般是采用一塊單片微處理器8042(現在大多已集成在南橋或SIO里)。它控制整個鍵盤的工作,包括加電自檢、鍵盤掃描碼的緩沖以及與主板的通訊。

6 a% p0 [8 A0 q0 o9 B* x0 N
兩個重要的中斷: 計匠網論壇" L; }+ _. d1 y9 a" ?* o
INT 09H是H/W中斷,對應IRQ1,INT 16H是一個S/W中斷。當鍵盤的一個鍵被按下時,鍵盤接口芯片根據被按下的位置,INT 09H負責把鍵值轉換成INT16H認識的值,返回給INT 16H。INT 16H再把該值根據OS所選定的不同語系鍵盤而轉換成相應的二進制字符傳給OS或應用程序。當用戶敲擊鍵盤速度過快,使主CPU來不及處理時,則先將所鍵 入的內容送往住存儲器的鍵盤緩沖區,等CPU能處理時,便從緩沖區中取出,送入CPU進行分析和執行。一般在PC機的內存中安排了大約20個字符的鍵盤緩 沖區。 , O0 I. K3 n2 O4 i# a& z
主板的鍵盤有一塊專用的接口芯片,一般是采用一塊單片微處理器8042(現在大多已集成在南橋或SIO里)。它控制整個鍵盤的工作,包括加電自檢、鍵盤掃描碼的緩沖以及與主板的通訊。 ?? D) f, C# Z% t# I
計匠網論壇, D2 M+ N0 c5 P?? N
(Award Code ,In file?? ATORGS.ASM, INT 09h( KBDINT_VECT?? JMP KBC_INT<at AKBRD.ASM> ) and INT 16h(KBD_VECT JMP keyboard) ) www.ufoit.com% J; F" ^& B2 f% L! ^2 y

對緩沖和命令的處理:
?????  8042分輸入緩沖和輸出緩沖,它的數據傳輸在I/O口60H和64H進行。基本上,I/O 64H是命令和狀態口,I/O 60H是數據口,它們同時可做讀寫動作,在讀和寫時有著不同的意義。I/O 64H的bit 0、1置位分別代表輸出/輸入緩沖滿。如果發現輸入緩沖滿(即判斷出I/O 64H[1]=1),要從I/O 60H將數據讀完。BIOS在自檢時如果確定輸入/輸出緩沖都沒有問題,會發“AAH”給I/O 64H,讓它自測試。等到輸入緩沖空(說明上一個命令已執行完),輸出緩沖滿(KB控制器對自測試命令有反應),再讀I/O 60H是否為“55H”(IBM PC/AT規范)。如果是,則表示KB沒有問題,若等不到輸出緩沖滿,說明有問題。

???   在寫命令之前,必須對I/O 64H口送一個60H的值,并等到輸入緩沖空,再操作I/O 60H。同樣,在讀狀態之前,也必須對I/O 64H口送一個20H的值,并等到輸出緩沖滿(表示有狀態輸出),再操作I/O 60H。這時,我們可以把64H看作索引口,而60H看作數據口。

A20地址線的切換: * o; I2 D- h3 u?? |
; t! ~0 E* l5 H2 N
  鍵盤接口芯片除了接受來自鍵盤的信息外,還要負責A20地址線的切換,因為當CPU從實模式切換到保護模式時便是通過A20地址線的切換完成的。平常 A20為“0”時,CPU工作于DOS的實模式;當A20切換為“1”時,便可進入保護模式。但由于鍵盤接口芯片切換A20地址線的速度不夠快,目前多由 主板上的芯片組以模擬方式取代,這樣也就省去了一塊鍵盤接口芯片。 & Y+ W& S& T" g! ~

8042 端口的操作:

通過8042芯片,可以:
1. 向8042芯片發布命令(通過64h),并通過60h讀取命令的返回結果(如果有的話),或通過60h端口寫入命令所需的數據(如果需要的話)。
2.讀取Status Register的內容(通過64h);
3.向8048發布命令(通過60h);
4.讀取來自于Keyboard的數據(通過60h)。這些數據包括Scan Code(由按鍵和釋放鍵引起的),對8048發送的命令的確認字節(ACK)及回復數據。 & x5 ]?? z?? i. {- D$ P?? [
再次強調一遍,Command(命令)分為發送給8042芯片的命令和發送給8048的命令。它們是不相同的,并且使用的端口也是不相同的(分別為64h和60h)。
- l: [5 z

64h端口(讀操作)
?????? 對64h端口進行讀操作,會讀取Status Register的內容。
???? in al, 0x64 計匠網論壇" z( @" P/ A8 }?? A4 V) O! o+ o
?? 執行這個指令之后,AL寄存器中存放的就是Status Register的內容。

64h端口(寫操作) ; ?* {) h8 r& _9 N1 K
??? 向64h端口寫入的字節,被認為是對8042芯片發布的命令(Command): 寫入的字節將會被存放在Input Register中; 同時會引起Status Register的Bit-3自動被設置為1,表示現在放在Input Register中的數據是一個Command,而不是一個Data;
計匠網論壇8 G% Z, n% F. G* F
?? 在向64h端口寫某些命令之前必須確保鍵盤是被禁止的,因為這些被寫入的命令的返回結果將會放到Output Register中,而鍵盤如果不被禁止,則也會將數據放入到Output Register中,會引起相互之間的數據覆蓋; 9 J; |9 l0 @; H. S* g
?? 在向64h端口寫數據之前必須確保Input Register是空的(通過判斷Status Register的Bit-1是否為0)。 " {/ }9 l: p' t?? G2 _
計匠網論壇/ A% W- C?? a' `
60h端口(讀操作)
??????? 對60h端口進行讀操作,將會讀取Output Register的內容。Output Register的內容可能是: . 來自于8048的數據。這些數據包括Scan Code,對8048發送的命令的確認字節(ACK)及回復數據。 . 通過64h端口對8042發布的命令的返回結果。 www.ufoit.com: j: v: u1 c3 ]/ o
在向60h端口讀取數據之前必須確保Output Register中有數據(通過判斷Status Register的Bit-0是否為1)


60h端口(寫操作) % b9 N5 /# B' I# s2 I7 L( s) ^- e
?? ??? 向60h端口寫入的字節,有兩種可能: 1.如果之前通過64h端口向8042芯片發布的命令需要進一步的數據,則此時寫入的字節就被認為是數據; 2.否則,此字節被認為是發送給8048的命令。 在向60h端口寫數據之前,必須確保Input Register是空的(通過判斷Status Register的Bit-1是否為0)。

***********************************************************************************
***********************************************************************************
B5
R_ALT E0,38 E0,B8
HOME E0,47 E0,C7
UP ARROW E0,48 E0,C8
PG UP E0,49 E0,C9
L ARROW E0,4B E0,CB
R ARROW E0,4D E0,CD
END E0,4F E0,CF
D ARROW E0,50 E0,D0
PG DN E0,51 E0,D1
INSERT E0,52 E0,D2
DELETE E0,53 E0,D3
L GUI E0,5B E0,DB
R GUI E0,5C E0,DC
APPS E0,5D E0,DD
PRNT SCRN E0,2A, E0,37 E0,B7, E0,AA
PAUSE E1,1D,45 E1,9D,C5 -NONE

這里說幾句對驅動沒有幫助的題外話,記不清是由于先有了關于 Scan Code 的值的猜測,才去按這個順序列 Scan Code ,還是先這樣列 Scan Code ,才有了關于 Scan Code 的值的猜測。總之,用這個 Make Code 的順序,和我們現在鍵盤上鍵的布局做對照,我們大致就能猜到為什么 A 鍵的 Make Code 值為 0x1e,為什么 H 鍵的 Make Code 值為 0x23。我們拿其中的一小段舉例子,A 1E,S 1F,D 20,F 21,G 22,H 23,看看鍵盤上 A,S,D,F,G,H 的位置吧。能感覺到些什么吧,感覺不到就算了,這個和驅動是無關的。從 Scan Code Set 1,可能還能推測出來最早的鍵盤的樣子。以及發生在鍵盤上的一些變化。我們注意到 F10 和 F11,F12 的 Make Code 不是連在一起的,估計比較早的鍵盤只有10個功能鍵,而不是現在的12個功能鍵。從鍵的 Make Code 來看,有可能曾經使用的一些鍵,現在已經不出現在鍵盤上了。

還有一個值得注意的是,如果有 Make Code 為 0x60 的鍵,那么它的 Break Code 應該為 0x60+0x80=0xE0。那么這個鍵的 Break Code 將會和 表示擴展碼的 0xE0 搞混。不過還好,并沒有 Make Code 為 0x60 的鍵,所以不會發生搞混的情況。
1.4 i8042 鍵盤控制器
??? 鍵盤驅動直接讀寫 i8042 芯片,通過 i8042 間接的向鍵盤中的 i8048 發命令。所以對于驅動來說,直接發生聯系的只有 i8042 ,因此我們只介紹 i8042 ,不介紹 i8048。
??? 象 i8042,i8048 這樣的芯片,本身就是一個小的處理器,它的內部有自己的處理器,有自己的 Ram,有自己的寄存器,等等。
??? i8042 有 4 個 8 bits 的寄存器,他們是 Status Register(狀態寄存器),Output Buffer(輸出緩沖器),Input Buffer(輸入緩沖器),Control Register(控制寄存器)。使用兩個 IO 端口,60h 和 64h。

Status Register(狀態寄存器)
狀態寄存器是一個8位只讀寄存器,任何時刻均可被cpu讀取。其各位定義如下
Bit7: PARITY-EVEN(P_E): 從鍵盤獲得的數據奇偶校驗錯誤
Bit6: RCV-TMOUT(R_T): 接收超時,置1
Bit5: TRANS_TMOUT(T_T): 發送超時,置1
Bit4: KYBD_INH(K_I): 為1,鍵盤沒有被禁止。為0,鍵盤被禁止。
Bit3: CMD_DATA(C_D): 為1,輸入緩沖器中的內容為命令,為0,輸入緩沖器中的內容為數據。
Bit2: SYS_FLAG(S_F): 系統標志,加電啟動置0,自檢通過后置1
Bit1: INPUT_BUF_FULL(I_B_F): 輸入緩沖器滿置1,i8042 取走后置0
BitO: OUT_BUF_FULL(O_B_F): 輸出緩沖器滿置1,CPU讀取后置0

Output Buffer(輸出緩沖器)
輸出緩沖器是一個8位只讀寄存器。驅動從這個寄存器中讀取數據。這些數據包括,掃描碼,發往 i8042 命令的響應,間接的發往 i8048 命令的響應。

Input Buffer(輸入緩沖器)
輸入緩沖器是一個8位只寫寄存器。緩沖驅動發來的內容。這些內容包括,發往 i8042 的命令,通過 i8042 間接發往 i8048 的命令,以及作為命令參數的數據。

Control Register(控制寄存器)
也被稱作 Controller Command Byte (控制器命令字節)。其各位定義如下
Bit7: 保留,應該為0
Bit6: 將第二套掃描碼翻譯為第一套
Bit5: 置1,禁止鼠標
Bit4: 置1,禁止鍵盤
Bit3: 置1,忽略狀態寄存器中的 Bit4
Bit2: 設置狀態寄存器中的 Bit2
Bit1: 置1,enable 鼠標中斷
BitO: 置1,enable 鍵盤中斷
2個端口 0x60,0x64
驅動中把 0x60 叫數據端口
驅動中把 0x64 叫命令端口
1.5 命令
驅動可以直接給 i8042 發命令,可以通過 i8042 間接給 i8048 發命令。命令這部分內容直接來自 < 參考資料 [1] >。

1.5.1 發給i8042的命令
驅動對鍵盤控制器發送命令是通過寫端口64h實現的,共有12條命令,分別為
20h
準備讀取8042芯片的Command Byte;其行為是將當前8042 Command Byte的內容放置于Output Register中,下一個從60H端口的讀操作將會將其讀取出來。
60h
準備寫入8042芯片的Command Byte;下一個通過60h寫入的字節將會被放入Command Byte。
A4h
測試一下鍵盤密碼是否被設置;測試結果放置在Output Register,然后可以通過60h讀取出來。測試結果可以有兩種值:FAh=密碼被設置;F1h=沒有密碼。
A5h
設置鍵盤密碼。其結果被按照順序通過60h端口一個一個被放置在Input Register中。密碼的最后是一個空字節(內容為0)。
A6h
讓密碼生效。在發布這個命令之前,必須首先使用A5h命令設置密碼。
AAh
自檢。診斷結果放置在Output Register中,可以通過60h讀取。55h=OK。
ADh
禁止鍵盤接口。Command Byte的bit-4被設置。當此命令被發布后,Keyboard將被禁止發送數據到Output Register。
AEh
打開鍵盤接口。Command Byte的bit-4被清除。當此命令被發布后,Keyboard將被允許發送數據到Output Register。
C0h
準備讀取Input Port。Input Port的內容被放置于Output Register中,隨后可以通過60h端口讀取。
D0h
準備讀取Outport端口。結果被放在Output Register中,隨后通過60h端口讀取出來。
D1h
準備寫Output端口。隨后通過60h端口寫入的字節,會被放置在Output Port中。

D2h
準備寫數據到Output Register中。隨后通過60h寫入到Input Register的字節會被放入到Output Register中,此功能被用來模擬來自于Keyboard發送的數據。如果中斷被允許,則會觸發一個中斷。

1.5.2 發給8048的命令
共有10條命令,分別為
EDh
設置LED。Keyboard收到此命令后,一個LED設置會話開始。Keyboard首先回復一個ACK(FAh),然后等待從60h端口寫入的LED 設置字節,如果等到一個,則再次回復一個ACK,然后根據此字節設置LED。然后接著等待。。。直到等到一個非LED設置字節(高位被設置),此時LED 設置會話結束。
EEh
診斷Echo。此命令純粹為了檢測Keyboard是否正常,如果正常,當Keyboard收到此命令后,將會回復一個EEh字節。
F0h
選擇Scan code set。Keyboard系統共可能有3個Scan code set。當Keyboard收到此命令后,將回復一個ACK,然后等待一個來自于60h端口的Scan code set代碼。系統必須在此命令之后發送給Keyboard一個Scan code set代碼。當Keyboard收到此代碼后,將再次回復一個ACK,然后將Scan code set設置為收到的Scan code set代碼所要求的。
F2h
讀取Keyboard ID。由于8042芯片后不僅僅能夠接Keyboard。此命令是為了讀取8042后所接的設備ID。設備ID為2個字節,Keyboard ID為83ABh。當鍵盤收到此命令后,會首先回復一個ACK,然后,將2字節的Keyboard ID一個一個回復回去。
F3h
設置Typematic Rate/Delay。當Keyboard收到此命令后,將回復一個ACK。然后等待來自于60h的設置字節。一旦收到,將回復一個ACK,然后將Keyboard Rate/Delay設置為相應的值。
F4h
清理鍵盤的Output Buffer。一旦Keyboard收到此命令,將會將Output buffer清空,然后回復一個ACK。然后繼續接受Keyboard的擊鍵。
F5h
設置默認狀態(w/Disable)。一旦Keyboard收到此命令,將會將Keyboard完全初始化成默認狀態。之前所有對它的設置都將失效—— Output buffer被清空,Typematic Rate/Delay被設置成默認值。然后回復一個ACK,接著等待下一個命令。需要注意的是,這個命令被執行后,鍵盤的擊鍵接受是禁止的。如果想讓鍵盤 接受擊鍵輸入,必須Enable Keyboard。
F6h
設置默認狀態。和F5命令唯一不同的是,當此命令被執行之后,鍵盤的擊鍵接收是允許的。
FEh
Resend。如果Keyboard收到此命令,則必須將剛才發送到8042 Output Register中的數據重新發送一遍。當系統檢測到一個來自于Keyboard的錯誤之后,可以使用自命令讓Keyboard重新發送剛才發送的字節。
FFh
Reset Keyboard。如果Keyboard收到此命令,則首先回復一個ACK,然后啟動自身的Reset程序,并進行自身基本正確性檢測(BAT- Basic Assurance Test)。等這一切結束之后,將返回給系統一個單字節的結束碼(AAh=Success, FCh=Failed),并將鍵盤的Scan code set設置為2。

1.5.3 讀到的數據

00h/FFh
當擊鍵或釋放鍵時檢測到錯誤時,則在Output Bufer后放入此字節,如果Output Buffer已滿,則會將Output Buffer的最后一個字節替代為此字節。使用Scan code set 1時使用00h,Scan code 2和Scan Code 3使用FFh。
AAh
BAT完成代碼。如果鍵盤檢測成功,則會將此字節發送到8042 Output Register中。
EEh
Echo響應。Keyboard使用EEh響應從60h發來的Echo請求。
F0h
在Scan code set 2和Scan code set 3中,被用作Break Code的前綴。
FAh
ACK。當Keyboard任何時候收到一個來自于60h端口的合法命令或合法數據之后,都回復一個FAh。
FCh
BAT失敗代碼。如果鍵盤檢測失敗,則會將此字節發送到8042 Output Register中。
FEh
Resend。當Keyboard任何時候收到一個來自于60h端口的非法命令或非法數據之后,或者數據的奇偶交驗錯誤,都回復一個FEh,要求系統重新發送相關命令或數據。
83ABh
當鍵盤收到一個來自于60h的F2h命令之后,會依次回復83h,ABh。83AB是鍵盤的ID。
Scan code
除了上述那些特殊字節以外,剩下的都是Scan code。

i8042與i8048鍵盤控制器芯片端口操作總結


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 魏千翔| 天天影视色香欲综合网老头 | 免费特黄一级欧美大片在线看 | av在线色 | 久久久婷婷一区二区三区不卡 | 91精品国产91久久久久 | 日日爽 | 欧美另类色 | 91tm视频 | 久久久国产精品 | 国产精品自线在线播放 | 中文字幕欧美在线 | 国产在线视频91 | 欧美综合激情网 | 国产精品久久久久亚洲 | 亚洲国产成人九九综合 | 五月天激激婷婷大综合蜜芽 | 免费播放特黄特色毛片 | 国产在线自在拍91精品黑人 | 99精品视频免费在线观看 | 51国产视频| 久久伊人精品 | 亚洲精品人成网在线播放影院 | 欧美午夜色视频国产精品 | 亚洲国产精品久久久久久网站 | 日本一区免费 | 777奇米影视色888成人 | 一级免费看片 | av小说在线 | 久久99国产精品成人欧美 | 可米影院| 99久久综合给久久精品 | 成人禁在线观看网站 | 国产精品大片在线观看 | 男生插女生视频免费 | 激情视频自拍 | 国产成人99| 久久久久成人精品免费播放动漫 | 国产精品久久久久久久久久久搜索 | 中文字幕网在线 | 丰满年轻岳中文字幕一区二区 |