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 目錄下,一般情況不需要修改,特殊硬件移植相關驅動即可。

 

待續。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM