DSP/BIOS中的IO設備驅動編程技術
圖2給出了此模式中最簡單的傳送狀態(tài)集。圓圈中單詞表示設備驅動程序緩沖區(qū)隊列的狀態(tài)。第一個單詞是“to device”隊列,第二個表示外設占用緩沖區(qū)指針,第三個是“from device”隊列,第二個表示外設占用緩沖區(qū)指針,第三個是“from device”隊列。E表示空,F表示滿,EEE是起始狀態(tài)。
每個隊列可以是空(E),滿(F),非空非滿(N)。應用程序調用PutBuf()將緩沖區(qū)放到“to device”隊列中。驅動程序立即將緩沖區(qū)放進外設,轉移到狀態(tài)“EFE”。當傳送完畢,外設向驅動程序發(fā)中斷信號,然后驅動中斷處理程序將緩沖區(qū)從外設寄存器轉移到“from device”隊列,轉移到狀態(tài)“EEF”,接著調用應用程序的回調函數(shù)。回調函數(shù)調用GetBuf()從驅動程序的“from device”隊列重新得到緩沖區(qū),驅動程序返回起始狀態(tài)。
如果驅動程序支持硬件排隊,則當一個緩沖區(qū)正由外設傳送時,“to device”隊列能控制另一個緩沖區(qū)。與圖2中狀態(tài)轉移不同,應用程序現(xiàn)在可能向“to device”隊列增加另一個緩沖區(qū)。驅動程序將此緩沖區(qū)指針存進一個隊列,此時狀態(tài)為“FFE”,“to device”隊列為滿,外設正在傳送一個緩沖區(qū),“from device”隊列為空。使用C數(shù)據(jù)結構實現(xiàn)這種狀態(tài)機器的狀態(tài)向量。
使用DMA全局重新加載寄存器來控制“to device”隊列,狀態(tài)結構如下所示。
Typedef struct drv_state{
Bool enabled;
Ptr currentBuffer;
Uns currentSize;
Ptr fullBuffer;
Uns fullSize;
LIO_TcallBack callback;
Arg calbackArg;
} LIO_Obj;
第一個字段“enabled”是一個布爾值,表示程序的開始或結束。下面兩個字段“currentBuffer”“currentSize”控制當前傳送緩沖區(qū)的起始地址和尺寸。當傳送完畢,它們轉移到“from device”隊列。“fullBuffer”“fullSize”字段實現(xiàn)長度為1的“from device”隊列。Callback()的地址和參數(shù)通過setCallback()存儲在狀態(tài)結構中。
驅程序對每個緩沖區(qū)只接收一個中斷,而不是每個采樣一個斷。發(fā)生中斷時,驅動程序已經(jīng)知道緩沖區(qū)傳送完畢,重新加載,DMA不需再重新編程。中斷處理程序首先將currentBuffer內容移到fullBuffer中。如果緩沖區(qū)已在“to device”隊列中,即已使用重新加載的DMA,則新緩沖區(qū)指針和長度記錄進currentBuffer字段中,然后調用callback()。一旦定義了基本的狀態(tài)機器,相似硬件的新驅動程序就很容易寫出。
評論