先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
a. 将前面文章中做好的uboot烧写到板子上之后,会提示nor flash的error,我们先解决这个问题。因为我们此时从nand启动,不涉及到nor flash,需要注释掉相关判断,避免从nand启动时,在nor初始化部分卡死,修改board.c函数 board_init_r,注释掉下面部分
else {
puts("0 KB\n\r");
//puts(failed);
//hang();
}
b. 修改G:\100ask\systems\u-boot-2012.04.01\drivers\mtd\cfi_flash.c,支持调试打印,我们放开flash_get_size函数中的打印
#define _DEBUG 1
#define DEBUG 1
c. 修改arch\arm\lib\boards.c board_init_r函数中flash_inint初始化失败部分 drivers/mtd/jedec_flash.c, jedec_table数组中加上新的flash型号
/* jz2440 v2使用的是MT29LV160DB芯片 */
{
.mfr_id = (u16)MX_MANUFACT, /* 厂家id */
.dev_id = 0x2249, /* 设备id */
.name = "MXIC MT29LV160DB", /* 名字 */
.uaddr = { /* nor flash 看到的解锁地址 */
[1] = MTD_UADDR_0x0555_0x02AA /* x16 */
},
.DevSize = SIZE_1MiB, /* 总大小 */
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 4, /* 擦除区域,比如10个128k,10个256块,那么擦除区域就是2*/
.regions = {
ERASEINFO(16*1024, 1),
ERASEINFO(8*1024, 2),
ERASEINFO(32*1024, 1),
ERASEINFO(64*1024, 31),
}
},
d. 将上面的修改移植到虚拟机下面,并重新编译make,烧写到板子上,发现有打印:
ERROR: too many flash sectors
e. 修改smdk2440.h中的宏定义,解决上面的错误打印信息,如下,(此时,去掉flash中我们在步骤b中增加的打印调试宏定义)
#define CONFIG_SYS_MAX_FLASH_SECT (128)
f. 修复了重定位时留下来的bug: sp要重新设置,修改start.S,
.globl base_sp
base_sp:
.long 0
ldr r0,=0x00000000
bl board_init_f
/* unsigned int的值存在r0里,正好给board_init_r */
ldr r1, _TEXT_BASE
ldr sp, base_sp /* 重新设置栈指针 */
/* 调用第二阶段代码 */
bl board_init_r
以及修改board.c,在board_init_f函数中
extern ulong base_sp;
base_sp = addr_sp;
g. 编译完成之后,重新烧写代码
loady 32000000 //此时不能烧写到30000000
protect off all
erase 0 80000
cp.b 32000000 0 80000
reset
h. 验证代码是否正确
protect off all
erase 80000 8ffff
cp.b 30000000 80000 8ffff
cmp.b 30000000 80000 10000