分兩種情況: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.1\drivers\usb\musb,這裡,當然如果你用的是別的版本的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裝置模擬驅動,如果有錢(很貴的),買一套成品過來,找一個板子就可以了。
分兩種情況: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.1\drivers\usb\musb,這裡,當然如果你用的是別的版本的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裝置模擬驅動,如果有錢(很貴的),買一套成品過來,找一個板子就可以了。