<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 模擬技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于HID規(guī)范的智能遙控器中的設(shè)計(jì)2

          基于HID規(guī)范的智能遙控器中的設(shè)計(jì)2

          作者: 時(shí)間:2012-09-09 來(lái)源:網(wǎng)絡(luò) 收藏

          2.2 軟件系統(tǒng)設(shè)計(jì)

            本系統(tǒng)所設(shè)計(jì)和實(shí)現(xiàn)的體感游戲手柄具有輸入和輸出的功能,即它具有輸入和輸出HID 數(shù)據(jù)包。它不像鍵盤和鼠標(biāo)是標(biāo)準(zhǔn)的HID 設(shè)備,需要根據(jù)HID 規(guī)范自定義它的數(shù)據(jù)包格式。根據(jù)數(shù)據(jù)包的格式,寫(xiě)出其報(bào)告描述符,以保證在枚舉過(guò)程中正確識(shí)別出體感游戲手柄設(shè)備。Dongle 端分析整理從端獲取到的數(shù)據(jù),根據(jù)設(shè)備的報(bào)告描述符,識(shí)別出體感游戲手柄數(shù)據(jù),并把這些數(shù)據(jù)整理成符合其輸入數(shù)據(jù)包格式的數(shù)據(jù),然后Dongle 端再以USB 協(xié)議的通信方式,將整理好的數(shù)據(jù)傳輸給電視機(jī)。同時(shí)Dongle 端接收電視機(jī)反饋回來(lái)的數(shù)據(jù)信息, 并整理成符合其輸出數(shù)據(jù)包格式的數(shù)據(jù),然后將信息反饋給端,端再作出相應(yīng)的響應(yīng)。

            與所有HID 設(shè)備一樣,具有體感游戲手柄功能的遙控器Dongle 端的應(yīng)用程序設(shè)計(jì)也主要包括以下4 個(gè)方面的工作:1)查找所有HID 設(shè)備;2)確定哪一個(gè)是用戶需要的HID 設(shè)備,并連接該設(shè)備;3)獲得HID 設(shè)備的信息;4)根據(jù)用戶需要,讀取HID 輸入報(bào)告或者寫(xiě)入HID 輸出報(bào)告。

            遙控器中可能定義了多個(gè)HID 設(shè)備,需要使用兩個(gè)接口,接口0 用于實(shí)現(xiàn)其他HID 設(shè)備的功能,接口1 用于實(shí)現(xiàn)體感游戲手柄的功能。因此需要兩個(gè)非零端點(diǎn),因?yàn)橥慌渲孟碌牟煌涌?,必須使用不同的端點(diǎn)。而數(shù)據(jù)是通過(guò)非零端點(diǎn)進(jìn)行傳輸?shù)模w感游戲手柄的接口選用端點(diǎn)2 返回或發(fā)送報(bào)告數(shù)據(jù)。Dongle 端通過(guò)端點(diǎn)2 輸入向電視機(jī)返回體感游戲手柄的數(shù)據(jù),電視機(jī)通過(guò)端點(diǎn)2 輸出中斷將反饋給遙控器的信息發(fā)出。

            Dongle 插入后,怎樣讓電視機(jī)識(shí)別出USB 體感游戲手柄呢?設(shè)備枚舉的功能就是實(shí)現(xiàn)電視機(jī)識(shí)別設(shè)備的過(guò)程,只有枚舉成功了,電視機(jī)才能識(shí)別出設(shè)備,建立電視機(jī)與設(shè)備之間的通信。設(shè)備的枚舉過(guò)程都是通過(guò)端點(diǎn)0 實(shí)現(xiàn)的。電視機(jī)通過(guò)端點(diǎn)0 輸出中斷發(fā)出各種請(qǐng)求,數(shù)據(jù)存放在端點(diǎn)0 的輸出緩沖區(qū)中。Dongle 端讀取并分析端點(diǎn)0 輸出緩沖區(qū)的數(shù)據(jù),然后通過(guò)端點(diǎn)0 輸入中斷做出相應(yīng)的響應(yīng),數(shù)據(jù)存放到端點(diǎn)0輸入緩沖區(qū)中, 在電視機(jī)下一次發(fā)送IN 令牌包后,MCU 會(huì)自動(dòng)將端點(diǎn)0 輸入緩沖區(qū)數(shù)據(jù)返回給電視機(jī)。當(dāng)Dongle 端有多個(gè)報(bào)告描述符時(shí),程序怎么知道電視機(jī)請(qǐng)求的是哪個(gè)呢? 電視機(jī)要獲取報(bào)告描述符時(shí),請(qǐng)求是發(fā)送到接口的。當(dāng)電視機(jī)發(fā)出發(fā)送到接口1 的報(bào)告描述符請(qǐng)求時(shí),Dongle 端會(huì)返回體感游戲手柄的報(bào)告描述符數(shù)據(jù)給電視機(jī), 從而成功完成枚舉過(guò)程。電視機(jī)識(shí)別出體感游戲手柄,建立它們之間的通信。

            在本系統(tǒng)中,通過(guò)在芯片的集成開(kāi)發(fā)環(huán)境中添加USB 模塊,根據(jù)實(shí)現(xiàn)設(shè)備的功能特點(diǎn),做出相應(yīng)設(shè)置并編譯,實(shí)現(xiàn)設(shè)備枚舉過(guò)程的功能及所需的代碼, 然后再根據(jù)設(shè)備的實(shí)際需求做相應(yīng)的修改, 在Dongle 端程序的主函數(shù)中初始化USB 模塊,就可以實(shí)現(xiàn)電視機(jī)識(shí)別Dongle,進(jìn)而識(shí)別出體感游戲手柄設(shè)備。Dongle 端程序主流程圖如圖4 所示。進(jìn)入主函數(shù),MCU 首先完成一系列初始化,包括中斷配置和USB模塊初始化(開(kāi)始枚舉過(guò)程)。然后程序就處于一個(gè)無(wú)限循環(huán)中,實(shí)現(xiàn)電視機(jī)和設(shè)備之間的實(shí)時(shí)通信。

          基于HID規(guī)范的智能遙控器中的設(shè)計(jì)2

          圖4 Dongle 端程序主流程

            電視機(jī)和設(shè)備之間不是隨時(shí)都能夠進(jìn)行通信的,只有設(shè)置了非零配置之后才能進(jìn)行數(shù)據(jù)傳輸。在無(wú)限循環(huán)中,首先判斷電視機(jī)和Dongle 端的通信是否準(zhǔn)備好,即設(shè)備的枚舉過(guò)程是否成功完成。這需要獲取配置值,進(jìn)行判斷,若配置值非零,說(shuō)明電視機(jī)和Dongle 端的通信已建立。Dongle 端不斷的獲取從遙控器端發(fā)來(lái)的數(shù)據(jù),根據(jù)設(shè)備的設(shè)備描述符、配置描述符集合(包括斷點(diǎn)描述符、接口描述符等),分析整理后存放到相應(yīng)HID 設(shè)備的HID 包中, 然后通過(guò)USB 總線傳遞給電視機(jī)。

            若按下體感開(kāi)關(guān)鍵,遙控器選擇的是體感游戲手柄功能;否則,遙控器選擇的是其他設(shè)備的功能。按下體感開(kāi)關(guān)鍵,電視機(jī)先通過(guò)端點(diǎn)2 輸出中斷發(fā)出反饋信息, 使遙控器端的體感開(kāi)關(guān)指示燈亮,體感游戲手柄功能打開(kāi),然后遙控器可以發(fā)送體感游戲手柄數(shù)據(jù)給電視機(jī)。Dongle 端發(fā)送體感游戲手柄數(shù)據(jù)到端點(diǎn)2 之前,需要檢查端點(diǎn)2 是否處于空閑狀態(tài),即里面是否還有數(shù)據(jù)未發(fā)送出去, 可以通過(guò)端點(diǎn)2 輸入中斷和總線復(fù)位中斷使端點(diǎn)2處于空閑狀態(tài)。如果端點(diǎn)2 輸入處于空閑狀態(tài),就可以通過(guò)端點(diǎn)2 輸入返回體感游戲手柄數(shù)據(jù)給電視機(jī)了。電視機(jī)會(huì)根據(jù)游戲的進(jìn)度發(fā)出反饋信息, 調(diào)用遙控器的傳感器模塊、震動(dòng)模塊和Audio 模塊,實(shí)現(xiàn)遙控器和電視機(jī)之間的互動(dòng)。

            3 結(jié)束語(yǔ)


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: HID規(guī)范 智能 遙控器

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();