色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > DSP/BIOS中的IO設(shè)備驅(qū)動(dòng)編程技術(shù)

          DSP/BIOS中的IO設(shè)備驅(qū)動(dòng)編程技術(shù)

          作者: 時(shí)間:2010-12-22 來(lái)源:網(wǎng)絡(luò) 收藏

          圖2給出了此模式中最簡(jiǎn)單的傳送狀態(tài)集。圓圈中單詞表示設(shè)備驅(qū)動(dòng)程序緩沖區(qū)隊(duì)列的狀態(tài)。第一個(gè)單詞是“to device”隊(duì)列,第二個(gè)表示外設(shè)占用緩沖區(qū)指針,第三個(gè)是“from device”隊(duì)列,第二個(gè)表示外設(shè)占用緩沖區(qū)指針,第三個(gè)是“from device”隊(duì)列。E表示空,F表示滿,EEE是起始狀態(tài)。

          每個(gè)隊(duì)列可以是空(E),滿(F),非空非滿(N)。應(yīng)用程序調(diào)用PutBuf()將緩沖區(qū)放到“to device”隊(duì)列中。驅(qū)動(dòng)程序立即將緩沖區(qū)放進(jìn)外設(shè),轉(zhuǎn)移到狀態(tài)“EFE”。當(dāng)傳送完畢,外設(shè)向驅(qū)動(dòng)程序發(fā)中斷信號(hào),然后驅(qū)動(dòng)中斷處理程序?qū)⒕彌_區(qū)從外設(shè)寄存器轉(zhuǎn)移到“from device”隊(duì)列,轉(zhuǎn)移到狀態(tài)“EEF”,接著調(diào)用應(yīng)用程序的回調(diào)函數(shù)?;卣{(diào)函數(shù)調(diào)用GetBuf()從驅(qū)動(dòng)程序的“from device”隊(duì)列重新得到緩沖區(qū),驅(qū)動(dòng)程序返回起始狀態(tài)。

          如果驅(qū)動(dòng)程序支持硬件排隊(duì),則當(dāng)一個(gè)緩沖區(qū)正由外設(shè)傳送時(shí),“to device”隊(duì)列能控制另一個(gè)緩沖區(qū)。與圖2中狀態(tài)轉(zhuǎn)移不同,應(yīng)用程序現(xiàn)在可能向“to device”隊(duì)列增加另一個(gè)緩沖區(qū)。驅(qū)動(dòng)程序?qū)⒋司彌_區(qū)指針存進(jìn)一個(gè)隊(duì)列,此時(shí)狀態(tài)為“FFE”,“to device”隊(duì)列為滿,外設(shè)正在傳送一個(gè)緩沖區(qū),“from device”隊(duì)列為空。使用C數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)這種狀態(tài)機(jī)器的狀態(tài)向量。

          使用DMA全局重新加載寄存器來(lái)控制“to device”隊(duì)列,狀態(tài)結(jié)構(gòu)如下所示。

          Typedef struct drv_state{

          Bool enabled;

          Ptr currentBuffer;

          Uns currentSize;

          Ptr fullBuffer;

          Uns fullSize;

          LIO_TcallBack callback;

          Arg calbackArg;

          } LIO_Obj;

          第一個(gè)字段“enabled”是一個(gè)布爾值,表示程序的開(kāi)始或結(jié)束。下面兩個(gè)字段“currentBuffer”“currentSize”控制當(dāng)前傳送緩沖區(qū)的起始地址和尺寸。當(dāng)傳送完畢,它們轉(zhuǎn)移到“from device”隊(duì)列。“fullBuffer”“fullSize”字段實(shí)現(xiàn)長(zhǎng)度為1的“from device”隊(duì)列。Callback()的地址和參數(shù)通過(guò)setCallback()存儲(chǔ)在狀態(tài)結(jié)構(gòu)中。

          驅(qū)程序?qū)γ總€(gè)緩沖區(qū)只接收一個(gè)中斷,而不是每個(gè)采樣一個(gè)斷。發(fā)生中斷時(shí),驅(qū)動(dòng)程序已經(jīng)知道緩沖區(qū)傳送完畢,重新加載,DMA不需再重新編程。中斷處理程序首先將currentBuffer內(nèi)容移到fullBuffer中。如果緩沖區(qū)已在“to device”隊(duì)列中,即已使用重新加載的DMA,則新緩沖區(qū)指針和長(zhǎng)度記錄進(jìn)currentBuffer字段中,然后調(diào)用callback()。一旦定義了基本的狀態(tài)機(jī)器,相似硬件的新驅(qū)動(dòng)程序就很容易寫(xiě)出。


          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