iMX6Q Sabresd Board SPL Mode

匿名 (未验证) 提交于 2019-12-03 00:32:02

uboot 2014以后的版本已经加入了支持快速启动的spl模式,本文用iMX6Q-SDP开发板做个简单讲解

在官方的yocot中下载fsl-L4.9.11_1.0.0-ga版本代码并编译,提取出uboot和kernel做为SPL模式的示范

看一下uboot官方对SPL和过去对比的描述


如下是denx对spl的描述


如下是SPL模式的简易时序图


如下针对iMX6Q Sabresd SD开发板打开SPL模式

uboot部分

开发板对应的配置文件为mx6qsabresd_defconfig

打开SPL模式需要在配置文件加入一个宏CONFIG_SPL=y

但此时还没达到快速启动的目的,需要跳过uboot直达kernel才行:boot_rom --> SPL --> kernel


为此查看uboot/README的SPL framework部分

CONFIG_SPL

此项我们在defconfig中已经打开

CONFIG_SPL_OS_BOOT


有一项说明了从SPL跳转到kernel需要打开此宏

在include/configs/mx6_common.h中加入定义#define CONFIG_SPL_OS_BOOT,然后编译

得到如下明确的错误提示


在uboot/README or 查阅未定义的宏得知具体含义



CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR,
CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS



CONFIG_SYS_MMCSD_RAW_MODE_KERNEL_SECTOR


含义非常明确

具体是多少需要算一下,此处只要求kernel的地址信息,隐藏了uboot和SPL的地址信息,由此我们可以根据SPL和uboot的地址,算出允许kernel和dtb写入的安全地址

SPL的位置是由boot_rom指定的位于mmc的0x400位置,不可更改

uboot位置则在include/configs/imx6_spl.h中指定

/* MMC support */
#if defined(CONFIG_SPL_MMC_SUPPORT)




#endif

此宏CONFIG_SPL_MMC_SUPPORT跟随全局SPL变量CONFIG_SPL打开

位于include/configs/mx6sabresd.h

#ifdef CONFIG_SPL
#define CONFIG_SPL_LIBCOMMON_SUPPORT
#define CONFIG_SPL_MMC_SUPPORT
#include "imx6_spl.h"
#endif

由此我们计算下kernel和dtb的安全地址

image / bin

addr beginaddr endsize (bytes)
SPLaddr = 0x400 / sector = 2addr = 0x900035840
u-bootaddr = 11400 / sector = 138addr = 0x64754340820
由此可知,dtb和kernel的位置需要在addr = 0x64754之后,为了方便按照如下直接取整

image / binaddr beginaddr endsize (bytes)
dtbaddr = 0x200000 / sector = 4096addr = 0x20c57450548
kerneladdr = 0x400000 / sector = 8192addr = 0xaea3687250792

可得到如下的定义

/* Falcon Mode - MMC support: args@2MB kernel@4MB */

#define CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS (CONFIG_CMD_SPL_WRITE_SIZE / 512)

现在已经将SPL跳转到kernel所需的所有地址信息全部填充完毕,还记得在最开始的时候,有一个条件选项


在SPL我们是可以选择进入uboot或者是kernel的,当然也可以写死,如果不写死就是要重载该函数spl_start_uboot

该函数在doc/README.falcon有描述

Function that a board must implement
------------------------------------
void spl_board_prepare_for_linux(void) : optional

spl_start_uboot() : required

可在board/freescale/mx6sabresd/mx6sabresd.c文件中重载spl_start_uboot,当前直接写死SPL--> kernel,可手动改为return 0试试结果如何变化

#ifdef CONFIG_SPL_OS_BOOT
int spl_start_uboot(void)
{


}

#endif


kernel 部分

kernel部分非常简单

该开发板对应的defconfig为imx_v6_v7_defconfig

source environment

make imx_v6_v7_defconfig

export LOADADDR=0x10800000

make uImage

得到两个文件uImage和imx6q-sabresd.dtb


制作启动mmc卡

sudo dd if=SPL of=/dev/sdh bs=1k seek=1

sudo dd if=u-boot.img of=/dev/sdh bs=512 seek=138

sudo dd if=imx6q-sabresd.dtb of=/dev/sdh bs=512 seek=4096

sudo dd if=uImage of=/dev/sdh bs=512 seek=8192


未完待续。。。




标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!