【知乎】為什么 USB 鍵盤會有鍵沖而 PS2 的鍵盤卻能全鍵無沖?
?47,255
6?個回答

小大熊貓
man in the mirror
水平有限,如有錯誤還請指正。
PS/2是一種雙向同步串行通訊協(xié)議,PS/2鍵盤的時鐘信號頻率通常在10-20kHz之間。PS/2按鍵掃描碼存在通碼和斷碼兩種。當檢測到某個按鍵被按下,鍵盤會向主機發(fā)送該按鍵對應(yīng)的通碼。如果有一個按鍵被持續(xù)按下沒有釋放,鍵盤會不斷向主機發(fā)送該按鍵對應(yīng)的通碼。如果有多個按鍵同時被持續(xù)按下沒有釋放,鍵盤會不斷向主機發(fā)送最后一個被檢測到的按鍵對應(yīng)的通碼。當檢測到某個按鍵被釋放,鍵盤會向主機發(fā)送該按鍵對應(yīng)的斷碼。
可以看出,由于采用串行通訊,在接口層面上,PS/2實現(xiàn)全鍵盤任意按鍵無沖突沒有瓶頸。
USB HID采用的是報文形式,USB鍵盤的輪詢率通常是125Hz,每次向主機發(fā)送8字節(jié)的報文。USB HID的掃描碼沒有通碼和斷碼之分,每次發(fā)送的數(shù)據(jù)標識當前有哪些按鍵被按下。當按鍵被釋放,在下一個報文中該按鍵對應(yīng)的掃描碼就會被移除。
USB鍵盤報告的第1字節(jié)用于標識左右Ctrl、Shift、Alt和Win鍵是否按下,第2字節(jié)保留,第3至8字節(jié)用于標識普通鍵是否按下,每個字節(jié)只能標識一個普通鍵。因此,標準的USB鍵盤只能支持任意6鍵同時按下無沖突,最多14鍵同時按下無沖突。
可以看出,由于USB HID的限制,USB鍵盤無法直接實現(xiàn)全鍵盤任意按鍵無沖突。為了解決這一問題,鍵盤制造商采取了一系列手段,如將單個USB鍵盤虛擬成多個USB HID設(shè)備和自定義USB HID報文格式等。不過有時自定義USB HID報文格式的USB鍵盤會遇到兼容性問題,如在某些主板BIOS界面下無法使用鍵盤等。
至于鍵盤內(nèi)部的按鍵沖突,來源于矩陣按鍵掃描時電流逆流導(dǎo)致的“幽靈按鍵”現(xiàn)象。薄膜鍵盤的應(yīng)對辦法是優(yōu)化布線,盡可能避免可能同時按下的按鍵沖突。當然這只能緩解沖突并不能解決沖突,為了避免出現(xiàn)“幽靈按鍵”現(xiàn)象,鍵盤控制器只能屏蔽其中部分按鍵。機械鍵盤通常采取在每個按鍵處都設(shè)置二極管的辦法來避免這個問題。
實際上鍵盤中的按鍵是被設(shè)置在一個矩陣中的,這個矩陣由許多列線(輸入)和行線(輸出)構(gòu)成,列線和行線交叉處就是按鍵開關(guān)。在沒有按鍵觸發(fā)時,行線和列線之間彼此斷開。所有列線均置為高電平,而行線則會根據(jù)掃描情況發(fā)生變化。
當控制器進行掃描時,將所有行線設(shè)置為低電平,然后檢測列線,如果有列線為低電平則說明有按鍵閉合。隨后控制器將所有行線設(shè)置為浮空,依次將行線逐行設(shè)置為低電平(其余行線浮空),并讀取所有列線的情況。當讀取到低電平的列線時,列線和行線交叉處的按鍵就是被閉合的按鍵,控制器通過查表即可得知結(jié)果。

