mini2440_NFS 利用uboot启动

来源:互联网 发布:ug中心钻编程 编辑:程序博客网 时间:2024/05/29 14:19

    本文记录mini2440开发板如何利用uboot通过nfs服务来启动内核。

背景:

        放了好久的板子,今天又得重新拿来使唤,之前换了机子,虽说除了kernel和rootfs通过nfs挂载的,但u-boot死活进不去...搞定u-boot,nfs又不好使了。

...

环境:

        1.OS:ubuntu11.10;

        2.串口工具:C-kermit

        ...

涉及:

        1.nfs中exports的配置;

        2.u-boot中env的设置;

        3.遇到的问题...


    一、nfs中配置文件:/etc/exports

    $sudo vim /etc/exports

    1.添加开发板要挂载的nfs目录:

        /your/nfsroot/path 192.168.2.0/24(rw, sync, no_root_squash)

       我的是:/home/wang2/codePrj/ldd/rootfs/qtopia4 192.168.2.0/24(rw, sync, no_root_squash)

    2.添加开发板需要的内核文件目录:

        /your/kernel/uImage/path 192.168.2.0/24(rw, sync,no_root_squash)

       我的是:/home/wang2/codePrj/ldd/imgs 192.168.2.0/24(rw, sync, no_root_squash)

    3.$sudo nfs-kernel-server  restart


    二、关于第一步中的uImage:

    因为u-boot在引导kernel img时需要读取img的前64字节的相关信息,所以想用u-boot引导内核还必须制作uImage(uboot Image)

    1. 用make menuconfig获得zImage;

    2. 用u-boot tools中的mkimage 处理zImage:

        mkimage -A arm -O linux  -T kernel -C none -a 0x30008000 -e 0x30008000 -n kernel-2.6.32.2 -d zImage uImage

   3. 参数说明:
     -A arm     -------- Architecture   架构是arm
     -O linux    -------- OS                操作系统是linux
     -T kernel  -------- Type              映像类型是kernel
     -C none    -------- Compressed   压缩类型为无压缩
     -a 30008000 ----                      image的载入地址(hex)
     -e 30008000 ---- entry             内核的入口地址(hex)
     -n kernel-2.6.32.2 --- name       image的名字
     -d zImage ---- 原始的image文件名      uImage ---- u-boot使用的image文件


   三、通过nfs挂载:

    1. 提示:

               Loading: *_*** ERROR: Cannot mount
       原因:
                 a. 改完/etc/exports未重启nfs服务;
                 b. 防火墙未关闭:
                           $sudo ufw status如果为active则可以通过
                           $sudo ufw disable   关闭Ubuntu Fire Wall防火墙
     2. 提示:    
NAND read: device 0 offset 524288, size 2097152 ... 2097152 bytes read: OK## Booting image at 30008000 ...   Image Name:   kernel-2.6.32.2   Created:      2010-04-25   9:59:17 UTC   Image Type:   ARM Linux Kernel Image (uncompressed)   Data Size:    1966552 Bytes =  1.9 MB   Load Address: 30008000   Entry Point:  30008000   Verifying Checksum ... OK   XIP Kernel Image ... OKStarting kernel ...data abortpc : [<30008010>]    lr : [<33f94754>]sp : 33f4faa0  ip : 30008000  fp : 00000002r10: 00000000  r9 : 33e7fe2c  r8 : 33f4ffdcr7 : 33f9e278  r6 : 33f9e278  r5 : 30008000  r4 : 00000000r3 : 30008000  r2 : 30000100  r1 : 000000c1  r0 : 33f4fce8Flags: nZCv  IRQs off  FIQs off  Mode SVC_32Resetting CPU ...
原因:
        a. 内核的类型不对,mach-type不一致;
        b. uImage中的入口地址不对,因为mkimage处理后会加入64字节(0x40)的额外信息,所以将上方的-e选项后,改为
0x30008040         
    3.  提示:
                Load address: 0x30008000                Loading: T T T T T T T .....
        原因:
                这会儿的错误,居然是网线过长引起的!!!用大概3到5米的网线,只有T T T ;换成1米的就########了!太诡异了                       
    4. extra:
            之前我是按上面的命令直接生成uImag,下载到开发板是能够运行的;可是这次却总是下载-->cpu resetting-->下载-->cpu resetting...;(之前和之后只是mkimage工具使用的不一样!)通过b,得到修复。


 四、u-boot环境变量的配置:

    1. 打印当前env:

        #printenv

    2. 设置env:

        #setenv env_name env_value

        #setenv bootargs 'noinitrd root=/dev/nfs rw nfsroot=192.168.2.3:/home/wang2/codePrj/ldd/rootfs/qtopia4 ip=192.168.2.4:192.168.2.3:255.255.255.0 console=ttySAC0,115200  mem=64M'

        我的env:        

[zhong@mini2440]# printenv bootdelay=1baudrate=115200ethaddr=08:08:11:18:12:27zhong=bmp d 70000 stdin=serialstdout=serialstderr=serialethact=dm9000filesize=266854fileaddr=30008000gatewayip=192.168.2.1netmask=255.255.255.0ipaddr=192.168.2.4serverip=192.168.2.3bootcmd=nfs 0x30008000 192.168.2.3:/home/wang2/codePrj/ldd/imgs/uImage;bootm 0x30008000bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.2.3:/home/wang2/codePrj/ldd/rootfs/qtopia4 ip=192.168.2.4:192.168.2.3:255.255.255.0 console=ttySAC0,115200  mem=64M

    

    五、可以nfs启动了

Try to bring eth0 interface up......NFS root ...DonePlease press Enter to activate this console. 

原创粉丝点击