移植U-BOOT之裁剪和修改默认参数(易用性)启动内核,以及对uboot进行分区
今天我們來裁剪U-BOOT,使其更加易用,修改默認參數,以及制作最終修改好得補丁文件方便以后的快速移植。
那么如果想看之前的關于網卡以及flash等的移植,請點擊鏈接查看:點擊鏈接查看
在裁剪修改之前呢,我們先來了解一下U-BOOT的環境參數(環境變量):
uboot在啟動的時候首先會讀取環境參數,然后判斷環境參數是否有效,如果設置的環境參數是無效的,那么就使用默認的參數。
我們還要知道整個Linux系統在硬盤中(FLASH)中是如何分區的:
我們可以看到,uboot放到第一個分區,環境參數放到第二個分區,內核放到第三個分區,文件系統放到第四個分區。
之前我們修改的U-BOOT啟動后,一直有一個警告:
顯示說CRC的參數錯誤,使用默認的環境變量。那么我們就從這個問題引入吧。在uboot中搜索字符串:using default environment
從而找到了:
Env_common.c(common目錄下)
bootargs是傳給內核的啟動參數,可以設置文件系統的相關分區等。我們在配置文件smdk2440.h中159行的地方定義一下:
#define CONFIG_BOOTARGS "console=ttySAC0 root=dev/mtdblock3" //代表內核從串口0啟動,文件系統放到第3個分區bootcmd是uboot用來啟動內核的參數,我們也在配置文件中定義(bootargs定義的下面)定義一下(先隨便定義一個值):
#define CONFIG_BOOTCOMMAND "nand read 30000000 0xbac 0x200000;bootm 30000000" //因為現在還無得知內核的分區的具體地址,先隨便設置一個值,用于演示,等我們把整個FLASH分區規劃好了之后,再來設置bootdelay是uboot啟動后的那個倒數計時的參數,當uboot啟動后,進入倒計時啟動,我們按下任意鍵,進入uboot交互界面開始進行一些設置等操作。這里我們就去默認值。
ipaddr我們已經很熟悉了,是uboot單板的ip地址,這個我們可以修改一下看看,這個在配置文件smdk2440.h中已經由定義,我們找到將其修改為:
#define CONFIG_IPADDR 192.168.1.103ethaddr表示網卡的MAC地址,再定義一下MAC地址:
#define CONFIG_ETHADDR 00:0c:29:4d:e4:f4 //lyy好了,設置好我們常用的參數后,我們先來裁剪一下uboot,因為這個uboot實在是太大了。
我們在uboot命令行輸入help,發現有各種命令,有些命令根本不需要,那么我們就需要把相關的宏定義給去掉。
這里我就不記錄了,去掉的地方太分散了,大概是去掉了usb,文件系統的支持等。
然后重新編譯uboot,發現有一些錯誤,說我的有一些定義沒定義,但是,我已經把相關定義去掉了。重新:make distclean,然后make smdk2440_config,再make。沒有錯誤了(至于為什么,我也不清楚,沒必要細究。)。
然后我們現在來分區:
首先看一下之前是怎么分區的,啟動內核看一下之前是怎么分區的:
0x00000000-0x00040000 : “bootloader” (0~256k)
0x00040000-0x00060000 : “params”
0x00060000-0x00260000 : “kernel”
0x00260000-0x10000000 : “root”
我們先來設置一下我們的參數的存放地址吧,因為之前我們設置好參數之后,每次都不敢save,就是怕破壞FLASH。
在配置文件中,找到如下環境變量的相關定義:
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000) #define CONFIG_ENV_IS_IN_FLASH #define CONFIG_ENV_SIZE 0x10000 /* allow to overwrite serial and ethaddr */ #define CONFIG_ENV_OVERWRITE那么我們重新定義這些宏,該怎么定義呢?
在uboot命令行使用help命令查看save相關的信息:
然后我們在uboot源碼中搜索字符串:saveenv
找到了類似這樣的語句:
搜索信息:Env_flash.c (common):int saveenv(void)
我們去common目錄下看看Makefile,看看Env_flash.c的編譯依賴哪個宏?找到了下面這句:
COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o
說明編譯Env_flash.c依賴的是CONFIG_ENV_IS_IN_NAND這個宏的定義。那么我們就定義這個宏CONFIG_ENV_IS_IN_NAND:
所以我們將上面環境變量的宏重新定義如下:
然后重新編譯,沒有錯誤。
用tftp下載,先設置好ip等(參考上一篇文章):
tftp 30000000 u-boot.bin
protect off all
erase 0 3ffff (因為uboot經過裁剪后,大小變了,所以擦除和拷貝的地址會發生變化)
cp.b 30000000 0 40000
然后重啟:
由啟動知,已經有了倒數的命令,以及我們設置的ip等,都直接就存在了。
但是還是有呢個關于CRC的警告信息,那是因為,那個CRC的變量沒有寫到FLSAH中,我們執行save命令,再重啟:
此時,就沒有那個警告信息了,說明參數已經成功被寫進flash,說明上面修改的的參數保存的地址的區域,也設置成功了。
然后我們燒寫內核:
tftp 30000000 uImage_4.3
nand erase 60000 200000
nand write 30000000 60000 200000
從這里,就可以感覺到,燒寫個程序要這么麻煩。下面我們就來修改代碼,讓燒寫程序變得簡單:
在配置文件中定義宏:CONFIG_CMD_MTDPARTS(尋找方法類似于上面的找Makefile的方法)
在board.c中657行添加:
run_command("mtdparts default",0);重新編譯,出現錯誤:
common/libcommon.o: In function get_mtd_info':
/work/system/u-boot-2012.04.01/common/cmd_mtdparts.c:306: undefined reference toget_mtd_device_nm’
make: * [u-boot] Error 1
通過查找,發現Mtdcore.c函數(在drivers/mtd目錄下)定義了get_mtd_device_nm這個函數,應該是沒有被編譯進內核,所以才顯示錯誤,去Makefile中查看,發現,還需要定義這個宏:CONFIG_MTD_DEVICE,那么我們在配置文件中再定義這個宏:
再重新編譯,沒有錯誤。燒寫uboot,重啟,在uboot命令行輸入:mtdparts,顯示如下:
再來燒寫內核時,就可以這樣燒寫內核了:
tftp 30000000 uImage_4.3
nand erase.part kernel
nand write 30000000 kernel
然后我們再回過頭把配置文件中的這句話:
修改為:
#define CONFIG_BOOTCOMMAND "nand read 30000000 kernel 0x200000;bootm 30000000"重新編譯,燒寫uboot,燒寫內核。重啟,發現可以直接啟動內核了,因為我們已經把讀內核的地址修改好了。
總結
以上是生活随笔為你收集整理的移植U-BOOT之裁剪和修改默认参数(易用性)启动内核,以及对uboot进行分区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++允许重载的运算符和不允许重载的运算
- 下一篇: KNX转485模块专用配置软件使用说明书