VxWorks下的同類(lèi)USB設備管理方法
VxWoAs是美國Wind River System(WRS)公司開(kāi)發(fā)的嵌入式實(shí)時(shí)操作系統。VxWorks中的I/O子系統為應用程序提供了簡(jiǎn)單、統一、與設備無(wú)關(guān)的訪(fǎng)問(wèn)接口。I/O系統內部采用設備列表、驅動(dòng)程序列表和文件描述符表來(lái)實(shí)現對不同設備的管理與訪(fǎng)問(wèn),從而為開(kāi)發(fā)通用外部設備驅動(dòng)程序提供了便利。然而在一些專(zhuān)用系統上,為了縮短設備的響應時(shí)間,提高設備的讀取速度,有必要將設備與I/O系統獨立起來(lái)。由于VxWorks屬于微內核,所有的程序均運行在同一線(xiàn)性地址空間,這也為設備與I/O系統的獨立提供了條件?;?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/VxWorks">VxWorks的I/O子系統設備管理的思想,本文提出了一種在VxWorks下對多個(gè)同類(lèi)USB設備進(jìn)行管理的設計方案。該方案可使得對設備的訪(fǎng)問(wèn)獨立于I/O子系統。
1 VxW0rks的I/O子系統設備管理
VxWorks I/O系統內部對設備的管理主要通過(guò)三張表來(lái)實(shí)現,即驅動(dòng)程序列表、設備列表和文件描述符表。其中驅動(dòng)程序列表用來(lái)管理已注冊的設備驅動(dòng)程序,它的大小是固定的,有NUM DRIVERS項,每一項對應驅動(dòng)程序的入口點(diǎn),當應用程序調用標準I/O接口函數時(shí),I/O子系統便可通過(guò)驅動(dòng)程序列表檢索到設備的驅動(dòng)程序,從而實(shí)現對指定設備的訪(fǎng)問(wèn)、發(fā)送、接收等操作。系統可利用iosDrvInstall()注冊設備驅動(dòng)程序,并將設備的人口函數加入到驅動(dòng)程序列表。同時(shí)返回一個(gè)drvnum驅動(dòng)程序號,并將其作為設備描述符的一部分,從而以此把設備與其驅動(dòng)程序聯(lián)系起來(lái)。I/O子系統采用鏈表對所有設備進(jìn)行管理,該鏈表稱(chēng)之為設備列表。調用iosDevAdd ()可向系統添加設備,添加設備時(shí),應指明設備名稱(chēng)及驅動(dòng)程序索引號,該索引號就是iosDrvInstall ()返回的索引號。在VxWorks中,一個(gè)設備可以被多次打開(kāi),但對于每一次打開(kāi),系統將利用一個(gè)文件描述符來(lái)區分,本系統將會(huì )維持一張文件描述符表,該表的每一項記錄了與設備對應的驅動(dòng)程序號和設備ID,這樣,就會(huì )文件描述符與驅動(dòng)程序、以及設備之間建立一種聯(lián)系。這樣,在利用標準I/O函數進(jìn)行讀寫(xiě)時(shí),就可以根據文件描述符從文件描述符表中找到對應的驅動(dòng)程序的人口與設備ID。VxWorks中的這三張表的關(guān)系如圖1所示。
2 USB設備管理方案設計
設計獨立于I/O系統的USB設備驅動(dòng)程序的設計思想主要基于兩點(diǎn),第一是用戶(hù)自己管理設備。第二是通過(guò)驅動(dòng)程序直接向應用程序提供可用于讀寫(xiě)設備的接口函數。由于設備獨立于I/O系統,用戶(hù)需要自己設計一種設備管理方法,以便對多個(gè)接入的USB設備進(jìn)行合理的管理。然而由于不存在設備驅動(dòng)程序列表,故在設計時(shí)還需要有一種方法來(lái)解決設備的訪(fǎng)問(wèn)問(wèn)題。
2.1 USB設備描述符
設備描述符實(shí)際上是一個(gè)數據結構,可在系統中作為一個(gè)邏輯結構體。它是一個(gè)具體設備的抽象??膳c一個(gè)物理設備相對應,是參與設備管理、訪(fǎng)問(wèn)的主要結構體。鑒于I/O子系統對設備的管理,在對多個(gè)USB設備進(jìn)行管理時(shí),對于設備的存儲,可采用雙向鏈表來(lái)進(jìn)行管理,稱(chēng)之為設備列表。鏈表對USB設備的管理主要通過(guò)設備頭(USB_BEV_HDR)來(lái)實(shí)現。USB設備頭是一個(gè)與具體設備無(wú)關(guān)的數據結構,它由一個(gè)鏈表節點(diǎn)和設備名稱(chēng)組成。節點(diǎn)中包含指向有前一個(gè)和下一個(gè)USB設備的設備頭的鏈表節點(diǎn)。實(shí)際上,每一個(gè)USB設備都會(huì )有更多的數據存儲在更大的數據結構中。這個(gè)結構就是設備描述符,而USB設備頭只是做為USB設備描述符的起始部分。設備頭的數據結構(USB_DEV_HDR)如下:
其中,USB_DL_NODE是一個(gè)鏈表節點(diǎn),它由兩個(gè)鏈表節點(diǎn)指針域組成。分別指向前一個(gè)和下一個(gè)設備的鏈表節點(diǎn)。其數據結構如下:
這樣,就可以把USB設備的描述符劃分為兩部分,其中一部分與具體設備無(wú)關(guān),稱(chēng)為設備頭:另外一部分是與具體設備相關(guān)的設備特殊數據,設備相關(guān)部分包括USB設備的Node ID、USB管道句柄、端點(diǎn)地址、狀態(tài)等信息。其結構如圖2所示。設備無(wú)關(guān)部分主要用于設備管理,而設備相關(guān)部分則用于對設備的訪(fǎng)問(wèn)。
評論