mini2440使用u-boot

下载:
u-boot.bin

u-boot-1.1.6-mini2440.tar.gz

同学买了一块FriendlyARM(友善之臂)做的mini2440的板子,板上有友善之臂自己扩展的SuperVIVI,很简便易用的一个bootloader,特别是菜单功能做的很贴心。然而美中不足的是,SuperVIVI需要通过USB来更新NAND上的内容,这个USB驱动却又只支持Windows 2000(Windows XP勉强能用),但我的同学现在只有MacOS X和Vista机器了,用起来很是不便。

友善之臂提供了一个u-boot,心想刷到NAND上就好了,用不了几分钟。于是我考虑给他的mini2440换上网络功能强大的u-boot。显然后面的进展远没有这么顺利,不然就不会特别来记述一番了。

刷上自带的u-boot后,发现MTD的分区很怪异,kernel区是从0开始的。心想,不至于有这么怪异的错误留在这里吧,几秒种后恍然大悟,原来mini2440板上有NOR和NAND 2个存储器,这个u-boot是为NOR准备的。好吧,自己动手改改。

找到源代码,发现居然还是1.1.6,真够老的。上友善之臂的网站去下载,发现依然是1.1.6,这个…难道u-boot不受欢迎?不过我在友善之臂的网站上发现了移植好的2.6.29的内核,可以顺便拿来试试。

友善之臂用的是open24×0的config,修改了u-boot-1.1.6/include/configs/open24×0.h,重新安排了MTD的分区,并使u-boot采用NAND来存放env。然后修改linux-2.6.29/arch/arm/plat-s3c24xx/common-friendly-arm.c,把MTD的分区信息调整成与u-boot的一致。然后编译,刷写NAND,关掉板子,默默祈祷了一下之后,满怀希望的按下红色的电源开关…果然,启动不了。

串口console上打印出来的信息,停在了”done, booting the kernel.”。也就是说,解压缩成功了,也许是跳转到入口失败了,也许是在打印出”Linux version”之前出了什么问题。当然,也有可能是信息没有打印到串口console上。可惜手边没有仿真器,瞎猜没有用。mini2440的板子应该有不少用户,这些用户中应该不止一个人试过u-boot。Google一下吧。

看来这个问题还真不止我一个人遇到过,不过大家似乎都选择自己重新移植u-boot,而不是修正原有的u-boot 1.1.6。这个活儿太花时间了,不行,继续Google。在继续Google了近一个小时之后,总结大家的问题一般是3种情况:

  1. console设置没有传递到内核
  2. u-boot的时钟设置不在405MHz,与Kernel的不一致
  3. Machine ID设置的与Kernel不一致

第1种情况可以排除,我设置了CMDLINE。第2种情况,检查了u-boot-1.1.6/board/open24×0/boot_init.c,貌似也没问题。看来是Machine ID的问题。

查看u-boot-1.1.6/board/open24×0/open24×0.c与linux-2.6.29/include/asm/mach-types.h,发现Machine ID果然设置的不对。mini2440的ID是1999,而u-boot中设置的是三星官方的362。改完,刷写,重启。

依然不灵。

这就有点土了。没有仿真器,没有打印信息,我和mini2440之间又不能通过脑电波交流…冥思苦想中,我进入了准无意识状态,大脑在迷惘,手指在不停地用NOR或者NAND启动mini2440。突然,我感到有什么东西不对。隐隐约约的,我似乎看到了什么东西,不应该出现的东西。定定神,一行一行地翻看串口console日志,貌似每一行都很正常,但最后我停在了SuperVIVI启动的一行语句上面:”Machine ID: 782″。

782?为什么会是782?我grep了一下linux-2.6.29/include/asm/mach-types.h,782是MACH_TYPE_PNX4008。先不想那么多,改成782试试。改完,刷写,重启。

Kernel成功启动了。

回过头研究782,不由哑然失笑。原来是这个linux-2.6.29移植的有点潦草,defconfig中的宏定义前后不一致,使得Machine ID没有设置为预想的值。好吧,这个问题就留在这里吧,也是一种不和谐美。

附linux-2.6.29/arch/arm/plat-s3c24xx/common-friendly-arm.c中的MTD分区设置:

static struct mtd_partition friendly_arm_default_nand_part[] = {
[0] = {
.name = “boot”,
.size = 0×00040000,
.offset = 0,
},
[1] = {
.name = “env”,
.offset = 0×00040000,
.size = 0×00010000,
},
[2] = {
.name = “kernel”,
.offset = 0×00050000,
.size = 0×00200000,
},
[3] = {
.name = “root”,
.offset = 0×00250000,
.size = 0×03db0000,
}
};

13 Responses to “mini2440使用u-boot”

  1. hechu 说:

    大神,你讲的我非常看不懂。

  2. 雪兔 说:

    很好玩的样子,吼吼

  3. 郭解 说:

    老友 过来看过你!

    我最近在学flash编程 哈哈

  4. ddy 说:

    自己架的站吗,不错,还较新的。

  5. cp 说:

    哥们写的不错 谢谢分享

  6. 小叶子 说:

    自从Linux官方内核Linux-2.6.29开始,才正式加入mini2440的Machine ID: 1999.
    友善光盘里的u-boot据说是网友提供的,并没有人继续维护,友善使用的是supervivi,跟随友善网站一起发布的Linux-2.6.29内核配套的supervivi也已经把machine ID改为1999,或许你还没有更新NOR里面的吧,因此显示的还是老的ID,经常多看看他们网站下载更新吧,还是有不少好东西的。

    • 胡林 说:

      我下载你的uboot。用友善的Linux-2.6.29,Starting kernel …就没了

  7. 匿名 说:

    U-Boot 1.1.6 (Apr 28 2009 – 23:34:29)

    DRAM: 64 MB
    Flash: 1 MB
    NAND: 64 MiB
    *** Warning – bad CRC or NAND, using default environment

    In: serial
    Out: serial
    Err: serial
    UPLLVal [M:38h,P:2h,S:2h]
    MPLLVal [M:5ch,P:1h,S:1h]
    CLKDIVN:5h

    +———————————————+
    | S3C2440A USB Downloader ver R0.03 2004 Jan |
    +———————————————+
    USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
    FORMAT: +++
    NOTE: Power off/on or press the reset button for 1 sec
    in order to get a valid USB device address.

    Hit any key to stop autoboot: 0
    Booting Linux …

    NAND read: device 0 offset 0×50000, size 0×200000

    reading NAND page at offset 0×50000 failed
    Could not read entire image due to bad blocks
    2097152 bytes read: ERROR
    ## Booting image at 32000000 …
    Bad Magic Number

    大侠,我烧写了你的,能帮我看下我的哪里不行不?

  8. icecut 说:

    俺也买的这种板子,这种软件风格还是比较害死人的…

  9. 匿名 说:

    你好:我下了你的image用友善的linux-2.6.29可是Starting kernel …就没显示了

  10. 胡林 说:

    打印信息如下:
    ## Booting image at 30007fc0 …

    Image Name: linux-2.6.30

    Created: 2009-12-10 8:11:36 UTC

    Image Type: ARM Linux Kernel Image (uncompressed)

    Data Size: 2012968 Bytes = 1.9 MB

    Load Address: 30007fc0

    Entry Point: 30008000

    Verifying Checksum … OK

    OK

    Starting kernel …
    连解压都没有,请楼主回复一下,谢谢!

Leave a Reply