VxWorks下的同類(lèi)USB設(shè)備管理方法
2.2設(shè)備列表設(shè)計(jì)
為了方便對(duì)設(shè)備的管理,USB設(shè)備列表可采用雙向鏈表結(jié)構(gòu),其作用是將所有USB設(shè)備的有關(guān)信息組織起來(lái),從而實(shí)現(xiàn)對(duì)多個(gè)設(shè)備的鏈?zhǔn)焦芾?。前面提到的設(shè)備描述符就是一個(gè)存儲(chǔ)了設(shè)備信息的數(shù)據(jù)結(jié)構(gòu)。而所有USB設(shè)備描述符都是以設(shè)備頭數(shù)據(jù)結(jié)構(gòu)開(kāi)始的,這樣,就可以很方便地將設(shè)備描述符組成一個(gè)鏈表形式的設(shè)備列表。通常鏈表的數(shù)據(jù)結(jié)構(gòu)如下:
圖3所示是一個(gè)空設(shè)備列表,而非空設(shè)備列表則如圖4所示。
對(duì)于同類(lèi)USB設(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è)備的過(guò)程。查找設(shè)備時(shí),每一個(gè)設(shè)備都需要用唯一的一個(gè)標(biāo)識(shí)來(lái)與其它設(shè)備區(qū)別,從而引出了設(shè)備的唯一標(biāo)識(shí)問(wèn)題。
2.3 USB設(shè)備的標(biāo)識(shí)問(wèn)題
同I/O系統(tǒng)標(biāo)識(shí)設(shè)備一樣,對(duì)于USB設(shè)備的標(biāo)識(shí)。也可以采用設(shè)備名來(lái)標(biāo)識(shí)。這樣可以給用戶一個(gè)直觀的概念,而且便于記憶。利用設(shè)備頭(USB_DEV_HDR)中的name指針域可以為每一個(gè)接入的設(shè)備起一個(gè)名字。這樣,對(duì)于不同的設(shè)備,就可以用名字字符串來(lái)唯一區(qū)分,但這不利于快速訪問(wèn)設(shè)備,因?yàn)樵诿看尾檎以O(shè)備的時(shí)候?qū)τ诿恳粋€(gè)設(shè)備鏈表節(jié)點(diǎn)都要進(jìn)行一次字符串比較,這樣便延長(zhǎng)了查找設(shè)備的時(shí)間。針對(duì)USB設(shè)備及VxWorks下USB協(xié)議棧的特點(diǎn),充分利用USBD對(duì)USB設(shè)備的標(biāo)識(shí),在設(shè)計(jì)中可采用USBD_NODEjD來(lái)標(biāo)識(shí)設(shè)備。在VxWorks中的USB協(xié)議棧中。對(duì)每一個(gè)USB設(shè)備為其分配一個(gè)唯一的USBD_NODE_ID號(hào)。事實(shí)上,VxWorks USBD并不關(guān)心設(shè)備與哪一個(gè)USB主控制器相連,也不關(guān)心物理設(shè)備的連接細(xì)節(jié)以及地址分配,USBD通常只是采用USBD_NODE_ID來(lái)定位設(shè)備。因此,基于USBD對(duì)USB設(shè)備的定位方法,在采用鏈表對(duì)USB設(shè)備進(jìn)行管理時(shí),也可以采用USBD_NODE_ID來(lái)唯一標(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位無(wú)符號(hào)整型數(shù),因此,在查找設(shè)備時(shí),可以用switch case語(yǔ)句來(lái)完成。
2.4設(shè)備訪問(wèn)技術(shù)
由于設(shè)備是獨(dú)立于I/O系統(tǒng)的,因此不存在驅(qū)動(dòng)程序列表和文件描述符表。設(shè)計(jì)時(shí),可采用驅(qū)動(dòng)程序直接向應(yīng)用程序提供可訪問(wèn)設(shè)備的接口函數(shù),以替代驅(qū)動(dòng)程序列表,而采用USBD_NODE_ID數(shù)組來(lái)存放多個(gè)USB設(shè)備的標(biāo)識(shí),以替代文件描述符表,如:USBD_NODE_ID usbd_node_id[MAX_DEV_NUM]。
對(duì)于同類(lèi)USB設(shè)備,根據(jù)其Product ID的不同,可將其記為O、l、2……MAX_DEV_NUM號(hào)設(shè)備,并分別將其USBD_NODE_ID存放于數(shù)組的對(duì)應(yīng)位置。這樣,在訪問(wèn)設(shè)備時(shí),就可利用設(shè)備號(hào)來(lái)代替文件描述符,例如在讀取0號(hào)設(shè)備時(shí),由其索引值0,就可得到其USBD_NODE_ID為USBD_NODE_ID usbd_node_id[O],再?gòu)脑O(shè)備列表中查找出nodeld為usbd_node_id[O]的設(shè)備結(jié)構(gòu)體,就可最終得到設(shè)備資源。通過(guò)USBD_NODE_ID數(shù)組來(lái)管理多個(gè)設(shè)備的nodeld如圖5所示。
評(píng)論