新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > VxWorks下的同類USB設(shè)備管理方法

        VxWorks下的同類USB設(shè)備管理方法

        作者: 時(shí)間:2013-10-08 來源:網(wǎng)絡(luò) 收藏


          2.2設(shè)備列表設(shè)計(jì)

          為了方便對(duì)設(shè)備的管理,USB設(shè)備列表可采用雙向鏈表結(jié)構(gòu),其作用是將所有USB設(shè)備的有關(guān)信息組織起來,從而實(shí)現(xiàn)對(duì)多個(gè)設(shè)備的鏈?zhǔn)焦芾怼G懊嫣岬降脑O(shè)備描述符就是一個(gè)存儲(chǔ)了設(shè)備信息的數(shù)據(jù)結(jié)構(gòu)。而所有USB設(shè)備描述符都是以設(shè)備頭數(shù)據(jù)結(jié)構(gòu)開始的,這樣,就可以很方便地將設(shè)備描述符組成一個(gè)鏈表形式的設(shè)備列表。通常鏈表的數(shù)據(jù)結(jié)構(gòu)如下:


          圖3所示是一個(gè)空設(shè)備列表,而非空設(shè)備列表則如圖4所示。


          對(duì)于設(shè)備,通常程序只維護(hù)一張?jiān)O(shè)備列表,在注冊(cè)該USB設(shè)備驅(qū)動(dòng)程序時(shí),初始化設(shè)備列表為空,驅(qū)動(dòng)程序只能被真正的注冊(cè)一次,因此,設(shè)備列表也只初始化一次。當(dāng)驅(qū)動(dòng)程序中的回調(diào)函數(shù)檢測(cè)到有設(shè)備動(dòng)態(tài)接人時(shí),系統(tǒng)會(huì)在創(chuàng)建設(shè)備、分配設(shè)備資源的同時(shí)將設(shè)備描述符加入到設(shè)備列表,而且只將其加入到設(shè)備列表的尾部。而在有設(shè)備動(dòng)態(tài)移除時(shí),驅(qū)動(dòng)程序回調(diào)函數(shù)會(huì)捕獲移除動(dòng)作,并根據(jù)設(shè)備的標(biāo)識(shí)遍歷設(shè)備列表,以查找出移除的設(shè)備,然后將其描述符從設(shè)備列表中刪除。遍歷設(shè)備列表其實(shí)就是一個(gè)查找設(shè)備的過程。查找設(shè)備時(shí),每一個(gè)設(shè)備都需要用唯一的一個(gè)標(biāo)識(shí)來與其它設(shè)備區(qū)別,從而引出了設(shè)備的唯一標(biāo)識(shí)問題。

          2.3 USB設(shè)備的標(biāo)識(shí)問題

          同I/O系統(tǒng)標(biāo)識(shí)設(shè)備一樣,對(duì)于USB設(shè)備的標(biāo)識(shí)。也可以采用設(shè)備名來標(biāo)識(shí)。這樣可以給用戶一個(gè)直觀的概念,而且便于記憶。利用設(shè)備頭(USB_DEV_HDR)中的name指針域可以為每一個(gè)接入的設(shè)備起一個(gè)名字。這樣,對(duì)于不同的設(shè)備,就可以用名字字符串來唯一區(qū)分,但這不利于快速訪問設(shè)備,因?yàn)樵诿看尾檎以O(shè)備的時(shí)候?qū)τ诿恳粋€(gè)設(shè)備鏈表節(jié)點(diǎn)都要進(jìn)行一次字符串比較,這樣便延長(zhǎng)了查找設(shè)備的時(shí)間。針對(duì)USB設(shè)備及下USB協(xié)議棧的特點(diǎn),充分利用USBD對(duì)USB設(shè)備的標(biāo)識(shí),在設(shè)計(jì)中可采用USBD_NODEjD來標(biāo)識(shí)設(shè)備。在中的USB協(xié)議棧中。對(duì)每一個(gè)USB設(shè)備為其分配一個(gè)唯一的USBD_NODE_ID號(hào)。事實(shí)上, USBD并不關(guān)心設(shè)備與哪一個(gè)USB主控制器相連,也不關(guān)心物理設(shè)備的連接細(xì)節(jié)以及地址分配,USBD通常只是采用USBD_NODE_ID來定位設(shè)備。因此,基于USBD對(duì)USB設(shè)備的定位方法,在采用鏈表對(duì)USB設(shè)備進(jìn)行管理時(shí),也可以采用USBD_NODE_ID來唯一標(biāo)識(shí)一個(gè)USB設(shè)備。在用該方法標(biāo)識(shí)設(shè)備時(shí),可將USBD_NODE_ID nodeld作為USB設(shè)備描述符結(jié)構(gòu)體的一個(gè)成員,其設(shè)備描述符結(jié)構(gòu)改造如下:


          由于USBD_NODE_ID是一個(gè)32位無符號(hào)整型數(shù),因此,在查找設(shè)備時(shí),可以用switch case語句來完成。

          2.4設(shè)備訪問技術(shù)

          由于設(shè)備是獨(dú)立于I/O系統(tǒng)的,因此不存在驅(qū)動(dòng)程序列表和文件描述符表。設(shè)計(jì)時(shí),可采用驅(qū)動(dòng)程序直接向應(yīng)用程序提供可訪問設(shè)備的接口函數(shù),以替代驅(qū)動(dòng)程序列表,而采用USBD_NODE_ID數(shù)組來存放多個(gè)USB設(shè)備的標(biāo)識(shí),以替代文件描述符表,如:USBD_NODE_ID usbd_node_id[MAX_DEV_NUM]。

          對(duì)于設(shè)備,根據(jù)其Product ID的不同,可將其記為O、l、2……MAX_DEV_NUM號(hào)設(shè)備,并分別將其USBD_NODE_ID存放于數(shù)組的對(duì)應(yīng)位置。這樣,在訪問設(shè)備時(shí),就可利用設(shè)備號(hào)來代替文件描述符,例如在讀取0號(hào)設(shè)備時(shí),由其索引值0,就可得到其USBD_NODE_ID為USBD_NODE_ID usbd_node_id[O],再從設(shè)備列表中查找出nodeld為usbd_node_id[O]的設(shè)備結(jié)構(gòu)體,就可最終得到設(shè)備資源。通過USBD_NODE_ID數(shù)組來管理多個(gè)設(shè)備的nodeld如圖5所示。



        關(guān)鍵詞: VxWorks 同類USB 設(shè)備管理

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 灵武市| 东乡| 雷波县| 台安县| 永宁县| 夏津县| 乌拉特中旗| 邓州市| 丽江市| 岳普湖县| 海宁市| 夏邑县| 汶川县| 北流市| 临夏县| 香格里拉县| 望都县| 托克逊县| 曲水县| 平顶山市| 苍梧县| 阜阳市| 射阳县| 秦皇岛市| 陕西省| 衡阳市| 通化县| 罗定市| 宁德市| 贵德县| 庆元县| 塔城市| 洞口县| 宜川县| 崇明县| 和平县| 西昌市| 乌苏市| 垣曲县| 临泉县| 孝昌县|