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