新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C64x系列DSP/BIOS中設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)

C64x系列DSP/BIOS中設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)

作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò) 收藏
摘要:為了高效地對(duì)外部設(shè)備進(jìn)行控制,給硬件設(shè)備編寫(xiě)驅(qū)動(dòng)程序是一種有效的解決方法。C64x系列的系統(tǒng)提出了類(lèi)/微型驅(qū)動(dòng)模型的驅(qū)動(dòng)程序結(jié)構(gòu)。實(shí)踐結(jié)果表明,采用類(lèi)/微型驅(qū)動(dòng)模型進(jìn)行驅(qū)動(dòng)程序設(shè)計(jì)后,應(yīng)用軟件可以復(fù)用絕大部分相似設(shè)備的驅(qū)動(dòng)程序,因而極大地提高了驅(qū)動(dòng)程序的開(kāi)發(fā)效率。 關(guān)鍵詞:器 I/O設(shè)備驅(qū)動(dòng) 類(lèi)/微型驅(qū)動(dòng)模型 實(shí)時(shí)操作系統(tǒng) 隨著新技術(shù)的不斷涌現(xiàn)和實(shí)時(shí)系統(tǒng)的日趨復(fù)雜,不同類(lèi)型的外部設(shè)備越來(lái)越多。為這些外部設(shè)備編寫(xiě)驅(qū)動(dòng)程序已經(jīng)成為依賴操作系統(tǒng)管理硬件的內(nèi)在要求。但是,由于內(nèi)存管腳、響應(yīng)時(shí)間和電源管理等條件的限制,為一個(gè)給定的系統(tǒng)編寫(xiě)設(shè)備驅(qū)動(dòng)程序有時(shí)候會(huì)很困難。針對(duì)設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)者遇到的上述難題,TI公司為C64x系列[1]DSP的開(kāi)發(fā)者提供了一種類(lèi)/微型驅(qū)動(dòng)模型(class/mini-driver model)[2]。該模型在功能上將設(shè)備驅(qū)動(dòng)程序分為依賴硬件層和不依賴硬件層兩層,兩層之間使用通用接口。實(shí)踐結(jié)果表明,采用類(lèi)/微型驅(qū)動(dòng)模型進(jìn)行設(shè)計(jì)后,應(yīng)用軟件可以復(fù)用絕大部分相似設(shè)備的驅(qū)動(dòng)程序,從而提高驅(qū)動(dòng)程序的開(kāi)發(fā)效率。 1 類(lèi)/微型驅(qū)動(dòng)模型簡(jiǎn)介 在類(lèi)/微型驅(qū)動(dòng)模型中,類(lèi)驅(qū)動(dòng)通常用于完成多線程I/O請(qǐng)求的序列化功能和同步功能,同時(shí)對(duì)設(shè)備實(shí)例進(jìn)行管理。在包括視頻系統(tǒng)I/O和異步I/O的典型實(shí)時(shí)系統(tǒng)中,只有少數(shù)的類(lèi)驅(qū)動(dòng)需要表示出外部設(shè)備的類(lèi)型。 類(lèi)驅(qū)動(dòng)通過(guò)每個(gè)外部設(shè)備獨(dú)有的微型驅(qū)動(dòng)對(duì)設(shè)備進(jìn)行操作。微型驅(qū)動(dòng)通過(guò)控制外設(shè)的寄存器、內(nèi)存和中斷資源對(duì)外部設(shè)備實(shí)現(xiàn)控制。微型驅(qū)動(dòng)程序必須將特定的外部設(shè)備有效地表示給類(lèi)驅(qū)動(dòng)。例如:視頻顯示設(shè)備存在一些不同的幀存,應(yīng)用軟件會(huì)根據(jù)不同的I/O操作進(jìn)行幀存的分配,此時(shí)微型驅(qū)動(dòng)必須映射視頻顯存,使得類(lèi)驅(qū)動(dòng)可以對(duì)不連續(xù)的內(nèi)存(分別存放RGB或YUV分量)設(shè)計(jì)特定的I/O請(qǐng)求。類(lèi)/微型驅(qū)動(dòng)模型允許發(fā)送由開(kāi)發(fā)者定義數(shù)據(jù)結(jié)構(gòu)的I/O請(qǐng)求包給微型驅(qū)動(dòng)來(lái)控制外部設(shè)備,此分層結(jié)構(gòu)使設(shè)備驅(qū)動(dòng)的復(fù)用能力得到加強(qiáng),并且豐富了發(fā)送給微型驅(qū)動(dòng)的I/0請(qǐng)求包的結(jié)構(gòu)。 類(lèi)/微型驅(qū)動(dòng)模型結(jié)構(gòu)如圖1所示。上層的應(yīng)用程序不直接控制微型驅(qū)動(dòng),而是使用一個(gè)或一個(gè)以上的類(lèi)驅(qū)動(dòng)對(duì)其進(jìn)行控制。每一個(gè)類(lèi)驅(qū)動(dòng)在應(yīng)用程序代碼中表現(xiàn)為一個(gè)API[3]函數(shù)并且通過(guò)微型驅(qū)動(dòng)的接口IOM與微型驅(qū)動(dòng)進(jìn)行通信。類(lèi)驅(qū)動(dòng)使用DSP/BIOS中的API函數(shù)實(shí)現(xiàn)諸如同步等的系統(tǒng)服務(wù)。 類(lèi)驅(qū)動(dòng)通過(guò)標(biāo)準(zhǔn)的微型驅(qū)動(dòng)接口調(diào)用微型驅(qū)動(dòng)控制硬件設(shè)備。到目前為止DSP/BIOS共定義了三種類(lèi)驅(qū)動(dòng):流輸入輸出管理模塊(SIO)、管道管理模塊(PIP)和通用輸入輸出模塊(GIO)。在PIP和SIO類(lèi)驅(qū)動(dòng)中,調(diào)用的API函數(shù)已經(jīng)存在于DSP/BIOS的PIP和SIO模塊中。這些API函數(shù)需將參數(shù)傳給相應(yīng)的適配模塊(adapter),才能與微型驅(qū)動(dòng)交換數(shù)據(jù)。而在GIO類(lèi)驅(qū)動(dòng)中,調(diào)用的API函數(shù)則直接與微型驅(qū)動(dòng)通信(需在CCS2.2以上)。 每一個(gè)微型驅(qū)動(dòng)都為類(lèi)驅(qū)動(dòng)和DSP/BIOS設(shè)備驅(qū)動(dòng)管理提供了標(biāo)準(zhǔn)接口。微型驅(qū)動(dòng)采用芯片支持庫(kù)(Chip Sup-port Library)[4]管理外圍設(shè)備的寄存器、內(nèi)存和中斷資源。 2 類(lèi)驅(qū)動(dòng)的編寫(xiě) SIO和PIP兩個(gè)接口模塊用于支持DSP和外設(shè)之間的數(shù)據(jù)交換。這兩種模塊都可以通過(guò)類(lèi)驅(qū)動(dòng)中的適配模塊和微型驅(qū)動(dòng)的IOM連接進(jìn)行數(shù)據(jù)傳輸。SIO的適配模塊稱為DIO,PIP的適配模塊稱為PIO。GIO模塊[5]的傳輸模式是基于流輸入輸出模式的同步I/O模式,更適合文件系統(tǒng)I/O。在編寫(xiě)類(lèi)驅(qū)動(dòng)時(shí),可以直接調(diào)用GIO的讀寫(xiě)API函數(shù),這些函數(shù)的接口已經(jīng)內(nèi)置于微型驅(qū)動(dòng)的IOM中。 2.1 SIO模塊和DIO模塊 DSP/BIOS中的SIO模塊為每個(gè)DSP/BIOS線程提供一個(gè)獨(dú)立的I/O機(jī)制,它支持動(dòng)態(tài)創(chuàng)建。SIO模塊有自己的驅(qū)動(dòng)模型,稱為DEV。DEV程序和微型驅(qū)動(dòng)的編寫(xiě)方法相似,都要實(shí)現(xiàn)函數(shù)表中的打開(kāi)、關(guān)閉和緩存管理等函數(shù),然而結(jié)構(gòu)比較復(fù)雜。相比之下,DIO模塊可以簡(jiǎn)化SIO模塊和IOM之間的連接,使得通信和同步變得更簡(jiǎn)單。 DIO模塊必須實(shí)現(xiàn)下列基本功能函數(shù): (1)回調(diào)函數(shù) 在外設(shè)的通道實(shí)例創(chuàng)建結(jié)束時(shí),如果微型驅(qū)動(dòng)已經(jīng)完成內(nèi)存分配,那么適配模塊將通過(guò)回調(diào)函數(shù)通知微型驅(qū)動(dòng)待調(diào)用函數(shù)的地址,同時(shí)回調(diào)函數(shù)也將通知適配模塊緩存已經(jīng)建立,并最終通知上層應(yīng)用程序。 (2)傳輸函數(shù) 傳輸函數(shù)將調(diào)用微型驅(qū)動(dòng)中的md-SubmitChan函數(shù)。微型驅(qū)動(dòng)中的mdSubmitChan函數(shù)將從適配模塊獲得一塊緩存,并將緩存中的新信息通過(guò)通道實(shí)例通知給中斷服務(wù)程序(ISR)。DIO模塊通過(guò)傳輸函數(shù)實(shí)現(xiàn)應(yīng)用程序與微型驅(qū)動(dòng)之間的通信。 2.2 PlP模塊和PlO模塊 DSP/BIOS中PIP模塊提供管理異步I/O的數(shù)據(jù)管道。每個(gè)管道對(duì)象都擁有一塊同樣大小的緩存,這些緩存分別為同樣數(shù)量的等長(zhǎng)小塊。小塊的數(shù)量和長(zhǎng)度在DSP/BIOS中設(shè)置。雖然小塊的長(zhǎng)度是固定的,但應(yīng)用程序可以把小于這個(gè)長(zhǎng)度的數(shù)據(jù)放入緩存小塊中。一個(gè)管道有兩個(gè)結(jié)束狀態(tài):寫(xiě)完緩存和讀完緩存。通常,無(wú)論哪個(gè)結(jié)束狀態(tài)都會(huì)激活I(lǐng)/O設(shè)備。數(shù)據(jù)通知函數(shù)用來(lái)執(zhí)行讀寫(xiě)同步任務(wù)和通知PIP緩存填滿或清空。寫(xiě)數(shù)據(jù)時(shí),PIP_alloc函數(shù)用來(lái)獲得緩存,PIP_put函數(shù)用于將數(shù)據(jù)寫(xiě)入緩存。寫(xiě)完后,讀數(shù)據(jù)通知函數(shù)notifyReader將被調(diào)用。讀數(shù)據(jù)時(shí),PIP_get函數(shù)用來(lái)接收緩存中的數(shù)據(jù),刃PIP_free函數(shù)在數(shù)據(jù)不再被使用時(shí)將緩存清空。清空完后,寫(xiě)數(shù)據(jù)通知函數(shù)notifyWriter將被調(diào)用。PIO模塊通過(guò)PIP模塊從應(yīng)用程序中獲得緩存,并將獲得的緩存提供給微型驅(qū)動(dòng)使用。當(dāng)微型驅(qū)動(dòng)使用完緩存時(shí),PIO模塊還可以將緩存交還給應(yīng)用程序。 PIO模塊必須實(shí)現(xiàn)下列基本功能函數(shù): (1)主函數(shù) 當(dāng)應(yīng)用程序給設(shè)備分配緩存時(shí),PIP的緩存管理調(diào)用rxPrime和txPrime函數(shù)。這兩個(gè)函數(shù)調(diào)用DSP/BIOS的API函數(shù)獲得緩存并提供給微型驅(qū)動(dòng)使用。主函數(shù)負(fù)責(zé)給適配模塊和應(yīng)用程序的緩存分配發(fā)送起始信號(hào)。 (2)回調(diào)函數(shù) 當(dāng)微型驅(qū)動(dòng)已完成內(nèi)存分配時(shí),適配模塊通過(guò)回調(diào)函數(shù)rxCallback或txCallback通知微型驅(qū)動(dòng)待調(diào)用函數(shù)的地址,同時(shí)回調(diào)函數(shù)也通知適配模塊緩存已經(jīng)建立,并最終通知給上層應(yīng)用程序。 (3)傳輸函數(shù):傳輸函數(shù)將調(diào)用微型驅(qū)動(dòng)中的md—SubmitChan函數(shù)。mdSubmitChan函數(shù)將從適配模塊中獲得一塊緩存,并將緩存的新信息通過(guò)通道實(shí)例通知給中斷服務(wù)程序(ISR)。PIO模塊通過(guò)傳輸函數(shù)實(shí)現(xiàn)應(yīng)用程序與微型驅(qū)動(dòng)之間的通信。 2.3 GIO模塊 GIO模塊在提供必要的同步讀/寫(xiě)API函數(shù)及其擴(kuò)展函數(shù)的同時(shí),將代碼和使用數(shù)據(jù)緩存的大小盡量簡(jiǎn)化。如圖2所示,應(yīng)用程序可以調(diào)用GIO的API函數(shù)直接與微型驅(qū)動(dòng)的IOM交換數(shù)據(jù),這些API函數(shù)使得GIO成為了第三種類(lèi)驅(qū)動(dòng)。 當(dāng)調(diào)用GIO_create創(chuàng)建一個(gè)外部設(shè)備的通道實(shí)例時(shí),GIO在通道實(shí)例中增加了狀態(tài)和I/O請(qǐng)求狀態(tài)結(jié)構(gòu)、IOM數(shù)據(jù)包(IOM_Packets)及一個(gè)GIO數(shù)據(jù)對(duì)象。GIO創(chuàng)建的通道實(shí)例的數(shù)據(jù)結(jié)構(gòu)如下: typedef stmct GIO_Obj{ IOM_Fxns *fxns; /* 函數(shù)表指針*/ Uns mode; /* 創(chuàng)建模式 */ Uns timeout; /* 超時(shí)時(shí)間 */ IOM_Packet syncPacket;/* 同步時(shí)使用的IOM_Packet */ QUE_Obj freeList; /* 異步I/O隊(duì)列 */ Ptr syncObj; /* 同步對(duì)象地址 */ Ptr mdChan; /* 通道實(shí)例地址 */ }GIO_Obj,*GIO_Handle; 函數(shù)表指針是應(yīng)用程序和微型驅(qū)動(dòng)函數(shù)表(fxns)的接口;創(chuàng)建模式包括:輸入(IOM_INPUT)、輸出(IOM_OUTPUT)和雙向(IOM_NOUT);IOM Packet在類(lèi)驅(qū)動(dòng)和微型驅(qū)動(dòng)間的異步操作時(shí)使用;同步對(duì)象地址指向特定通道的同步信號(hào);通道實(shí)例地址指向微型驅(qū)動(dòng)創(chuàng)建的通道實(shí)例。 3 微型驅(qū)動(dòng)的設(shè)計(jì)和實(shí)現(xiàn) 類(lèi)/微型驅(qū)動(dòng)模型中的微型驅(qū)動(dòng)直接控制外部設(shè)備。只要微型驅(qū)動(dòng)創(chuàng)建了規(guī)定的函數(shù),應(yīng)用程序就可以方便地通過(guò)DIO適配模塊、PIO適配模塊或(和)GIO類(lèi)驅(qū)動(dòng)調(diào)用。這些規(guī)定的函數(shù)包括:通道綁定函數(shù)(md—BindDev)、通道創(chuàng)建/刪除函數(shù)(mdCreateChan/md—DeleteChan)、I/O請(qǐng)求發(fā)送函數(shù)(mdSubmitChan)、中斷服務(wù)函數(shù)(ISRs)和設(shè)備控制函數(shù)(mdControlChan)。這些規(guī)定的函數(shù)將放入微型驅(qū)動(dòng)的函數(shù)接口表(IOM_Fxns)中的相應(yīng)位置,供應(yīng)用程序通過(guò)適配模塊或GIO類(lèi)驅(qū)動(dòng)調(diào)用。函數(shù)接口表的結(jié)構(gòu)如下: typedef struct IOM_Fxns { IOM_TmdBindDev mdBindDev; IOM—TmdUnBindDev mdUnBindDev; IOM—TmdControlChan mdControlChan; IOM_TmdCreateChan mdCreateChan; IOM_TmdDeleteChan mdDeleteChan; IOM_TmdSubmitChan mdSubmitChan; }IOM_Fxns; 3.1 綁定通道函數(shù) DSP/BIOS設(shè)備初始化時(shí)將調(diào)用每個(gè)已注冊(cè)到微型驅(qū)動(dòng)中的綁定函數(shù)(mdBindDev)。綁定函數(shù)一般要實(shí)現(xiàn)下列功能:根據(jù)配置的設(shè)備參數(shù)和可能存在的全局設(shè)備數(shù)據(jù)初始化外圍設(shè)備;掛入中斷服務(wù)函數(shù)(ISRs);獲得緩存、McBSPs、McASPs和DMA等資源。 如果微型驅(qū)動(dòng)使用多個(gè)外部設(shè)備,則DSP/BIOS為每個(gè)外設(shè)調(diào)用綁定函數(shù)。設(shè)備參數(shù)devid用來(lái)區(qū)分設(shè)備。如果支持一個(gè)設(shè)備,則綁定函數(shù)必須檢查是否已經(jīng)有設(shè)備綁定。 微型驅(qū)動(dòng)如果使用靜態(tài)數(shù)據(jù)來(lái)減少實(shí)時(shí)處理的動(dòng)態(tài)數(shù)據(jù)分配,可以使用輸入/輸出數(shù)據(jù)指針(devp)。輸入/輸出數(shù)據(jù)指針將傳給通道創(chuàng)建函數(shù)(mdCreateChan)。 3.2 通道創(chuàng)建/刪除函數(shù) 從應(yīng)用的觀點(diǎn)出發(fā),在應(yīng)用程序和外部設(shè)備之間必須有一個(gè)邏輯交流通道用來(lái)交換數(shù)據(jù)。應(yīng)用程序通過(guò)微型驅(qū)動(dòng)創(chuàng)建一個(gè)或多個(gè)邏輯通道對(duì)象作為應(yīng)用程序的邏輯通道。通道創(chuàng)建函數(shù)(mdCreateChan)根據(jù)需要?jiǎng)?chuàng)建通道對(duì)象并給通道對(duì)象設(shè)置初始值。通道刪除函數(shù)(md—DeleteChan)則刪除已創(chuàng)建好的通道對(duì)象。雖然每個(gè)微型驅(qū)動(dòng)的通道對(duì)象數(shù)據(jù)結(jié)構(gòu)都略有不同,但有些字段是必須的,如通道模式、等待I/O包序列和回調(diào)函數(shù)。以下是一個(gè)常見(jiàn)的通道對(duì)象數(shù)據(jù)結(jié)構(gòu): typedef struct ChanObj { Bool inuse; /* 如果為T(mén)RUE,則通道已打開(kāi) */ Int mode; /* 通道模式 */ IOM_Packet *dataPacket; /*I/O包 */ QUE_Obj pendList, /* 等待I/O包序列 */ Uns *bufptr; /* 當(dāng)前緩存指針 */ Uns bufcnt; /* 未處理的緩存數(shù)目 */ IOM_TiomCallback cbFxn; /* 回調(diào)函數(shù) */ Ptr cbArg; /* 回調(diào)函數(shù)參數(shù)地址 */ }ChanObj,*ChanHandle; 3.3 I/O請(qǐng)求發(fā)送函數(shù) 微型驅(qū)動(dòng)中的I/O請(qǐng)求發(fā)送函數(shù)(mdSubmitChan)用來(lái)處理IOM_Packet包中的命令字段。根據(jù)不同命令字段,微型驅(qū)動(dòng)將處理命令或返回錯(cuò)誤信息(IOM_ENOTIMPL)。 微型驅(qū)動(dòng)支持的命令字段有:IOM_READ、IOM_WRITE、IOM_ABORT和IOM_FLUSH。微型驅(qū)動(dòng)創(chuàng)建的輸入通道由IOM_READ命令來(lái)執(zhí)行輸入任務(wù),創(chuàng)建的輸出通道則由IOM_WRITE命令來(lái)執(zhí)行輸出任務(wù)。要放棄或者刷新已經(jīng)發(fā)送的I/O請(qǐng)求,可以使用IOM_BORT或IOM FLUSH命令。當(dāng)放棄時(shí),I/O請(qǐng)求包隊(duì)列中的所有輸入輸出請(qǐng)求都將被放棄。當(dāng)刷新時(shí),所有的I/O輸出包順序執(zhí)行,而所有的輸入I/O包都被放棄。 3.4 中斷服務(wù)函數(shù) 微型驅(qū)動(dòng)的中斷功能就是去處理外部設(shè)備的觸發(fā)事件,例如周期性的中斷。中斷通常是表示外設(shè)采樣完數(shù)據(jù)或者處理完數(shù)據(jù),也可以用于為DMA提供同步信號(hào),微型驅(qū)動(dòng)必須處理這些中斷。通常微型驅(qū)動(dòng)中的中斷服務(wù)函數(shù)ISRs必須完成以下功能: 出列IOM_Packet請(qǐng)求;設(shè)置下一次傳送或服務(wù)請(qǐng)求;調(diào)用類(lèi)驅(qū)動(dòng)的回調(diào)函數(shù)以保證和應(yīng)用程序同步,并返回IOM_Packet。3.5 設(shè)備控制函數(shù) 微型驅(qū)動(dòng)支持的控制操作因不同的外部設(shè)備而異。IOM定義了一些通用的控制代碼供驅(qū)動(dòng)程序調(diào)用。特定設(shè)備獨(dú)有的控制代碼必須自己編寫(xiě),其特征值必須大于128(IOM_CNTL_USER)。目前IOM支持的通用的控制代碼有: IOM_CHAN_RESET:將創(chuàng)建的通道實(shí)例重新恢復(fù)到初始狀態(tài)。 IOM_CHAN TIMEDOUT:當(dāng)應(yīng)用程序或類(lèi)驅(qū)動(dòng)超時(shí)時(shí),此控制代碼將進(jìn)行超時(shí)操作。例如,一個(gè)超時(shí)的IOM_Packet,如果沒(méi)執(zhí)行回調(diào)函數(shù),可能會(huì)被返回類(lèi)驅(qū)動(dòng)。 IOM_DEVICE_RESE:外部設(shè)備重新恢復(fù)到初始狀態(tài),它將影響為這個(gè)外部設(shè)備創(chuàng)建的所有通道實(shí)例。 微型驅(qū)動(dòng)支持的控制代碼和控制操作必須告訴使用微型驅(qū)動(dòng)的應(yīng)用程序開(kāi)發(fā)者,特別要注明該代碼的針對(duì)對(duì)象(是針對(duì)通道實(shí)例還是針對(duì)設(shè)備實(shí)例)。例如:改變外設(shè)波特率的控制代碼,必須注明是針對(duì)某個(gè)通道或者所有通道的,否則容易給應(yīng)用程序帶來(lái)錯(cuò)誤。 4 類(lèi)/微型驅(qū)動(dòng)模型驅(qū)動(dòng)應(yīng)用實(shí)例——C64x系列DSP/BIOS中PCI設(shè)備的驅(qū)動(dòng) 4.1 微型驅(qū)動(dòng)的設(shè)計(jì)與編寫(xiě) (1) 設(shè)計(jì)mdBindDev的部分程序代碼: static Int mdBindDev(Ptr *devp,Int devid,Ptr devParams) { …… QUE_new(%26;amp;device.hiShPrioQue)/*戶建立IOM包隊(duì)列*/ QUE_new(%26;amp;device.lOwPrioQue); …… hwiAttrs.ccMask=IRQASK_NONE; /*初始化PCI中斷*/ hwiAttrs.a(chǎn)rg=NULL; IRQ_map(1RQ_EVIDSPINT,intrld); HWI_dispatchPlug(intrId,(Fxn)isr,—1,%26;amp;hwiAttrs); } (2)設(shè)計(jì)mdCreateChah的部分程序代碼 static Int mdCreateChan(Ptr *chanp,Ptr devp,String name, Int mode,Ptr chanParams,IOM_Tiom Callback cbFxn,Ptr cbArg) { …… chan=MEM_alloc(0,sizeof(ChanObj),0); chan—>queue=%26;amp;device.hghPrioQue; /*通道初始化*/ …… if(device.openCount==0){ PCI_intEnable(PCI_EVT_PCIMASTER); /*PCI設(shè)備中斷初始化。*/ …… IRQ_enable(IRQ_EVT_DSPINT); } *chanp=chan; /*返回創(chuàng)建通道*/ } (3)設(shè)計(jì)mdSubmitChan的部分程序代碼 static Int mdSubmitChan(Ptr chanp,IOM_Packet *pPacket) { ChanHandle chan=(ChanHandle)chanp; /*掛載已創(chuàng)建通道*/ …… req=(C64XX_PCI_Request*)packet->addr; /*I/O請(qǐng)求包地址*/ req->reserved=chan; …… /*處理讀寫(xiě)請(qǐng)求包*/ if(packet->cmd==IOM_READ‖packet->cmd== IOM_WRITE){ imask=HWI_disable(); QUE_enqueue(chan->queue,packet) …… } ……/*處理其它功能的請(qǐng)求包 */ removePackets(chan,packet->cmd); /*移除已處理的請(qǐng)求包*/ } 中斷服務(wù)函數(shù)(ISRs)和設(shè)備控制函數(shù)(mdControlChan)的結(jié)構(gòu)與以上I/O請(qǐng)求發(fā)送函數(shù)(mdSubmitChan)的結(jié)構(gòu)類(lèi)似,本文不再作敘述。 4.2 在DSP/BIOS中注冊(cè)微型驅(qū)動(dòng) 打開(kāi)DSP/BIOS配置工具,如圖3所示。右鍵點(diǎn)擊User-Defined Devices圖標(biāo),選擇插入選項(xiàng),并重新命名為PCICHAN。右鍵點(diǎn)擊PCICHAN,選擇屬性選項(xiàng),進(jìn)行注冊(cè),如圖4所示。 4.3 編寫(xiě)類(lèi)驅(qū)動(dòng) 本例的類(lèi)驅(qū)動(dòng)使用通用輸入輸出模塊,首先右鍵點(diǎn)擊圖3中的GIO Manager,選擇啟動(dòng)GIO。在應(yīng)用程序中,GIO_create函數(shù)使用微型驅(qū)動(dòng)PCICHAN來(lái)創(chuàng)建通道實(shí)例,通過(guò)調(diào)用GIO_submit函數(shù)完成應(yīng)用程序?qū)CI設(shè)備的讀寫(xiě)操作等。源代碼如下: (1)創(chuàng)建通道 CIO—Handle pciChan; C64Xx_PCI_Attrs pciChanParam; C64XX_PCI_Request pciChanRequest; C64XX_PCI_DevParams pciChanDevParam; GIO_AppCallback pciChanCallBack; pciChan=GIO_create(”/PCICHAN”,IOM_INOUT,%26;amp;status,NULL,NULL); (2)發(fā)送讀請(qǐng)求包 pciChanRequest.srcAddr=(Ptr)BitsBuffer; pciChanRequest.dstAddr=(Ptr)m_DspControl.CstartAddr; pciChanRequest.byteCnt=length+20; pciChanRequest.options=PCI_WRITE; pciChanReqSize=sizeof(pciChanRequest); status=GIO_submit(pciChan,IOM_WRITE,%26;amp;pciChanRe—quest,%26;amp;pciChanReqSize,NULL); 通過(guò)上述三個(gè)步驟,PCI設(shè)備的DSP/BIOS驅(qū)動(dòng)設(shè)計(jì)就基本上完成了。應(yīng)用程序可以通過(guò)使用類(lèi)驅(qū)動(dòng)來(lái)復(fù)用PCI設(shè)備,這樣極大地提高了驅(qū)動(dòng)的工作效率,對(duì)PCI外設(shè)的控制也大為簡(jiǎn)化了。

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