iMX8MM u-boot2021.04移植


我移植的板子是讯为i.MX8MM开发板,参考板为官方 8MMINILPD4-EVK开发板。

  1. iMX8MM uboot2021.04 linux5.15.32移植
  2. iMX8MM启动流程
  3. iMX8MM u-boot2021.04移植
  4. iMX8MM linux5.15.32移植
  5. 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.binddr4_imem_1d.binddr4_dmem_2d.binddr4_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
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonboy哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值