新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于TMS320DM642驅動模型的驅動程序開發(fā)

基于TMS320DM642驅動模型的驅動程序開發(fā)

——
作者:武漢大學 金朝輝 時間:2007-01-26 來源:《單片機與嵌入式系統(tǒng)應用》 收藏

隨著新技術不斷涌現(xiàn)和dsp實時系統(tǒng)日趨復雜,不同類型的外部設備越來越多,為這些外部設備編寫設備驅動程序已成為依賴操作系統(tǒng)管理硬件的內在要求。但是,由于內存引腳、響應時間和電源管理等條件的限制,為一個給定的dsp系統(tǒng)編寫設備驅動程序有時會很困難。針對設備驅動程序開發(fā)者遇到的上述難題,ti公司為c64x系列dsp的開發(fā)者提供了一種"類/微型驅動模型(class/mini-driver model)",該模型在功能上將設備驅動程序分為依賴硬件層和不依賴硬件層,兩層之間使用通用接口。實踐結果表明,采用類/微型驅動模型進行設計后,應用軟件可以復用絕大部分相似設備的驅動程序,從而提高驅動程序的開發(fā)效率。

1 類/微型驅動模型簡介

在類/微型驅動模型中,類驅動通常用于實現(xiàn)多線程i/o請求的序列化和同步功能;同時對設備實例進行管理。在包括視頻系統(tǒng)i/o和異步i/o的典型實時系統(tǒng)中,只有少數的類驅動需要表示出外部設備的類型。

類驅動通過每個外部設備獨有的微型驅動對該設備進行操作,微型驅動則通過控制外設的寄存器、內存和中斷資源來實現(xiàn)對外部設備的控制,微型驅動程序必須將特定的外部設備有效地表示給類驅動。例如:視頻顯示設備存在一些不同的幀存,應用軟件會根據不同的i/o操作進行幀存的分配,此時微型驅動必須映射視頻顯存,使得類驅動可對不連續(xù)的內存(分別存放rgb或yuv分量)設計特定的i/o請求,類/微型驅動模型允許發(fā)送由開發(fā)者定義數據結構的i/o請求包給微型驅動來控制外部設備,此分層結構使設備驅動的復用能力得到加強,并且豐富了發(fā)送給微型驅動i/o請求包的結構。

類/微型驅動模型的結構如圖1所示,上層應用程序并非直接控制微型驅動,而是使用一個或一個以上的類驅動對其進行控制。每個類驅動在應用程序代碼中表現(xiàn)為一個api函數,并且通過微型驅動的接口iom與微型驅動進行通信,類驅動使用dsp/bios的中的api函數來實現(xiàn)諸如同步等系統(tǒng)服務(dsp/bios是ti公司推出的一種實時操作系統(tǒng),實際上它是一組可重復調用系統(tǒng)模塊的abi函數集合)。到目前為止dsp/bios共定義了3種類驅動:流輸入輸出管理模塊(sio/dio)、管道管理模塊(pip/pio)和通用輸入輸出模塊(gio)。在pip/pio和sio/pio類驅動中,調用的api函數已存在于dsp/bios的pip和sio模塊中,這些api函數將參數傳給相應的適配模塊(adapter),適配模塊再與微型驅動交換數據。在gio類驅動中,調用的api函數直接與微型驅動通信(需在ccs2.2以上)。

本文引用地址:http://2s4d.com/article/21200.htm

每個微型驅動都為類驅動和dsp/ bios設備驅動管理提供了標準接口,微型驅動采用芯片支持庫(chip support library)管理外圍設備的寄存器,內存和中斷資源。

2 類驅動的編寫

流輸入輸出管理模塊和管道管理模塊是dsp/bios提供的兩個接口模塊,用于支持dsp和外設之間的數據交換。這兩種模塊的數據傳輸都可通過類驅動中的適配模塊和微型驅動的iom連接。sio的適配模塊稱為dio:pip的稱為pio。類/微型驅動模型還可使用第三種接口模塊--通用輸入輸出模塊,其傳輸模塊是基于流輸入輸出模式的同步i/o模式,更適合文件系統(tǒng)i/o。在編寫類驅動時,可以直接調用gio的讀寫api函數,這些函數的接口已內置于微型驅動的iom中。

2.1 流輸入輸出管理模塊和sio的適配模塊

dsp/bios中的流輸入輸出管理模塊為每個dsp/bios線程提供了一種獨立的i/o機制,它支持動態(tài)創(chuàng)建。流輸入輸出管理模塊有自己的驅動模型,稱為dev。dev程序和微型驅動的編寫方法相似,都要實現(xiàn)函數表中的打開,關閉和緩存管理等函數,然而結構比較復雜,相比之下,sio的適配模塊可以簡化流輸入輸出模塊和iom之間的連接,使得通信和同步變得更簡單。

