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. 提示:    
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 ... OK

Starting kernel ...

data abort
pc : [<30008010>]    lr : [<33f94754>]
sp : 33f4faa0  ip : 30008000  fp : 00000002
r10: 00000000  r9 : 33e7fe2c  r8 : 33f4ffdc
r7 : 33f9e278  r6 : 33f9e278  r5 : 30008000  r4 : 00000000
r3 : 30008000  r2 : 30000100  r1 : 000000c1  r0 : 33f4fce8
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
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:        

[zhong@mini2440]# printenv 
bootdelay=1
baudrate=115200
ethaddr=08:08:11:18:12:27
zhong=bmp d 70000
 stdin=serial
stdout=serial
stderr=serial
ethact=dm9000
filesize=266854
fileaddr=30008000
gatewayip=192.168.2.1
netmask=255.255.255.0
ipaddr=192.168.2.4
serverip=192.168.2.3
bootcmd=nfs 0x30008000 192.168.2.3:/home/wang2/codePrj/ldd/imgs/uImage;bootm
 0x30008000
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

    

    五、可以nfs啓動了

Try to bring eth0 interface up......NFS root ...Done

Please press Enter to activate this console. 

發佈了29 篇原創文章 · 獲贊 55 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章