我是smart210 3G 监控版,2G MLC nand flash的板子,现在在做uboot的启动代码,从nand复制代码到内存的时候,发现只有最前面1K正确复制了,
我在nand初始化部分代码如下
复制代码- //因为NAND的频率是200MHz 所以1HCLK=5ns
- #define NFCONF_TACLS (10<<12)
- #define NFCONF_TWRPH0 (10<<8)
- #define NFCONF_TWRPH1 (10<<4)
- #define NFCONF_ADDRCYCLE (1<<1)
- //注意一下因为我的开发版使用的是MLC所以以下参数设定
- #define NFCONF_PAGESIZE (0<<2)
- #define NFCONF_MLCFLASH (1<<3)
- #define NFCONT_MODE (1<<0)
- #define NFCONT_NCE0 (1<<1)
- #define NFCONT_NCE1 (1<<2)
- #define NFCONT_NCE2 (1<<22)
- #define NFCONT_NCE3 (1<<23)
- #define NFCONT_SECCLOCK (0<<6)
- #define NFCONT_MECCLOCK (0<<7)
- #define NFCONT_RNB_TRANSMODE (0<<8)
- #define NFCONT_RNB_INT (0<<9)
- #define NFCONT_ENBILLEDALACCINT (0<<10)
- #define NFCONT_LOCK (0<<16)
- #define NFCONT_LOCKTIGHT (0<<17)
- #define NFCONT_MLCECCDIRECTION (0<<18)
- //初始化NAND
- void nand_init()
- {
- //配置引脚-配置请见自己写的nand初始化文档
- *MP0_1CON &= ~(0xff<<8);
- *MP0_1CON |= (0x33<<8);
- *MP0_1PUD &= ~(0xF<<4);
-
- *MP0_2CON = 0x00002222;
-
- *MP0_3CON &= ~0xFFFFFF;
- *MP0_3CON |= 0x22222;
- *MP0_3PUD &= ~(0x3ff);
- //初始化NFCONF
- *NFCONF &= ~(0xFFFF);
- *NFCONF |= (NFCONF_TACLS | NFCONF_TWRPH0 | NFCONF_TWRPH1|NFCONF_ADDRCYCLE|NFCONF_PAGESIZE|NFCONF_MLCFLASH );
- //使能NAND Controller
- // *NFCONT &= ~(0x707C7);
- *NFCONT = (NFCONT_MODE|NFCONT_NCE0|NFCONT_NCE1|NFCONT_NCE2|NFCONT_NCE3|NFCONT_RNB_TRANSMODE|NFCONT_RNB_INT|NFCONT_MECCLOCK \
- | NFCONT_SECCLOCK | NFCONT_ENBILLEDALACCINT | NFCONT_LOCK | NFCONT_LOCKTIGHT | NFCONT_MLCECCDIRECTION );
- //复位NAND
- nand_reset();
-
- }
|
然后做页复制
复制代码- #define NAND_PAGE_SIZE 4096
- #define BL1_SIZE (16 * 1024) //定义BL1的大小,BL2在此地址之后
- #define BL2_SIZE (48 * 1024) //定义BL2的大小,决定要复制多少代码
- #define CONFIG_SYS_BOOT_BASE (0x20008000) //BL2复制到内存的基地址
- #define NF8_ReadPage_Adv(a,b,c) (((int(*)(unsigned int, unsigned int, unsigned char*))(*((unsigned int *)0xD0037F90)))(a,b,c))
- void copy_bl2_to_ram(void)
- {
- void (*BL2)(void);
- /**********************************************************
- * 因为BL0会自动把前16K放进IRAM所以我们从NAND的16K偏移处开始复制代码
- * 之前使用自己寫的NAND copy函數不知道為什麼不好使
- * 改成固化代碼試試
- ************************************************************/
- ///********以下這段使用BL0固化好的代碼************
- int i = 0;
- int pages = BL2_SIZE / NAND_PAGE_SIZE; // 多少页
- int offset = BL1_SIZE / NAND_PAGE_SIZE; // u-boot.bin在NAND中的偏移地址(页地址)
- int block,page;
- unsigned char *p = (unsigned char *)CONFIG_SYS_BOOT_BASE;
- for (; i < pages; i++, p += NAND_PAGE_SIZE, offset += 1)
- {
- block = offset / 64;
- page = offset % 64;
- NF8_ReadPage_Adv(block,page , p);
- }
- BL2 = (void *)CONFIG_SYS_BOOT_BASE;
- (*BL2)();
-
- }
|
但是发现复制到内存的部份,内存中只有前1K内容是正确的,请问有知道的吗
[ 此帖被cliffdean在2015-12-16 09:41重新编辑 ]