目录

在mac上为imx6ull-s1-pro移植uboot

最近买了一块野火的imx6ull开发板,发现野火官方的文档写得真的一塌糊涂,如果跟着官方官方文档去做,大概率是做不出来的,于是就写这个操作文档记录一下。

前提说明

本机信息

系统:macOS 13.5.1
处理器:Apple M1 Pro
Make: GNU Make 3.81

关于跨平台gcc版本

刚入门的时候面对这么多gcc编译工具应该怎么选呢?其实是有规律的,比如我们用到的arm-none-eabi-gcc

  • arm:代表处理器架构,还有aarch64、risc等
  • none:这里代表没有特殊的平台,也就是说目标是什么平台都可以,一般用于驱动等底层的编译,常见的有arm-linux-abi-gcc等,这个就是为了编译linux应用的
  • eabi:嵌入式、裸驱动
  • gcc:工具

依赖安装

gcc

brew install arm-none-eabi-gcc

uboot工具

brew install u-boot-tools

dpkg工具

brew install dpkg-buildpackage

其他依赖

breew install lzop flex buildkit

代码下载

下载 野火uboot仓库:

git clone -b ebf_v2020_10_imx https://github.com/Embedfire/ebf_linux_uboot.git

下载 NXP官方代码

git clone -b u-boot-2021.10-rc4  https://github.com/Freescale/u-boot-fslc.git

ebf_v2020_10_imx 为野火提供imx6ull-s1-pro的最新uboot代码,我们将从这份代码里面移植一些驱动、配置文件到最新的NXP提供的uboot源码中。

下载好代码后,我们可以将两个文件夹放在同一级目录,如下,cd到upgrade_uboot目录中,这样可以方便后续操作的cv[手动狗头]

|---> upgrade_uboot
	|----> u-boot-2021.10-rc4
	|----> ebf_linux_uboot

移植说明

要移植什么文件以及修改什么文件,都是来源于野火官方的uboot移植教程

移植NXP驱动

复制configs中的头文件

这里面包含了uboot的环境参数和配置信息

cp ebf_linux_uboot/include/configs/mx6ullfire.h  u-boot-2021.10-rc4/include/configs/

复制开发板的编译配置文件

cp ebf_linux_uboot/configs/mx6ull_fire_*  u-boot-2021.10-rc4/configs/

移植freescale

cp -rf ebf_linux_uboot/board/freescale/mx6ullfire u-boot-2021.10-rc4/board/freescale/

这里要dis一下,野火官方的命令是这样的:cp -rf ebf_linux_uboot/board/freescale/mx6ullfire/ u-boot-2021.10-rc4/board/freescale/,能看出有什么问题不

移植dtoverlay

