引言
VxWoAs是美國Wind River System(WRS)公司開發(fā)的嵌入式實時操作系統(tǒng)。VxWorks中的I/O子系統(tǒng)為應用程序提供了簡單、統(tǒng)一、與設備無關的訪問接口。I/O系統(tǒng)內部采用設備列表、驅動程序列表和文件描述符表來實現(xiàn)對不同設備的管理與訪問,從而為開發(fā)通用外部設備驅動程序提供了便利。然而在一些專用系統(tǒng)上,為了縮短設備的響應時間,提高設備的讀取速度,有必要將設備與I/O系統(tǒng)獨立起來。由于VxWorks屬于微內核,所有的程序均運行在同一線性地址空間,這也為設備與I/O系統(tǒng)的獨立提供了條件?;赩xWorks的I/O子系統(tǒng)設備管理的思想,本文提出了一種在VxWorks下對多個同類USB設備進行管理的設計方案。該方案可使得對設備的訪問獨立于I/O子系統(tǒng)。
1 VxW0rks的I/O子系統(tǒng)設備管理
VxWorks I/O系統(tǒng)內部對設備的管理主要通過三張表來實現(xiàn),即驅動程序列表、設備列表和文件描述符表。其中驅動程序列表用來管理已注冊的設備驅動程序,它的大小是固定的,有NUM DRIVERS項,每一項對應驅動程序的入口點,當應用程序調用標準I/O接口函數(shù)時,I/O子系統(tǒng)便可通過驅動程序列表檢索到設備的驅動程序,從而實現(xiàn)對指定設備的訪問、發(fā)送、接收等操作。系統(tǒng)可利用iosDrvInstall()注冊設備驅動程序,并將設備的人口函數(shù)加入到驅動程序列表。同時返回一個drvnum驅動程序號,并將其作為設備描述符的一部分,從而以此把設備與其驅動程序聯(lián)系起來。I/O子系統(tǒng)采用鏈表對所有設備進行管理,該鏈表稱之為設備列表。調用iosDevAdd ()可向系統(tǒng)添加設備,添加設備時,應指明設備名稱及驅動程序索引號,該索引號就是iosDrvInstall ()返回的索引號。在VxWorks中,一個設備可以被多次打開,但對于每一次打開,系統(tǒng)將利用一個文件描述符來區(qū)分,本系統(tǒng)將會維持一張文件描述符表,該表的每一項記錄了與設備對應的驅動程序號和設備ID,這樣,就會文件描述符與驅動程序、以及設備之間建立一種聯(lián)系。這樣,在利用標準I/O函數(shù)進行讀寫時,就可以根據(jù)文件描述符從文件描述符表中找到對應的驅動程序的人口與設備ID。VxWorks中的這三張表的關系如圖1所示。
2 USB設備管理方案設計
設計獨立于I/O系統(tǒng)的USB設備驅動程序的設計思想主要基于兩點,第一是用戶自己管理設備。第二是通過驅動程序直接向應用程序提供可用于讀寫設備的接口函數(shù)。由于設備獨立于I/O系統(tǒng),用戶需要自己設計一種設備管理方法,以便對多個接入的USB設備進行合理的管理。然而由于不存在設備驅動程序列表,故在設計時還需要有一種方法來解決設備的訪問問題。
2.1 USB設備描述符
設備描述符實際上是一個數(shù)據(jù)結構,可在系統(tǒng)中作為一個邏輯結構體。它是一個具體設備的抽象??膳c一個物理設備相對應,是參與設備管理、訪問的主要結構體。鑒于I/O子系統(tǒng)對設備的管理,在對多個USB設備進行管理時,對于設備的存儲,可采用雙向鏈表來進行管理,稱之為設備列表。鏈表對USB設備的管理主要通過設備頭(USB_BEV_HDR)來實現(xiàn)。USB設備頭是一個與具體設備無關的數(shù)據(jù)結構,它由一個鏈表節(jié)點和設備名稱組成。節(jié)點中包含指向有前一個和下一個USB設備的設備頭的鏈表節(jié)點。實際上,每一個USB設備都會有更多的數(shù)據(jù)存儲在更大的數(shù)據(jù)結構中。這個結構就是設備描述符,而USB設備頭只是做為USB設備描述符的起始部分。設備頭的數(shù)據(jù)結構(USB_DEV_HDR)如下:
其中,USB_DL_NODE是一個鏈表節(jié)點,它由兩個鏈表節(jié)點指針域組成。分別指向前一個和下一個設備的鏈表節(jié)點。其數(shù)據(jù)結構如下:
這樣,就可以把USB設備的描述符劃分為兩部分,其中一部分與具體設備無關,稱為設備頭:另外一部分是與具體設備相關的設備特殊數(shù)據(jù),設備相關部分包括USB設備的Node ID、USB管道句柄、端點地址、狀態(tài)等信息。其結構如圖2所示。設備無關部分主要用于設備管理,而設備相關部分則用于對設備的訪問。
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所示。
在讀寫設備時??梢栽O備號作為設備的標識,并通過設備號在nodeld數(shù)組中得到設備的nodeId,再從設備列表中查找到具體的物理設備的描述符。從而得到設備資源并對設備進行訪問。以LM9833讀設備為例,其讀設備原型代碼如下:
其中,usbScanRead()是驅動程序向用戶應用程序提供的接口函數(shù),直接調用該函數(shù)即可讀取設備,其它的設備函數(shù)也是如此,其中設備號dev是由用戶根據(jù)不同設備的不同Product ID(PID)號制定的,這樣,當設備接入系統(tǒng)時,驅動程序就會根據(jù)其PID號判斷其設備號,并將該設備的nodeld值存放于數(shù)組的特定位置。由于此時設備始終處于就緒狀態(tài),用戶可以隨時對設備進行讀寫操作,而并不存在打開設備的操作。
讀寫設備時,首先要根據(jù)設備號dev從設備列表中查找出設備,并將其定位到具體的設備描述符上。在查找設備時,遍歷設備列表,就可找到節(jié)點設備描述符中nodeId與usbd_node_id[dev]相匹配的設備描述符結構體,并返回該結構體,然后再由設備描述符結構體得到設備的資源信息,從而實現(xiàn)對設備的讀寫。圖6所示是查找設備的一個簡單流程。
該方法屏蔽了復雜的驅動程序列表和文件描述符表,從而提供了一種快速定位和訪問設備的方法。這種方法在專用的系統(tǒng)中,對同類USB設備的訪問是非常高效的,但不具有通用性,也就是說,對于不同類別的設備。則需要另外一套同樣的機制來實現(xiàn)。
3 結束語
本文提出了一種獨立于VxWorks I/O系統(tǒng)的USB設備管理方法。該方法也是一種獨立于I/O系統(tǒng)的USB設備驅動程序設計模式,它對于在專用系統(tǒng)中同類USB設備的管理是非常有效的。通過對USB設備描述符、設備列表、以及應用程序訪問設備流程的設計,可以成功實現(xiàn)獨立于I/O系統(tǒng)的設備管理方法。這一種方法可以利用驅動程序直接向應用系統(tǒng)提供接口函數(shù)和nodeld數(shù)組。從而摒棄了I/O系統(tǒng)中復雜的驅動程序列表和文件描述符等概念。目前,這種獨立于VxWorks I/O系統(tǒng)的USB設備管理方法已在某大型掃描儀中得到應用,并取得了一定的經濟效益。
lele