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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章我們已經修改了uboot源碼使其能夠正常打印輸出了,但是輸出停到了nand啟動那里,所以這篇文章就來記錄如何修改源碼使uboot支持NAND啟動。

原來的代碼在鏈接時加了”-pie”選項, 使得u-boot.bin里多了”(.rel)”, “*(.dynsym)”使得程序非常大,不利于從NAND啟動(重定位之前的啟動代碼應該少于4K)。

1.去掉 “-pie”選項
在文件:arch/arm/config.mk的第75行,去掉:LDFLAGS_u-boot += -pie

2.在這之前會編寫好一個init.c程序,拿到這里來用,init.c程序的編寫會放到另一篇博客中,這里直接提供代碼,代碼鏈接為:init.c程序
將之前寫好的文件init.c放到board/samsung/smdk2440目錄, 并且修改Makefile,將init.c編譯進去如下圖:

3.修改start.S文件
start.S中有代碼:

/* Set stackpointer in internal RAM to call board_init_f */ call_board_init_f:ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ldr r0,=0x00000000bl board_init_f

將這一部分代碼改為:

ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8-byte alignment for ABI compliance *//* lyy */bl nand_init_llmov r0, #0ldr r1, _TEXT_BASEldr r2, _bss_end_ofsbl copy_code_to_sdrambl clear_bssldr pc,=call_board_init_f/* Set stackpointer in internal RAM to call board_init_f */ call_board_init_f:ldr r0,=0x00000000bl board_init_f/* unsigned int的值存在r0里,正好給board_init_r */ldr r1, _TEXT_BASE/* 調用第二階段的代碼*/bl board_init_r

4.刪除重定位代碼:
這下面的一大段代碼是重定位代碼,我們在這里不需要它,需要將其全部刪除

/*------------------------------------------------------------------------------*//** void relocate_code (addr_sp, gd, addr_moni)** This "function" does not return, instead it continues in RAM* after relocating the monitor code.**/.globl relocate_code relocate_code:mov r4, r0 /* save addr_sp */mov r5, r1 /* save addr of gd */mov r6, r2 /* save addr of destination *//* Set up the stack */ stack_setup:mov sp, r4adr r0, _startcmp r0, r6beq clear_bss /* skip relocation */mov r1, r6 /* r1 <- scratch for copy_loop */ldr r3, _bss_start_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#ifndef CONFIG_SPL_BUILD/** 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 fixloop #endifclear_bss: #ifndef CONFIG_SPL_BUILDldr r0, _bss_start_ofsldr r1, _bss_end_ofsmov r4, r6 /* reloc addr */add r0, r0, r4add r1, r1, r4mov r2, #0x00000000 /* clear */clbss_l:str r2, [r0] /* clear loop... */add r0, r0, #4cmp r0, r1bne clbss_lbl coloured_LED_initbl red_led_on #endif

4.修改CONFIG_SYS_TEXT_BASE為0x33f00000
在代碼中跳轉到 :_TEXT_BASE

/* lyy */bl nand_init_llmov r0, #0ldr r1, _TEXT_BASE

跳轉到lowlevel_init.S中的這里:

_TEXT_BASE:.word CONFIG_SYS_TEXT_BASE

然后點擊:CONFIG_SYS_TEXT_BASE
跳轉到smdk2440.h中的這里:

#define CONFIG_SYS_TEXT_BASE 0x0

將CONFIG_SYS_TEXT_BASE的值改為:0x33f00000
5.修改board_init_f(arch/arm/lib/board.c中), 把relocate_code去掉

//relocate_code(addr_sp, id, addr);

同時去掉下面兩句代碼:

/** reserve memory for U-Boot code, data & bss* round down to next 4 kB limit*///addr -= gd->mon_len;//addr &= ~(4096 - 1);

然后在這個函數的最后面加上:

return (unsigned int)id;

函數添加了int類型返回值,那么函數定義時的類型就得設置一下如下:

void board_init_f(ulong bootflag)
改為:

unsigned int board_init_f(ulong bootflag)

同時頭文件中也需要定義類型:
在/include/common.h中275行有如下聲明:

/* arch/$(ARCH)/lib/board.c */ void board_init_f (ulong) __attribute__ ((noreturn)); void board_init_r (gd_t *, ulong) __attribute__ ((noreturn));

將其改為:

/* arch/$(ARCH)/lib/board.c */ unsigned int board_init_f (ulong); void board_init_r (gd_t *, ulong);

__attribute__ ((noreturn));這句代碼是指定沒有返回值,所以需要去掉。

6.修改鏈接腳本: 把start.S, init.c, lowlevel.S等文件放在最前面
鏈接腳本為:/arch/arm/cpu/u-boot.lds
打開前面有一段:

.text :{__image_copy_start = .;CPUDIR/start.o (.text)*(.text)}

將其改為:

.text :{__image_copy_start = .;CPUDIR/start.o (.text)board/samsung/smdk2440/libsmdk2440.o (.text)*(.text)}

libsmdk2440.o包含了start.S, init.c, lowlevel.S,所以只需要把它放前面就行。

這些修改完之后,編譯,燒寫,看看效果:

這是我們將開關設置為NAND啟動后的效果,至少現在已經支持了NAND啟動。目前兩種啟動都可以了,接下來就是支持nand flash 和nor flash了,這樣就可以通過NAND啟動和NOR啟動完全啟動uboot了,我將放到另外兩篇文章中講,因為移植過程較為復雜,最后我會給出相關的移植順序以及閱讀文章的順序,以及制作整個補丁,大家只需要打補丁,就可以一次性移植好這個uboot。

喜歡我的可以加加關注,同時也可以加我qq和微信一起學習交流
qq:1126137994
微信:liu1126137994
更多資源分享,共同進步!

總結

以上是生活随笔為你收集整理的移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。