|
??上一節(jié)S3C2440移植uboot之支持DM9000移植uboot支持了網(wǎng)卡驅(qū)動(dòng),這節(jié)裁剪和修改uboot默認(rèn)參數(shù)
uboot的環(huán)境參數(shù)
??首先,uboot會(huì)去校驗(yàn)(CRC)存放環(huán)境變量的一段空間 ,若CRC有效則使用該空間里的環(huán)境變量,無效則用默認(rèn)的環(huán)境變量.
??而我們移植的uboot,由于一直沒有使用save,所以沒有讀不出CRC校驗(yàn),使用的默認(rèn)環(huán)境變量,如下圖所示:

修改uboot的默認(rèn)環(huán)境變量
搜索using default environment,發(fā)現(xiàn)這句話是在set_default_env()函數(shù)

?? default_environment這個(gè)變量,這是個(gè)全局字符數(shù)組,從字面上就可知道,這個(gè)是默認(rèn)環(huán)境變量數(shù)組,里面保存了各個(gè)環(huán)境值
查看 default_environment[]

??bootargs="(環(huán)境變量里最重要的一個(gè)),是傳遞給內(nèi)核的環(huán)境變量,里面會(huì)保存文件系統(tǒng)位置,控制臺(tái)console等等。
??其他宏的含義如下
"bootcmd=", 用來啟動(dòng)內(nèi)核的命令
"bootdelay=",uboot啟動(dòng)的倒計(jì)時(shí),默認(rèn)值為5S,只有設(shè)置了bootcmd,該倒計(jì)時(shí)才有用
"baudrate=",波特率,默認(rèn)為115200
"ethaddr=",網(wǎng)卡的MAC地址(也叫物理地址)
"ipaddr=",ip地址
"serverip=",使用tftp時(shí)的服務(wù)器地址
"netmask=",掩碼, 默認(rèn)值為255.255.255.0
"mtdparts=",mtd分區(qū)表
??更改smdk2440.h里面與環(huán)境相關(guān)的宏
??設(shè)置默認(rèn)環(huán)境變量宏(位于include/configs/smdk2440.h):
#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0" //bootargs
#define CONFIG_BOOTCOMMAND "nand read 0x30000000 0x60000 0x200000; bootm 0x30000000" //bootcmd
#define CONFIG_BOOTDELAY 5 //uboot 倒計(jì)時(shí)
#define CONFIG_NETMASK 255.255.255.0 //掩碼
#define CONFIG_IPADDR 192.168.2.110 //本機(jī)IP
#define CONFIG_SERVERIP 192.168.2.1 //電腦IP
#define CONFIG_ETHADDR 08:00:3c:26:0b:5b //MAC地址
??其中bootcmd是隨意寫的,因?yàn)榇藭r(shí)的內(nèi)核位置還不確定放在哪(后面配置mtdparts命令后,會(huì)在后面修改)
??由于nand中要?jiǎng)澐謆ootload空間、環(huán)境變量空間、內(nèi)核空間、系統(tǒng)空間
而uboot就有400多k,所以我們需要裁剪uboot,裁剪后再來劃分內(nèi)存分區(qū)
裁剪uboot
??進(jìn)入smdk2440.h,把不需要的功能的宏去掉,比如usb,文件系統(tǒng),rtc等
??1)去掉usb支持
/************************************************************
// * USB support (currently only works with D-cache off)
// ************************************************************/
//#define CONFIG_USB_OHCI
//#define CONFIG_USB_KEYBOARD
//#define CONFIG_USB_STORAGE
//#define CONFIG_DOS_PARTITION
??2)去掉rtc支持
/************************************************************
// * RTC
// ************************************************************/
//#define CONFIG_RTC_S3C24X0
??3)去掉BOOTP選項(xiàng)
/*
// * BOOTP options
// */
//#define CONFIG_BOOTP_BOOTFILESIZE
//#define CONFIG_BOOTP_BOOTPATH
//#define CONFIG_BOOTP_GATEWAY
//#define CONFIG_BOOTP_HOSTNAME
??4)去掉部分不需要的命令行配置
// #define CONFIG_CMD_DHCP //動(dòng)態(tài)主機(jī)配置協(xié)議命令行
// #define CONFIG_CMD_USB //USB命令行
??5)去掉文件系統(tǒng)
/*
// * File system
// */
//#define CONFIG_CMD_FAT
//#define CONFIG_CMD_EXT2
//#define CONFIG_CMD_UBI
//#define CONFIG_CMD_UBIFS
//#define CONFIG_CMD_MTDPARTS
//#define CONFIG_MTD_DEVICE
//#define CONFIG_MTD_PARTITIONS
//#define CONFIG_YAFFS2
//#define CONFIG_RBTR
解決rtc_xxx,cmd_date.c 錯(cuò)誤
??由于屏蔽的宏在其它文件也會(huì)用到,而make在之前用過,再次make只會(huì)編譯修改過的文件.
??所以輸入:
make clean
make smdk2440_config
make
??make后,打印以下錯(cuò)誤:

