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