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)
| |
| |-->0x0001FFFF-> SPL end
| |-->0x00020000-> SPL.backup1 start (SPL copy on 2nd block)
| |
| |-->0x0003FFFF-> SPL.backup1 end
| |-->0x00040000-> SPL.backup2 start (SPL copy on 3rd block)
| |
| |-->0x0005FFFF-> SPL.backup2 end
| |-->0x00060000-> SPL.backup3 start (SPL copy on 4th block)
| |
| |-->0x0007FFFF-> SPL.backup3 end
| |-->0x00080000-> U-Boot start
| |
| |-->0x002BFFFF-> U-Boot end
| |-->0x00260000-> ENV start
| |
| |
| |-->0x0027FFFF-> ENV end
| |-->0x00280000-> Linux Kernel start
| |
| |
| |-->0x0077FFFF-> Linux Kernel end
| |-->0x00780000-> File system start
| |
| |
+------------+-->0x10000000-> NAND end (Free end)
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# mmc rescan
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)
{
struct image_header *header;
/*@@ //修改前
switch (omap_boot_mode()) {
case NAND_MODE_HW_ECC:
debug("spl: nand - using hw ecc\n");
gpmc_init();
nand_init();
break;
default:
puts("spl: ERROR: This bootmode is not implemented - hanging");
hang();
}
@@*/
//修改后
debug("spl: nand - using hw ecc\n"); //@@
gpmc_init(); //@@
nand_init(); //@@
/*use CONFIG_SYS_TEXT_BASE as temporary storage area */
header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
保存。
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 */
static struct evm_dev_cfg gen_purp_evm_dev_cfg[] = {
....
//修改前
//@@ {evm_nand_init, DEV_ON_DGHTR_BRD,
//@@ (PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3)},
//修改后
{evm_nand_init, DEV_ON_BASEBOARD, PROFILE_NONE}, //@@
....
};
重新编译内核
把 linux kernel 的 uImage 写入到 NAND FLASH 中
把 uImage 写入到 NAND 中:
U-Boot# mmc rescan
U-Boot# mw.b 0x82000000 0xFF 0x500000
U-Boot# fatload mmc 0 0x82000000 uImage
U-Boot# nandecc hw 2
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# mmc rescan
U-Boot# mw.b 0x82000000 0xFF 0x2000000
U-Boot# fatload mmc 0 0x82000000 ubi.img
U-Boot# nandecc hw 2
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)
{
int lnum, err = 0;
struct ubifs_lprops *lprops;
ubifs_get_lprops(c);
......
//修改前
/* Fixup the current log head */
/*@@
err = fixup_leb(c, c->lhead_lnum, c->lhead_offs);
if (err)
goto out;
@@*/
//修改后
/*@@
* Fixup the log head which contains the only a CS node at the
* beginning.
*/
err = fixup_leb(c,c->lhead_lnum,ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size));
if (err)
goto out;
/*@@*/
......
}
2,重新编译内核,把生成的uImage写入到SD中,转换为 SD卡启动模式,但不进入linux系统,
把 uImge和 ubi.img这两个重新写入到 NAND 中。
4,把evm设置成从nandflash启动,OK!
重启,OK!再重启,也OK! 。。。