??上面的cmd_date.c文件以及出錯(cuò)變量rtc_xxx,從字面上來看顯然是與RTC有關(guān),我們直接屏蔽該文件
??通過Makefile,找到需要屏蔽宏CONFIG_CMD_DATE(宏定義位于include/configs/smdk2440.h):

屏蔽后,make成功,可以看到uboot只有200kb了:

設(shè)置分區(qū)
??每次啟動(dòng)內(nèi)核時(shí),都會(huì)打印以下分區(qū)信息:
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00040000 : "bootloader" //存放uboot
0x00040000-0x00060000 : "params" //存放環(huán)境變量
0x00060000-0x00260000 : "kernel" //存放內(nèi)核
0x00260000-0x10000000 : "root" //存放文件系統(tǒng)
??所以,我們新的uboot,還是照著這個(gè)來分區(qū)
??所以我們通過sava -help命令,看它位于哪個(gè)文件,找到save命令相關(guān)宏
如下圖所示:

??然后在si里搜索saveenv
??搜索如下圖所示:

??可以發(fā)現(xiàn),在env_flash.c 和env_nand.c這兩個(gè)文件都有saveenv()函數(shù).
??顯然env_flash.c的作用是,通過save命令將環(huán)境變量保存在nor flash.而env_nand.c,是將環(huán)境變量保存在nand flash里.
??接下來在common/Makefile搜索,看看這兩個(gè)文件依賴哪兩個(gè)宏
??如下圖所示:

??然后在smdk2440.h搜索這兩個(gè)宏,看看板卡默認(rèn)配置的是不是env_nand.c
??如下圖所示:

??可以看到,smdk2440.h是將環(huán)境變量保存在nor flash,由于2440在nand啟動(dòng)下是無法支持nor,所以我們需要屏蔽這三處宏,重新設(shè)置宏
設(shè)置save相關(guān)宏
??在其它板卡里搜索CONFIG_ENV_IS_IN_NAND,看看別人是怎么通過宏配置save的,然后在env_nand.c文件里搜索宏,來看宏是怎么用的
??最終宏修改為如下所示(位于include/configs/smdk2440.h):
//#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
//#define CONFIG_ENV_IS_IN_FLASH
//#define CONFIG_ENV_SIZE 0x10000
#define CONFIG_ENV_SIZE 0x20000 //環(huán)境變量空間大小
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x40000 //位于0x40000~(0X40000+0x20000)
#define CONFIG_ENV_RANGE CONFIG_ENV_SIZE //環(huán)境變量的擦除范圍,要>=SIZE
??上面的CONFIG_ENV_RANGE宏,其實(shí)不定義,內(nèi)核也會(huì)自動(dòng)定義(位于env_nand.c):

