DSP/BIOS中的IO設備驅(qū)動編程技術(shù)
2.2 三類函數(shù)
LIO接口中有三類函數(shù):控制函數(shù)、緩沖區(qū)和隊列管理函數(shù)、信令函數(shù)。
2.2.1 控制函數(shù)
控制函數(shù)用來實現(xiàn)設備的啟動、關閉和控制。其初始函數(shù)為驅(qū)動程序保存資源(物理外設和內(nèi)存)。它使用結(jié)構(gòu)指針作為可選變量,此結(jié)構(gòu)是一種設備的特殊變量結(jié)構(gòu)。
2.2.2 隊列管理
假定每個設備至少有一個用來傳送數(shù)據(jù)的緩沖區(qū)。許多設備(如McBSP和DMA)帶有允許雙緩沖的緩沖隊列。圖1是一個有三個存儲單元的LIO驅(qū)動程序,驅(qū)動程序中有:由外設填滿或清空的緩沖區(qū)“todevice”(到設備)隊列,將傳送的緩沖區(qū)返回到應用程序的緩沖區(qū)管理程序的“from device”(來自設備)隊列和當前傳送數(shù)據(jù)的緩沖區(qū)。在虛線框里的認為是在驅(qū)動程序里面。當前傳送數(shù)據(jù)的緩沖一般由外設寄存器控制,如DMA源寄存器或目標寄存器,在圖1中畫在“外設”中。含硬件隊列(如DMA重新如載寄存器)的設備也會含一個或多個存儲單元用業(yè)存儲指針為以后傳送用,此隊列為“to device”隊列。能包含緩沖區(qū)指針的第三個存儲單元是“from device”隊列,在驅(qū)動程序中為一變量。當設備準備傳送緩沖區(qū)時,緩沖區(qū)從輸入隊列傳送到外設寄存器。這些緩沖區(qū)然后移到輸出隊列以完成傳送,作為對CPU中斷的響應。
PutBuf()將緩沖區(qū)從應用程序傳送到驅(qū)動程序的輸入隊列。GetBuf()從輸出隊列得到緩沖區(qū)。IsEmpty()和IsFull()返回輸入隊列、輸出隊列的狀態(tài)。如果輸入隊列滿,因為無空間裝新緩沖區(qū),調(diào)用putBuf()會返回錯誤代碼。若IsFull()返回false,接下來可調(diào)用putBuf()。如果IsFull()返回true,但若在IsFull()返回true和調(diào)用putBuf()之間完成傳送,則調(diào)用putBuf()也可能會成功。
2.2.3 信令
如圖1所示,當傳送結(jié)束一般會觸發(fā)CPU中斷。此中斷會使應用程序?qū)魉偷木彌_區(qū)轉(zhuǎn)移到輸出隊列,然后調(diào)用calback()傳到驅(qū)動程序。Callback()應向應用程序發(fā)信號告知傳送完畢。
3 LIO驅(qū)動程序例子
音頻處理如語音壓縮、呼叫過程音調(diào)檢測等,是DSP的一般應用。本例是使用TMS320C5402 DSK上的DMA將音頻編解碼數(shù)據(jù)從McBSP移到緩沖區(qū)中。
當驅(qū)動程序響應應用程序調(diào)用和設備中斷時,采用數(shù)據(jù)結(jié)構(gòu)跟蹤驅(qū)動程序的狀態(tài)。有效狀態(tài)是設備驅(qū)動程序緩沖區(qū)隊列的狀態(tài),如圖1所示。
評論