最近买了一批s3c2440的核心板,nandflash 256M是三星的K9F2G,内存64M,nor flash为spansion S29AL016D。收到核心板后发现卖家在里面烧入的boot为vboot,不是uboot,不满足我的应用,因此第一件事情就是重新烧写uboot。

1、在烧写uboot遇到第一个问题就是Jflash不能识别nor flash芯片,我最初用的是JFlash ARM v4.08版本+V8 Jlink,始终不能识别nor flash芯片,我在工程设置中将如下两个选项去掉,能够连接上target但不能烧写norflash,如下图:

x230刷bios教程 x230刷ec_核心板

 后面我怀疑有没有可能是JFlash版本低了的原因,因为在去掉check flash id后能够连接目标target,说明硬件上是没有问题的,而且我以前在win7系统上烧写norflash成功过,只不过我现在用的是win10系统而已。后面我将JFlash ARM 4.08i升级到JFlash ARM 4.86b就能够正常烧写norflash了,如下图所示:

x230刷bios教程 x230刷ec_命令行_02

2、第二个问题是烧入我的linux内核和文件系统,烧入卖家的u-boot_W35.bin,在启动的时候出现如下情况:

x230刷bios教程 x230刷ec_根文件系统_03

一看到出现了这种情况当时心里面还是有点慌,因为之前买的核心板都没有问题,而且马上就要交货了现在核心板出问题,解决的大致过程如下:

首先比较核心板硬件上的区别,下面2图是之前买的核心板:

x230刷bios教程 x230刷ec_x230刷bios教程_04

x230刷bios教程 x230刷ec_命令行_05

下面2图是这个批次买的:

x230刷bios教程 x230刷ec_命令行_06

   

x230刷bios教程 x230刷ec_命令行_07

可以看出后批次核心板的电源芯片变化、晶振由之前的插装换为贴片;norflash发生变化。从日志看,大致是由于挂载根文件系统时出现了问题。经过确认,是由于烧写根文件系统出现了问题。通过uboot的命令行方式,查看到我的uboot的分区是:

x230刷bios教程 x230刷ec_根文件系统_08

上图是卖家给的uboot的参数,是2M的内核。下图是我编译的linux内核打印出的分区信息,可以看出内核大小是3M。

x230刷bios教程 x230刷ec_x230刷bios教程_09

 很明显是uboot和内核分区不一致。我在烧写都是通过dnw的(非dnw的命令行方式),dnw根据uboot,烧写各分区数据,由于uboot中内核分区是2M,导致我烧写的根文件系统其实位置是0x00400000。而内核启动后去挂载根文件系统时,是去读取自己的分区数据,从0x00500000位置开始读取,导致读取不到完整的根文件系统而卡死。

解决方法:

保证uboot分区和内核分区分区相同。对相对于uboot和内核分区,我比较熟悉uboot的内核分区的位置,于是,我修改了我的uboot源码,具体位置在include/configs/100ask24x0.h(文件名根据自己编译的产品不同会改变)中的

x230刷bios教程 x230刷ec_根文件系统_10

 使用修改后的uboot查看启动参数如下,程序正常运行:

x230刷bios教程 x230刷ec_核心板_11