主题 : 210从NAND复制代码到内存的只有前1K 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 82003
精华: 0
发帖: 26
金钱: 130 两
威望: 26 点
贡献值: 0 点
综合积分: 52 分
注册时间: 2012-11-16
最后登录: 2017-05-28
楼主  发表于: 2015-12-15 07:59

 210从NAND复制代码到内存的只有前1K

我是smart210 3G 监控版,2G MLC nand flash的板子,现在在做uboot的启动代码,从nand复制代码到内存的时候,发现只有最前面1K正确复制了,
我在nand初始化部分代码如下

复制代码
  1. //因为NAND的频率是200MHz 所以1HCLK=5ns
  2. #define NFCONF_TACLS (10<<12)
  3. #define NFCONF_TWRPH0 (10<<8)
  4. #define NFCONF_TWRPH1 (10<<4)
  5. #define NFCONF_ADDRCYCLE (1<<1)
  6. //注意一下因为我的开发版使用的是MLC所以以下参数设定
  7. #define NFCONF_PAGESIZE (0<<2)
  8. #define NFCONF_MLCFLASH (1<<3)
  9. #define NFCONT_MODE (1<<0)
  10. #define NFCONT_NCE0 (1<<1)
  11. #define NFCONT_NCE1 (1<<2)
  12. #define NFCONT_NCE2 (1<<22)
  13. #define NFCONT_NCE3 (1<<23)
  14. #define NFCONT_SECCLOCK (0<<6)
  15. #define NFCONT_MECCLOCK (0<<7)
  16. #define NFCONT_RNB_TRANSMODE (0<<8)
  17. #define NFCONT_RNB_INT (0<<9)
  18. #define NFCONT_ENBILLEDALACCINT (0<<10)
  19. #define NFCONT_LOCK (0<<16)
  20. #define NFCONT_LOCKTIGHT (0<<17)
  21. #define NFCONT_MLCECCDIRECTION (0<<18)
  22. //初始化NAND
  23. void nand_init()
  24. {
  25.     //配置引脚-配置请见自己写的nand初始化文档
  26.     *MP0_1CON &= ~(0xff<<8);
  27.     *MP0_1CON |= (0x33<<8);
  28.     *MP0_1PUD &= ~(0xF<<4);
  29.     
  30.     *MP0_2CON = 0x00002222;
  31.     
  32.     *MP0_3CON &= ~0xFFFFFF;
  33.     *MP0_3CON |= 0x22222;
  34.     *MP0_3PUD &= ~(0x3ff);    
  35.     //初始化NFCONF
  36.     *NFCONF &= ~(0xFFFF);
  37.     *NFCONF |= (NFCONF_TACLS | NFCONF_TWRPH0 | NFCONF_TWRPH1|NFCONF_ADDRCYCLE|NFCONF_PAGESIZE|NFCONF_MLCFLASH );
  38.     //使能NAND Controller
  39. //    *NFCONT &= ~(0x707C7);
  40.     *NFCONT = (NFCONT_MODE|NFCONT_NCE0|NFCONT_NCE1|NFCONT_NCE2|NFCONT_NCE3|NFCONT_RNB_TRANSMODE|NFCONT_RNB_INT|NFCONT_MECCLOCK \
  41.                 | NFCONT_SECCLOCK | NFCONT_ENBILLEDALACCINT | NFCONT_LOCK | NFCONT_LOCKTIGHT | NFCONT_MLCECCDIRECTION );
  42.     //复位NAND
  43.     nand_reset();
  44.     
  45. }

然后做页复制
复制代码
  1. #define NAND_PAGE_SIZE 4096
  2. #define BL1_SIZE (16 * 1024)  //定义BL1的大小,BL2在此地址之后
  3. #define BL2_SIZE (48 * 1024)  //定义BL2的大小,决定要复制多少代码
  4. #define CONFIG_SYS_BOOT_BASE (0x20008000)  //BL2复制到内存的基地址
  5. #define NF8_ReadPage_Adv(a,b,c) (((int(*)(unsigned int, unsigned int, unsigned char*))(*((unsigned int *)0xD0037F90)))(a,b,c))
  6. void copy_bl2_to_ram(void)
  7. {
  8.     void (*BL2)(void);
  9.     /**********************************************************
  10.     * 因为BL0会自动把前16K放进IRAM所以我们从NAND的16K偏移处开始复制代码
  11.     * 之前使用自己寫的NAND copy函數不知道為什麼不好使
  12.     * 改成固化代碼試試
  13.     ************************************************************/
  14.     ///********以下這段使用BL0固化好的代碼************
  15.     int i = 0;
  16.     int pages = BL2_SIZE / NAND_PAGE_SIZE;        // 多少页
  17.     int offset = BL1_SIZE / NAND_PAGE_SIZE;            // u-boot.bin在NAND中的偏移地址(页地址)
  18.     int block,page;
  19.     unsigned char *p = (unsigned char *)CONFIG_SYS_BOOT_BASE;
  20.     for (; i < pages; i++, p += NAND_PAGE_SIZE, offset += 1)
  21.     {
  22.         block = offset / 64;
  23.         page = offset % 64;
  24.         NF8_ReadPage_Adv(block,page , p);
  25.     }
  26.     BL2 = (void *)CONFIG_SYS_BOOT_BASE;
  27.     (*BL2)();
  28.     
  29. }

但是发现复制到内存的部份,内存中只有前1K内容是正确的,请问有知道的吗
[ 此帖被cliffdean在2015-12-16 09:41重新编辑 ]
级别: 新手上路
UID: 82003
精华: 0
发帖: 26
金钱: 130 两
威望: 26 点
贡献值: 0 点
综合积分: 52 分
注册时间: 2012-11-16
最后登录: 2017-05-28
1楼  发表于: 2015-12-15 12:33
自己发现了应该是mlc的问题,mlc因为是双倍密度在1k后面的数据居然跳了1k也就是 0x1000的数据跑到了0x2000位置处了,
还没解决不过找到病根了
[ 此帖被cliffdean在2015-12-17 09:37重新编辑 ]