mini2440_NFS 利用uboot启动

    本文记录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. 提示:  

   
   
   
   
[cpp] view plain copy
  1. NAND read: device 0 offset 524288, size 2097152 ...  
  2.  2097152 bytes read: OK  
  3. ## Booting image at 30008000 ...  
  4.    Image Name:   kernel-2.6.32.2  
  5.    Created:      2010-04-25   9:59:17 UTC  
  6.    Image Type:   ARM Linux Kernel Image (uncompressed)  
  7.    Data Size:    1966552 Bytes =  1.9 MB  
  8.    Load Address: 30008000  
  9.    Entry Point:  30008000  
  10.    Verifying Checksum ... OK  
  11.    XIP Kernel Image ... OK  
  12.   
  13. Starting kernel ...  
  14.   
  15. data abort  
  16. pc : [<30008010>]    lr : [<33f94754>]  
  17. sp : 33f4faa0  ip : 30008000  fp : 00000002  
  18. r10: 00000000  r9 : 33e7fe2c  r8 : 33f4ffdc  
  19. r7 : 33f9e278  r6 : 33f9e278  r5 : 30008000  r4 : 00000000  
  20. r3 : 30008000  r2 : 30000100  r1 : 000000c1  r0 : 33f4fce8  
  21. Flags: nZCv  IRQs off  FIQs off  Mode SVC_32  
  22. Resetting 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:        

[cpp]  view plain copy
  1. <span style="font-size: 16px; ">[zhong@mini2440]# printenv   
  2. bootdelay=1  
  3. baudrate=115200  
  4. ethaddr=08:08:11:18:12:27  
  5. zhong=bmp d 70000  
  6.  stdin=serial  
  7. stdout=serial  
  8. stderr=serial  
  9. ethact=dm9000  
  10. filesize=266854  
  11. fileaddr=30008000  
  12. gatewayip=192.168.2.1  
  13. netmask=255.255.255.0  
  14. ipaddr=192.168.2.4  
  15. serverip=192.168.2.3  
  16. bootcmd=nfs 0x30008000 192.168.2.3:/home/wang2/codePrj/ldd/imgs/uImage;bootm  
  17.  0x30008000  
  18. 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  
  19. </span>  

    

    五、可以nfs启动了

[cpp]  view plain copy
  1. Try to bring eth0 interface up......NFS root ...Done  
  2.   
  3. Please press Enter to activate this console.   

你可能感兴趣的:(mini2440_NFS 利用uboot启动)