隨著最新和最偉大的游戲系統(tǒng)每隔幾年首次亮相,我的舊視頻游戲控制器庫(kù)存也以同樣的速度增長(zhǎng)。許多較舊的游戲機(jī)都設(shè)計(jì)有非標(biāo)準(zhǔn)的專有連接器??杀氖?,這意味著,即使它們?nèi)匀还δ荦R全,我的大多數(shù)舊游戲控制器也注定要在架子上積聚灰塵。然而,只需稍加修改,這些控制器就可以被賦予新的生命,并重新用作與現(xiàn)代計(jì)算機(jī)的漂亮接口。用舊組件和備件制造USB鼠標(biāo)或鍵盤的專業(yè)知識(shí)既有趣又信息豐富,可以通過用戶控制輸入向任何嵌入式系統(tǒng)添加功能。
檢查舊控制器
制作USB鼠標(biāo)的基本要求很簡(jiǎn)單。鼠標(biāo)需要兩個(gè)用于左鍵和右鍵單擊的按鈕,以及控制水平和垂直移動(dòng)的方法。
這些基本標(biāo)準(zhǔn)以各種方式實(shí)施,具有不同的組成部分和復(fù)雜性。1980 年代和 1990 年代初的游戲手柄使用連接到 8 位或 16 位閂鎖的簡(jiǎn)單按鈕。每隔幾毫秒鎖定一次數(shù)據(jù),游戲機(jī)可以輕松地打卡并解釋按下了哪些按鈕。后來的控制器集成了模數(shù)轉(zhuǎn)換器(ADC),以檢測(cè)操縱桿從其靜止位置移動(dòng)的距離,從而允許不同的移動(dòng)速度,而不是簡(jiǎn)單按鈕的“開關(guān)”控制。更現(xiàn)代的控制器甚至集成了一個(gè)加速度計(jì),通過身體運(yùn)動(dòng)為用戶提供了更多種類的控制。無(wú)論使用哪種控制器,互聯(lián)網(wǎng)上都應(yīng)該有大量關(guān)于其數(shù)據(jù)如何編碼的信息。掌握游戲控制器如何收集和存儲(chǔ)輸入后,下一步就是格式化 USB 的數(shù)據(jù)。
制作鼠標(biāo)
USB是一種極其通用的協(xié)議,主機(jī)系統(tǒng)必須準(zhǔn)備好接受來自所連接設(shè)備的各種數(shù)據(jù)包。首次連接終端設(shè)備時(shí),它必須在稱為“枚舉”的過程中向主機(jī)描述其標(biāo)識(shí)、功能和預(yù)期數(shù)據(jù)格式。幸運(yùn)的是,大多數(shù)主機(jī)系統(tǒng)都有常用設(shè)備類(想想閃存驅(qū)動(dòng)器、鍵盤、打印機(jī)等)的內(nèi)置驅(qū)動(dòng)程序。如果終端設(shè)備枚舉某個(gè)類,則主機(jī)無(wú)需任何其他軟件即可使用該設(shè)備。鼠標(biāo)屬于人體學(xué)接口設(shè)備 (HID) 類,因此在此類下枚舉將使鼠標(biāo)即插即用。
當(dāng)設(shè)備首次連接到 USB 端口時(shí),主機(jī)會(huì)發(fā)送 SETUP 數(shù)據(jù),以便設(shè)備有機(jī)會(huì)枚舉。終端設(shè)備必須解碼 SETUP 數(shù)據(jù)包并發(fā)送設(shè)備描述符,然后發(fā)送其配置、接口、類、端點(diǎn)和報(bào)告描述符。描述符是包含有關(guān)設(shè)備操作的詳細(xì)信息的表數(shù)據(jù)。從設(shè)備制造商、數(shù)據(jù)緩沖區(qū)大小和通信速度到功耗和數(shù)據(jù)格式,在枚舉期間,各種描述符中都會(huì)報(bào)告所有內(nèi)容。
報(bào)告描述符控制計(jì)算機(jī)如何接收和解釋通過 USB 發(fā)送的數(shù)據(jù)。我們可以根據(jù) HID 類中預(yù)定義的用法來識(shí)別鼠標(biāo)的左鍵和右鍵功能??刂破髦械膬蓚€(gè)按鈕對(duì)應(yīng)于兩個(gè)輸入,每個(gè)輸入的位大小為 1,每個(gè)輸入的邏輯值為 0 或 1。
USAGE_PAGE(按鈕) USAGE_MINIMUM(按鈕 1) USAGE_MAXIMUM(按鈕 2) LOGICAL_MINIMUM (0) LOGICAL_MAXIMUM (1) REPORT_COUNT (2) REPORT_SIZE (1) 輸入(數(shù)據(jù)、變量、絕對(duì)值)
由于我們只使用數(shù)據(jù)字節(jié)的 2 位,因此我們需要另一個(gè) 6 位的報(bào)告大小,計(jì)算機(jī)將其解釋為常量。請(qǐng)注意,我們不包括后一位的任何用法。
REPORT_COUNT(1) REPORT_SIZE(6) 輸入 (碳納米、變量、絕對(duì))
我們發(fā)送的接下來的 2 個(gè)字節(jié)分別對(duì)應(yīng)于 x 軸和 y 軸數(shù)據(jù)。每個(gè)方向的數(shù)據(jù)都有自己的 8 位報(bào)告大小,對(duì)于 8 位有符號(hào)整數(shù),邏輯值可以在 -127 到 127 的范圍內(nèi)。
USAGE_PAGE(通用桌面) 用法 (X) 用法(Y) LOGICAL_MINIMUM (-127) LOGICAL_MAXIMUM (127) REPORT_SIZE (8) REPORT_COUNT (2) 輸入(數(shù)據(jù)、變量、相關(guān))
由于上述報(bào)告描述符的每一行在 HID 使用情況表中都有一個(gè)預(yù)定義的值。1以下數(shù)組表示鼠標(biāo)示例的總報(bào)告描述符。
unsigned char RepD[]= // Report descriptor { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse) 0xA1, 0x01, // COLLECTION (Application) 0x09, 0x01, // USAGE (Pointer) 0xA1, 0x00, // COLLECTION (Physical) 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x02, // USAGE_MAXIMUM (Button 2) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x95, 0x02, // REPORT_COUNT (2) 0x75, 0x01, // REPORT_SIZE (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x06, // REPORT_SIZE (6) 0x81, 0x01, // INPUT (Cnst,Var,Abs) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7F, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x06, // INPUT (Data,Var,Rel) 0xC0, // END_COLLECTION 0xC0 // END_COLLECTION };
所以現(xiàn)在你要問,從這份報(bào)告描述符解釋中實(shí)際得出的是什么?通過使用上面的報(bào)告描述符,我們需要做的就是將來自游戲控制器的數(shù)據(jù)格式化為以下格式(表 1),主機(jī)系統(tǒng)將能夠正確理解輸入。
表 1.USB 鼠標(biāo)數(shù)據(jù)格式
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|
字節(jié) 0 | 0 | 0 | 0 | 0 | 0 | 0 | 右鍵單擊 | 左鍵點(diǎn)擊 |
字節(jié) 1 | X 軸位移(帶符號(hào)) | |||||||
字節(jié) 2 | Y 軸位移(帶符號(hào)) |
請(qǐng)務(wù)必注意,方向數(shù)據(jù)既有符號(hào)又相對(duì)于光標(biāo)的當(dāng)前位置。如果發(fā)送 -1 作為 x 軸位移,光標(biāo)將向左移動(dòng)一個(gè)像素。x 軸位移字節(jié)中的 +1 將光標(biāo)向右移動(dòng)一個(gè)像素。這同樣適用于 y 軸,負(fù)值向上移動(dòng)光標(biāo),正值向下移動(dòng)光標(biāo)。
現(xiàn)在可以顯示創(chuàng)建USB接口的兩種不同方法??梢允褂脙?nèi)置USB串行接口引擎的MAXQ612或MAXQ622 16位微控制器,也可以使用帶有MAX3420E或MAX3421E USB外設(shè)控制器的微控制器。圖 1 顯示了第一個(gè)實(shí)現(xiàn)。我選擇的游戲控制器有一個(gè)方便的I2C 接口。使用MAXQ622用作I2C主接口與游戲控制器通信,將數(shù)據(jù)解析成上面表1所示的格式并處理USB事務(wù)?,F(xiàn)在可以實(shí)現(xiàn)單芯片鼠標(biāo)解決方案。
圖1.單芯片 USB 鼠標(biāo)的示意圖。本設(shè)計(jì)采用MAXQ622微控制器和MAXQ622評(píng)估(EV)板。
除外部旁路電容器外,I 上的上拉電阻2C線和晶體振蕩器,此示例設(shè)計(jì)不需要額外的元件。圖2所示為更通用的解決方案,使用MAX3420E USB外設(shè)控制器和配備I2C 和 SPI 函數(shù)。
圖2.USB鼠標(biāo)示意圖,現(xiàn)在使用MAX3420E USB外設(shè)控制器和MAX3420E評(píng)估板。而任何具有I2可以使用C和SPI功能,在這種情況下,我們繼續(xù)使用MAXQ622。
MAX3420EEVKIT-2為所有接口引腳提供接頭,包括用于SPI通信的MOSI、MISO、#SS和SCLK引腳,以及用于微控制器信號(hào)中斷的INT引腳。MAX3420EEVKIT-2具有板載Atmel ATtiny2313微控制器,通過定制固件,可實(shí)現(xiàn)位砰砰?2C 總線直接連接到游戲控制器。在本例中,MAXQ622評(píng)估板具有2C和SPI外設(shè)被用作通用微控制器。
結(jié)論
現(xiàn)在您知道如何使用舊的視頻游戲控制器和任何具有正確接口的微控制器來實(shí)現(xiàn)USB鼠標(biāo)。該過程就像連接幾個(gè)跳線并下載固件一樣簡(jiǎn)單。
此處提供的代碼具有多個(gè)函數(shù)。它持續(xù)監(jiān)控 USB 總線是否有來自主機(jī)的任何活動(dòng)或傳入請(qǐng)求;它定期輪詢游戲控制器以獲取新數(shù)據(jù),將此數(shù)據(jù)發(fā)送到主機(jī),并閃爍 LED 作為狀態(tài)/時(shí)間指示器。這兩種實(shí)現(xiàn)都具備識(shí)別 USB 總線重置和 USB 總線掛起事件的能力。兩者都執(zhí)行主機(jī)的遠(yuǎn)程喚醒,并適當(dāng)?shù)仨憫?yīng)所有主機(jī) CONTROL 傳輸。
審核編輯:郭婷
-
控制器
+關(guān)注
關(guān)注
112文章
16382瀏覽量
178333 -
usb
+關(guān)注
關(guān)注
60文章
7950瀏覽量
264897 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7508瀏覽量
88078
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論