??然后重新編譯新的uboot,就可以使用save命令保存環(huán)境變量了.
??接著我們燒寫內(nèi)核:
tftp 30000000 uImage
nand erase 60000 200000
nand write 30000000 60000 200000 //保存在內(nèi)核分區(qū)里
bootm 30000000 //啟動(dòng)內(nèi)核
??從這里,看出燒個(gè)內(nèi)核還需要記錄這些分區(qū)空間地址,非常麻煩
設(shè)置mtdparts命令(在舊版uboot里,是mtd命令)
設(shè)置mtdparts命令
??其實(shí),我們可以使用mtdparts命令,通過分區(qū)名字來代替這些地址,比如以前的uboot,直接輸入:
nand erase kernel //這個(gè)kernel名字就等于: 60000 200000
nand write 30000000 kernel //這個(gè)kernel名字就等于: 60000 200000
??由于smdk2440板卡里沒有配置mtdparts命令,所以步驟如下所示:
??1)搜索mtdparts,發(fā)現(xiàn)位于common/cmd_mtdparts.c
??2) 在common/Makefile搜索,找到cmd_mtdparts.c文件依賴
CONFIG_CMD_MTDPARTS宏

??3)在其它板卡里搜索CONFIG_CMD_MTDPARTS,看看別人是怎么通過宏配置nand的,別人寫的配置如下所示:

(PS:當(dāng)執(zhí)行mtdparts default命令時(shí),uboot就會(huì)檢測(cè)是否有CONFIG_CMD_MTDPARTS宏,然后再根據(jù)上面的MTDPARTS_DEFAULT宏保存的mtd
??4)設(shè)置mtdparts相關(guān)宏
??接下來,便復(fù)制上面的宏到smdk2440.h中,改為:
/*-----------------------------------------------------------------------
* mtdparts
*/
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT "nand0=smdk2440-0"
#define MTDPARTS_DEFAULT "mtdparts=smdk2440-0:256k(u-boot)," \
"128k(params)," \
"2m(kernel)," \
"-(rootfs)"
??編譯報(bào)錯(cuò)

??提示get_mtd_device_nm未定義,但是我們?cè)贛tdcore.c中已經(jīng)定義了,所以有可能是這個(gè)Mtdcore.c沒有被編譯進(jìn)內(nèi)核。
??查看 drivers/mtd/Makefile中的定義部分,需要定義CONFIG_MTD_DEVICE 宏

??重新編譯燒寫測(cè)試
以前擦除:nand erase 60000 200000
現(xiàn)在擦除:nand erase kernel
發(fā)現(xiàn)報(bào)錯(cuò)了

??執(zhí)行 help medparts

??我們先執(zhí)行mtdparts defaults,再執(zhí)行nand erase kernel,成功了。

??接著我們把這條命令添加到代碼中去自動(dòng)執(zhí)行。
??在board_init_r()函數(shù)里的for(;;)前面添加(位于arch/arm/lib/board.c):
run_command("mtdparts default", 0); //添加此處代碼
for (;;) {
main_loop();
}
??這樣uboot每次啟動(dòng)時(shí),都會(huì)執(zhí)行一次mtdparts default命令,使它根據(jù)默認(rèn)參數(shù)來自動(dòng)分區(qū).
??mtdparts命令就此設(shè)置好了
??然后重新修改,之前設(shè)置的環(huán)境參數(shù)bootcmd(位于smdk2440.h):
??將
#define CONFIG_BOOTCOMMAND "nand read 0x30000000 0x60000 0x200000; bootm 0x30000000" //bootcmd
??改為:
#define CONFIG_BOOTCOMMAND "nand read 0x30000000 kernel; bootm 0x30000000" //bootcmd
測(cè)試mtdparts分區(qū)
??輸入mtdparts,查看默認(rèn)分區(qū)名稱:

??如上圖所示,接下來我們便可以直接使用kernel名字來擦除kernel分區(qū),并燒寫內(nèi)核了
??步驟如下:
tftp 30000000 uImage
nand erase.part kernel //等于nand erase 200000 60000
nand write 30000000 kernel //從sdram拷貝到nand
??下一節(jié)S3C2440移植uboot之支持燒寫yaffs映像及制作補(bǔ)丁我們將移植uboot支持yaffs文件系統(tǒng)。
有任何問題,均可通過公告中的二維碼聯(lián)系我
|