u-boot移植重要问题说明
u-boot移植重要問題說明
一、從SD卡拷貝BL2到內存的函數
???????? 函數名字叫copy_uboot_to_ram,位置在board/samsung/real210/mmc_boot.c
???????? 其中有這個一部分
ch = *(volatileu32 *)(0xD0037488);
???????? copy_sd_mmc_to_memcopy_bl2 =
???????? ??? (copy_sd_mmc_to_mem) (*(u32 *)(0xD0037F98));
???????? 可能看著比較費解,其實這個拷貝函數是固化在irom里面的,是無法修改的,不過是可以直接使用的,它的地址就是在0xD0037F98,只要使用下面的定義然后再把0xD0037F98地址傳遞給copy_bl2就可以了。
typedef u32(*copy_sd_mmc_to_mem)
(u32 channel, u32 start_block, u16 block_size, u32 *trg, u32 init);
參考博客http://blog.csdn.net/shangguobuliuhen/article/details/9844371
二、從nand啟動 8位ECC校驗以及u-boot前8K校驗和校驗問題
???????? 在從nand啟動時,s5pv210會對讀取的代碼進行ECC和校驗和校驗,所以在往nand寫入u-boot時也要正確的做好8位ECC和校驗和計算之后再寫入。校驗和是在nand_write函數中進行的,所在的文件位置是drivers/mtd/nand/nand_base.c。進行校驗和計算的代碼是:
#if defined(CONFIG_BL1_CHECKSUM)
???????? inti;
???????? ulongchecksum;
???????? uint8_t*ptr;
#endif
#if defined(CONFIG_BL1_CHECKSUM)
???????? if(to == 0) {
?????????????????? ptr= buf + 16;?
?????????????????? for(i= 16, checksum = 0; i < 8192; i++) {
??????????????????????????? checksu+= *ptr;
??????????????????????????? ptr++;
?????????????????? }
?????????????????? *((volatileu32 *)(buf + 0x8)) = checksum;
???????? }
#endif
???????? 由宏CONFIG_BL1_CHECKSUM控制。其中if (to== 0)是用來判斷是否為u-boot.bin文件的首地址(也是nand的起始地址,即0x00000000地址),如果是那么就進行校驗和的計算,否則直接寫入,不在計算校驗和。有了這個判斷就很好的解決即可以實現對u-boot.bin前8K的BL1進行校驗和計算,也不影響后續的數據寫入。使用if (to == 0)原因是,u-boot.bin的前8K數據需要計算,后面的就不需要了,而if (to == 0)就正好實現了這個功能。
三、u-boot.lds連接文件問題
???????? 這里只貼出.text部分:
???????? 下面是官方部分
.text :
???????? {
?????????????????? *(.__image_copy_start)
?????????????????? CPUDIR/start.o(.text*)
?????????????????? *(.text*)
???????? }
???????? 下面是修改后的部分
.text :
???????? {
?????????????????? *(.__image_copy_start)
?????????????????? CPUDIR/start.o(.text*)
?????????????????? board/samsung/real210/real210_board.o???? (.text)/*用戶添加*/
?????????????????? *(.text*)
???????? }
???????? real210_board.o就是要鏈接的目標文件。為什么要做這個呢?這個是u-boot移植中很重要的一部分,不做這個的話,BL1都無法實現。原因慢慢來說:
???????? 知道BL1是u-boot.bin的前8K代碼,要在BL1階段進行串口和內存的初始化,那么這些初始化的代碼必須在u-boot.bin前8K數據之內,否則會因為找不到函數崩潰掉。在u-boot中默認是沒有這個鏈接的,也就是說,即使你寫的代碼完全正確,沒有這個鏈接的話,也是無法正常運行的,因為在默認的情況下,編譯后u-boot很可能把這些初始化鏈接到了前8K之外。為此我們就需要把這些函數鏈接到前8K之內。也就是鏈接real210_board.o這個文件,如上面的代碼。
???????? 可以知道real210_board.o這個文件是在板級文件夾中,看看該文件夾下的makefile:
#下面為用戶添加,功能是把lowlevel_init.o mem_setup.o mmc_boot.o這三個目標獨立出來,生成real210_board.o,用于在u-boot.lds中做鏈接
#這樣做的目的是,為了在增加該目錄下代碼量時,不影響生成u-boot.bin前8K的BL1
LIBReal??? = $(obj)real210_board.o
REAL210_board :=lowlevel_init.o mem_setup.o mmc_boot.o nand_cp.o
?
SRCS??? := $(REAL210_board:.o=.S)
REAL210_board :=$(addprefix $(obj),$(REAL210_board))
#上面為用戶添加
?
LIB?? = $(obj)lib$(BOARD).o
?
COBJS-y?? := real210.o
#COBJS-$(CONFIG_SAMSUNG_ONENAND)??? += onenand.o
SOBJS?????? :=
?
SRCS??? := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
OBJS???????? := $(addprefix $(obj),$(COBJS-y))
SOBJS?????? := $(addprefix $(obj),$(SOBJS))
?
#下面為用戶添加,下面的ALL一定不能少,它的意思是告訴編譯器后面的兩個LIB全部都要編譯,不加只會編譯前面的一個,后面的不會編譯
ALL?? :$(LIB) $(LIBReal)
$(LIBReal):$(obj).depend$(REAL210_board)
???????? $(call cmd_link_o_target, $(REAL210_board))
#上面為用戶添加
?
$(LIB) ???? :$(obj).depend $(SOBJS) $
可以看到real210_board.o 是由lowlevel_init.o mem_setup.o mmc_boot.o nand_cp.o文件鏈接的目標文件。而BL1所需要的函數也都在這些文件之中,如果鏈接過后有函數在u-boot.bin前8K之外,那么就需要對這些文件里的函數瘦身了。
?
?
?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的u-boot移植重要问题说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u-boot移植第三弹——移植2013.
- 下一篇: u-boot移植第四弹——2013.10