iMX8MM u-boot2021.04移植
我移植的板子是讯为i.MX8MM开发板,参考板为官方 8MMINILPD4-EVK开发板。
- iMX8MM uboot2021.04 linux5.15.32移植
- iMX8MM启动流程
- iMX8MM u-boot2021.04移植
- iMX8MM linux5.15.32移植
- iMX8MM buildroot-2022.02.5构建根文件系统
1. 添加板子
进入我们下载好的源码目录,需要复制每个板子特有的一些文件,添加完板子板级文件一般就不会修改了,主要是修改设备树和配置文件。这里直接修改完这些文件,基本都是将evk改为topeet,不做过多解释。
1.1 添加配置文件
添加配置文件我们只需要复制 i.MX8MM EVK的默认配置文件,在源码目录下执行下列命令创建我们自己板子的配置文件。
$ cd configs/
$ cp imx8mm_evk_defconfig imx8mm_topeet_defconfig
修改configs/imx8mm_topeet_defconfig文件
# configs/imx8mm_topeet_defconfig
CONFIG_TARGET_IMX8MM_EVK=y
# 改为
CONFIG_TARGET_IMX8MM_TOPEET=y
CONFIG_DEFAULT_DEVICE_TREE="imx8mm-evk"
# 改为
CONFIG_DEFAULT_DEVICE_TREE="imx8mm-topeet"
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage-8mm-lpddr4.cfg"
# 改为,我们的开发板使用的是ddr4
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage-8mm-ddr4.cfg"
CONFIG_DEFAULT_FDT_FILE="imx8mm-evk.dtb"
# 改为
CONFIG_DEFAULT_FDT_FILE="imx8mm-topeet.dtb"
1.2 添加板级文件
同样复制参考板的板级文件,在源码目录下执行下列命令创建我们自己板子的板级文件。
$ cd include/configs/
$ cp imx8mm_evk.h imx8mm_topeet.h
$ cd ../../board/freescale/
$ cp -r imx8mm_evk imx8mm_topeet
$ cd imx8mm_topeet/
$ mv imx8mm_evk.c imx8mm_topeet.c
$ rm lpddr4_timing_4g.c lpddr4_timing.c
修改include/configs/imx8mm_topeet.h文件
// include/configs/imx8mm_topeet.h
#ifndef __IMX8MM_EVK_H
#define __IMX8MM_EVK_H
// 改为
#ifndef __IMX8MM_TOPEET_H
#define __IMX8MM_TOPEET_H
/* 删除注释代码,我们的开发板用的是PCA9450电源管理芯片,所以不考虑别的情况
#if defined(CONFIG_IMX8M_LPDDR4) && defined(CONFIG_TARGET_IMX8MM_EVK)
*/
#define CONFIG_POWER_PCA9450
/* 删除注释代码
#else
#define CONFIG_POWER_BD71837
#endif
*/
#define JH_ROOT_DTB "imx8mm-evk-root.dtb"
// 改为
#define JH_ROOT_DTB "imx8mm-topeet-root.dtb"
/* 删除注释代码,1为SD卡启动,2为EMMC启动,我们采用手动配置EMMC启动
#ifdef CONFIG_TARGET_IMX8MM_DDR4_EVK
#define CONFIG_SYS_FSL_USDHC_NUM 1
#else
*/
#define CONFIG_SYS_FSL_USDHC_NUM 2
/* 删除注释代码
#endif
*/
#include "imx8mm_evk_android.h"
// 改为
#include "imx8mm_topeet_android.h"
修改board/freescale/imx8mm_topeet/imx8mm_topeet.c文件
// board/freescale/imx8mm_topeet/imx8mm_topeet.c
// 下面函数修改为,将EVK改为TOPEET
int board_late_init(void)
{
/* 此处代码省略 */
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
env_set("board_name", "TOPEET");
env_set("board_rev", "iMX8MM");
#endif
return 0;
}
修改board/freescale/imx8mm_topeet/Kconfig文件为
if TARGET_IMX8MM_TOPEET
config SYS_BOARD
default "imx8mm_topeet"
config SYS_VENDOR
default "freescale"
config SYS_CONFIG_NAME
default "imx8mm_topeet"
config IMX8M_1G_MEMORY
bool "imx8m 1GB memory size"
source "board/freescale/common/Kconfig"
endif
修改board/freescale/imx8mm_topeet/MAINTAINERS文件为
i.MX8MM TOPEET BOARD
M: Peng Fan <peng.fan@nxp.com>
S: Maintained
F: board/freescale/imx8mm_topeet/
F: include/configs/imx8mm_topeet.h
F: configs/imx8mm_topeet_defconfig
修改board/freescale/imx8mm_topeet/Makefile文件为
#
# Copyright 2018 NXP
#
# SPDX-License-Identifier: GPL-2.0+
#
obj-y += imx8mm_topeet.o
ifdef CONFIG_SPL_BUILD
obj-y += spl.o
obj-$(CONFIG_IMX8M_DDR4) += ddr4_timing.o
endif
修改arch/arm/mach-imx/imx8m/Kconfig文件
config TARGET_PHYCORE_IMX8MP
bool "PHYTEC PHYCORE i.MX8MP"
select IMX8MP
select SUPPORT_SPL
select IMX8M_LPDDR4
# 在这里添加下面代码
config TARGET_IMX8MM_TOPEET
bool "imx8mm DDR4 TOPEET board"
select IMX8MM
select SUPPORT_SPL
select IMX8M_DDR4
select FSL_CAAM
select FSL_BLOB
select MISC
select SPL_CRYPTO_SUPPORT if SPL
# 在最后endif上面添加下面一行
source "board/freescale/imx8mm_topeet/Kconfig"
1.3 添加设备树文件
复制参考板的设备树文件,在源码目录下执行下列命令创建我们自己板子的设备树文件。
$ cd arch/arm/dts/
$ cp imx8mm-evk.dts imx8mm-topeet.dts
$ cp imx8mm-evk.dtsi imx8mm-topeet.dtsi
$ cp imx8mm-evk-u-boot.dtsi imx8mm-topeet-u-boot.dtsi
修改arch/arm/dts/imx8mm-topeet.dts文件
// 文件arch/arm/dts/imx8mm-topeet.dts
#include "imx8mm-evk.dtsi"
// 改为
#include "imx8mm-topeet.dtsi"
//根节点下的这两个属性改为
/ {
model = "NXP i.MX8MM TOPEET board";
compatible = "fsl,imx8mm-topeet", "fsl,imx8mm";
};
修改arch/arm/dts/Makefile文件
dtb-$(CONFIG_ARCH_IMX8M) += \
# 此处代码省略
imx8mn-ab2.dtb \
#添加我们的板子
imx8mm-topeet.dtb
2. 修改设备树
添加完板子之后对uboot的修改主要就是修改设备树,源码基本不需要修改。
2.1 修改DDR
官方开发板和我们开发板最大的不同就是DDR类型的不同,官方开发板使用的是LPDDR4我们开发版使用的是DDR4,上面我们修改了配置文件中的CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage-8mm-ddr4.cfg"
参数就完成了修改。
2.2 修改网卡
讯为i.MX8MM开发板使用的phy芯片和官方iMX8MM EVK开发板是同系列,只有设计上略有不同。讯为i.MX8MM开发板的phy芯片复位引脚接到了GPIO2_IO10上,所以要对phy配置复位引脚。
// 文件arch/arm/dts/imx8mm-topeet.dtsi
&fec1 {
mdio {
ethphy0: ethernet-phy@0 {
// 更改reset引脚属性
reset-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
};
};
};
&iomuxc {
pinctrl_fec1: fec1grp {
fsl,pins = <
/* MX8MM_IOMUXC_SAI2_RXC_GPIO4_IO22 0x19 */
MX8MM_IOMUXC_SD1_RESET_B_GPIO2_IO10 0x19
>;
};
};
2.3 修改SD卡
讯为i.MX8MM开发板和官方iMX8MM EVK开发板SD卡,只有SD2_DET引脚不同。讯为i.MX8MM开发板SD2_DET引脚接到了GPIO2_IO12上,所以要对SD配置CD引脚。
// 文件arch/arm/dts/imx8mm-topeet.dtsi
&usdhc2 {
// 更改cd引脚属性
cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
};
&iomuxc {
pinctrl_usdhc2_gpio: usdhc2grpgpiogrp {
fsl,pins = <
/* MX8MM_IOMUXC_GPIO1_IO15_GPIO1_IO15 0x1c4 */
MX8MM_IOMUXC_SD2_CD_B_GPIO2_IO12 0x1c4
>;
};
};
2.4 关闭屏幕和TypeC
因为我没有屏幕,所以需要失能屏幕。
// 文件arch/arm/dts/imx8mm-topeet.dtsi
&lcdif {
status = "disabled";
};
&mipi_dsi {
status = "disabled";
};
板子没有TypeC接口,直接关闭。
# configs/imx8mm_topeet_defconfig
CONFIG_USB_TCPC=y
# 改为
CONFIG_USB_TCPC=n
3. 编译下载
编译uboot前我们需要先编译ATF,下载uboot编译所需的文件。文章uboot的编译目录,为uboot源码的根目录。
3.1 编译ATF
进入下载好的ATF源码目录,执行下列命令完成编译。
$ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=imx8mm bl31
编译完成可以看到在build/imx8mm/release
下生成了我们需要的bl31.bin
文件,将这个文件复制到uboot的编译目录下。
3.2 下载firmware-imx
执行下面命令,下载firmware-imx,获取权限并执行获取所需文件。
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.9.bin
$ chmod +x firmware-imx-8.9.bin
$ ./firmware-imx-8.9.bin
进入firmware-imx-8.9/firmware/ddr/synopsys
目录,将ddr4_dmem_1d.bin
、ddr4_imem_1d.bin
、ddr4_dmem_2d.bin
和ddr4_imem_2d.bin
四个文件复制到uboot的编译目录下。
3.3 编译uboot
进入uboot源码目录,确保编译所需文件都已复制。
执行下列命令,完成编译。
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- imx8mm_topeet_defconfig
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- menuconfig
$ make ARCH=arm CROSS_COMPILE=aarch64-linux-gnu- ATF_LOAD_ADDR=0x920000 flash.bin -j12
编译完成,生成flash.bin
是带有IVT的,可以烧写。
3.4 下载验证
使用uuu启动uboot,将拨码开关拨到串行下载模式,连接好串口和OTG。执行$ sudo uuu -b emmc flash.bin
命令,进行下载。(注意:下载到SD卡使用$ sudo uuu -b sd flash.bin
,但是CONFIG_SYS_FSL_USDHC_NUM得选择SD卡启动)
下载完成后,设置启动方式从EMMC启动,重启开发板。
将网线连接到路由器上,执行dhcp命令获取ip地址,并ping服务器测试网络正常。
4. 总结
uboot移植添加了很多板级文件,这些都不是重要的(其他芯片可能没有这些)。修改设备树是移植的重中之重,但是讯为i.MX8MM开发板和官方EVK开发板比较接近,所以修改比较简单。本文仅供学习参考,如有问题欢迎指正。
移植源码获取:
git clone https://github.com/Sonboy97/uboot.git -b imx
版本:b1a78b672f6c1c2cc11de62f0e39ba06758567d8