uboot代码框架熟悉(三)itop4412-uboot2015移植步骤

  本文只是熟悉uboot的框架和配置编译加载运行流程,对于板级驱动的修改直接复制讯为移植好的uboot。

  下面对移植过程做个记录。

通过熟悉itop4412 uboot2015启动时的内存分布和源码初始化流程,大致可以确定移植步骤大概如下:

  一. 首先我们需要针对itop4412开发板,先将uboot官方下载的uboot2015配置成适合itop4412开发板的移植模板,这个过程我们大概需要做的是:修改交叉编译工具链、创建我们自己的板级目录、在menuconfig中将uboot配置成我们创建的开发板,编译出初始u-boot.bin文件;

  二. 移植SPL阶段

  通过SPL阶段编译加载运行过程,我们知道SPL是通过BL1阶段加载进iRAM的0x20203400内存地址运行,然后,SPL的bin文件的14KB-4B的地方需要放校验码。所以

  1. 我们首先需要将SPL编译加工成能被BL1加载运行,这个过程大概需要做的是修改SPL阶段的链接地址为0x20203400,编译完后在14KB-4B的地方加上校验和,然后,在SPL阶段的入口点放一段点亮LED的函数,LED点亮,就可以说明我们SPL阶段制作成功;

  2. 然后,根据SPL的代码执行流程,依次修改系统时钟初始化、串口初始化、DRAM初始化等代码,修改启动介质代码,将uboot第二阶段从启动介质加载到DRAM中;

  3. 在uboot第二阶段的入口点放一段LED点亮的代码,LED点亮就说明我们的SPL阶段移植成功,可以正常加载uboot第二阶段了。

  三. 移植uboot第二阶段,启动kernel

所需环境

虚拟机版本:ubuntu14.04.6

交叉编译工具链:arm-2009q3

uboot官方版本:ftp://ftp.denx.de/pub/u-boot/u-boot-2015.04.tar.bz2

  

一、制作移植模板

  1. 主Makefile中添加交叉编译工具链CROSS_COMPILE

  2. 创建板级目录

  移植uboot需要修改的主体部分是cpu目录和board目录,分别是:

  1) cpu目录:arch/arm/cpu/armv7/exynos

    cpu目录中的代码功能主要是cpu及其内部外设(时钟、DRAM、UART等)的初始化等;

  2) board目录:board/samsung

    这个目录下每一个文件夹对应一个samsung公司芯片制作的核心板,itop4412芯片是samsung公司的,因此移植时需要在这个文件夹下创建我们自己的开发板目录。仿照讯为移植的目录,在board/samsung目录下创建自己的移植目录,其中,tomato.c和tools/mktomatospl.c(这个程序就是给SPL加CRC校验码用的)内容和讯为移植好的内容一样:

    Kconfig内容:

     Makefile内容:

    tools目录

  将创建的板级目录tomato添加进Kconfig体系,在arch/arm/cpu/armv7/exynos/Kconfig文件添加选项,将board/samsung/tomato/Kconfig关联过来,仿照origen目录添加

  修改完Kconfig后,在menuconfig中可以选择自己添加的开发板。

  menuconfig中的配置,这里的配置主要配置

  1> 开发板架构

    选择ARM体系结构和我们自己创建的开发板tomato

  2> 调试串口

  3> 指定设备树名

    直接将讯为移植好的设备树arch/arm/dts/exynos4412-itop4412.dts拷贝到arch/arm/dts/exynos4412-tomato.dts使用,修改完开发板字段如下

    拷贝完后,需要在arch/arm/dts/Makefile中添加编译目标exynos4412-tomato.dtb

    然后在menuconfig中指定设备树

  4> 添加SPL支持

  5> 创建主配置文件include/configs/tomato.h

    先直接拷贝include/configs/origen.h,稍微修改下include/configs/tomato.h文件

  根据uboot启动SD卡中内存分布情况修改如下内容

  此时编译会报spi相关的驱动错误如下

  我们目前没有使用spi设备,直接在arch/arm/cpu/armv7/exynos/Kconfig将spi的支持修改成n(这里spi默认为y,在menuconfig中无法看到该spi配置项,暂时没去找原因)

  去掉spi支持后,编译还会出现如下错误

  这是由于定义在arch/arm/cpu/armv7/exynos/exynos4_setup.h文件中的APB_SFR_INTERLEAVE_CONF_VAL宏需要先定义CONFIG_ORIGEN或CONFIG_MIU_1BIT_INTERLEAVED

  因此,修改arch/arm/cpu/armv7/exynos/exynos4_setup.h文件中的CONFIG_ORIGEN为CONFIG_TOMATO

  做完上面的工作后,make -j4编译应该可以编译出u-boot.bin,至此,模板制作完成。

