uboot 修改代碼 增加 環境變量


--- title: uboot修改代碼增加環境變量 date: 2019-12-27 21:26:39 categories: tags: - uboot ---

以"tftp下載kernel和自動掛載NFS根文件系統" 為例。

背景

為了開發的方便我們一般都會有這么一個需求:

  1. uboot啟動不做任何操作從nand啟動

  2. 執行一個簡單的命令, 從網絡下載內核並啟動, 啟動之后自動掛接NFS根文件系統

為了實現上述的需求我們就不能修改nand啟動的bootcmd, 那我們可以新建一個啟動命令. 姑且叫它netboot 吧, 下邊我們來看如何實現netboot

修改uboot代碼

第一處

include/configs/com335x.h 里添加 netboot(可以添加到CONFIG_BOOTCMD上方)

#define CONFIG_NETBOOT "tftp 0x81000000 uImage;"\
"run netargs;"\
"bootm 0x81000000"

第二處

include/env_default.h 里添加 netboot

#ifdef CONFIG_NETBOOT
"netboot=" CONFIG_NETBOOT "\0"
#endif

重新編譯uboot, 並燒寫

make com335x_nand_512_config

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

代碼里修改之后直接燒寫到nand里還是不能立刻生效。

因為uboot是先讀取nand里有沒有環境變量, 如果有的話就用nand里的 如果nand里沒有才使用默認的環境變量.所以我們在燒寫uboot的時候需要將環境變量分區一起擦掉, 這樣就可以使用我們代碼里的默認環境變量了.

首先看下板子的分區信息

U-Boot# mtdpart
device nand0 <omap2-nand.0>, # parts = 9
#: name size offset mask_flags

0: SPL 0x00020000 0x00000000 0
1: SPL.backup1 0x00020000 0x00020000 0
2: SPL.backup2 0x00020000 0x00040000 0
3: SPL.backup3 0x00020000 0x00060000 0
4: u-boot 0x001e0000 0x00080000 0
5: u-boot-env 0x00020000 0x00260000 0
6: logo 0x00300000 0x00280000 0
7: kernel 0x00500000 0x00580000 0
8: rootfs 0x1f580000 0x00a80000 0

active partition: nand0,0 - (SPL) 0x00020000 @ 0x00000000

defaults:
mtdids : nand0=omap2-nand.0
mtdparts:
   mtdparts=omap2-nand.0:
   128k(SPL),128k(SPL.backup1),128k(SPL.backup2),128k(SPL.backup3),
   1920k(u-boot),128k(u-boot-env),3m(logo),5m(kernel),-(rootfs)

然后執行如下語句:

nand erase.part u-boot
nand erase.part u-boot-env
tftp 0x81000000 u-boot.img
nand write 0x81000000 u-boot ${filesize}

重新設置ip等環境變量, 添加netargs

ip地址的配置需要根據自身的情況進行更改

U-Boot# setenv serverip 192.168.1.102
U-Boot# setenv ipaddr 192.168.1.105
U-Boot# setenv gatewayip 192.168.1.1
U-Boot# setenv netargs setenv bootargs noinitrd console=ttyO0,115200n8 lcdtype=AUO_AT070TN94 root=/dev/nfs ip=ipaddr:{serverip}:gatewayip:
{netmask}:com335x:eth0:off nfsroot=192.168.1.102:/home/eac/nfsboot

U-Boot# save
U-Boot# run netboot

問題

問題1: 為什么不用setenv netboot tftp 0x81000000 uImage; run netboot; bootm 0x81000000 這條命令而要去修改uboot代碼?

因為這條語句執行了之后效果只有 netboot=tftp 0x81000000 第一個分號之后的內容丟失了, 所以必須更該代碼

問題2: 如果不設置netargs會有什么后果? netargs各部分是什么含義?

設置netargs是為了能夠掛載nfs, 如果netboot 設置為: tftp 0x81000000 uImage; bootm 0x81000000 就會因為沒有設置根文件系統這個環境變量而出錯.

setenv netargs 'setenv bootargs noinitrd console=ttyO0,115200n8 lcdtype=AUO_AT070TN94 root=/dev/nfs ip=ipaddr:{serverip}:gatewayip:
{netmask}:com335x:eth0:off nfsroot=192.168.1.102:/home/eac/nfsboot'
 
${ipaddr} 開發板本身的地址
${serverip} tftp及nfs目錄所在系統的地址
${gatewayip} 網關
${netmask} 子網掩碼
com335x eth0:off 網卡名(這里隨意)
nfsroot=192.168.1.102:/home/eac/nfsboot nfs主機ip地址以及目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM