S3C2440移植uboot之支持NORFLASH
上节S3C2440移植uboot之支持NAND启动修改了代码支持了NAND启动。这节我们分析uboo使其支持NORFLASH的操作。
1.分析启动错误
上一节启动uboot出现如下所示,我们搜索下错误代码Flash:
上面的Flash: *** failed ***
是属于uboot第二阶段函数board_init_r()里的代码, 代码如下所示(位于arch/arm/lib/board.c):
/*第二阶段*/ void board_init_r(gd_t *id, ulong dest_addr) //gd uboot重定位地址 { ... ... puts("Flash: "); //打印flash: flash_size = flash_init(); //初始化nor_flash if (flash_size > 0) { ... ... print_size(flash_size, "\n"); //打印nor_flash的大小 } else { puts(failed); //打印数组failed[]="*** failed ***\n"; hang(); //进入while中,并打印: ### ERROR ### Please RESET the board ### } #if defined(CONFIG_CMD_NAND) puts("NAND: "); //打印NAND: nand_init(); //初始化nand_flah ... ... }
从上面代码看出, board_init_r()会来初始化nor,由于新的uboot不支持nor,所以flash_init()初始失败,然后打印一串错误代码后,等待复位.
由于2440在nand启动时,会自动装载nand的前4k内容,所以不支持norflash,因为nor的前4k内容被nand占用.
2.修改代码
所以修改上面代码,避免nand启动一直卡住,将:
else { puts(failed); //打印数组failed[]="*** failed ***\n"; hang(); //进入while中,并打印: ### ERROR ### Please RESET the board ### }
改为:
else { puts("0 KB\r\n"); //打印0 KB }
在u-boot-2012.04.01\drivers\mtd\cfi_flash.c文件中增加定义
#define _DEBUG 1 #define DEBUG //调试模式
打印如下调试信息
然后使用nor启动新的uboot,打印出调试信息:
打印出norflash的厂家ID=0xC2,设备ID=0x2249,显然uboot匹配读出的ID没有成功.
搜索JEDEC PROBE字段,找到位于board_init_r()->flash_init()->flash_detect_legacy():
如上图所示,该函数会进入board_init_r()->flash_init()->flash_detect_legacy()->jedec_flash_match(),里面会通过两个ID来匹配jedec_table[].
3.在匹配数组中添加我们的NORFLASH
接下来向jedec_table[]里添加norflash:MT29LV160DB(位于drivers/mtd/jedec_flash.c)
参考手册如下
修改后代码如下:
/*MX29LV160DB*/ { .mfr_id = (u16)MX_MANUFACT, //厂家ID0x00C200C2 (读nor,便是0xc2) .dev_id = 0x2249, //设备ID .name = "MXIC MX29LV160DB", .uaddr = { [1] = MTD_UADDR_0x0555_0x02AA /* 数组[1]表示是16位nor,解锁地址为:0x555,0x2AA */ }, .DevSize = SIZE_2MiB, .CmdSet = P_ID_AMD_STD, .NumEraseRegions= 4, //4种不同的扇区规格 .regions = { ERASEINFO(16*1024, 1), ERASEINFO(8*1024, 2), ERASEINFO(32*1024, 1), ERASEINFO(64*1024, 31), } },
重新烧写看打印信息,出现这么一段ERROR:
ERROR:too many flash sectors
说flash的扇区太多了,搜索找到位于drivers/mtd/jedec_flash.c中:
显然是CONFIG_SYS_MAX_FLASH_SECT宏小于我们flash的扇区,所以打印ERROR。
所以修改CONFIG_SYS_MAX_FLASH_SECT宏定义(位于include/configs/smdk2440.h),并去掉之前定义的DEBUG调试宏(位于u-boot-2012.04.01\drivers\mtd\cfi_flash.c)
4.然后重新烧写
输入flinfo命令(flash info),就能查看flash的信息了:
然后通过uboot命令,检测nor的读写是否正确:
查看内容
往内存写数据
5.解决栈设置错误的问题
拷贝的数据和源数据内容不同,可能是我们的栈设置有问题。
(关于内存分布可以看这个图)内存分布
由于之前重定位,清除bss之后栈一直指向30000000的位置,每调用一个函数栈应该会变化。由于我们的设置问题,导致栈一直卡在30000000的位置,所以拷贝数据后再比较源数据和目的数据就会出错。
修改start.s启动文件
call_board_init_f: /*注意这里 ,把声明放文件开头编译会报错。只能放这里*/ .globl base_sp base_sp: .long 0 ldr r0,=0x00000000 bl board_init_f /*unsigned int id 的值存在r0中,正好给board_init_r使用*/ ldr r1, =_TEXT_BASE /*重新设置栈到之前的位置 指向原来addr_sp += 128;*/ ldr sp,base_sp /*调用第二阶段代码*/ bl board_init_r
在board.c中将之前的栈的地址传回来
同时在board.c中定义外部引用
重新烧写
usb 1 30000000 //使用usb下载到SDRAM上,1表示一直下载,直到完成 //然后打开DNW,传输新的uboot.bin给usb protect off all //关闭nor的写保护 erase 0 +7FFFF //擦除nor上的 0~7FFFF地址内容, (512k*1024-1)=+7FFF=擦除长度=512kb,要大于新的uboot.bin才行 cp.b 30000000 0 80000 //将SDRAM上的新的uboot.bin,拷贝到nor上(烧写512K) protect off all erase 80000 8ffff /*擦除512K*/ cp.b 32000000 80000 1000 /*从32000000拷贝1000字节数据到80000位置*/ cmp.b 32000000 80000 1000 /*比较拷贝的数据是否相同*/
现在我们的NORFLASH就支持了NOR的操作。
下一节S3C2440移植uboot之支持NANDFLASH操作我们将移植uboot支持NANDFLASH的操作。
有任何问题,均可通过公告中的二维码联系我
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架