第1章-确定superboot210如何为smart210的nand flash进行的分区划
标题的意思简单的而说,其实就是搞清楚superboot210将boot.bin,kernel和根文件系统分别下载到了什么地方。 首先看一下内核的启动信息? (superboot210.bin + linux3.0.8),其中有这么一段: [??????????? ] S3C NAND Driver is using hardware ECC. [??????????? ] 0x0000000c0000-0x000000100000 : "misc" 这是在内核当中的分区信息,通常情况下,对于一个追求完美的程序员来说,最好将内核的分区信息和uboot当中的分区信息设置一致,毕竟看起来更舒服一些。但是实际上来说,只要内核的根文件系统的分区和uboot的对应的下载根文件的地址一致即可。这是由启动参数(又叫环境变量)bootargs决定的,开发板提供的这个参数值为: bootargs=root=/dev/mtdblock4 rootfstype=yaffs2 console=ttySAC0,115200 init=/linuxrc androidboot.console=ttySAC0 skipcali=yes ctp=2 可以看出,根文件系统被放在了mtdblock4的分区上,也就是第4+1个分区,即上面的system分区。 所以从上面的启动信息来看,最后一项system分区肯定是正确的,但是以上四个是正确的吗?在我看来,至少第一个分区就错了,"misc"分区肯定是用来存放boot.bin,这是由ARM启动过程BL0决定的,但是boot.bin一定要放在0x00的位置,上面的启动信息居然是从c0000开始的,这是开哪门子国际玩笑。只有一种解释,这个分区信息和uboot真正的分区信息并不完全对应。 ?????? 那么"kernel"分区是否对应呢?我们知道,uboot想要引导内核,首先就要从nand flash中将内核读入到SDRAM里,如果我们连kernel存放在nand flash的哪个位置都不知道的话,那根本就没有必要去尝试引导了。 ????? 首先在uboot的命令行模式下输入: ? ? ? nand read 0x20000000 0x600000 0x10000 ? ?? 然后便出现了网上流传很广的那个错误: ? ? ?NAND read from offset 600000 failed -74 ? ? ? 接下来我先在uboot中执行nand flash擦出工作。 ????? nand srcub.chip ???? 完全擦除nand后,uboot就可以随意正确读取nand flash上的任何位置的数据了。当然读出来的数肯定都是ff ff ff ff ,类似与下面的样子 [ZBL210]# nand read 0x20000000 0x200000 0x800 而当我将kernel下载到nand flash当中后,假如我读到了kernel的数据,这时候就会显示错误,就是用这种笨方法,我终于确定了superboot210将kernel实际下载到了0x40000~0x900000的位置。 接下来确定一下uboot将环境变量下载到哪了呢。这个可以直接从uboot源码中找到这样一个宏定义 #define CONFIG_ENV_OFFSET?????????????? 0x100000 所以现在基本上可以确定分区了 0~1M?? bootloader 1M~4M?? parameters 4M~9M? kernel 9M~14M? ramdisk 14M~???? rootfs 接下来,重点解决uboot读取内核的ecc问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |