在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