在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            ISA總線的DMA技術(shù)

            作者: 時(shí)間:2011-05-20 來源:網(wǎng)絡(luò) 收藏
            5.1 通道資源的申請(qǐng)與釋放

            本文引用地址:http://www.biyoush.com/article/150725.htm

              同I/O端口資源類似,設(shè)備驅(qū)動(dòng)程序必須在一開始就調(diào)用request_dma()函數(shù)來向內(nèi)核申請(qǐng)通道資源的使用權(quán)。而且,最好在設(shè)備驅(qū)動(dòng)程序的open()方法中完成這個(gè)操作,而不是在模塊的初始化例程中調(diào)用這個(gè)函數(shù)。因?yàn)檫@在一定程度上可以讓多個(gè)設(shè)備共享通道資源(只要多個(gè)設(shè)備不同時(shí)使用一個(gè)DMA通道)。這種共享有點(diǎn)類似于進(jìn)程對(duì)CPU的分時(shí)共享。

              設(shè)備使用完DMA通道后,其驅(qū)動(dòng)程序應(yīng)該記得調(diào)用free_dma()函數(shù)來釋放所占用的DMA通道資源。通常,最好再驅(qū)動(dòng)程序的release()方法中調(diào)用該函數(shù),而不是在模塊的卸載例程中進(jìn)行調(diào)用。

              還需要注意的一個(gè)問題是:資源的申請(qǐng)順序。為了避免死鎖(deadlock),驅(qū)動(dòng)程序一定要在申請(qǐng)了中斷號(hào)資源后才申請(qǐng)DMA通道資源。釋放時(shí)則要先釋放DMA通道,然后再釋放中斷號(hào)資源。

              使用DMA的設(shè)備驅(qū)動(dòng)程序的open()方法的如下:

              int xxx_open(struct inode * inode, struct file * filp)

              {

              ┆

              if((err = request_irq(irq,xxx_ISR,SA_INTERRUPT,”YourDeviceName”,NULL))

              return err;

              if((err = request_dma(dmanr, “YourDeviceName”)){

              free_irq(irq, NULL);

              return err;

              }

              ┆

              return 0;

              }

              release()方法的范例代碼如下:

              void xxx_release(struct inode * inode, struct file * filp)

              {

              ┆

              free_dma(dmanr);

              free_irq(irq,NULL);

              ┆

              }

              5.2 申請(qǐng)DMA緩沖區(qū)

              由于8237 DMAC只能尋址系統(tǒng)RAM中低16MB物理內(nèi)存,因此:設(shè)備驅(qū)動(dòng)程序在申請(qǐng)DMA緩沖區(qū)時(shí),一定要以GFP_DMA標(biāo)志來調(diào)用kmalloc()函數(shù)或get_free_pages()函數(shù),以便在系統(tǒng)內(nèi)存的DMA區(qū)中分配物理內(nèi)存。

              5.3 編程DMAC

              設(shè)備驅(qū)動(dòng)程序可以在他的read()方法、write()方法或ISR中對(duì)DMAC進(jìn)行編程,以便準(zhǔn)備啟動(dòng)一個(gè)DMA傳輸事務(wù)。一個(gè)DMA傳輸事務(wù)有兩種典型的過程:(1)用戶請(qǐng)求設(shè)備進(jìn)行DMA傳輸;(2)硬件異步地將外部數(shù)據(jù)寫道系統(tǒng)中。

              用戶通過I/O請(qǐng)求觸發(fā)設(shè)備進(jìn)行DMA傳輸?shù)牟襟E如下:

              1.用戶進(jìn)程通過系統(tǒng)調(diào)用read()/write()來調(diào)用設(shè)備驅(qū)動(dòng)程序的read()方法或write()方法,然后由設(shè)備驅(qū)動(dòng)程序read/write方法負(fù)責(zé)申請(qǐng)DMA緩沖區(qū),對(duì)DMAC進(jìn)行編程,以準(zhǔn)備啟動(dòng)一個(gè)DMA傳輸事務(wù),最后正確地設(shè)置設(shè)備(setup device),并將用戶進(jìn)程投入睡眠。

              2.DMAC負(fù)責(zé)在DMA緩沖區(qū)和I/O外設(shè)之間進(jìn)行數(shù)據(jù)傳輸,并在結(jié)束后觸發(fā)一個(gè)中斷。

              3.設(shè)備的ISR檢查DMA傳輸事務(wù)是否成功地結(jié)束,并將數(shù)據(jù)從DMA緩沖區(qū)中拷貝到驅(qū)動(dòng)程序的其他內(nèi)核緩沖區(qū)中(對(duì)于I/O device to memory的情況)。然后喚醒睡眠的用戶進(jìn)程。

              硬件異步地將外部數(shù)據(jù)寫到系統(tǒng)中的步驟如下:

              1.外設(shè)觸發(fā)一個(gè)中斷通知系統(tǒng)有新數(shù)據(jù)到達(dá)。

              2.ISR申請(qǐng)一個(gè)DMA緩沖區(qū),并對(duì)DMAC進(jìn)行編程,以準(zhǔn)備啟動(dòng)一個(gè)DMA傳輸事務(wù),最后正確地設(shè)置好外設(shè)。

              3.硬件將外部數(shù)據(jù)寫到DMA緩沖區(qū)中,DMA傳輸事務(wù)結(jié)束后,觸發(fā)一個(gè)中斷。

              4. ISR檢查DMA傳輸事務(wù)是否成功地結(jié)束,然后將DMA緩沖區(qū)中的數(shù)據(jù)拷貝驅(qū)動(dòng)程序的其他內(nèi)核緩沖區(qū)中,最后喚醒相關(guān)的等待進(jìn)程。

              網(wǎng)卡就是上述過程的一個(gè)典型例子。

              為準(zhǔn)備一個(gè)DMA傳輸事務(wù)而對(duì)DMAC進(jìn)行編程的典型代碼段如下:

              unsigned long flags;

              flags = claim_dma_lock();

              disable_dma(dmanr);

              clear_dma_ff(dmanr);

              set_dma_mode(dmanr,mode);

              set_dma_addr(dmanr, virt_to_bus(buf));

              set_dma_count(dmanr, count);

              enable_dma(dmanr);

              release_dma_lock(flags);

              檢查一個(gè)DMA傳輸事務(wù)是否成功地結(jié)束的代碼段如下:

              int residue;

              unsigned long flags = claim_dma_lock();

              residue = get_dma_residue(dmanr);

              release_dma_lock(flags);

              ASSERT(residue == 0);


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

            關(guān)鍵詞: 技術(shù) DMA 總線 ISA

            評(píng)論


            相關(guān)推薦

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

            關(guān)閉