二. 移植SPL阶段

  1. 制作uboot镜像文件以烧录到SD卡上

  1.1 从讯为移植好的uboot2015中拷贝镜像制作的相关文件工具sdfuse_q目录、CodeSign4SecureBoot目录、编译脚本build.sh、SD卡烧录脚本mkuboot;

  在SPL阶段的入口点放一段点灯程序如下

  然后

  .build.sh编译

  ./mkuboot烧录镜像到SD卡中,此时可以看到灯亮起来又熄灭了,这是因为还没有加供电锁存,程序运行起来就断电了,但可以说明我们的SPL阶段被加载运行起来了。

  2. 从uboot2015启动流程源码分析中的SPL阶段启动流程图中可以看出,我们需要开始修改的地方是arch/arm/cpu/armv7/exynos/spl_boot.c中的board_init_f函数中相关的函数,SPL移植时关于系统时钟、供电锁存、串口、DRAM以及加载uboot第二阶段并跳转到uboot第二阶段,都在这个函数中完成,因此,只要把这个函数修改完,SPL阶段就移植成功了。

  2.1 首先修改do_lowlevel_init,这个函数定义在arch/arm/cpu/armv7/exynos/lowlevel_init.c文件中

  2.1.1修改供电锁存函数set_ps_hold_ctrl,这个函数定义在arch/arm/cpu/armv7/exynos/power.c,如下

  函数中使用到结构体struct exynos4x12_power,这个结构体需要我们添加到arch/arm/include/asm/arch-exynos/power.h中

  修改完供电锁存的代码后,我们发现灯还是会灭,这是因为供电锁存之前的代码出问题,供电锁存的代码并没有被执行,如下图所示的代码段有问题

  我们在主配置文件include/configs/tomato.h中添加CONFIG_SYS_L2CACHE_OFF将这段代码屏蔽掉

  这时再编译烧录运行uboot,灯就不会熄灭了。

  2.1.2 修改系统时钟初始化函数system_clock_init,这个函数定义在arch/arm/cpu/armv7/exynos/clock_init_exynos4.c,函数功能大概是设置各个模块的时钟源以及时钟源分频系数啥的,没有仔细研究,直接拷贝讯为移植好的

  修改完system_clock_init函数后,还要添加arch/arm/cpu/armv7/exynos/tomato_setup.h,system_clock_init函数使用的宏定义定义在tomato_setup.h文件中;

  然后在arch/arm/include/asm/arch-exynos/clock.h文件中添加结构体struct exynos4x12_clock;

  arch/arm/cpu/armv7/exynos/clock.c文件中各外设的时钟参数配置和获取时都是使用struct exynos4_clock结构体,需要修改成struct exynos4x12_clock结构体,其中一处修改如下:

  2.1.3 串口初始化

    在arch/arm/cpu/armv7/exynos/lowlevel_init.c文件中直接添加串口初始化函数:

  修改支持printascii串口打印函数,这个函数直接调用串口寄存器操作串口输出;这是一个汇编函数,定义在arch/arm/lib/debug.S文件中,需要做如下修改

  还要修改串口底层寄存器操作文件arch/arm/include/debug/8250.S文件如下:

  这时,编译烧录uboot,应该可以打印如下字样

  2.1.4动态内存DRAM初始化函数mem_ctrl_init

    该函数定义在arch/arm/cpu/armv7/exynos/dmc_init_exynos4.c文件中,修改后的dmc_init_exynos4.c文件如下

  这时编译烧录uboot,应该可以看到uboot第二阶段被正常加载启动了

  至此,SPL阶段移植成功,已经正常加载uboot第二阶段并运行,但是uboot第二阶段中关于SD卡的初始化存在问题。

三、uboot第二阶段移植

  uboot第二阶段已经进入命令行,整体上不需要做大的改动了。(只需要修改SD卡和EMMC相关的驱动)下面参考讯为的SDK修改SD卡和内部EMMC的初始化,需要修改如下两个文件

  drivers/mmc/s5p_sdhci.c修改成如下:

  drivers/mmc/sdhci.c修改成如下:

  这时,使用命令行已经可以正常启动内核了


  本文仅是本人在熟悉uboot的代码框架过程中的记录,分析总结出来以便自己更好的理解,大家勿喷哈。参考了网上的博客没有一一列出。如有侵权,请联系删除。

参考博客:

  https://www.jianshu.com/p/5df61e55e96a

  https://blog.csdn.net/hyyoxhk/article/details/81734733

原文地址:https://www.cnblogs.com/lztutumo/p/13283221.html