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

    待续。。。

  • 相关阅读:
    SpringBoot集成logback.xml日志配置文件找不到错误
    两个List集合如何去重,取交集,并集,差集
    分转元工具类
    Redis(二十九)PHP 使用 Redis
    Redis学习(二十八)Java 使用 Redis
    Redis学习(二十七)Redis 分区
    Redis学习(二十六)Redis 管道技术
    面试题
    Android 自动化测试
    Inner Functions
  • 原文地址:https://www.cnblogs.com/silencehuan/p/11264096.html
Copyright © 2020-2023  润新知