zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/lztutumo/p/13283221.html
Copyright © 2011-2022 走看看