• 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

  • 相关阅读:
    一个总成本花费100W的失败项目的小小反省
    从绝望中寻找希望
    一个合格程序员该做的事情——你做好了吗?
    Go to 北京!
    深入浅出Oracle分析函数
    最适合web开发人员使用的速查表
    采用axis2c进行webservice发布的流程4在生成的代码中添加事务处理逻辑
    采用axis2c进行webservice发布的流程1
    rhel6.0及centos6.0 忘记root密码解决办法
    采用axis2c进行webservice发布的流程3通过wsdl文件,自动生成C的服务端代码
  • 原文地址:https://www.cnblogs.com/lztutumo/p/13283221.html
Copyright © 2020-2023  润新知