U-boot移植

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

 

待续。。。

 

posted @ 2019-07-29 15:22  silencehuan  阅读(1193)  评论(0编辑  收藏  举报