首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

wince 2440下DMA的有关问题

2012-03-08 
wince 2440下DMA的问题为了提高nandflash读写速度,准备使用DMA来读nandflash的数据。在bootloader中使用如

wince 2440下DMA的问题
为了提高nandflash读写速度,准备使用DMA来读nandflash的数据。在bootloader中使用如下

  rDISRC0=NFDATA; // Nand flash data register
  rDISRCC0=(0<<1) | (1<<0); //arc=AHB,src_addr=fix
  rDIDST0=(unsigned)pSectorBuff;
  rDIDSTC0=(0<<1) | (0<<0); //dst=AHB,dst_addr=inc;
rDCON0=(1<<31)|(1<<30)|(0<<29)|(1<<28)|(1<<27)
|(0<<23)|(1<<22)|(2<<20)|(512/4/4);
//Handshake,AHB,interrupt,(4-burst),whole,S/W,no_autoreload,word,count=128;
// DMA on and start.
  rDMASKTRIG0=(1<<1)|(1<<0);

while(0 != rDMASKTRIG0);// Wait until Dma transfer is done.
就是根据2440的dma数据手册配置dma的源地址NFDATA和目的地址pSectorBuff。pSectorBuff是nandRead函数传入的buffer指针 

因为bootloader中没有使用mmu 这个指针就是真实的物理地址 上面的是OK的

进入wince的FMD驱动 由于使用了mmu nandread函数传入的指针为VA,需要转为PA我是这样处理的:

bRet = LockPages(pSectorBuff, 512, physAddr, LOCKFLAG_WRITE);
  physAddr[0] = (physAddr[0] << UserKInfo[KINX_PFN_SHIFT]) 
  + ((DWORD)pSectorBuff & (UserKInfo[KINX_PAGESIZE] - 1));
  physAddr[1] = (physAddr[1] << UserKInfo[KINX_PFN_SHIFT]);

通过lockpages函数对传入的指针得到物理地址,保存在physAddr中 然后配置DMA
  if (0 == physAddr[1]) { /*DMA1¶ÁÈ¡512 bytes*/
  v_pDMAPRegs->DISRC1 = NFDATAADDR; // Nand flash data register
  v_pDMAPRegs->DISRCC1 = (0<<1) | (1<<0); //arc=AHB,src_addr=fix
  v_pDMAPRegs->DIDST1 = (unsigned int)physAddr[0];
  v_pDMAPRegs->DIDSTC1 = (0<<1) | (0<<0); //dst=AHB,dst_addr=inc;
  v_pDMAPRegs->DCON1 = (1<<31)|(1<<30)|(0<<29)|(1<<28)|(1<<27)
  |(0<<23)|(1<<22)|(2<<20)|(512/4/4);
  //Handshake,AHB,interrupt,(4-burst),whole,S/W,no_autoreload,word,count=128;
  // DMA on and start.
  v_pDMAPRegs->DMASKTRIG1 = (1<<1)|(1<<0);
  while (0 != v_pDMAPRegs->DMASKTRIG1);// Wait until Dma transfer is done.

上面的代码在测试中发现第一次可以读取到nandflash的数据,但是如果再次读这出现了数据不完全读的问题。下面是我dump得到的数据
第一次读取nandflash block516的512 bytes数据是OK的。
dump 516-0x0
000: e9 fd ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
060: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
070: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
110: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
120: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
130: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
140: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
150: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
160: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
170: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
180: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
190: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 


1a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
1b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff 03 01 
1c0: 01 00 21 b0 00 00 00 01 00 00 00 b0 01 00 01 b1 
1d0: 01 00 0b b0 00 00 00 b1 01 00 00 00 04 00 00 00 
1e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa 

下次再次读取这个数据,nandread函数传入的指针和flash地址都是相同:
dump 516-0x0
000: e9 fd ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
010: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
020: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
030: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
060: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
070: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
080: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
090: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0e0: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
0f0: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
100: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
110: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
120: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
130: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
140: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
150: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
160: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
170: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
180: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
190: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
1a0: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
1b0: ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab 
1c0: 01 00 21 b0 00 00 00 01 00 00 00 b0 01 00 01 b1 
1d0: 01 00 0b b0 00 00 00 b1 01 00 00 00 04 00 00 00 
1e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa 

其中很多数据是0xab 这个0xab是我首先使用memset设置的,就是为了检查是否数据没有读完全

这个是怎么回事?





[解决办法]
看看是不是开了CACHE,把CACHE禁用掉
[解决办法]

探讨
我使用evc编写的一个程序,对nandflash建立文件读写的程序判断驱动的性能

开启dma和不使用dma相差无几 不使用dma还稍微快一些 使用dma中的api调用太影响性能了 我一次仅仅读了nandflash的512 bytes

这个也比较小 也影响性能

热点排行