日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UBOOT手动设置环境变量

發(fā)布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UBOOT手动设置环境变量 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Arm板系統(tǒng)文件一般有三個——bootloader(uboot)、kernel(uImage)及根文件系統(tǒng)(rootfs)。

在arm板上電后,按uboot->kernel->rootfs的順序依次啟動。由于開發(fā)板上有多種存儲介質(zhì),三個文件可以放在任何可以存儲的介質(zhì)上,因此也就導(dǎo)致文件的多種啟動方式。本文就來討論,以上三個文件對應(yīng)不通存放位置的不同啟動配置。

?



一般開發(fā)板上會有flash(Nor or NAND),mmc,emmc,sd卡等。系統(tǒng)文件可以燒寫在其中的任意一種上,因此也就對應(yīng)不通的啟動。在開發(fā)過程中,有時經(jīng)常需要改動內(nèi)核,或者修改應(yīng)用程序,如果每次都修改后都重新燒寫到板上的存儲介質(zhì),會比較麻煩。因此,為方便調(diào)試,uImage和rootfs還可以從網(wǎng)絡(luò)啟動,即nfs啟動。但uboot只能從板上介質(zhì)啟動。
啟動過程其實(shí)是先將要啟動的文件從存儲位置拷貝到內(nèi)存空間,再在內(nèi)存中運(yùn)行。因此所謂不同位置啟動,也就是從不同位置拷貝而已。
下面我們以開發(fā)板啟動為例,分別介紹三個文件從不同位置啟動的過程方法。我使用的開發(fā)板上有emmc和兩個sd卡。我們按照啟動順序,依次介紹。
首先是uboot啟動。Uboot是三個系統(tǒng)文件中第一個啟動的,對它的拷貝工作由cpu中的固件決定。固件中支持從幾個位置拷貝uboot,它就能存放在幾個位置上。至于每次啟動具體從其中的哪里開始,硬件撥碼開關(guān)決定,對應(yīng)撥碼在開發(fā)板手冊上能查到。啟動之前,先將uboot的二進(jìn)制文件拷貝到對應(yīng)介質(zhì)。有兩種不同方法燒寫,如下:
1. uboot二進(jìn)制文件拷貝到emmc,是通過芯片供應(yīng)商的下載工具軟件燒寫完成;
2. 拷貝到sd卡是在linux下,通過dd命令完成的。
燒寫完成后,將啟動撥碼撥到對應(yīng)位置即可啟動uboot。
然后介紹kernel文件(uImange)和rootfs的啟動。如上所述,uImage和rootfs可以從emmc、sd卡或nfs拷貝到內(nèi)核啟動。具體的啟動位置由uboot中的參數(shù)傳遞的內(nèi)容決定。這些參數(shù)的內(nèi)容在uboot中有寫死的值,也可以在uboot啟動階段進(jìn)入到命令輸入界面,修改這些參數(shù)的值,來改變啟動位置。(作者:圍補(bǔ))
進(jìn)入uboot命令界面后,輸入如下一段命令,修改啟動參數(shù),并重啟。
setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd
命令輸入完后,重啟開發(fā)板,即可按照上述命令中設(shè)置的參數(shù)來啟動系統(tǒng)。
下面我們來分析一下uboot階段輸入的啟動參數(shù)的意義,以便讀者自己修改相關(guān)內(nèi)容,讓板子從自己需要的位置啟動。
首先介紹幾個命令。是在上面看到最多的setenv命令,該命令使用來設(shè)置或刪除某個環(huán)境變量的。當(dāng)setenv后面只帶一個參數(shù),該參數(shù)必須為已有的變量名,輸入命令回車后該變量即被刪除;當(dāng)setenv后面有多個參數(shù),將把其后第一個參數(shù)作為環(huán)境變量,后面其他參數(shù)作為該變量的值或內(nèi)容。



第二個要解釋的命令mmc。在uboot命令界面中敲入mmc,回車,能夠看到其多個用法:
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on currentmmc device
mmc dev [dev] [part] - show or set current mmcdevice [partition]
mmc bootpart [dev] [part] - show or set bootpartition
mmc list - lists available devices
解釋一下其中幾個用法:
mmc read addr blk# cnt 用來將硬盤(emmc/sd)中的內(nèi)容讀取到內(nèi)存中。其中addr指內(nèi)存中的目標(biāo)位置起始地址,blk#指被拷貝內(nèi)容起始存儲塊的塊號,cnt指要被拷貝的塊數(shù)。一般每個塊的大小為512byte。
mmc dev [dev] [part] - show or set current mmc device [partition] 顯示或設(shè)置當(dāng)前設(shè)備。命令mmc dev即為顯示當(dāng)前是哪個device;mmc dev #意為設(shè)置“#”為當(dāng)前設(shè)備。



