首先必須弄清楚S3C6410關於SD啓動的整個過程。
再來談移植:
1.把movi.h文件放在include目錄下。
2.把movi_boot.c放在/nand_spl目錄下並創建鏈接,把鏈接放到/nand_spl/board/samsung/smdk6410目錄下並修改該目錄下的Makefile
2.1 增加movi_boot.o
COBJS = nand_boot.o nand_ecc.o s3c64xx.o smdk6410_nand_spl.o nand_base.o movi_boot.o
2.2 指明movi_boot.c路徑
$(obj)movi_boot.c:
@rm -f $@
@ln -s $(TOPDIR)/nand_spl/movi_boot.c $@
3.增加宏定義#define CONFIG_MOVINAND到smdk6410.h(include/configs)
4.Start.s在程序中nand_boot這裏添加movi_boot的代碼,如下:
#ifdef CONFIG_NAND_SPL
#ifdef CONFIG_MOVINAND
ldr sp, _TEXT_PHY_BASE
bl movi_bl2_copy
b after_copy
after_copy:
ldr pc,_TEXT_PHY_BASE
#endif
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,_nand_boot
mov pc, r0
_nand_boot: .word nand_boot
#else
......
#endif
編譯可能提示movi_bl2_copy沒有定義,我是把它聲明在include目錄下的nand.h裏面:
#ifdef CONFIG_MOVINAND
void movi_bl2_copy(void);//__attribute__((noreturn))
#endif
也可以把它放在common.h裏面。
OK,編譯應該可以通過了,接下來製作u-boot-mmc.nb0用於燒錄到SD卡中:
5.u-boot-mmc.nb0的製作方法
5.1先製作一個512K的u-boot.bin,這個就是用在SDRAM中運行的,因此原材料自然就是主目錄下的
u-boot.bin. 可能我們編譯好的u-boot.bin並沒有512K這麼大,那麼可以採用“複製”或“拼接”的方法做一個512k的bin:
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 512k temp
mv xaa u-boot_512k.bin
5.2 再製作一個8k的u-boot.bin,這個是BL1階段運行的,所以原料必須是在nand_spl下u-boot_spl-16k.bin
cat nand_spl/u-boot-spl-16k.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 8k temp
mv xaa u-boot_8k.bin
5.3我們還需要一個16K的"空白"bin,就是上面出現的那個movi-env-zero-16k.bin
5.4把這幾個bin合併起來就是u-boot-mmc.nb0啦:
cat u-boot_512k.bin >> u-boot_mmc.nb0
cat movi-env-zero-16k.bin >> u-boot_mmc.nb0
cat u-boot_8k.bin >> u-boot_mmc.nb0
嫌上面步驟多手工輸入麻煩?那麼,就在主目錄下建立一個文件,隨便命名比:u2mmc
編輯這個文件內容如下:
#!/bin/sh
rm -rf u-boot_mmc.bin
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 512k temp
mv xaa u-boot_512k.bin
rm -f temp x*
cat nand_spl/u-boot-spl-16k.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 8k temp
mv xaa u-boot_8k.bin
rm -f temp x*
cat u-boot_512k.bin >> u-boot_mmc.bin
cat movi-env-zero-16k.bin >> u-boot_mmc.bin
cat u-boot_8k.bin >> u-boot_mmc.bin
rm -rf u-boot_512k.bin u-boot_8k.bin
這樣我們每次
root@ubuntu:/home/my/u-boot-2012.10# make
完後再
root@ubuntu:/home/my/u-boot-2012.10# ./u2mmc
就製作好u-boot_mmc.nb0文件了,把它燒錄到SD卡中,然後從SD啓動試試看你的U-boot有沒有運行起來.
最後說明一下爲什麼第一個u-boot是512K,中間爲何有個16K的“0X00”?其實這2個都是根據系統的配置而定的,也就是說,系統配置不同,這兩個地方的大小就會不同。
其中512K是這樣來的:
(include/movi.h)#define PART_SIZE_BL (512 * 1024)
而16K的"0x00"是這個:
(include/configs/smdk6410.h)#define CONFIG_ENV_SIZE 0x4000