在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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 來(lái)源:網(wǎng)絡(luò) 收藏
            4 Linux對(duì) 通道資源的管理

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

              通道是一種系統(tǒng)全局資源。任何外設(shè)想要進(jìn)行傳輸,首先都必須取得某個(gè)DMA通道資源的使用權(quán),并在傳輸結(jié)束后釋放所使用DMA通道資源。從這個(gè)角度看,DMA通道資源是一種共享的獨(dú)占型資源。

              Linux在kernel/Dma.c文件中實(shí)現(xiàn)了對(duì)DMA通道資源的管理。

              4.1 對(duì)DMA通道資源的描述

              Linux在kernel/Dma.c文件中定義了數(shù)據(jù)結(jié)構(gòu)dma_chan來(lái)描述DMA通道資源。該結(jié)構(gòu)類型的定義如下:

              struct dma_chan {

              int lock;

              const char *device_id;

              };

              其中,如果成員lock!=0則表示DMA通道正被某個(gè)設(shè)備所使用;否則該DMA通道就處于free狀態(tài)。而成員device_id就指向使用該DMA通道的設(shè)備名字字符串。

              基于上述結(jié)構(gòu)類型dma_chan,Linux定義了全局?jǐn)?shù)組dma_chan_busy[],以分別描述8個(gè)DMA通道資源各自的使用狀態(tài)。如下:

              static struct dma_chan dma_chan_busy[MAX_DMA_CHANNELS] = {

              { 0, 0 },

              { 0, 0 },

              { 0, 0 },

              { 0, 0 },

              { 1, cascade },

              { 0, 0 },

              { 0, 0 },

              { 0, 0 }

              };

              顯然,在初始狀態(tài)時(shí)除了DMA通道4外,其余DMA通道皆處于free狀態(tài)。

              4.2 DMA通道資源的申請(qǐng)

              任何卡在使用某個(gè)DMA通道進(jìn)行DMA傳輸之前,其設(shè)備驅(qū)動(dòng)程序都必須向內(nèi)核提出DMA通道資源的申請(qǐng)。只有申請(qǐng)獲得成功后才能使用相應(yīng)的DMA通道。否則就會(huì)發(fā)生資源沖突。

              函數(shù)request_dma()實(shí)現(xiàn)DMA通道資源的申請(qǐng)。其源碼如下:

              int request_dma(unsigned int dmanr, const char * device_id)

              {

              if (dmanr >= MAX_DMA_CHANNELS)

              return -EINVAL;

              if (xchg(dma_chan_busy[dmanr].lock, 1) != 0)

              return -EBUSY;

              dma_chan_busy[dmanr].device_id = device_id;

              /* old flag was 0, now contains 1 to indicate busy */

              return 0;

              }

              上述函數(shù)的核心實(shí)現(xiàn)就是用原子操作xchg()讓成員變量dma_chan_busy[dmanr].lock和值1進(jìn)行交換操作,xchg()將返回lock成員在交換操作之前的值。因此:如果xchg()返回非0值,這說(shuō)明dmanr所指定的DMA通道已被其他設(shè)備所占用,所以request_dma()函數(shù)返回錯(cuò)誤值-EBUSY表示指定DMA通道正忙;否則,如果xchg()返回0值,說(shuō)明dmanr所指定的DMA通道正處于free狀態(tài),于是xchg()將其lock成員設(shè)置為1,取得資源的使用權(quán)。

              4.3 釋放DMA通道資源

              DMA傳輸事務(wù)完成后,設(shè)備驅(qū)動(dòng)程序一定要記得釋放所占用的DMA通道資源。否則別的外設(shè)將一直無(wú)法使用該DMA通道。

              函數(shù)free_dma()釋放指定的DMA通道資源。如下:

              void free_dma(unsigned int dmanr)

              {

              if (dmanr >= MAX_DMA_CHANNELS) {

              printk(Trying to free DMA%d

              , dmanr);

              return;

              }

              if (xchg(dma_chan_busy[dmanr].lock, 0) == 0) {

              printk(Trying to free free DMA%d

              , dmanr);

              return;

              }

              } /* free_dma */

              顯然,上述函數(shù)的核心實(shí)現(xiàn)就是用原子操作xchg()將lock成員清零。

              4.4 對(duì)/proc/dma文件的實(shí)現(xiàn)

              文件/proc/dma將列出當(dāng)前8個(gè)DMA通道的使用狀況。Linux在kernel/Dma.c文件中實(shí)現(xiàn)了函數(shù)個(gè)get_dma_list()函數(shù)來(lái)至此/proc/dma文件的實(shí)現(xiàn)。函數(shù)get_dma_list()的實(shí)現(xiàn)比較簡(jiǎn)單。主要就是遍歷數(shù)組dma_chan_busy[],并將那些lock成員為非零值的數(shù)組元素輸出到列表中即可。如下:

              int get_dma_list(char *buf)

              {

              int i, len = 0;

              for (i = 0 ; i MAX_DMA_CHANNELS ; i++) {

              if (dma_chan_busy.lock) {

              len += sprintf(buf+len, %2d: %s

              ,

              i,

              dma_chan_busy.device_id);

              }

              }

              return len;

              } /* get_dma_list */

              5 使用DMA的ISA設(shè)備驅(qū)動(dòng)程序

              DMA雖然是一種硬件機(jī)制,但它離不開軟件(尤其是設(shè)備驅(qū)動(dòng)程序)的配合。任何使用DMA進(jìn)行數(shù)據(jù)傳輸?shù)腎SA設(shè)備驅(qū)動(dòng)程序都必須遵循一定的框架。



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

            評(píng)論


            相關(guān)推薦

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

            關(guān)閉