搜索
bottom↓
回复: 8

MPC8321的链式DMA相关问题3个求教。

[复制链接]

出0入0汤圆

发表于 2013-2-22 09:33:24 | 显示全部楼层 |阅读模式
1.填CDAR寄存器是否需要把要赋的值左移5位?
比如要把0x0020e440,是否需要搞成U64 = ((U64)0x0020e440)<<5;
因为寄存器说明上,低5位被挪作他用,但是 PDF上说明描述符需要8字对齐,这样低5位本身就是0 。
在实验中,左移5位后,启动DMA,然后检查寄存器,发现所有寄存器都是0。而不左移,寄存器有值,只是不对,而且重启后值不变。

2.和上面的相关,描述符要求8字对齐,也就是32字节,以前只见过4字节对齐的…… 是我理解错误,还是描述符在内存中真的必须32字节对齐?
我现在的处理办法:
建一个U64数组,比需要的大32字节,然后从首地址开始判断地址 (U32)addr % 32,为0就把地址存在一个全局变量里面,以后填描述符都拿
这个地址做起始。

3.仍然相关。飞思卡尔的linux BSP包中:
#define DMA_OUT(fsl_chan, addr, val, width)           (((fsl_chan)->feature & FSL_DMA_BIG_ENDIAN)  ? out_be##width(addr, val) : out_le##width(addr, val))
out_be##width(addr, val)是什么意识?out_be没找到定义,##更不晓得是干啥的,width(addr, val)看起来像函数或者宏,但也没找到定义。
文件在这儿:
http://lxr.linux.no/linux+v3.7.1/drivers/dma/fsldma.h
PS:严重推荐这个站。

谢谢各路大侠。
PS:有些事情,不懂的人就是天堑,懂得人就是一句话的事情……
DMA的操作非常简单,问题都在细节上,我搞了1周,才把直接模式大致搞定……
如果哪位能发点链式DMA代码,或者QQ指点一下,解决问题后酬劳¥100,钱很少,聊表心意。
谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2013-2-22 11:32:24 | 显示全部楼层
##找到了,连接符
用在宏定义中,把## 后面的变量当成文本贴在前面字符后。
out_be##width(addr, val) ,如果width(addr, val)=10,最后程序里面就是out_be10;

出0入0汤圆

发表于 2013-2-22 19:36:01 | 显示全部楼层
1, 对字段赋值不需要,对整个寄存器赋值需要。也就是说,保证bit31-5是你想要的值。
2, 这个应该不难吧。

出0入0汤圆

 楼主| 发表于 2013-2-25 17:10:12 | 显示全部楼层
继续抓狂中,CDAR不移位,启动DMA后立即读寄存器,看到DMA开始读描述符,顺序也是对的,但是读的地址不是我填进去的CDAR,而是读的地址0.

出0入0汤圆

 楼主| 发表于 2013-2-25 17:10:54 | 显示全部楼层
本帖最后由 fengxin32 于 2013-2-25 17:14 编辑

#define  CB      (1<<2)
#define  CS      (1)
#define  EOTD    (1)
#define  CTM     (1<<2)
#define  TEM     (1<<3)
#define  SAHE    (1<<12)
#define  SAHTS2  (1<<14)
#define  SAHTS4  (1<<15)
#define  BWC2    (1<<21)
#define  BWC4    (1<<22)
#define  BWC8    (3<<21)

#define  PCICM   (1<<15) /* PCI和DMA共用时钟 */

unsigned short TSA=0x1234,TSB=0x5678,TSC=0x9abc;  /*测试用源数据*/
unsigned short TDA[512],TDB[512],TDC[512],TDD[64];

volatile UINT64 Descriptor[48]; /*描述符放在这里*/
volatile DMA_CHA*  pDmaChain;   
volatile unsigned char DmaChainCount = 0;  /* 指向链上第几个段描述符 */

uint32 BS(uint32 reg)  /* byte-swap */
  {
  uint32 Big,*p;
  uint8 byte[4];

  byte[0] = reg;
  byte[1] = reg>>8;
  byte[2] = reg>>16;
  byte[3] = reg>>24;  
  p = (uint32*)byte;
  Big = *p;

  return (Big);
  }
void DMAClockInit()
  {
  uint32* p = (uint32*)Descriptor;
  uint32 t32;
  
  Reg(SCCR,CCR) = Reg(SCCR,CCR)|PCICM;
  taskDelay(50);
  
  while(1) /*变成8字对齐*/
    {
    t32 = (uint32)p;
    if ((t32%32)==0)
      {
      pDmaChain = (DMA_CHA*)p;
      break;
      }
    p++;
    }
  }


/* 链模式 ,填充描述符*/
unsigned char DMAChainFill(uint32* pSour,uint32* pDesc,unsigned int num)
  {
  volatile unsigned int reg = 0;
  DMA_CHA* p;
  UINT64 Temp;

  p = (DMA_CHA*)pDmaChain;

  p = p + DmaChainCount;
  Temp = BS((UINT32)pSour);
  p->Sour = Temp<<32;
  Temp = BS((UINT32)pDesc);
  p->Desc = Temp<<32;

  Temp = (UINT64)BS((uint32)(p+1));
  p->NDA = Temp<<32;
  Temp = BS(num);
  p->Num = Temp<<32;
  
  DmaChainCount = DmaChainCount + 1;
  }

unsigned char DMAChaining(uint32 DMAchan,uint32 Mode)  /* 链式DMA初始化 */
  {
  volatile unsigned int reg = 0;
  DMA_CHA* p = (DMA_CHA*)pDmaChain;
  uint32* p32;
  uint32 i,n;
  UINT64 Temp = 0;

  while (Reg(SR,DMAchan)!=0)
    {
    DmaChainCount = 0;
    return (ERROR);
    }
  p = p + DmaChainCount - 1;
  p->NDA = (BS(EOTD));
  
  reg = ((uint32)pDmaChain);
  Reg(CDAR,DMAchan) = BS(reg);
  
  reg = BS(SAHTS2|SAHE);
  Reg(MR,DMAchan) = reg&0xf8ffffff;

  reg = BS(SAHTS2|SAHE|CS);
  Reg(MR,DMAchan) = reg;

  return (OK);
  }
  
void DmaChainTest()/*测试函数*/
  {
  volatile unsigned int  reg=0,Num=0;
  unsigned char i,n;
  DMA_CHA* p = (DMA_CHA*)pDmaChain;
  uint32* p32 = (uint32*)pDmaChain;
  
  DMAChainFill((uint32*)&TSA,(uint32*)TDA,512);
  DMAChainFill((uint32*)&TSA,(uint32*)TDB,512);
  DMAChainFill((uint32*)&TSA,(uint32*)TDC,512);
  
  DMAChaining(DMA1,0);

  }


出0入0汤圆

 楼主| 发表于 2013-2-26 17:07:25 | 显示全部楼层
经过试验,CDAR不需要移位,因为32字节对齐后,低5位已经变0了。

出0入0汤圆

 楼主| 发表于 2013-2-27 16:40:29 | 显示全部楼层
好吧,现在能够正常工作了……
但是,描述符表必须在地址0x0~0xffff之间,超过就重新指向0x0了
晕,CDAR填入的值是对的,其后的事情是硬件自动完成,这下抓瞎了。

出0入0汤圆

发表于 2013-3-9 20:39:46 | 显示全部楼层
学习了,谢谢!!!!!!!!!1

出0入0汤圆

 楼主| 发表于 2013-3-10 23:10:03 | 显示全部楼层
我现在描述符表任然只能放在低64k~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 07:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表