基于HID規(guī)范的智能遙控器中的設計2
2.2 軟件系統(tǒng)設計
本系統(tǒng)所設計和實現的體感游戲手柄具有輸入和輸出的功能,即它具有輸入和輸出HID 數據包。它不像鍵盤和鼠標是標準的HID 設備,需要根據HID 規(guī)范自定義它的數據包格式。根據數據包的格式,寫出其報告描述符,以保證在枚舉過程中正確識別出體感游戲手柄設備。Dongle 端分析整理從遙控器端獲取到的數據,根據設備的報告描述符,識別出體感游戲手柄數據,并把這些數據整理成符合其輸入數據包格式的數據,然后Dongle 端再以USB 協(xié)議的通信方式,將整理好的數據傳輸給電視機。同時Dongle 端接收電視機反饋回來的數據信息, 并整理成符合其輸出數據包格式的數據,然后將信息反饋給遙控器端,遙控器端再作出相應的響應。
與所有HID 設備一樣,具有體感游戲手柄功能的智能遙控器Dongle 端的應用程序設計也主要包括以下4 個方面的工作:1)查找所有HID 設備;2)確定哪一個是用戶需要的HID 設備,并連接該設備;3)獲得HID 設備的信息;4)根據用戶需要,讀取HID 輸入報告或者寫入HID 輸出報告。
智能遙控器中可能定義了多個HID 設備,需要使用兩個接口,接口0 用于實現其他HID 設備的功能,接口1 用于實現體感游戲手柄的功能。因此需要兩個非零端點,因為同一配置下的不同接口,必須使用不同的端點。而數據是通過非零端點進行傳輸的,體感游戲手柄的接口選用端點2 返回或發(fā)送報告數據。Dongle 端通過端點2 輸入向電視機返回體感游戲手柄的數據,電視機通過端點2 輸出中斷將反饋給遙控器的信息發(fā)出。
Dongle 插入后,怎樣讓電視機識別出USB 體感游戲手柄呢?設備枚舉的功能就是實現電視機識別設備的過程,只有枚舉成功了,電視機才能識別出設備,建立電視機與設備之間的通信。設備的枚舉過程都是通過端點0 實現的。電視機通過端點0 輸出中斷發(fā)出各種請求,數據存放在端點0 的輸出緩沖區(qū)中。Dongle 端讀取并分析端點0 輸出緩沖區(qū)的數據,然后通過端點0 輸入中斷做出相應的響應,數據存放到端點0輸入緩沖區(qū)中, 在電視機下一次發(fā)送IN 令牌包后,MCU 會自動將端點0 輸入緩沖區(qū)數據返回給電視機。當Dongle 端有多個報告描述符時,程序怎么知道電視機請求的是哪個呢? 電視機要獲取報告描述符時,請求是發(fā)送到接口的。當電視機發(fā)出發(fā)送到接口1 的報告描述符請求時,Dongle 端會返回體感游戲手柄的報告描述符數據給電視機, 從而成功完成枚舉過程。電視機識別出體感游戲手柄,建立它們之間的通信。
在本系統(tǒng)中,通過在芯片的集成開發(fā)環(huán)境中添加USB 模塊,根據實現設備的功能特點,做出相應設置并編譯,實現設備枚舉過程的功能及所需的代碼, 然后再根據設備的實際需求做相應的修改, 在Dongle 端程序的主函數中初始化USB 模塊,就可以實現電視機識別Dongle,進而識別出體感游戲手柄設備。Dongle 端程序主流程圖如圖4 所示。進入主函數,MCU 首先完成一系列初始化,包括中斷配置和USB模塊初始化(開始枚舉過程)。然后程序就處于一個無限循環(huán)中,實現電視機和設備之間的實時通信。
圖4 Dongle 端程序主流程
電視機和設備之間不是隨時都能夠進行通信的,只有設置了非零配置之后才能進行數據傳輸。在無限循環(huán)中,首先判斷電視機和Dongle 端的通信是否準備好,即設備的枚舉過程是否成功完成。這需要獲取配置值,進行判斷,若配置值非零,說明電視機和Dongle 端的通信已建立。Dongle 端不斷的獲取從遙控器端發(fā)來的數據,根據設備的設備描述符、配置描述符集合(包括斷點描述符、接口描述符等),分析整理后存放到相應HID 設備的HID 包中, 然后通過USB 總線傳遞給電視機。
若按下體感開關鍵,遙控器選擇的是體感游戲手柄功能;否則,遙控器選擇的是其他設備的功能。按下體感開關鍵,電視機先通過端點2 輸出中斷發(fā)出反饋信息, 使遙控器端的體感開關指示燈亮,體感游戲手柄功能打開,然后遙控器可以發(fā)送體感游戲手柄數據給電視機。Dongle 端發(fā)送體感游戲手柄數據到端點2 之前,需要檢查端點2 是否處于空閑狀態(tài),即里面是否還有數據未發(fā)送出去, 可以通過端點2 輸入中斷和總線復位中斷使端點2處于空閑狀態(tài)。如果端點2 輸入處于空閑狀態(tài),就可以通過端點2 輸入返回體感游戲手柄數據給電視機了。電視機會根據游戲的進度發(fā)出反饋信息, 調用遙控器的傳感器模塊、震動模塊和Audio 模塊,實現遙控器和電視機之間的互動。
3 結束語
評論