小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

S3C2440移植uboot之裁剪和修改默認(rèn)參數(shù)

 小仙女本仙人 2022-05-17 發(fā)布于北京

??上一節(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)系我

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多