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