您的位置:首页 > 编程语言

Dahdi驱动源代码分析之四DMA缓存区

2017-08-16 17:45 197 查看
一、环境
DAHDI驱动版本:dahdi-linux-complete-2.6.2+2.6.2
DAHDI卡:Digium Wildcard TE420 dual-span T1/E1/J1 card

版权声明:本文为博主(宽简厚重,Yuesichiu)原创文章,未经博主允许不得转载
http://blog.csdn.net/yuesichiu/article/details/77259150

二、细节
      为这张卡创建DMA缓存区,缓存区大小为numbufs * 1KB(一个收,一个发)。writedma是与总线相关的物理地址,返回值为驱动程序使用的虚拟地址。这两个缓存区:第一个是写缓存区;第二个是读缓存区。32个通道,双缓存(读/写),4端口

     分配的缓存区大小:
      (端口数 * DAHDI_MAX_CHUNK_SIZE * 32 * 4)* 2
       一个缓存区大小:4 ×8 ×32 ×4 = 4 KB

       也就是8KB的缓存,缓存区是先是写缓存区,然后是读缓存区。

版权声明:本文为博主(宽简厚重,Yuesichiu)原创文章,未经博主允许不得转载
http://blog.csdn.net/yuesichiu/article/details/77259150



    wc->writechunk =alloc //虚拟地址
    wc->writedma = writedma //DMA的物理地址

    /* 存放读缓存区*/
   /* Read is after the whole write piece (in words) */
  卡是4E1卡因此, (T4_BASE_SIZE(wc) = 8 * 32 * 4 = 1KB
   wc->readchunk = wc->writechunk + (T4_BASE_SIZE(wc) * numbufs) / 4; //readchunk,writechunk是u32类型

   而dma_addr_t是u64(64位系统),u32(32位系统)
    /* 初始化读/写缓存区 */

    /* Initialize Write/Buffers to all blank data */
    memset(wc->writechunk, 0x00, T4_BASE_SIZE(wc) * numbufs);
    memset(wc->readchunk, 0xff, T4_BASE_SIZE(wc) * numbufs);

版权声明:本文为博主(宽简厚重,Yuesichiu)原创文章,未经博主允许不得转载
http://blog.csdn.net/yuesichiu/article/details/77259150
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息