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禁用掉
[解决办法]