基于TMS320DM642驅動(dòng)模型的驅動(dòng)程序開(kāi)發(fā)
隨著(zhù)新技術(shù)不斷涌現和dsp實(shí)時(shí)系統日趨復雜,不同類(lèi)型的外部設備越來(lái)越多,為這些外部設備編寫(xiě)設備驅動(dòng)程序已成為依賴(lài)操作系統管理硬件的內在要求。但是,由于內存引腳、響應時(shí)間和電源管理等條件的限制,為一個(gè)給定的dsp系統編寫(xiě)設備驅動(dòng)程序有時(shí)會(huì )很困難。針對設備驅動(dòng)程序開(kāi)發(fā)者遇到的上述難題,ti公司為c64x系列dsp的開(kāi)發(fā)者提供了一種"類(lèi)/微型驅動(dòng)模型(class/mini-driver
model)",該模型在功能上將設備驅動(dòng)程序分為依賴(lài)硬件層和不依賴(lài)硬件層,兩層之間使用通用接口。實(shí)踐結果表明,采用類(lèi)/微型驅動(dòng)模型進(jìn)行設計后,應用軟件可以復用絕大部分相似設備的驅動(dòng)程序,從而提高驅動(dòng)程序的開(kāi)發(fā)效率。
1 類(lèi)/微型驅動(dòng)模型簡(jiǎn)介
在類(lèi)/微型驅動(dòng)模型中,類(lèi)驅動(dòng)通常用于實(shí)現多線(xiàn)程i/o請求的序列化和同步功能;同時(shí)對設備實(shí)例進(jìn)行管理。在包括視頻系統i/o和異步i/o的典型實(shí)時(shí)系統中,只有少數的類(lèi)驅動(dòng)需要表示出外部設備的類(lèi)型。
類(lèi)驅動(dòng)通過(guò)每個(gè)外部設備獨有的微型驅動(dòng)對該設備進(jìn)行操作,微型驅動(dòng)則通過(guò)控制外設的寄存器、內存和中斷資源來(lái)實(shí)現對外部設備的控制,微型驅動(dòng)程序必須將特定的外部設備有效地表示給類(lèi)驅動(dòng)。例如:視頻顯示設備存在一些不同的幀存,應用軟件會(huì )根據不同的i/o操作進(jìn)行幀存的分配,此時(shí)微型驅動(dòng)必須映射視頻顯存,使得類(lèi)驅動(dòng)可對不連續的內存(分別存放rgb或yuv分量)設計特定的i/o請求,類(lèi)/微型驅動(dòng)模型允許發(fā)送由開(kāi)發(fā)者定義數據結構的i/o請求包給微型驅動(dòng)來(lái)控制外部設備,此分層結構使設備驅動(dòng)的復用能力得到加強,并且豐富了發(fā)送給微型驅動(dòng)i/o請求包的結構。
類(lèi)/微型驅動(dòng)模型的結構如圖1所示,上層應用程序并非直接控制微型驅動(dòng),而是使用一個(gè)或一個(gè)以上的類(lèi)驅動(dòng)對其進(jìn)行控制。每個(gè)類(lèi)驅動(dòng)在應用程序代碼中表現為一個(gè)api函數,并且通過(guò)微型驅動(dòng)的接口iom與微型驅動(dòng)進(jìn)行通信,類(lèi)驅動(dòng)使用dsp/bios的中的api函數來(lái)實(shí)現諸如同步等系統服務(wù)(dsp/bios是ti公司推出的一種實(shí)時(shí)操作系統,實(shí)際上它是一組可重復調用系統模塊的abi函數集合)。到目前為止dsp/bios共定義了3種類(lèi)驅動(dòng):流輸入輸出管理模塊(sio/dio)、管道管理模塊(pip/pio)和通用輸入輸出模塊(gio)。在pip/pio和sio/pio類(lèi)驅動(dòng)中,調用的api函數已存在于dsp/bios的pip和sio模塊中,這些api函數將參數傳給相應的適配模塊(adapter),適配模塊再與微型驅動(dòng)交換數據。在gio類(lèi)驅動(dòng)中,調用的api函數直接與微型驅動(dòng)通信(需在ccs2.2以上)。

