u-boot 移植要点
一般厂家直接提供 u-boot 源码,做查看、修改(增加新功能) 或 u-boot 版本升级这三大块的用处;后两种都需要对新板子做适配/移植。
如果没有提供 u-boot 源码,那么就从 u-boot 官方版本中找到一个最相近的板子配置进行移植,这个需要水平较高。
一般把 u-boot 做成对应平台通用的和最小化的,即只保留必要的板级外设初始化代码(如串口、网口和 FLASH 等需要主要做适配,都尽量找能现成使用的),其他更多板级外设初始化在 Linux 移植部分中完成。
如果要深入学习,有以下要点可以参考:
如果芯片公司或者单位提供了移植好的 u-boot,可以用 beyong 软件把移植好的 u-boot 文件夹与 官方原版(版本要一致)进行对比,看一看改动了哪些文件夹和哪些文件,帮助学习。
uboot移植新手入门实践_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili。版本比较新。
-
韦东山 _ 嵌入式Linux _ 第1期与2期间的衔接课程 _ u-boot编译体验和源码深度分析
-
linux-----uboot和kernel移植 - 灰信网
芯片公司、开发板厂家和用户三者之间的联系:
- 芯片公司移植的 u-boot 从一开始是基于官方的 u-boot 拿来修改,添加/修改自家的 EVK 评估版的板子型号、相关外设初始化文件,并修改 u-boot 的 Makefile 配置,然后把自家芯片的 EVK 评估版的硬件原理图、u-boot、Linux 和 根文件系统以及使用说明文档等等全部开源,以供下游做应用的公司/厂家和做开发板的公司拿来做修改或直接应用;
- 做开发板的厂家在拿到了芯片公司提供的芯片评估版 EVK 板子的原理图后,与 SoC 直接相关的比如 PMIC、DDR、FLASH、以太网 PHY 芯片等等不会做大改,一般直接照搬过来画自己的开发板。因为在移植 u-boot 的时候就不用再为新选型的芯片做代码适配,一般没必要做这种费力但效果不大的事情,能直接用的就尽量直接用,能不用改的就尽量不改。然后再拿到芯片公司提供的芯片评估版 EVK 板子对应的 u-boot 源码之后,同样的再添加/修改为自家开发板的型号、添加一点点自己板子的外设初始化代码(这个要求比较高)并修改 Makefile,便得到自家开发板适配的又一个 u-boot;
- 当用户(比如现在的我)拿到了开发板厂家 或者 芯片公司提供的 u-boot 源码,即所有相关文件和初始化代码都写好了,便可以直接编译进而使用,或者自己再进一步定制化。
- 作者:thatway1989
- 链接:https://juejin.cn/post/7385776247600988170
U-boot移植应用开发手册
感兴趣可以看一下这个清华的实验课,讲述了U-Boot的移植过程:https://oscourse-tsinghua.gitbook.io/loongsoncsprj2020-manual/ucore/uboot-yi-zhi-guo-cheng
U-boot移植步骤
参考自**链接**
1. 复制现有板子目录,创建新板子
// 板级目录
xingyanl@yocto:uboot$ cd board/freescale/
// 创建新板子
xingyanl@yocto:uboot$ cp -R mx6sabresd mx6qsensorgw
2. 修改相关文件
2.1 修改Makefile文件
// 修改mx6qsensorgw目录下得到Makefile文件
xingyanl@yocto:mx6qsensorgw$ vi Makefile
xingyanl@yocto:mx6qsensorgw$ cat Makefile
obj-y := mx6qsensorgw.o // 更新内容
2.2 重命名.c文件
// 更改板级c文件
xingyanl@yocto:mx6qsensorgw$ cp mx6sabresd.c mx6qsensorgw.c
2.3 修改Kconfig文件
a) 修改/board/freescale/mx6qsensorgw目录下的Kconfig
xingyanl@yocto:mx6qsensorgw$ vi Kconfig
xingyanl@yocto:mx6qsensorgw$ cat Kconfig
if TARGET_MX6QSENSORGW // 新板子名字
config SYS_BOARD
default "mx6qsensorgw" // 新板子名字
config SYS_VENDOR
default "freescale"
config SYS_CONFIG_NAME
default "mx6qsensorgw" // 新板子名字
endif
b) 修改/arch/arm/cpu/armv7/mx6目录下的Kconfig
// 添加如下内容
xingyanl@yocto:mx6$ vi Kconfig
......
// 添加新板类型
config TARGET_MX6QSENSORGW
bool "Support mx6qsensorgw"
select BOARD_LATE_INIT
select SUPPORT_SPL
select DM
select DM_THERMAL
select BOARD_EARLY_INIT_F
......
// source新板子文件Kconfig文件
source "board/freescale/mx6qsensorgw/Kconfig"
......
2.4 更新include/configs/xxx.h文件
xingyanl@yocto:uboot$ cd include/configs
// copy mx6sabresd.h文件
xingyanl@yocto:configs$ cp mx6sabresd.h mx6qsensorgw.h
// 修改#include "mx6sabre_common.h"为 #include "mx6qsensorgw_common.h"
xingyanl@yocto:configs$ vi mx6qsensorgw.h
#include "mx6qsensorgw_common.h"
// copy mx6sabre_common.h文件
xingyanl@yocto:configs$ cp mx6sabre_common.h mx6qsensorgw_common.h
// 一些宏定义
CONFIG_LOADADDR // ZImage内核会load到这个地址引导
CONFIG_SYS_MALLOC_LEN // Heap内存大小
CONFIG_STACKSIZE // stack的大小
CONFIG_NR_DRAM_BANKS // DDR banks的数量
PHYS_SDRAM_SIZE // DDR的大小,以MB为单位
PHYS_SDRAM // DDR的物理地址
fdt_file // 配置宏定义
"#define CONFIG_DEFAULT_FDT_FILE <customer>.dtb"
// 或者直接修改
"fdt_file=<customer>.dtb"
// Config文件对U-Boot很重要,它决定了u-boot.bin的大小,功能和性能
3. 为新板创建配置文件
xingyanl@yocto:uboot$ cd configs/
xingyanl@yocto:configs$ cp mx6qsabresd_defconfig mx6qsensorgw_defconfig
xingyanl@yocto:configs$ vi mx6qsensorgw_defconfig
// 替换TARGET
# CONFIG_TARGET_MX6SABRESD=y // 删除
CONFIG_TARGET_MX6QSENSORGW=y // 添加
// 更新cfg文件目录,和内存相关配置文件
# CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6sabresd/mx6q_4x_mt41j128.cfg,MX6Q"
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6qsensorgw/mx6q_4x_mt41j128.cfg,MX6Q"
// 更新设备树文件
#CONFIG_DEFAULT_DEVICE_TREE="imx6q-sabresd"
CONFIG_DEFAULT_DEVICE_TREE="imx6q-sensorgw"
4. 为新板子指定设备树文件
// 添加设备树文件
xingyanl@yocto:uboot$ cd arch/arm/dts/
xingyanl@yocto:dts$ cp imx6q-sabresd.dts imx6q-sensorgw.dts
5. 创建u-boot的build脚本
5.1 创建u-boot编译脚本
xingyanl@yocto:uboot$ vi u-boot.sh
#!/bin/bash
export ARCH=arm
# 指定交叉编译器目录---重要
export CROSS_COMPILE=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-
make distclean;
make mx6qsensorgw_defconfig
make
5.2 编译u-boot
// 添加权限
xingyanl@yocto:uboot$ chmod a+x u-boot.sh
// 编译
xingyanl@yocto:uboot$ ./u-boot.sh
适用人员
本文适用于需要使用Uboot的所有人员。
开发环境
Uboot代码编译环境,环境搭建见:快速入门
Siflower开发板测试环境。
相关背景
UBOOT属于bootloader的一种,是用来引导启动系统/内核的。随着客制化的需求越来越多,硬件的差异也越来越多,而不同的硬件需要不同的引导程序,所以就需要适配不同的Uboot,开发对应的Uboot就显得尤为重要。
功能概述
本文介绍了U-boot的结构和使用方法。其中使用方法包括了代码下载,开发,编译,烧录uboot镜像,以及通过uboot更新内核镜像。本文介绍的U-boot包括了uboot-spl和uboot两部分。
U-boot的介绍
SPL
SPL是介于芯片内部rom程序与uboot之间的一个BootLoader,其主要功能为初始化ddr,系统管理器,时钟,以及加载uboot。SPL程序本身需要加载到系统内部ram中运行,是一个轻量级的uboot。
在U-boot开源程序中,本身是包含SPL选项的。Uboot-spl是用Uboot同一套代码,通过CONFIG_SPL_BUILD宏分割编译出的结果。在MPW0和MPW1的测试时,我们采用了Uboot-spl作为Irom与Uboot之间的BootLoader,但FULLMASK版本将芯片内部ram减少到了64KB,不足以同时支持Uboot-spl的rom+ram的需求,因此采用了一份裸机实现的bare_spl。Bare_spl相比于原Uboot-spl更加简单可控,也可以同样实现引导uboot的功能。同时,bare_spl也同时支持mpw0和mpw1芯片,并且减少了存储空间,为flash优化、分区的重新定义提供了支持。
SPL的流程如下(uboot-spl和bare-spl实现主要功能一致):

最低0.47元/天 解锁文章
497

被折叠的 条评论
为什么被折叠?