2.2 管道管理模塊和pip的適配模塊

dsp/bios中的管道管理模塊提供了管理異步i/o的"數據管道",每個管道對象都擁有一塊同樣大小的緩存,這些緩存分為同樣數量且等長的小塊;小塊的數量和長度在dsp/bios中設置。雖然小塊的長度是固定的,但應用程序可把小于這個長度的數據放入緩存小塊中,一個管道有兩個結束狀態(tài):寫完緩存和讀完緩存。通常,無論是哪個結束狀態(tài)都會激活i/o設備。數據通知函數用來執(zhí)行讀/寫同步任務以及通知pip緩存填滿或清空。寫數據時,pip_alloc函數用來獲得緩存,pip_put函數用于將數據寫入緩存;寫完后,讀數據通知函數notifyreader將被調用。當讀數據時,pip_get函數用來接收緩存中的數據,pip_free函數在數據不再被使用時將緩存清空,清空完后,寫數據通知函數notifywriter將被調用。

2.3 通用輸入輸出模塊

通用輸入輸出模塊在提供必要的同步讀/寫api函數及其擴展函數的同時,將代碼和使用數據緩存的大小盡量簡化。如圖2所示,應用程序可以調用gio的api函數直接與微型驅動的iom交換數據,這些api函數使得gio成為第三種類驅動。

函數表指針是應用程序和微型驅動函數表(fxns)的接口;創(chuàng)建模式包括輸入(iom_input)、輸出(iom_output)和雙向(iom_inout);iom_packet在類驅動和微型驅動間執(zhí)行異步操作時使用,同步對象地址指向特定通道的同步信號,通道實例地址則指向微型驅動創(chuàng)建的通道實例。

3 微型驅動的設計和實現(xiàn)

類/微型驅動模型中的微型驅動直接控制外部硬件設備。只要微型驅動創(chuàng)建了規(guī)定的函數,應用程序就可以方便地通過dio適配模塊、pio適配模塊或(和)gio類驅動調用。規(guī)定的函數包括:通道綁定函數(mdbinddev)、通道創(chuàng)建/刪除函數(mdcreatechan/mddeletechan)、i/o請求發(fā)送函數(mdsubmitchan)、中斷服務函數(isrs)和設備控制函數(mdcontrolchan)。這些規(guī)定的函數將放入微型驅動的函數接口表(iom_fxns)中的相應位置,供應用程序通過適配模塊或gio類驅動調用。函數接口表的結構如下:


微型驅動支持的控制代碼和控制操作,特別要注明該代碼的針對對象(針對通道實例還是設備實例)。例如,改變外設波特率的控制代碼,必須注明是針對某個通道還是所有通道的,否則容易給應用程序帶來錯誤。

4 用minidriver實現(xiàn)視頻數據的輸入和輸出

如圖3所示,從視頻采集芯片采集來的視頻數據通過edma從視頻接口(video port)傳輸到緩存中,此過程可以通過minidriver實現(xiàn),本設計在minidriver中通過判斷視頻接口是否有完整的幀數據來實現(xiàn)幀緩存的管理和edma的重裝載及清零更新;在清零后minidriver通知上層類驅動有空幀緩存可以使用。這樣就實現(xiàn)了數據的連續(xù)傳送。

數據輸出時,使用下文設計的pci minidriver實現(xiàn)。

4.1 微型驅動的設計與編寫




isrs為和mdcontrolchan的結構與mdsubmitchan的結構類似,本文不再做敘述。

4.2 在dsp/bios中注冊微型驅動

打開dsp/bios配置工具,如圖4所示,首先右擊user-defined devices圖標,選擇插入選項,并重新命名為pcichan;然后右擊pcichan,選擇屬性選項,如圖5所示進行注冊。


4.3 編寫類驅動

本例的類驅動使用通用輸入輸出模塊,首先右擊圖4中的gio-general input/output manager,選擇"啟動gio",在應用程序中,gio_create函數使用微型驅動pcichan來創(chuàng)建通道實例;通過調用gio_submit函數來完成應用程序對pci設備的讀/寫操作等,源代碼如下:


通過上述3個步驟,pci設備的dsp/bios驅動設計就基本上完成了,應用程序可以通過使用類驅動來復用pci設備,這樣極大地提高了驅動的工作效率,也大大簡化了對pci外設的控制。



關鍵詞:

評論


相關推薦

技術專區(qū)

關閉