如何從零開始做一個 USB 鍵盤?

最好分層次描述從硬體,軟體各個層面大致要處理哪些問題。

相關問題:
如何從零開始做一個藍牙鍵盤?
如何把一個 usb 鍵盤改造成藍牙鍵盤?


分兩種情況:

1、做一個真正的USB鍵盤,這種設計基本上不涉及大量的軟體編碼。


2、做一個模擬的USB鍵盤,實際上可以沒有按鍵功能,這種的需要考慮大量的軟體編碼,實際上是一個單片機。

第一種設計:買現成的USB設備晶元,然後焊好就可以了,幾乎沒聽說過誰自己從零開始做USB設備晶元的,首先晶振之類的如何滿足要求就是一個問題。

基本原理就是按鍵,轉換掃描碼,寫入寄存器,然後等主機那邊去讀就可以了。

主機端實際上不需要做什麼設計,因為鍵盤屬於標準的class設備,都是自帶驅動的。

第二種設計:首先要找到一個支持OTG的單片機(板子),編寫完整的USB Device Stack(大概幾萬行),定義好USB描述符(Descriptor)和HID描述符(Windows需要),然後等待主機的中斷傳輸請求即可。

每次把需要發送的掃描碼(scan code)寫到中斷傳輸的緩衝區里,讓device stack把數據發送走即可。

至於硬體信號部分,這些都是USB控制器(簡稱控制器,下同)集成的,如果說你要自己寫一個控制器,那麼需要的技術就太複雜了,全球也沒有多少廠商能弄出來自己的控制器。做控制器需要熟練背誦USB2.0技術規範以及EHCI/UHCI/OHCI技術規範。

---------------------既然問具體怎麼做,那麼我也補充一些吧---------------------

首先,需要一個支持OTG或者USB Device工作模式的板子/晶元/模塊。板子可大可小,可以是工業級的帶OTG的板子,也可以是小小的只有一個單片機的那種。小的那種我沒有用過,我就說大的。

OTG的意思可以大概理解為這個USB口既可以作為主機口接設備,也可以作為設備接入主機,新一點的手機都帶這個功能。

我所知道的OTG控制器有Mentor Graphics的,還有Freescale有一些板子也支持。

找到這樣的板子,然後就是找代碼了,Linux里實際上就有這樣的代碼,比如Mentor Graphics的控制器驅動的代碼在:linux-3.7.1driversusbmusb,這裡,當然如果你用的是別的版本的Linux,在相應的位置也能找到代碼。不知道Linux源碼從哪裡找?傳送門:The Linux Kernel Archives

有了代碼,你還需要U-boot或者其它的東西去啟動這個板子,同時要使用對應的交叉編譯器,應該是arm的交叉編譯器。

於是,板子能起來了,接到主機(比如PC上)也能識別出來一個「未知設備」了,剩下的工作就是給這個未知設備寫驅動。

首先,要通過控制器代碼去編寫相關的USB設備描述符,PC能識別各種設備都是靠描述符,對此,需要先了解USB技術規範:《Universal Serial Bus Specification Revision 2.0》,這個百度一下就能下載,但是全英文的,我見過中文的,但翻譯的很糟糕並且不全。

在此技術規範的章節:9.6.1 Device里有詳細描述了USB設備描述符的信息。具體怎麼把描述符寫到驅動里,這個我不是特別清楚,所以只能說你要自己看代碼了。

有了設備描述符,實際上還有很多別的描述符要設置,比如介面描述符、配置描述符等等,這些規範里都有,需要一一閱讀。

有了這些,你只是製造了一個USB設備,但Windows還不認賬,此時,需要設置HID描述符,因為鍵盤輸入HID設備,關於HID的描述也有技術規範《Device Class Definition for Human Interface Devices (HID) Version 1.11》,同樣沒有中文的。

然後,你就可以根據這個規範發送對應的中斷傳輸(interrupt)信號,就可以跟主機通信了。然後具體你想模擬哪個按鍵,需要發送對應的掃描碼,具體的內容參考這裡:Scancode,掃描碼的介紹是有中文的,找到以後,你就可以很開心的發送鍵盤按鍵信息了。

然後,就完事了,難度就是要閱讀很多技術規範,以及大量的代碼。

當然,某些商用的嵌入式系統自帶USB設備模擬驅動,如果有錢(很貴的),買一套成品過來,找一個板子就可以了。


隨便說說吧
自製鍵盤有兩種主要的流派
一種是用現成的客制化 PCB 加其他零件組裝,插軸 / 燈焊完就行
一種是用飛線 + 電阻把軸連接到 Teensy 一類的控制器上
至於手繪 PCB 這種東西實在是太朋克了就不說了

第一種方法唯一會出問題的地方也就是小心別把 PCB 焊掉盤或者燈的正負極接反
第二種方法在構造按鍵矩陣的時候要小心短路和注意防 ghosting

軟體方面沒有任何要求,當然你要是想再造個 TMK 那就是另外一回事了


X寶上遍地開花的STM32開發板,便宜量又足,ST官方自帶USB庫,還自帶USB HID常式。
幾個地方要注意:
1.USB描述符,研究下HID設備的描述符即可。
2.鍵盤矩陣的掃描,如果按鍵很多組成了16×8的矩陣,要特別注意處理特殊按鍵比如Alt,Ctrl,Shift等,如果有超過3個以上的按鍵需要同時識別,注意ghost鍵的處理。去網上找一份scan code1和scan code2的表格,對照需要發送的code.
3.如果是在X86系統下使用且支持Boot和在DOS下使用,還需要支持X86系統鍵盤控制器的標準命令。windows驅動自帶了,這點倒不用操心。


曾經做過一件事,把小霸王的遊戲手柄(15針)接一個單片機,轉為 USB HID 模擬鍵盤,可以插在電腦上打拳皇。


《圈圈教你玩USB》裡面就有講…………隨書附送PCB版


其實我覺得這個問題很有實際意義,我們就用到不少嵌入式的工控一體機,標準鍵盤太大,每次巡視都要臨時插滑鼠鍵盤,實際上只用到十幾個按鍵而已。如果研製成功訂製的帶小搖桿的鍵盤,就可以給每個一體機配一個。


chh有今年的圖文教程,還是機械的鍵盤


這樣子我做出來的東西真的不好用,只能用來裝13,少年,這已經不是一個造輪子的時代了


改造藍牙鍵盤,這個我有最簡單的檔案。
淘寶一個串口轉藍牙,txd rxd. 接鍵盤原來的usb vcc gnd 接的電 結束


如果你想用USB鍵盤做一個跳舞毯我倒是可以@我的室友。


從零開始做,軟體部分,幾乎無工作。
硬體部分,買一個usb鍵盤晶元,照spec設計原理。

重點來了,從零開始做出usb鍵盤的那套殼子結構件等,這屬於多個產業鏈的資源整合,已經超出了diyer的能力了。


首先,找個1, 0.5不行。


推薦閱讀:

TAG:鍵盤(計算機) | USB | 硬體 |