am335x 从 NAND FLASH 中启动遇到的问题的解决方法(上) (下)
http://blog.chinaunix.net/uid-28458801-id-3437793.html PC操作系统:ubuntu?11.10 使用的开发板:am335x_evm 开发板使用的操作系统:linux?3.2 有多种方式可以写入数据到NAND?FLASH?中,这里使用的是?SD卡,把?SD?中的SPL(?MLO),?u-boot.img?文件写入到?NAND?FLASH?中 NAND?布局如下: +------------+-->0x00000000->?SPL?start?????????(SPL?copy?on?1st?block) 1. 先使用?SD卡启动?am335x,但不要进入到系统中。(SD,Switch?SW3,?SW3[5:1]?==>?10111?,?其他?pins?都设置为?0?(也就是?OFF).?) 如下:
把?SD?中?的?SPL(MLO),u-boot.img?文件写入到?NAND?FLASH?中。 把?SPL?(MLO)?写入到??NAND?中?: U-Boot#?mmc?rescan? U-Boot#?mw.b?0x82000000?0xFF?0x20000? U-Boot#?fatload?mmc?0?0x82000000?MLO U-Boot#?nandecc?hw?2 U-Boot#?nand?erase?0x0?0x20000? U-Boot#?nand?write.i?0x82000000?0x0?0x20000 把?u-boot.img?写入到?NAND?中: U-Boot#?mw.b?0x82000000?0xFF?0x40000? U-Boot#?fatload?mmc?0?0x82000000?u-boot.img? U-Boot#?nandecc?hw?2? U-Boot#?nand?erase?0x80000?0x40000? U-Boot#?nand?write.i?0x82000000?0x80000?0x40000 执行到这里,没有发生任何错误。 2. 关闭?am335x。 转换成有?NAND?模式启动?am335x。(NAND,Switch?SW3,?SW3[5:1]?==>?10010?,?其他?pins?都设置为?0?(也就是?OFF).?) 启动?am335x。 3. 发生异常,提示如下: U-Boot?SPL?2011.09?(Jun?23?2012?-?20:16:14)??????????????????????? Texas?Instruments?Revision?detection?unimplemented??????????????? spl:?ERROR:?This?bootmode?is?not?implemented?-?hanging###?ERROR?###?Please?RESET?the?board?### 4. 解决方法: 打开文件:ti-sdk-am335x-evm/board-support/u-boot-2011.09-psp04.06.00.07/arch/arm/cpu/armv7/omap-common/spl_nand.c 修改函数:void?spl_nand_load_image(void)???//?LINE??33 如下: void?spl_nand_load_image(void) ????//修改后 保存。 5. 重新编译?uboot。?执行命令:#make?O=am335x?CROSS_COMPILE=arm-arago-linux-gnueabi-?ARCH=arm?am335x_evm 把生成的?MLO,u-boot.img?文件复制到?SD?卡中?替换原来的这两个文件。 重新执行??1.和2.。 启动?am335x。 显示如下:
完成!
首先要?linux?kernel?可以支持?NAND?FLASH。 打开linux?kernel?文件?:linux-3.2-psp04.06.00.07.sdk/arch/arm/mach-omap2/board-am335xevm.c 修改如下: /*?General?Purpose?EVM?*/ ????.... //修改前 //@@????{evm_nand_init,?DEV_ON_DGHTR_BRD, ????//修改后 ????.... }; 重新编译内核 把?linux?kernel?的?uImage?写入到?NAND?FLASH?中 把?uImage?写入到?NAND?中: U-Boot#?mw.b?0x82000000?0xFF?0x500000? U-Boot#?fatload?mmc?0?0x82000000?uImage? U-Boot#?nand?erase?0x280000?0x500000? U-Boot#?nand?write.i?0x82000000?0x280000?0x500000 通过?NAND?方式启动?am335x?,提示如下: 问题:?应该是没有把?文件系统?也写入到?NAND?FLASH?中。 待续。。。 ubifs文件系统的制作和移植有几个要点是需要重点注意的,ubifi的正确制作流程, 请看本人的《ubifs的制作,移植的重点详解》 ubifs的制作,移植的重点详解 1,把生成?ubifs?的文件系统的?ubi.img?写入到NAND?FALSH?中 U-Boot#?mw.b?0x82000000?0xFF?0x2000000? U-Boot#?fatload?mmc?0?0x82000000?ubi.img? U-Boot#?nand?erase?0x780000?0xF880000? U-Boot#?nand?write.i?0x82000000?0x780000?0x2000000 2,设置?bootargs?环境变量,是?ubifs?成为根文件系统,并保持设置,然后关机 U-Boot#setenv?bootargs?'console=ttyO0,115200n8?noinitrd?ip=off?mem=256M?rootwait=1?rw?ubi.mtd=7,2048?rootfstype=ubifs?root=ubi0:rootfs?init=/linuxrc' U-Boot#saveenv ?????在这里需要重点注意的命令参数是?:init=/linuxrc ?????这里的?linuxrc?是一个可执行文件,这个文件是用以引导内核加载文件系统的。如果没有这个文件,内核无法正确加载文件系统。 ?????将会导致以下错误:Kernel?panic?-?not?syncing:?No?init?found.??Try?passing?init=?option?to?kernel. ?????这个文件的详解在:《ubifs的制作,移植的重点详解?》->?"2),生成镜像文件"?中。 ????? 3,把evm设置成从nandflash启动,这次启动应该是可以正常启动的。但是再次关机后,重新启动,很可能会出现以下错误: ??????UBIFS?error?(pid?1):?replay_log_leb:?first?log?node?at?LEB?3:0?is?not?CS?node ?????UBIFS?error(pid?1):?replay_log_leb:?log?error?detected?while?replaying?the?log?at?LEB?3:0??? ?????这个错误的原因是'fixup_free_space()中计算空空间开始地址为c->lhead_offs。正确的应该为一直是0 解决方法是: ???????1,修改?linux?内核代码 ?????????????FILE_PATH:?fs/ubifs/sb.c?:?fixup_free_space() static?int?fixup_free_space(struct?ubifs_info?*c) ????...... ????//修改前 ???? ?????//修改后 ????????????? ?????...... } ???????2,重新编译内核,把生成的uImage写入到SD中,转换为?SD卡启动模式,但不进入linux系统, ????????????把??uImge和?ubi.img这两个重新写入到?NAND?中。 4,把evm设置成从nandflash启动,OK! ?????重启,OK!再重启,也OK!?。。。 至此,ubifs?成功写入到NAND中,并成为linux根文件系统 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |