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