第三個命令saveenv是保存環(huán)境變量的意思。環(huán)境變量設(shè)置后,使用該指令保存,下次重啟時會按照上次保存的設(shè)置啟動,就不用再次設(shè)置了。
最后,run命令比較明顯,“運(yùn)行”的意思。一般加在某內(nèi)容為可執(zhí)行命令的變量前。
再來說明一下變量。在上述參數(shù)設(shè)置命令中,參數(shù)bootargs和bootcmd是uboot的參數(shù),其功能和名稱不能被改變,其他都是用戶自定義的變量,可以改變其名稱。其中bootargs代表由uboot傳給內(nèi)核的參數(shù);bootcmd是uboot啟動時,系統(tǒng)自動加載的命令序列。如果設(shè)置了啟動參數(shù)后,想讓系統(tǒng)下次自動按照本次設(shè)置的方式啟動,則一定要把拷貝和啟動內(nèi)核的語句設(shè)置為bootcmd的值,否則下次啟動無法自動加載并啟動內(nèi)核。(作者圍補(bǔ))
介紹完重要的命令及uboot環(huán)境變量后,我們再來看上面的啟動參數(shù)設(shè)置命令行:
setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rwvideo=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd
按照上面對命令和參數(shù)的講解,做一些變量的替換之后,可以看到,此處只做了兩件事,一是設(shè)置環(huán)境變量bootargs的值,二是設(shè)置bootcmd的值,并保存。其中bootargs的值傳遞給內(nèi)核,用來初始化一些設(shè)備和啟動rootfs;bootcmd的值用來啟動內(nèi)核,即自動加載的命令序列。(最后一句run bootcmd是啟動,不再是設(shè)置命令了。)
對上述命令中,采用如此多自定義變量的原因是,有些調(diào)試工具命令行輸入不能過長,因此用中間自定義變量縮短一次性輸入的命令行長度。我們將不必要的自定義變量做替換掉,然后來分析其內(nèi)容。
setenv bootargs console=ttymxc0,115200root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24ip=dhcp

setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'

saveenv

run bootcmd
將自定義變量替代掉后,能看到,參數(shù)設(shè)置其實(shí)就是做了對兩個系統(tǒng)環(huán)境變量賦值的工作。下面具體分析各變量值得內(nèi)容。
對bootargs的賦值,對要是跟rootfs啟動相關(guān)。內(nèi)容是一個很大的字符串,不同項之間由空格隔開,也可以把由空格隔開的多項看做是多個參數(shù)。
第一項是console=ttymxc0,115200是選擇操作臺,并設(shè)置波特率。
中間幾項root=/dev/mmcblk0p1 rootwait rw,是對rootfs啟動位置設(shè)置root=/dev/mmcblk0p1是指從設(shè)備mmcblk0的p1分區(qū)掛載rootfs。那么mmcblk0到底是哪個設(shè)備呢?由于文件系統(tǒng)的掛載是在kernel啟動后進(jìn)行的,而內(nèi)核啟動后會安裝linux的分配方式給現(xiàn)有設(shè)備分配名稱,因此可對應(yīng)區(qū)分設(shè)備。我使用的開發(fā)板上,emmc即為mmcblk0設(shè)備,sd安裝掛載順序依次后排。如果多個卡槽在系統(tǒng)啟動前都插上了sd卡,系統(tǒng)會安裝sd卡槽所在接口號依次分配設(shè)備名稱號。比如,兩個sd卡槽,slot2和slot3(對應(yīng)總線號),只插一個sd開始,無論在哪個槽都是mmcblk1;但兩個都插上sd時,在slot2中的是mmcblk1,slot3中的則是mmcblk2。Ok,至此,從哪個設(shè)備掛載rootfs已經(jīng)很清楚了。后面兩個參數(shù),rw是聲明啟動權(quán)限,即以讀寫方式啟動;rootwait是指等待設(shè)備/dev/mmcblk0p1設(shè)備就緒后才嘗試掛載rootfs。如果沒有此參數(shù),linux內(nèi)核啟動時可能會在存儲設(shè)備尚未就緒是就嘗試掛載rootfs,此時肯定掛載失敗,那么啟動也就失敗了。
最后的幾個參數(shù),video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp,是做一些設(shè)備初始化的,主要是對視頻設(shè)備和網(wǎng)絡(luò),對不需要視頻設(shè)備的嵌入式系統(tǒng)可以不設(shè)置此項,ip也可以單獨(dú)設(shè)置。
然后是第二個環(huán)境變量bootcmd的設(shè)置,主要跟kernel啟動相關(guān)。
setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'
設(shè)置bootcmd內(nèi)容為命令序列,用用單引號包圍,命令間由分號分隔。
按照上面對mmc命令的講解,第一個命令mmc dev 1,意思是將dev 1設(shè)置為當(dāng)前設(shè)備。這里就是uImage啟動(拷貝)的位置。在我使用的開發(fā)板上,dev 1指放在卡槽slot2中的sd卡。此處由于linux內(nèi)核沒有啟動,設(shè)備名稱不能按照linux分配方式確定。在我使用的開發(fā)板上,dev 2是放在卡槽slot3中的sd卡,dev3是emmc。對此句做相應(yīng)修改,即可更改內(nèi)核啟動位置。
mmc read 0x10800000 0x800 0x2000這句大家也應(yīng)該可以明白意思了,即將存儲設(shè)備上從塊號0x800開始的0x2000個存儲塊的東西拷貝到內(nèi)存0x10800000開始的空間內(nèi)。
bootm也是uboot命令,用于加載uboot能辨認(rèn)的操作系統(tǒng)映像。

總結(jié)

以上是生活随笔為你收集整理的UBOOT手动设置环境变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。