本文只是熟悉uboot的框架和配置編譯加載運行流程,對於板級驅動的修改直接復制訊為移植好的uboot。
下面對移植過程做個記錄。
通過熟悉itop4412 uboot2015啟動時的內存分布和源碼初始化流程,大致可以確定移植步驟大概如下:
一. 首先我們需要針對itop4412開發板,先將uboot官方下載的uboot2015配置成適合itop4412開發板的移植模板,這個過程我們大概需要做的是:修改交叉編譯工具鏈、創建我們自己的板級目錄、在menuconfig中將uboot配置成我們創建的開發板,編譯出初始u-boot.bin文件;
二. 移植SPL階段
通過SPL階段編譯加載運行過程,我們知道SPL是通過BL1階段加載進iRAM的0x20203400內存地址運行,然后,SPL的bin文件的14KB-4B的地方需要放校驗碼。所以
1. 我們首先需要將SPL編譯加工成能被BL1加載運行,這個過程大概需要做的是修改SPL階段的鏈接地址為0x20203400,編譯完后在14KB-4B的地方加上校驗和,然后,在SPL階段的入口點放一段點亮LED的函數,LED點亮,就可以說明我們SPL階段制作成功;
2. 然后,根據SPL的代碼執行流程,依次修改系統時鍾初始化、串口初始化、DRAM初始化等代碼,修改啟動介質代碼,將uboot第二階段從啟動介質加載到DRAM中;
3. 在uboot第二階段的入口點放一段LED點亮的代碼,LED點亮就說明我們的SPL階段移植成功,可以正常加載uboot第二階段了。
三. 移植uboot第二階段,啟動kernel
所需環境
虛擬機版本:ubuntu14.04.6
交叉編譯工具鏈:arm-2009q3
uboot官方版本:ftp://ftp.denx.de/pub/u-boot/u-boot-2015.04.tar.bz2
一、制作移植模板
1. 主Makefile中添加交叉編譯工具鏈CROSS_COMPILE
2. 創建板級目錄
移植uboot需要修改的主體部分是cpu目錄和board目錄,分別是:
1) cpu目錄:arch/arm/cpu/armv7/exynos
cpu目錄中的代碼功能主要是cpu及其內部外設(時鍾、DRAM、UART等)的初始化等;
2) board目錄:board/samsung
這個目錄下每一個文件夾對應一個samsung公司芯片制作的核心板,itop4412芯片是samsung公司的,因此移植時需要在這個文件夾下創建我們自己的開發板目錄。仿照訊為移植的目錄,在board/samsung目錄下創建自己的移植目錄,其中,tomato.c和tools/mktomatospl.c(這個程序就是給SPL加CRC校驗碼用的)內容和訊為移植好的內容一樣:
Kconfig內容:
Makefile內容:
tools目錄
將創建的板級目錄tomato添加進Kconfig體系,在arch/arm/cpu/armv7/exynos/Kconfig文件添加選項,將board/samsung/tomato/Kconfig關聯過來,仿照origen目錄添加
修改完Kconfig后,在menuconfig中可以選擇自己添加的開發板。
menuconfig中的配置,這里的配置主要配置
1> 開發板架構
選擇ARM體系結構和我們自己創建的開發板tomato
2> 調試串口
3> 指定設備樹名
直接將訊為移植好的設備樹arch/arm/dts/exynos4412-itop4412.dts拷貝到arch/arm/dts/exynos4412-tomato.dts使用,修改完開發板字段如下
拷貝完后,需要在arch/arm/dts/Makefile中添加編譯目標exynos4412-tomato.dtb
然后在menuconfig中指定設備樹
4> 添加SPL支持
5> 創建主配置文件include/configs/tomato.h
先直接拷貝include/configs/origen.h,稍微修改下include/configs/tomato.h文件
根據uboot啟動SD卡中內存分布情況修改如下內容
此時編譯會報spi相關的驅動錯誤如下
我們目前沒有使用spi設備,直接在arch/arm/cpu/armv7/exynos/Kconfig將spi的支持修改成n(這里spi默認為y,在menuconfig中無法看到該spi配置項,暫時沒去找原因)
去掉spi支持后,編譯還會出現如下錯誤
這是由於定義在arch/arm/cpu/armv7/exynos/exynos4_setup.h文件中的APB_SFR_INTERLEAVE_CONF_VAL宏需要先定義CONFIG_ORIGEN或CONFIG_MIU_1BIT_INTERLEAVED
因此,修改arch/arm/cpu/armv7/exynos/exynos4_setup.h文件中的CONFIG_ORIGEN為CONFIG_TOMATO
做完上面的工作后,make -j4編譯應該可以編譯出u-boot.bin,至此,模板制作完成。
二. 移植SPL階段
1. 制作uboot鏡像文件以燒錄到SD卡上
1.1 從訊為移植好的uboot2015中拷貝鏡像制作的相關文件工具sdfuse_q目錄、CodeSign4SecureBoot目錄、編譯腳本build.sh、SD卡燒錄腳本mkuboot;
在SPL階段的入口點放一段點燈程序如下
然后
.build.sh編譯
./mkuboot燒錄鏡像到SD卡中,此時可以看到燈亮起來又熄滅了,這是因為還沒有加供電鎖存,程序運行起來就斷電了,但可以說明我們的SPL階段被加載運行起來了。
2. 從uboot2015啟動流程源碼分析中的SPL階段啟動流程圖中可以看出,我們需要開始修改的地方是arch/arm/cpu/armv7/exynos/spl_boot.c中的board_init_f函數中相關的函數,SPL移植時關於系統時鍾、供電鎖存、串口、DRAM以及加載uboot第二階段並跳轉到uboot第二階段,都在這個函數中完成,因此,只要把這個函數修改完,SPL階段就移植成功了。
2.1 首先修改do_lowlevel_init,這個函數定義在arch/arm/cpu/armv7/exynos/lowlevel_init.c文件中
2.1.1修改供電鎖存函數set_ps_hold_ctrl,這個函數定義在arch/arm/cpu/armv7/exynos/power.c,如下
函數中使用到結構體struct exynos4x12_power,這個結構體需要我們添加到arch/arm/include/asm/arch-exynos/power.h中
修改完供電鎖存的代碼后,我們發現燈還是會滅,這是因為供電鎖存之前的代碼出問題,供電鎖存的代碼並沒有被執行,如下圖所示的代碼段有問題
我們在主配置文件include/configs/tomato.h中添加CONFIG_SYS_L2CACHE_OFF將這段代碼屏蔽掉
這時再編譯燒錄運行uboot,燈就不會熄滅了。
2.1.2 修改系統時鍾初始化函數system_clock_init,這個函數定義在arch/arm/cpu/armv7/exynos/clock_init_exynos4.c,函數功能大概是設置各個模塊的時鍾源以及時鍾源分頻系數啥的,沒有仔細研究,直接拷貝訊為移植好的
修改完system_clock_init函數后,還要添加arch/arm/cpu/armv7/exynos/tomato_setup.h,system_clock_init函數使用的宏定義定義在tomato_setup.h文件中;
然后在arch/arm/include/asm/arch-exynos/clock.h文件中添加結構體struct exynos4x12_clock;
arch/arm/cpu/armv7/exynos/clock.c文件中各外設的時鍾參數配置和獲取時都是使用struct exynos4_clock結構體,需要修改成struct exynos4x12_clock結構體,其中一處修改如下:
2.1.3 串口初始化
在arch/arm/cpu/armv7/exynos/lowlevel_init.c文件中直接添加串口初始化函數:
修改支持printascii串口打印函數,這個函數直接調用串口寄存器操作串口輸出;這是一個匯編函數,定義在arch/arm/lib/debug.S文件中,需要做如下修改
還要修改串口底層寄存器操作文件arch/arm/include/debug/8250.S文件如下:
這時,編譯燒錄uboot,應該可以打印如下字樣
2.1.4動態內存DRAM初始化函數mem_ctrl_init
該函數定義在arch/arm/cpu/armv7/exynos/dmc_init_exynos4.c文件中,修改后的dmc_init_exynos4.c文件如下
這時編譯燒錄uboot,應該可以看到uboot第二階段被正常加載啟動了
至此,SPL階段移植成功,已經正常加載uboot第二階段並運行,但是uboot第二階段中關於SD卡的初始化存在問題。
三、uboot第二階段移植
uboot第二階段已經進入命令行,整體上不需要做大的改動了。(只需要修改SD卡和EMMC相關的驅動)下面參考訊為的SDK修改SD卡和內部EMMC的初始化,需要修改如下兩個文件
drivers/mmc/s5p_sdhci.c修改成如下:
drivers/mmc/sdhci.c修改成如下:
這時,使用命令行已經可以正常啟動內核了
本文僅是本人在熟悉uboot的代碼框架過程中的記錄,分析總結出來以便自己更好的理解,大家勿噴哈。參考了網上的博客沒有一一列出。如有侵權,請聯系刪除。
參考博客:
https://www.jianshu.com/p/5df61e55e96a
https://blog.csdn.net/hyyoxhk/article/details/81734733