以上圖為例,1和2為列線,3和4為行線。檢測按鍵時分別向行線3和4加低電平。當W鍵被按下,對3加低電平時,2會被拉低,控制器通過查表可以得知此時W鍵被按下。
這里可能會遇到一種情況:當QWA鍵被同時按下時,對4加低電平會導(dǎo)致一部分電流通過W(向下)、Q(向上)、A(向下)鍵從4流出,導(dǎo)致2被拉低,從而導(dǎo)致控制器認為S鍵也被按下,這就是“幽靈按鍵”。要避免“幽靈按鍵”的出現(xiàn),比較簡單粗暴的辦法是當按下相鄰4個鍵中的2個鍵后,便屏蔽其它2個按鍵,雖然這會導(dǎo)致無法同時識別矩陣中相鄰的部分按鍵,但是這種情況通常非常少見。為了緩解“幽靈按鍵”導(dǎo)致的按鍵沖突,可以采取優(yōu)化鍵盤布線的辦法,將可能同時按下的按鍵盡可能分布在不同的行列上,從而減少按鍵沖突的發(fā)生。要完全避免“幽靈按鍵”和其導(dǎo)致的按鍵沖突,可以在每個按鍵處都設(shè)置一個二極管,只允許電流單向通過(向下),這一問題就得到了解決。通常機械鍵盤會采用這種解決辦法,而薄膜鍵盤出于成本和定位考慮不會這樣做。
鍵盤控制器不斷掃描整個矩陣,當檢測到按鍵觸發(fā)時,控制器會將其轉(zhuǎn)換為鍵盤碼值并存儲在特定的寄存器中。每隔一段時間,控制器會查詢寄存器中的數(shù)據(jù),將其編碼為報文,通過外部總線發(fā)送給主機。對于PS/2鍵盤,控制器還會通過與之前的狀態(tài)進行比較,確定按鍵是被按下還是被釋放,從而將相應(yīng)的按鍵掃描碼發(fā)送給主機。
編輯于 2023-10-16 20:40?IP 屬地北京

