6193|11

89

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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设置的,就是为了检查是否数据没有读完全

这个是怎么回事?



此帖出自WindowsCE论坛

最新回复

DMAij挺不错  详情 回复 发表于 2010-5-5 14:38
点赞 关注
 

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不清楚,这个问题看起来很奇怪。

此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我找到原因了 是因为数据cache的问题 dma直接写到sdram的数据没有被wince给利用 需要使用下面的函数flush cache
在设置dma之前 需要调用CacheSync(CACHE_SYNC_DISCARD);

这样数据就可以保持一致性了 但是这样一来 dma读的速度反而不如直接读的快了

此帖出自WindowsCE论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

4
 
看看是不是开了CACHE,把CACHE禁用掉
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
关注。
此帖出自WindowsCE论坛
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(中级)

6
 
使用CacheRangeFlush函数可以部分disable cache 但是这样还是会降低系统性能

测试下来DMA读nandflash是可以了 但是速度和不使用dma相比 没有提高

能否再优化一下dma??
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
没有研究过,速度怎么判断啊
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

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

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

这个也比较小 也影响性能
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
修改读写nandflash读写函数为2K一个单位 性能提高 5/0.8->6.5/2

不知道还有什么提高的办法吗?
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 sdssly 的回复:
我使用evc编写的一个程序,对nandflash建立文件读写的程序判断驱动的性能

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

这个也比较小 也影响性能


cache 可以提高ARM性能的。你现在不用了肯定会有影响的。再说了这个flash读写速度也不能太高吧。看看数据手册是否正常呢。
此帖出自WindowsCE论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

11
 
我为了使用dma disable了读写buffer的cache 但是这个操作是dma必须的 否则会出现数据不一致的错误

关于nandflash的读写速度, 我也不知道 datasheet中写的都是最优化的情况
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
DMAij挺不错
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表