每個(gè)微型驅動(dòng)都為類(lèi)驅動(dòng)和dsp/ bios設備驅動(dòng)管理提供了標準接口,微型驅動(dòng)采用芯片支持庫(chip support library)管理外圍設備的寄存器,內存和中斷資源。
2 類(lèi)驅動(dòng)的編寫(xiě)
流輸入輸出管理模塊和管道管理模塊是dsp/bios提供的兩個(gè)接口模塊,用于支持dsp和外設之間的數據交換。這兩種模塊的數據傳輸都可通過(guò)類(lèi)驅動(dòng)中的適配模塊和微型驅動(dòng)的iom連接。sio的適配模塊稱(chēng)為dio:pip的稱(chēng)為pio。類(lèi)/微型驅動(dòng)模型還可使用第三種接口模塊--通用輸入輸出模塊,其傳輸模塊是基于流輸入輸出模式的同步i/o模式,更適合文件系統i/o。在編寫(xiě)類(lèi)驅動(dòng)時(shí),可以直接調用gio的讀寫(xiě)api函數,這些函數的接口已內置于微型驅動(dòng)的iom中。
2.1 流輸入輸出管理模塊和sio的適配模塊
dsp/bios中的流輸入輸出管理模塊為每個(gè)dsp/bios線(xiàn)程提供了一種獨立的i/o機制,它支持動(dòng)態(tài)創(chuàng )建。流輸入輸出管理模塊有自己的驅動(dòng)模型,稱(chēng)為dev。dev程序和微型驅動(dòng)的編寫(xiě)方法相似,都要實(shí)現函數表中的打開(kāi),關(guān)閉和緩存管理等函數,然而結構比較復雜,相比之下,sio的適配模塊可以簡(jiǎn)化流輸入輸出模塊和iom之間的連接,使得通信和同步變得更簡(jiǎn)單。
2.2 管道管理模塊和pip的適配模塊
dsp/bios中的管道管理模塊提供了管理異步i/o的"數據管道",每個(gè)管道對象都擁有一塊同樣大小的緩存,這些緩存分為同樣數量且等長(cháng)的小塊;小塊的數量和長(cháng)度在dsp/bios中設置。雖然小塊的長(cháng)度是固定的,但應用程序可把小于這個(gè)長(cháng)度的數據放入緩存小塊中,一個(gè)管道有兩個(gè)結束狀態(tài):寫(xiě)完緩存和讀完緩存。通常,無(wú)論是哪個(gè)結束狀態(tài)都會(huì )激活i/o設備。數據通知函數用來(lái)執行讀/寫(xiě)同步任務(wù)以及通知pip緩存填滿(mǎn)或清空。寫(xiě)數據時(shí),pip_alloc函數用來(lái)獲得緩存,pip_put函數用于將數據寫(xiě)入緩存;寫(xiě)完后,讀數據通知函數notifyreader將被調用。當讀數據時(shí),pip_get函數用來(lái)接收緩存中的數據,pip_free函數在數據不再被使用時(shí)將緩存清空,清空完后,寫(xiě)數據通知函數notifywriter將被調用。
2.3 通用輸入輸出模塊
通用輸入輸出模塊在提供必要的同步讀/寫(xiě)api函數及其擴展函數的同時(shí),將代碼和使用數據緩存的大小盡量簡(jiǎn)化。如圖2所示,應用程序可以調用gio的api函數直接與微型驅動(dòng)的iom交換數據,這些api函數使得gio成為第三種類(lèi)驅動(dòng)。

函數表指針是應用程序和微型驅動(dòng)函數表(fxns)的接口;創(chuàng )建模式包括輸入(iom_input)、輸出(iom_output)和雙向(iom_inout);iom_packet在類(lèi)驅動(dòng)和微型驅動(dòng)間執行異步操作時(shí)使用,同步對象地址指向特定通道的同步信號,通道實(shí)例地址則指向微型驅動(dòng)創(chuàng )建的通道實(shí)例。
3 微型驅動(dòng)的設計和實(shí)現
類(lèi)/微型驅動(dòng)模型中的微型驅動(dòng)直接控制外部硬件設備。只要微型驅動(dòng)創(chuàng )建了規定的函數,應用程序就可以方便地通過(guò)dio適配模塊、pio適配模塊或(和)gio類(lèi)驅動(dòng)調用。規定的函數包括:通道綁定函數(mdbinddev)、通道創(chuàng )建/刪除函數(mdcreatechan/mddeletechan)、i/o請求發(fā)送函數(mdsubmitchan)、中斷服務(wù)函數(isrs)和設備控制函數(mdcontrolchan)。這些規定的函數將放入微型驅動(dòng)的函數接口表(iom_fxns)中的相應位置,供應用程序通過(guò)適配模塊或gio類(lèi)驅動(dòng)調用。函數接口表的結構如下:
微型驅動(dòng)支持的控制代碼和控制操作,特別要注明該代碼的針對對象(針對通道實(shí)例還是設備實(shí)例)。例如,改變外設波特率的控制代碼,必須注明是針對某個(gè)通道還是所有通道的,否則容易給應用程序帶來(lái)錯誤。
4 用minidriver實(shí)現視頻數據的輸入和輸出
如圖3所示,從視頻采集芯片采集來(lái)的視頻數據通過(guò)edma從視頻接口(video port)傳輸到緩存中,此過(guò)程可以通過(guò)minidriver實(shí)現,本設計在minidriver中通過(guò)判斷視頻接口是否有完整的幀數據來(lái)實(shí)現幀緩存的管理和edma的重裝載及清零更新;在清零后minidriver通知上層類(lèi)驅動(dòng)有空幀緩存可以使用。這樣就實(shí)現了數據的連續傳送。

數據輸出時(shí),使用下文設計的pci minidriver實(shí)現。
4.1 微型驅動(dòng)的設計與編寫(xiě)
isrs為和mdcontrolchan的結構與mdsubmitchan的結構類(lèi)似,本文不再做敘述。
4.2 在dsp/bios中注冊微型驅動(dòng)
打開(kāi)dsp/bios配置工具,如圖4所示,首先右擊user-defined devices圖標,選擇插入選項,并重新命名為pcichan;然后右擊pcichan,選擇屬性選項,如圖5所示進(jìn)行注冊。


4.3 編寫(xiě)類(lèi)驅動(dòng)
本例的類(lèi)驅動(dòng)使用通用輸入輸出模塊,首先右擊圖4中的gio-general input/output manager,選擇"啟動(dòng)gio",在應用程序中,gio_create函數使用微型驅動(dòng)pcichan來(lái)創(chuàng )建通道實(shí)例;通過(guò)調用gio_submit函數來(lái)完成應用程序對pci設備的讀/寫(xiě)操作等,源代碼如下:
通過(guò)上述3個(gè)步驟,pci設備的dsp/bios驅動(dòng)設計就基本上完成了,應用程序可以通過(guò)使用類(lèi)驅動(dòng)來(lái)復用pci設備,這樣極大地提高了驅動(dòng)的工作效率,也大大簡(jiǎn)化了對pci外設的控制。
評論