cp ebf_linux_uboot/dtoverlay/* u-boot-2021.10-rc4/dtoverlay/

修改imx处理器的Kconfig文件

打开 u-boot-2021.10-rc4/arch/arm/mach-imx/mx6/Kconfig 文件,在 config TARGET_MX6ULL_14X14_EVK 代码块下添加以下代码:

config TARGET_MX6ULL_FIRE
	bool "Support mx6ullfire"
	depends on MX6ULL
	select BOARD_LATE_INIT
	select DM
	select DM_THERMAL
	imply CMD_DM

以上配置项定义了一个名为TARGET_MX6ULL_FIRE的目标设备,用于指定是否支持MX6ULL_FIRE开发板。

添加配置选项

打开 u-boot-2021.10-rc4/arch/arm/mach-imx/mx6/Kconfig 文件,在 source “board/freescale/mx6ullevk/Kconfig” 下一行添加以下代码:

source "board/freescale/mx6ullfire/Kconfig"

将MX6ULL-FIRE开发板的配置选项包含到上层Kconfig文件中,即可调用mx6ullfire中的Kconfig进行配置。

添加设备树信息

打开 u-boot-2021.10-rc4/arch/arm/dts/Makefile 文件,修改 dtb-$(CONFIG_MX6ULL) += 代码块为:

dtb-$(CONFIG_MX6ULL) += \
      imx6ull-14x14-evk.dtb \
      imx6ull-fire-mmc.dtb \
      imx6ull-fire-nand.dtb \
      imx6ull-colibri.dtb \
      imx6ull-myir-mys-6ulx-eval.dtb \
      imx6ull-phytec-segin-ff-rdk-emmc.dtb \
      imx6ull-dart-6ul.dtb \
      imx6ull-somlabs-visionsom.dtb \
      imx6ulz-14x14-evk.dtb

主要是将 imx6ull-fire-mmc.dtb \imx6ull-fire-nand.dtb \ 加入代码块中。

复制设备源码

将野火emmc版本和nand版本的设备树都复制到新版本uboot。

cp ebf_linux_uboot/arch/arm/dts/imx6ull-fire-* u-boot-2021.10-rc4/arch/arm/dts/

修改板卡soc文件

打开 u-boot-2021.10-rc4/arch/arm/mach-imx/mx6/soc.c 文件,在这个文件的最上面添加一行:

#include <asm/setup.h>

在这个文件的最后一行添加代码块:

#ifdef CONFIG_SERIAL_TAG
void get_board_serial(struct tag_serialnr *serialnr)
{
	struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
	struct fuse_bank *bank = &ocotp->bank[0];
	struct fuse_bank0_regs *fuse = (struct fuse_bank0_regs *)bank->fuse_regs;
	serialnr->low = fuse->uid_low;
	serialnr->high = fuse->uid_high;
}
#endif

以上是一个获取板级信息的函数,该函数使用了SoC内部的OTP存储器,读取存储在OTP中的唯一设备标识符UID,并将其保存到Linux内核启动参数中的struct tag_serialnr结构体中,使其成为内核启动参数之一。

移植野火驱动

设备树插件配置

cp -rf ebf_linux_uboot/cmd/dtfile.c u-boot-2021.10-rc4/cmd/
cp -rf ebf_linux_uboot/include/dtoverlay.h u-boot-2021.10-rc4/include/

dtfile.c 用于实现uboot命令dtfile。该命令用于在uboot中加载并解析设备树文件,并将其显示输出或保存到指定的文件中。
dtoverlay.h 用于定义设备树相关的数据结构和函数声明。

修改cmd的makedown

打开 u-boot-2021.10-rc4/cmd/Makefile 文件,在 obj-$(CONFIG_CMD_FDT) += fdt.o 下面添加一行:

obj-$(CONFIG_OF_LIBFDT) += dtfile.o

配置uuid

cp -rf ebf_linux_uboot/include/init.h u-boot-2021.10-rc4/include/
cp  -rf ebf_linux_uboot/common/board_r.c u-boot-2021.10-rc4/common/board_r.c

init.h 用于声明uboot启动过程中的初始化函数和数据结构。
board_r.c 包含一些通用的板级初始化函数和一些通用的工具函数,可以用于不同的硬件平台。

修改入口makefile

打开 u-boot-2021.10-rc4/Makefile 文件,在 libs-y += env/ 代码下添加一行代码:

libs-y += dtoverlay/

至此,所有的文件已经移植完成

编译

cd u-boot-2021.10-rc4
make distclean
make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_mmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-eabi- HOSTCFLAGS="-I/opt/homebrew/opt/openssl/include/" HOSTLDFLAGS="-L/opt/homebrew/opt/openssl/lib/" -j12

如果在编译过程中报错了,可以看看下面有没有相应的解决方法。

错误处理

Makefile:40: *** missing separator. Stop.

去到Makefile文件第40行看一下,有个undefine关键字,但是这个版本的make可能不支持,直接注释掉就好了

......
#undefine MK_ARCH
......

error: unknown type name ‘uXX’

在报错的文件加入引用

#include <asm-generic/int-ll64.h>

Unable to find the ncurses package.

安装ncurses

brew install ncurses

找到你电脑上的ncurses的include路径

brew info ncurses

会显示如下

For compilers to find ncurses you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

修改 script/kconfig/mconf-cfg.sh 文件,加入以下代码(注意与上面查处的结果对应):

if [ -f /opt/homebrew/opt/ncurses/include/ncurses.h ]; then
	echo cflags=\"-D_GNU_SOURCE -I/opt/homebrew/opt/ncurses/include\"
	echo libs=\"-lncurses\"
	exit 0
fi

./tools/mkimage 语法错误

这个是因为源码所提供的mkimage工具与我们的系统不兼容,全局搜索tools/mkimage有关字眼,直接替换成mkimage