u-boot移植第二弹——移植2012.10u-boot到RealARM210 cortex-A8开发板
本次移植的目的:
?????? 1.u-boot能夠跑起來
2.能夠進入控制臺打印出如下信息
??????
?????? 本次移植是基于官方的u-boot版本是u-boot-2012.10,溫馨提示,如果是新手可以完全按照這個步驟走就行。好,下面開始。
?????? 第一步,修改u-boot-2012.10根目錄下的boards.cfg文件,用gedit打開該文件,使用搜索功能,搜索文件smdkc100定位到這里,然后另起一行,拷貝smdkc100這行,復制到下面一行中,然后把smdkc100修改為real210,如下圖所示:
第二步,建立real210文件夾
進入到目錄/board/samsung/把smdkc100文件夾里所有的文件拷貝到當前目錄下的real210文件夾,如下圖所示:
第三步,建立real210.h文件
進入/include/configs,把smdkc100.h拷貝到real210.h中,具體的拷貝方式,大家自行選擇,只要完整正確拷貝即可。
第四步,修改根目錄下Makefile
打開Makefile文件,找到CROSS_COMPILE ?=這個位置,修改為:
CROSS_COMPILE ?=arm-linux-
注意,上面的這個修改需要你的系統已做好了arm-liunx-gcc編譯器的安裝以及環境變量的設置,如果沒有需要加入編譯器的路徑,如/usr/local/arm/arm-2009q3/bin/arm-linux-。
?
第五步,修改board/samsung/smdkv210/lowlevel_init.S
由于我們在BL1已經做了串口和內存的初始化,所以在u-boot中就不需要進行初始化了,這里需要把u-boot中這部分代碼給屏蔽掉。
注釋掉lowlevel_init.S文件中第42行到第85行。
?
第六步,修改start.S
在BL1階段只做了u-boot.bin的拷貝,并沒有清除BSS,所以需要在start.S文件中增加該代碼。
reset: clear_bss://BSS清除,由用戶添加ldr r0, =__bss_startldr r1, =__bss_end__mov r2, #0x0 clbss_l:str r2, [r0],#4cmp r0, r1bne clbss_l//BSS清除,由用戶添加bl save_boot_params/** set the cpu to SVC32 mode*/mrs r0, cpsrbic r0, r0, #0x1forr r0, r0, #0xd3msr cpsr,r0/** Setup vector:* (OMAP4 spl TEXT_BASE is not 32 byte aligned.* Continue to use ROM code vector only in OMAP4 spl)*/ #if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))/* Set V=0 in CP15 SCTRL register - for VBAR to point to vector */mrc p15, 0, r0, c1, c0, 0 @ Read CP15 SCTRL Registerbic r0, #CR_V @ V = 0mcr p15, 0, r0, c1, c0, 0 @ Write CP15 SCTRL Register/* Set vector address in CP15 VBAR register */ldr r0, =_startmcr p15, 0, r0, c12, c0, 0 @Set VBAR #endif/* the mask ROM code should have PLL and others stable */ #ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_ini _cp15bl cpu_init_crit #endif在該文件中還要對 ENTRY(relocate_code) 進行修改,這部分是 u-boot 的搬運操作,由于我們已經拷貝到制定的內存,我們不在需要搬移了,所以這里做如下修改:整個函數代碼如下:
ENTRY(relocate_code)mov r4, r0 /* save addr_sp */mov r5, r1 /* save addr of gd */mov r6, r2 /* save addr of destination *///用戶添加,跳轉到board_init_r函數執行mov sp, r4 mov r0, r5 mov r1, r6 bl board_init_r//用戶添加,跳轉到board_init_r函數執行 #if 0/* Set up the stack */ stack_setup:mov sp, r4adr r0, _startcmp r0, r6moveq r9, #0 /* no relocation. relocation offset(r9) = 0 */beq clear_bss /* skip relocation */mov r1, r6 /* r1 <- scratch for copy_loop */ldr r3, _image_copy_end_ofsadd r2, r0, r3 /* r2 <- source end address */copy_loop:ldmia r0!, {r9-r10} /* copy from source address [r0] */stmia r1!, {r9-r10} /* copy to target address [r1] */cmp r0, r2 /* until source end address [r2] */blo copy_loop/** fix .rel.dyn relocations*/ldr r0, _TEXT_BASE /* r0 <- Text base */sub r9, r6, r0 /* r9 <- relocation offset */ldr r10, _dynsym_start_ofs /* r10 <- sym table ofs */add r10, r10, r0 /* r10 <- sym table in FLASH */ldr r2, _rel_dyn_start_ofs /* r2 <- rel dyn start ofs */add r2, r2, r0 /* r2 <- rel dyn start in FLASH */ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */add r3, r3, r0 /* r3 <- rel dyn end in FLASH */ fixloop:ldr r0, [r2] /* r0 <- location to fix up, IN FLASH! */add r0, r0, r9 /* r0 <- location to fix up in RAM */ldr r1, [r2, #4]and r7, r1, #0xffcmp r7, #23 /* relative fixup? */beq fixrelcmp r7, #2 /* absolute fixup? */beq fixabs/* ignore unknown type of fixup */b fixnext fixabs:/* absolute fix: set location to (offset) symbol value */mov r1, r1, LSR #4 /* r1 <- symbol index in .dynsym */add r1, r10, r1 /* r1 <- address of symbol in table */ldr r1, [r1, #4] /* r1 <- symbol value */add r1, r1, r9 /* r1 <- relocated sym addr */b fixnext fixrel:/* relative fix: increase location by offset */ldr r1, [r0]add r1, r1, r9 fixnext:str r1, [r0]add r2, r2, #8 /* each rel.dyn entry is 8 bytes */cmp r2, r3blo fixloopb clear_bss _rel_dyn_start_ofs:.word __rel_dyn_start - _start _rel_dyn_end_ofs:.word __rel_dyn_end - _start _dynsym_start_ofs:.word __dynsym_start - _startclear_bss:ldr r0, _bss_start_ofsldr r1, _bss_end_ofsmov r4, r6 /* reloc addr */add r0, r0, r4add r1, r1, r4mov r2, #0x00000000 /* clear */clbss_l:cmp r0, r1 /* clear loop... */bhs clbss_e /* if reached end of bss, exit */str r2, [r0]add r0, r0, #4b clbss_l clbss_e:/** We are done. Do not return, instead branch to second part of board* initialization, now running from RAM.*/ jump_2_ram: /** If I-cache is enabled invalidate it*/ #ifndef CONFIG_SYS_ICACHE_OFFmcr p15, 0, r0, c7, c5, 0 @ invalidate icachemcr p15, 0, r0, c7, c10, 4 @ DSBmcr p15, 0, r0, c7, c5, 4 @ ISB #endif /** Move vector table*/ #if !defined(CONFIG_TEGRA20)/* Set vector address in CP15 VBAR register */ldr r0, =_startadd r0, r0, r9mcr p15, 0, r0, c12, c0, 0 @Set VBAR #endif /* !Tegra20 */ldr r0, _board_init_r_ofsadr r1, _startadd lr, r0, r1add lr, lr, r9/* setup parameters for board_init_r */mov r0, r5 /* gd_t */mov r1, r6 /* dest_addr *//* jump to it ... */mov pc, lr_board_init_r_ofs:.word board_init_r - _start #endif ENDPROC(relocate_code) #endif
第七步,修改SDRAM基地址include/configs/smdkv210.h +51,修改如下:
#defineCONFIG_SYS_SDRAM_BASE????????? 0x30000000
由于我要使用的地址就是0x30000000所以我不必修改,如果你的板子基地址不是,請修改之。
第八步,修改內存的Banks設置,include/configs/smdkv210.h+186
修改為如下所示:
/* SMDKC100 has 1 banks of DRAM, we use only one in U-Boot */ //#define CONFIG_NR_DRAM_BANKS 1 //#define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */ //#define PHYS_SDRAM_1_SIZE (128 << 20) /* 0x8000000, 128 MB Bank #1 */ /* SMDKC100 has 2 banks of DRAM */ #define CONFIG_NR_DRAM_BANKS 2 /* we have 1 bank of DRAM */ #define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */ #define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */ #define PHYS_SDRAM_1_SIZE SDRAM_BANK_SIZE #define PHYS_SDRAM_2 (CONFIG_SYS_SDRAM_BASE + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */ #define PHYS_SDRAM_2_SIZE SDRAM_BANK_SIZE第九步,修改board/samsung/real210/smdkc100.c 中void dram_init_banksize(void)函數,修改成所示:
void dram_init_banksize(void) {/*gd->bd->bi_dram[0].start = PHYS_SDRAM_1;gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;*/gd->bd->bi_dram[0].start = PHYS_SDRAM_1;gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;gd->bd->bi_dram[1].start = PHYS_SDRAM_2;gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE; }該函數是用于計算內存的總量。
第十步,修改board/samsung/real210/smdkc100.c中int dram_init(void)函數成如下所示:
int dram_init(void) {//gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE);gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) + get_ram_size((long *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE;return 0; }第十一步,還是修改board/samsung/real210/smdkc100.c該文件,函數是下面兩個,修改成下面所示的即可:
int board_init(void) {//smc9115_pre_init();gd->bd->bi_arch_number = MACH_TYPE_SMDKC100;gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;return 0; }int board_eth_init(bd_t *bis) {int rc = 0; #ifdef CONFIG_SMC911X//rc = smc911x_initialize(0, CONFIG_SMC911X_BASE); #endifreturn rc; }
上面主要是注釋掉smc9115_pre_init();?和smc911x_initialize(0,?CONFIG_SMC911X_BASE);因為我們沒有smc911網絡,所以不需要。
int checkboard(void) {printf("Board:\treal210\n");return 0; }smdkc100.c這個文件已經修改完成,后面不再修改。
第十二步,修改sp指針,在include/configs/smdkv210.h修改,搜索CONFIG_SYS_INIT_SP_ADDR文字,修改成如下所示:
//#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR - 0x1000000) #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR + 0x10000000)第十三步,在include/configs/smdkv210.h修改,搜索CONFIG_SYS_PROMPT文字,修改成如下:
//#define CONFIG_SYS_PROMPT "SMDKC100 # " #define CONFIG_SYS_PROMPT "REAL210 # "第十四步,在include/configs/smdkv210.h修改,搜索CONFIG_SERIAL文字,修改成如下:
//#define CONFIG_SERIAL0 1 /* use SERIAL 0 on SMDKC100 */ #define CONFIG_SERIAL2 1 /* use SERIAL 2 on REAL210 */第十五步,在include/configs/smdkv210.h修改,搜索CONFIG_IDENT_STRING文字,修改成如下:
//#define CONFIG_IDENT_STRING " for SMDKC100" #define CONFIG_IDENT_STRING " for REAL210"第十六步,在include/configs/smdkv210.h修改,搜索CONFIG_ENV_IS_IN_ONENAND文字,修改成如下:
//#define CONFIG_ENV_IS_IN_ONENAND 1 #define CONFIG_ENV_IS_NOWHERE 1第十七步,在include/configs/smdkv210.h修改,搜索CONFIG_CMD_ONENAND文字,修改成如下:
//#define CONFIG_CMD_ONENAND #undef CONFIG_CMD_ONENAND因為開發板上無onenand,所以不進行定義。
第十八步,修改board/samsung/smdkv210/config.mk,修改為:
1. CONFIG_SYS_TEXT_BASE = 0x33e00000第十九步,修改?arch/arm/config.mk+88,注釋掉該行(網上解釋的原因是:原來的代碼在鏈接時加了"-pie"選項,?使得u-boot.bin里多了"*(.rel*)","*(.dynsym)",使得程序非常大,不利于從NAND啟動(重定位之前的啟動代碼應該少于4K),目前不太明白,有待研究。),修改后如下:
1. #LDFLAGS_u-boot += -pie好,到這里我們可以進行試著編譯了,看看是否能夠正常編譯通過。
第二十步,編譯測試
打開終端進入到u-boot-2012.10的根目錄下,輸入makereal210_config命令進行先配置。如下圖所示:
配置成功,注意這里只在官方源碼中修改了上面步驟,其他地方沒有任何更改,輸入make指令進行編譯。完成后會在根目錄下得到u-boot.bin文件。當然這時的u-boot僅僅實現了能夠跑起來的功能。
下載到SD卡的測試命令為:
?
dd iflag=dsyncoflag=dsync if=u-boot.binof=/dev/sdb seek=49
放到SD卡看看是不是有下面的效果呢。
如果上述成功完成,那么下面可以再做一個小小的修改。
把board/samsung/real210/目錄下的smdkc100.c文件名修改成real210.c
打開board/samsung/ real210/目錄下的Makefile文件,把所有的smdkc100修改成real210。
?
OK,第二彈完成。
總結
以上是生活随笔為你收集整理的u-boot移植第二弹——移植2012.10u-boot到RealARM210 cortex-A8开发板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM汇编伪指令 .word
- 下一篇: u-boot移植第三弹——移植2013.