U-boot移植學習內容建議
1.Uboot啟動流程
uboot啟動流程簡析
詳解參見:
https://www.cnblogs.com/lifexy/p/8136378.html
https://www.cnblogs.com/leaven/p/6296160.html
下面以 imx6ullevk 為例對啟動流程進行追溯,此啟動流程未涉及 spl 和 設備樹dts;一般uboot涉及外設較少、功能簡單也不建立分離。
1.uboot的啟動入口 _start
在頂部makefile中會執行 u-boot.lds
查看 arch/arm/cpu/u-boot.lds 中

_start 位於 arch/arm/lib/vectors.S
會跳轉到 reset

reset 位於 arch/arm/cpu/armv7/start.S

reset 后會跳轉到 save_boot_params_ret
通過設置CPSR寄存器設置CPU為HYP、SVC模式(超級管理員、超級監視者模式),禁止FIQ和IRQ中斷模式,接下來會跳轉到 cpu_init_cp15

cpu_init_cp15
初始化協處理器CP15,從而禁用MMU和TLB
然后執行 cpu_init_crit
進行一些關鍵的初始化動作,也就是平台級和板級的初始化。其代碼核心就是lowlevel_init
ENTRY(cpu_init_crit) /* * Jump to board specific initialization... * The Mask ROM will have already initialized * basic memory. Go here to bump up clock rate and handle * wake up conditions. */ b lowlevel_init @ go setup pll,mux,memory ENDPROC(cpu_init_crit)
lowlevel_init一般是由板級代碼自己實現的。但是對於某些平台來說,也可以使用通用的lowlevel_init,其定義在arch/arm/cpu/lowlevel_init.S中
本文實例的 mx6ullevk armv7就是使用通用的 lowlevel_init
freescale 的 imx6 系列的 board-init 初始化沒有使用SPL,均由C語言實現在board/freescale/mx6ullevk/ 里,
最好跳轉到 _main
位於 arch/arm/lib/crt0.S
初始化C運行環境,主要時設置堆棧,然后就跳轉到 board_init_f
_main流程
1.設置調用 board_init_f 的環境;
2.調用 board_init_f ,設置中間環境,初始化時鍾和一些硬件;
3.最好調用 board_init_r
board_init_f 和 board_init_r 在common文件夾下均有通用版的實現 common/board_f.c 和 common/board_r.c
board_init_f
位於 board/freescale/mx6ullevk/mx6ullevk.c
這個函數的主要功能就是初始化一些硬件設備(串口、定時器等)並且設置gd結構體中的成員。
void board_init_f(ulong dummy) { /* setup AIPS and disable watchdog */ arch_cpu_init(); ccgr_init(); /* iomux and setup of i2c */ board_early_init_f(); /* setup GP timer */ timer_init(); /* UART clocks enabled and gd valid - init serial console */ preloader_console_init(); /* DDR initialization */ spl_dram_init(); /* Clear the BSS. */ memset(__bss_start, 0, __bss_end - __bss_start); /* load/boot image from boot device */ board_init_r(NULL, 0); }
接下來就是uboot的后部分 board_init_r
詳細可參見 https://blog.csdn.net/qq_16777851/article/details/81782669
U-boot移植(IMX283+U-boot2015.04)
環境
宿主機平台:Ubuntu 12.04.4 LTS
目標機:Easy-ARM IMX283
目標機內核:Linux 2.6.35.3
u-boot版本:u-boot-2015.04.tar.bz2
交叉編譯器:gcc 4.5.2
1.測試gcc與uboot版本是否兼容
tar -xjvf u-boot-2015.04.tar.bz2
cd u-boot-2015.04
make mx28evk_nand_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
編譯沒有問題,正常生成 boot.bin 文件,則uboot版本可以使用,否則建議使用低版本或使用高版本gcc
2.移植自定義板子的uboot
1.板子相關配置拷貝
# 板級配置
cp -rf board/freescale/mx28evk board/freescale/wh_mx28evk
# Uboot配置
cp include/configs/mx28evk.h include/configs/wh_mx28evk.h
cp configs/mx28evk_nand_defconfig configs/wh_mx28evk_defconfig
2.移植config修改
1)修改 configs/wh_mx28evk_defconfig
2)修改板級支持 board/freescale/wh_mx28evk
修改 mx28evk.c 為 wh_mx28evk.c
修改 Makefile
obj-y := wh_mx28evk.o
修改 kbuild 文件
if TARGET_WH_MX28EVK config SYS_BOARD default "wh_mx28evk" config SYS_VENDOR default "freescale" config SYS_SOC default "mxs" config SYS_CONFIG_NAME default "wh_mx28evk" endif
3)修改架構配置文件 arch/arm/Kconfig
增加自定義板子選擇內核的內容
config TARGET_WH_MX28EVK bool "Support wh_mx28evk" select CPU_ARM926EJS select SUPPORT_SPL source "board/freescale/wh_mx28evk/Kconfig"
待續。。。
U-boot移植(IMX6ULL + U-boot-2016.03)
環境
宿主機平台:Ubuntu 16.04
目標機:IMX6ULL
目標機內核:Linux 4.1.15
u-boot版本:https://ftp.denx.de/pub/u-boot/u-boot-2016.03.tar.bz2
交叉編譯器:gcc-linaro-4.9-2014.11
Uboot移植
1. 移植相關文件
arch/arm/cpu/armv7/mx6/ - CPU內核相關代碼,一般不需要修改 The CPU support code for the Freescale i.MX28
arch/arm/include/asm/arch-mx6/ - iMX6ULL相關頭文件(主要為外設、引腳復用等寄存器相關宏定義)
board/freescale/mx6ullevk/ - mx6ullevk 板級支持文件(uboot移植主要內容修改點:外設初始化)
include/configs/mx6ullevk.h - mx6ullevk 整體uboot配置文件
當然還有驅動部分 drivers 目錄下,一般情況不需要修改,特殊硬件移植相關驅動即可。
待續。。。
