Uboot 版本:u-boot-2013.01
開發板:FS_4412 平臺(Exynos4412,可以根據自己的板子修改,只要是4412的過程都是一樣的)
一、建立自己的平臺
1、下載源碼
我們可以在下面這個網站上下載最新的和以前任一版本的uboot
ftp://ftp.denx.de/pub/u-boot/
這里我們使用的是u-boot-2013.01
2、解壓uboot 源碼并進入目錄
3、指定交叉編譯工具鏈
a -- 打開根目錄下的Makefile
b -- 添加交叉編譯工具鏈信息
4、指定產品CPU
我們產品用的CPU 是exynos 4412
查看u-boot 源碼該CPU 是否已支持
U-boot 已支持,見arch/arm/cpu/armv7/exynos/
5、指定產品BOARD
找一個最類似的board 配置修改, 這里我們參考的是board/samsung/origen/
a -- 修改board/samsung/ 板級相關文件夾,復制?board/samsung/origen/,重命名為fs4412
?
b -- 修改board/samsung/fs4412/Makefile信息
修改 origen.o 為 fs4412.o
c -- 修改include/configs/fs4412.h配置文件
這里同樣是先復制?inlcude/configs/origen.h,生成?inlcude/configs/fs4412.h
打開fs4412.h,修改以下文件:
將原來的#define CONFIG_SYS_PROMPT "ORIGEN #" 改成:
將原來的#define CONFIG_IDENT_STRING for ORIGEN 改成
d -- 配置boards.cfg
打開uboot根目錄下的boards.cfg,在origen后新增
6、編譯u-boot
$ make distclean
$ make fs4412_config (可以在inlcude/config.mk及include/config.h下看到配置好的信息)
$ make
編譯完成后生成的u-boot.bin?就是可執行的鏡像文件。
燒寫uboot 命令:
tftp 41000000 u-boot.bin
movi write uboot 41000000
但是該文件還不能在我們板子上運行,我們需要對u-boot 源代碼進行相應的修改。
二、實現能看到串口終端信息
1、確認第一條指令有運行到(點燈法)
a -- 在arch/arm/cpu/armv7/start.S 134 行后添加點燈程序
b -- ?添加三星加密方式
exynos 需要三星提供的初始引導加密后,我們的u-boot,才能被引導運行
將sdfuse_q 目錄拷貝到u-boot-2013.01 源碼目錄下
注:sdfuse_q 三星提供的加密處理
將CodeSign4SecureBoot 目錄拷貝到u-boot-2013.01 源碼目錄下
注:CodeSign4SecureBoot 三星提供的安全啟動方式
c --?修改Makefile
$vim Makefile
修改實現sdfuse_q 的編譯
在
下添加
注意是tab 鍵縮進的,否則makefile 編譯報錯
注意如果執行了make distclean 需重新拷貝CodeSign4SecureBoot
d -- 拷貝編譯腳本
將 build.sh 拷貝到uboot 根目錄下,并加上執行權限,并執行該腳本 注:build.sh 腳本方式完成自動添加加密方式,是自己編寫的
編譯生成所需文件u-boot_fs4412.bin
燒寫新的u-boot_fs4412.bin
復位,發現燈有點亮,說明我們的u-boot 有運行到
附:build.sh腳本文件
[cpp]?view plaincopy
#!/bin/sh?? ?? sec_path="CodeSign4SecureBoot/"?? CPU_JOB_NUM=$(grep?processor?/proc/cpuinfo?|?awk?'{field=$NF};END{print?field+1}')?? ROOT_DIR=$(pwd)?? CUR_DIR=${ROOT_DIR##*/}?? ?? case?"$1"?in?? ????clean)?? ????????echo?make?clean?? ????????make?mrproper?? ????????;;?? ????*)?? ?????????????? ????????if?[?!?-d?$sec_path?]?? ????????then?? ????????????echo?"**********************************************"?? ????????????echo?"[ERR]please?get?the?CodeSign4SecureBoot?first"?? ????????????echo?"**********************************************"?? ????????????return?? ????????fi?? ?????????? ????????make?fs4412_config?? ?????????? ????????make?-j$CPU_JOB_NUM?? ?????????? ????????if?[?!?-f?checksum_bl2_14k.bin?]?? ????????then?? ????????????echo?"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"?? ????????????echo?"There?are?some?error(s)?while?building?uboot,?please?use?command?make?to?check."?? ????????????echo?"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"?? ????????????exit?0?? ????????fi?? ?????????? ????????cp?-rf?checksum_bl2_14k.bin?$sec_path?? ????????cp?-rf?u-boot.bin?$sec_path?? ????????rm?checksum_bl2_14k.bin?? ?????????? ????????cd?$sec_path?? ????????cat?E4412_N.bl1.SCP2G.bin?bl2.bin?all00_padding.bin?u-boot.bin?tzsw_SMDK4412_SCP_2GB.bin?>?u-boot-fs4412.bin?? ????????mv?u-boot-fs4412.bin?$ROOT_DIR?? ?????????? ????????rm?checksum_bl2_14k.bin?? ????????rm?u-boot.bin?? ?? ????????echo??? ????????echo??? ????????;;?? ?????????? esac??
2、實現串口輸出
修改lowlevel_init.S 文件
$vim board/samsung/fs4412/lowlevel_init.S
a -- 添加臨時棧
在
lowlevel_init:
后添加
b -- ?添加關閉看門狗代碼
在
beq wakeup_reset
后添加
c -- 添加串口初始化代碼
在uart_asm_init: 的
str r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]
后添加
注釋掉trustzone 初始化
注釋掉
bl uart_asm_init
下的
bl tzpc_init
重新編譯u-boot
$ ./build.sh
燒寫新的u-boot_fs4412.bin
復位會看到串口信息
三、網卡移植
1、添加網絡初始化代碼
$vim board/samsung/fs4412/fs4412.c
在struct exynos4_gpio_part2 *gpio2; 后添加
[cpp]?view plaincopy
#ifdef?CONFIG_DRIVER_DM9000?? #define?EXYNOS4412_SROMC_BASE?0X12570000?? ?? #define?DM9000_Tacs?????(0x1)???//?0clk?????????address?set-up?? #define?DM9000_Tcos?????(0x1)???//?4clk?????????chip?selection?set-up?? #define?DM9000_Tacc?????(0x5)???//?14clk????????access?cycle?? #define?DM9000_Tcoh?????(0x1)???//?1clk?????????chip?selection?hold?? #define?DM9000_Tah??????(0xC)???//?4clk?????????address?holding?time?? #define?DM9000_Tacp?????(0x9)???//?6clk?????????page?mode?access?cycle?? #define?DM9000_PMC??????(0x1)???//?normal(1data)page?mode?configuration?? ?? ?? struct?exynos_sromc?{?? ????unsigned?int?bw;?? ????unsigned?int?bc[6];?? };?? ?? ? ? ? ? ? ? ?? ?? void?exynos_config_sromc(u32?srom_bank,?u32?srom_bw_conf,?u32?srom_bc_conf)?? {?? ????unsigned?int?tmp;?? ????struct?exynos_sromc?*srom?=?(struct?exynos_sromc?*)(EXYNOS4412_SROMC_BASE);?? ?? ????? ?? ????tmp?=?srom->bw;?? ????tmp?&=?~(0xF?<<?(srom_bank?*?4));?? ????tmp?|=?srom_bw_conf;?? ????srom->bw?=?tmp;?? ?? ????? ?? ????srom->bc[srom_bank]?=?srom_bc_conf;?? }?? static?void?dm9000aep_pre_init(void)?? {?? ????unsigned?int?tmp;?? ????unsigned?char?smc_bank_num?=?1;?? ????unsigned?int?????smc_bw_conf=0;?? ????unsigned?int?????smc_bc_conf=0;?? ?? ?????? ????writel(0x00220020,?0x11000000?+?0x120);?? ????writel(0x00002222,?0x11000000?+?0x140);?? ?????? ????writel(0x22222222,?0x11000000?+?0x180);?? ????writel(0x0000FFFF,?0x11000000?+?0x188);?? ????writel(0x22222222,?0x11000000?+?0x1C0);?? ????writel(0x0000FFFF,?0x11000000?+?0x1C8);?? ????writel(0x22222222,?0x11000000?+?0x1E0);?? ????writel(0x0000FFFF,?0x11000000?+?0x1E8);???????????????? ????smc_bw_conf?&=?~(0xf<<4);?? ????smc_bw_conf?|=?(1<<7)?|?(1<<6)?|?(1<<5)?|?(1<<4);?? ????smc_bc_conf?=?((DM9000_Tacs?<<?28)?? ????????????|?(DM9000_Tcos?<<?24)?? ????????????|?(DM9000_Tacc?<<?16)?? ????????????|?(DM9000_Tcoh?<<?12)?? ????????????|?(DM9000_Tah?<<?8)?? ????????????|?(DM9000_Tacp?<<?4)?? ????????????|?(DM9000_PMC));?? ????exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf);?? }?? #endif??
在
gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
?后添加
[cpp]?view plaincopy
#ifdef?CONFIG_DRIVER_DM9000?? ????dm9000aep_pre_init();?? #endif??
在文件末尾添加
[cpp]?view plaincopy
#ifdef?CONFIG_CMD_NET?? int?board_eth_init(bd_t?*bis)?? {?? ????int?rc?=?0;?? #ifdef?CONFIG_DRIVER_DM9000?? ????rc?=?dm9000_initialize(bis);?? #endif?? ????return?rc;?? }?? #endif??
2、修改配置文件添加網絡相關配置
$ vim include/configs/fs4412.h
修改
#undef CONFIG_CMD_PING
為
#def ine CONFIG_CMD_PING
修改
#undef CONFIG_CMD_NET
為
#def ine CONFIG_CMD_NET
在文件末尾
#endif /* __CONFIG_H */
前面添加
3、重新編譯u-boot
$ ./build.sh
燒寫新的u-boot_fs4412.bin
復位后
# ping 192.168.9.120
四、FLASH 移植(EMMC)
1、初始化EMMC
$cp movi.c arch/arm/cpu/armv7/exynos/
$vim arch/arm/cpu/armv7/exynos/Makefile
在pinmux.o 后添加movi.o
修改板級文件
$vim board/samsung/fs4412/fs4412.c
在
#include <asm/arch/mmc.h>
后面添加
#include <asm/arch/clk.h>
#include "origen_setup.h"
在
#ifdef CONFIG_GENERIC_MMC
后面添加
[cpp]?view plaincopy
u32?sclk_mmc4;???? #define?__REGMY(x)?(*((volatile?u32?*)(x)))?? #define?CLK_SRC_FSYS??__REGMY(EXYNOS4_CLOCK_BASE?+?CLK_SRC_FSYS_OFFSET)?? #define?CLK_DIV_FSYS3?__REGMY(EXYNOS4_CLOCK_BASE?+?CLK_DIV_FSYS3_OFFSET)?? ?? int?emmc_init()?? {?? ????u32?tmp;?? ????u32?clock;?? ????u32?i;?? ?????? ?????? ????tmp?=?CLK_SRC_FSYS?&?~(0x000f0000);?? ????CLK_SRC_FSYS?=?tmp?|?0x00060000;?? ?????? ????tmp?=?CLK_DIV_FSYS3?&?~(0x0000ff0f);?? ????clock?=?get_pll_clk(MPLL)/1000000;?? ?? ????for(i=0?;?i<=0xf;?i++)??{?? ????????sclk_mmc4=(clock/(i+1));?? ?? ????????if(sclk_mmc4?<=?160)??? ????????{?? ????????????CLK_DIV_FSYS3?=?tmp?|?(i<<0);?? ????????????break;?? ????????}?? ????}?? ????emmcdbg("[mjdbg]?sclk_mmc4:%d?MHZ;?mmc_ratio:?%d\n",sclk_mmc4,i);?? ????sclk_mmc4?*=?1000000;?? ?? ????? ? ? ? ? ? ? ?? ????writel(readl(0x11000048)&~(0xf),0x11000048);??? ????writel(readl(0x11000040)&~(0xff),0x11000040);?? ?? ????writel(readl(0x11000048)&~(3<<4),0x11000048);??? ????writel(readl(0x11000044)&~(1<<2),0x11000044);??? ????writel(readl(0x11000040)&~(0xf<<8)|(1<<8),0x11000040);?? ????udelay(100*1000);?? ????writel(readl(0x11000044)|(1<<2),0x11000044);??? ?? ?? ????writel(0x03333133,?0x11000040);?? ?? ????writel(0x00003FF0,?0x11000048);?? ????writel(0x00002AAA,?0x1100004C);?? ?? #ifdef?CONFIG_EMMC_8Bit?? ????writel(0x04444000,?0x11000060);?? ????writel(0x00003FC0,?0x11000068);?? ????writel(0x00002AAA,?0x1100006C);?? #endif?? ?? #ifdef?USE_MMC4?? ????smdk_s5p_mshc_init();?? #endif??? }??
將int board_mmc_init(bd_t *bis)函數內容改寫為
[cpp]?view plaincopy
int?board_mmc_init(bd_t?*bis)?? {?? ????int?i,?err;?? #ifdef?CONFIG_EMMC?? ????err?=?emmc_init();?? #endif?? ????return?err;?? }??
在末尾添加
[cpp]?view plaincopy
#ifdef?CONFIG_BOARD_LATE_INIT?? #include?<movi.h>?? int??chk_bootdev(void)?? {?? ????char?run_cmd[100];?? ????struct?mmc?*mmc;?? ????int?boot_dev?=?0;?? ????int?cmp_off?=?0x10;?? ????ulong??start_blk,?blkcnt;?? ?? ????mmc?=?find_mmc_device(0);?? ?? ????if?(mmc?==?NULL)?? ????{?? ????????printf("There?is?no?eMMC?card,?Booting?device?is?SD?card\n");?? ????????boot_dev?=?1;?? ????????return?boot_dev;?? ????}?? ????start_blk?=?(24*1024/MOVI_BLKSIZE);?? ????blkcnt?=?0x10;?? ?? ????sprintf(run_cmd,"emmc?open?0");?? ????run_command(run_cmd,?0);?? ?? ????sprintf(run_cmd,"mmc?read?0?%lx?%lx?%lx",CFG_PHY_KERNEL_BASE,start_blk,blkcnt);?? ????run_command(run_cmd,?0);?? ?? ????sprintf(run_cmd,"emmc?close?0");?? ????run_command(run_cmd,?0);?? ?? ????return?0;?? }??
2、添加相關命令
$ cp cmd_movi.c common/
$ cp cmd_mmc.c common/
$ cp cmd_mmc_fdisk.c common/
修改Makefile
$ vim common/Makefile
在
COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o
后添加
COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.o
COBJS-$(CONFIG_CMD_MOVINAND) += cmd_movi.o
添加驅動
$ cp mmc.c drivers/mmc/
$ cp s5p_mshc.c drivers/mmc/
$ cp mmc.h include/
$ cp movi.h include/
$ cp s5p_mshc.h include/
修改Makefile
$vim drivers/mmc/Makefile
添加
COBJS-$(CONFIG_S5P_MSHC) += s5p_mshc.o
3、添加EMMC 相關配置
$vim include/configs/fs4412.h
添加
[cpp]?view plaincopy
#define?CONFIG_EVT1?????1???????/*?EVT1?*/?? #ifdef?CONFIG_EVT1?? #define?CONFIG_EMMC44_CH4?//eMMC44_CH4?(OMPIN[5:1]?=?4)?? ?? #ifdef?CONFIG_SDMMC_CH2?? #define?CONFIG_S3C_HSMMC?? #undef?DEBUG_S3C_HSMMC?? #define?USE_MMC2???? #endif?? ?? #ifdef?CONFIG_EMMC44_CH4?? #define?CONFIG_S5P_MSHC?? #define?CONFIG_EMMC?????????????1????????????????? #define?USE_MMC4???? ?? #define?CONFIG_EMMC_EMERGENCY?? ? ? ? ?? ?#define?emmcdbg(fmt,args...)??? #endif?? ?? #endif?/*end?CONFIG_EVT1*/?? #define?CONFIG_CMD_MOVINAND?? #define?CONFIG_CLK_1000_400_200?? #define?CFG_PHY_UBOOT_BASE??????CONFIG_SYS_SDRAM_BASE?+?0x3e00000?? #define?CFG_PHY_KERNEL_BASE?????CONFIG_SYS_SDRAM_BASE?+?0x8000?? ?? #define?BOOT_MMCSD??????0x3?? #define?BOOT_EMMC43?????0x6?? #define?BOOT_EMMC441????0x7?? #define?CONFIG_BOARD_LATE_INIT??
4、重新編譯u-boot
$ ./build.sh
燒寫新的u-boot_fs4412.bin
復位后
# mmcinfo
總結
以上是生活随笔為你收集整理的Exynos4412 Uboot 移植(五)—— Uboot 移植过程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。