加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

am335x 从 NAND FLASH 中启动遇到的问题的解决方法(上) (下)

发布时间:2020-12-15 17:36:06 所属栏目:百科 来源:网络整理
导读: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?文件写入到?N

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#?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?eccn");
????????gpmc_init();
????????nand_init();
????????break;
????default:
????????puts("spl:?ERROR:?This?bootmode?is?not?implemented?-?hanging");
????????hang();
????}
@@*/

????//修改后
????debug("spl:?nand?-?using?hw?eccn");????//@@????
????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?以及?文件系统??待续


首先要?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#?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)
{
????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!?。。。

至此,ubifs?成功写入到NAND中,并成为linux根文件系统

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读