胡莉彤
CRH2G-0001專屬鐵路人偶,現(xiàn)已支持USB PPS(霧
太長不看版:請先問是不是[1]?[2]再問為什么。理論上USB鍵盤一樣可以做到全鍵無沖(并不使用額外的驅(qū)動程序等),但在部分品牌電腦(如惠普、蘋果)[3]的固件內(nèi)可能無法正常使用。


IBM F62 復(fù)刻版鎮(zhèn)樓。
理論上而言,USB 人體學(xué)輸入設(shè)備(即鍵盤、鼠標等設(shè)備)所遵循的技術(shù)規(guī)范本身允許外設(shè)采用自定義報文格式并將報文結(jié)構(gòu)通過“HID 描述符”傳遞給主機。在此條件下,鍵盤固件編寫者完全可以通過在報文內(nèi)聲明一個很長的位段或者類似的手段來向主機傳遞所有鍵位的狀態(tài)。但是,對于電腦本身的固件(比如 PC BIOS)的編寫者而言,解析 HID 描述符并且完整支持 HID 規(guī)范則過于復(fù)雜了。因此,USB HID 規(guī)范針對鍵盤規(guī)定了一個易于解析的報文格式[1]:
?1 ?ui ?Bitfield of Modifier Keys (LCtrl, RCtrl, LShift, RShift, LAlt, RAlt, LWindows, RWindows)
?1 ?ui ?Reserved (0)
?1 ?ui ?Scancode 1 (or 0)
?1 ?ui ?Scancode 2 (or 0)
?1 ?ui ?Scancode 3 (or 0)
?1 ?ui ?Scancode 4 (or 0)
?1 ?ui ?Scancode 5 (or 0)
?1 ?ui ?Scancode 6 (or 0)
這個簡易報文(也就是其他答主提到的“USB 協(xié)議”)可以在修飾鍵外支持最多六個額外的按鍵,而大部分中低端 USB 鍵盤也僅支持該報文。故此類鍵盤即使硬件上支持全鍵無沖(如靜電電容鍵盤),也僅支持最多六個按鍵。
而對于物理上支持全鍵無沖的鍵盤而言,理論上鍵盤本身只需向主機枚舉兩個虛擬 HID 設(shè)備(一個遵循簡易協(xié)議的基本鍵盤、一個采用自定義報文格式的全功能廠商定義設(shè)備)即可支持原生全鍵無沖??上?,包括 Windows 在內(nèi)的主流操作系統(tǒng)在檢測到此類設(shè)備時,會讀取基本鍵盤設(shè)備而無視廠商定義設(shè)備,導(dǎo)致全鍵無沖無法正常工作[1]。對于該問題的一個常見的解決方案是由廠商編寫自定義鍵盤驅(qū)動,在驅(qū)動層面上屏蔽基本鍵盤設(shè)備而強制使用廠商定義的設(shè)備。
除此之外,還有一個有濫用 HID 協(xié)議的嫌疑的思路:利用大部分電腦固件并不會去解析 HID 描述符而是直接按照約定俗成的簡易報文格式直接讀取鍵盤報文的特點,令一塊采用自定義報文的鍵盤也能向下兼容簡易報文[1]:
?1 ?ui ?Bitfield of Depressed Modifier Keys (LCtrl, RCtrl, LShift, RShift, LAlt, RAlt, LWindows, RWindows)
?1 ?ui ?Padding
?1 ?ui ?"Padding" (actually: Scancode 1)
?1 ?ui ?"Padding" (actually: Scancode 2)
?1 ?ui ?"Padding" (actually: Scancode 3)
?1 ?ui ?"Padding" (actually: Scancode 4)
?1 ?ui ?"Padding" (actually: Scancode 5)
?1 ?ui ?"Padding" (actually: Scancode 6)
13 ?ui ?Bitfield of Depressed Non-Modifier Keys
在該實現(xiàn)中,鍵盤向主機只枚舉一個“廠商定義設(shè)備”,并且 HID 描述符聲明了一部分格式與簡易報文吻合的“占位符”。而實際上,報文的前 8 位是按照簡易報文規(guī)范編碼的一部分按鍵鍵碼信息。電腦固件在遇到該報文時,由于一般會無視 HID 描述符直接按照簡易報文格式解析,將會正確解析出簡易報文部分的內(nèi)容;而進入操作系統(tǒng)以后,操作系統(tǒng)則會根據(jù) HID 描述符的內(nèi)容,忽略被聲明為占位符的簡易報文內(nèi)容,從而支持全鍵無沖。目前已知采取該技巧實現(xiàn)無驅(qū)動支持全鍵無沖的鍵盤包括?MODEL F LABS?復(fù)刻的 Model F?靜電屈蹲彈簧鍵盤(ibm-capsense-usb[2]固件默認支持;QMK 固件需要手動啟用[3])以及改裝了?xwhatsit?主板的 IBM 原廠古董鍵盤(Model F 以及更古老的 DisplayWriter 等)[2]。
不過這種投機取巧的思路也有缺點:有一部分沒有完整實現(xiàn) USB HID 標準的電腦固件(如蘋果以及惠普的固件)可能會直接無視采用這種報文格式的鍵盤,因此 Model F Labs 在其采用的 QMK 固件中默認關(guān)閉了全鍵無沖模式[3]。并且筆者的確在自己的惠普 EliteBook 745?G6 上遇到了與 xwhatsit 固件相關(guān)的開機階段鍵盤無法使用的問題(在刷入 QMK 固件并且保持全鍵無沖模式關(guān)閉后得到了解決)。
綜上所述,USB 鍵盤在理論上并沒有實現(xiàn)全鍵無沖的技術(shù)障礙;而廠家選擇不直接實現(xiàn)全鍵無沖則更多是因為協(xié)議本身的歷史遺留所導(dǎo)致的兼容性問題(中高端產(chǎn)品)或成本考慮(低端產(chǎn)品)。
參考
^abcdhttps://www.devever.net/~hl/usbnkro
^abchttps://static.wongcornall.com/ibm-capsense-usb-web/ibm-capsense-usb.html#x1-160003.3.2
^abchttps://www.modelfkeyboards.com/manual/
編輯于 2022-10-04 13:17

先謝郭嘉
有情調(diào)的送禮達人,兢兢業(yè)業(yè)的測評人(合作看簡介)
因為在USB的協(xié)議下,定期向主機發(fā)送當前按鍵的狀態(tài),每次只能發(fā)送8個字節(jié)。
第一個就是左右的Ctrl、Shift、Alt、Win這些按鍵有沒有被按下,鍵盤上的這8個鍵的狀態(tài)就由這一個字節(jié)表示。
第二個保留(沒用)
還剩下6個字節(jié),就對應(yīng)著按下的6個按鍵,數(shù)字鍵、字母等。要是一次性按鍵超出了6個,那么會自動選取前6個或者后6個。
所以一次性最多是可以發(fā)送14個按鍵的信息的。其實USB接口的偽無沖對日常的應(yīng)用影響不大,畢竟就10根手指頭,全鍵無沖對于平常人來說用處真的不是很明顯。PS/2接口還有一個比較遺憾的問題,PS/2接口的鍵盤都是薄膜鍵盤,只能實現(xiàn)局部的無沖?,F(xiàn)在還是USB接口的主流,并且PS/2的電器安全性和可靠性受到設(shè)計因素的影響不小。其實就算有無沖的機械鍵盤,還是USB接口好一點。
?

匿名用戶
兩個因素:硬件和軟件。
軟件上,USB鍵盤的HID報文為了兼容和方便老舊BIOS去解析,只能采取比較簡短的格式,這個格式的長度只能裝6個鍵。但是一旦進入了操作系統(tǒng)就能加載專門解析報文的驅(qū)動,100個鍵無沖都沒問題。合格的鍵盤可以切換模式(模式由計算機主動申請,是HID協(xié)議標準支持的),便宜貨就只支持6鍵的了。此外,不需要模擬多個鍵盤,不需要特殊驅(qū)動(3大操作系統(tǒng)都能解析)。
硬件上,鍵盤的按鍵掃描為了成本,普遍采用矩陣掃描。固有缺點是會產(chǎn)生鬼鍵(如果按下直角上的3個按鈕,則對面的第4個按鈕也會觸發(fā)),軟件要消除這個影響,固然做不到全鍵無沖。
(不想細究的,可以看稚暉君鍵盤那一期視頻)
編輯于 2022-10-04 19:09