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 目录下,一般情况不需要修改,特殊硬件移植相关驱动即可。
待续。。。