[uboot 移植]uboot 移植过程

uboot 移植

本次移植的开发板是基于 imx6ull 的 linux 开发板,开发板名称为 igkboard,因此之后的许多文件都会以此命名,本次移植的 uboot 版本为 lf-5.15.32-2.0.0

1 修改顶层 Makefile

在编译 uboot 时,我们使用的一般命令步骤是,先清除构建,然后配置 uboot,最后执行编译,操作步骤如下
注:最后一行命令,-j 用于指定编译所使用的线程数,如果服务器分配有 n 个核,则 -j 后的参数为 2*n

make ARCH=arm CROSS_COMPILE=/opt/buildroot/cortexA7/bin/arm-linux- distclean
make ARCH=arm CROSS_COMPILE=/opt/buildroot/cortexA7/bin/arm-linux- xxx_defconfig
make ARCH=arm CROSS_COMPILE=/opt/buildroot/cortexA7/bin/arm-linux- -j16

为简化操作我们可以在顶层 Makefile 进行设置,要修改的内容就是目标架构和交叉编译器,在顶层 Makefile 中找到 ARCH 和 CROSS_COMPILE 然后进行如下修改

ARCH = arm
CROSS_COMPILE ?= /opt/buildroot/cortexA7/bin/arm-linux-

这样在我们进行 uboot 编译时,就不需要每次都设定 ARCH 和 CROSS_COMPILE,直接使用如下命令即可

make distclean
make xxx_defconfig
make -j16

2 在 board 文件夹下添加开发板对应的板级文件

先创建文件夹 board/lingyun/igkboard,已知 board 下存放的是不同开发板的定制代码,我们的开发板型号是 imx6ull,因此将 board/freescale/mx6ullevk 文件夹中的内容复制到我们创建的 board/lingyun/igkboard 文件夹中,然后再进行修改
这其中一共有 7 个文件,其中有些文件做小幅修改即可,具体修改如下

2.1 imximage_lpddr2.cfg 和 imximage.cfg 文件

imximage_lpddr2.cfg 和 imximage.cfg 文件,这两个文件用于配置和生成 boot image,其中只有imximage.cfg 需要修改,将 plugin.bin 文件位置改成我们自己创建的文件夹,修改内容如下

#ifdef CONFIG_USE_IMXIMG_PLUGIN
/*PLUGIN    plugin-binary-file    IRAM_FREE_START_ADDR*/
PLUGIN	board/lingyun/igkboard/plugin.bin 0x00907000
#else

2.2 plugin.S 文件

plugin.S 文件内容不需要修改,该文件用于初始化并设置 ddr

2.3 Kconfig 文件

Kconfig 文件,主要用于添加 menuconfig 图形化配置 uboot 时的一些默认值
例如,SYS_CONFIG_NAME 这一个宏,在之后我们会在 /include/configs 下创建自己的头文件 igkboard.h 时,需要在添加 igkboard_defconfig(这个文件在后面会讲到) 中添加 CONFIG_TARGET_LINGYUN_IGKBOARD=y 这一行,这就把我们在 Kconfig 文件中给的默认值包含了进来,在编译 uboot 时,内核会给 SYS_CONFIG_NAME 这个宏添加头和尾,也就是将 igkboard 添加为 configs/igkboard.h 这样在编译时就可以把 igkboard.h 头文件 include 进来编译

if TARGET_LINGYUN_IGKBOARD

config SYS_BOARD
	default "igkboard"

config SYS_VENDOR
	default "lingyun"

config SYS_CONFIG_NAME
	default "igkboard"

config SYS_TEXT_BASE
	default 0x87800000
endif

2.4 igkboard.c 文件

将 mx6ullevk.c 改名为 igkboard.c,该文件作用是初始化电源,串口,网络,lcd 等设备,并且 包含 nand 和 mmc 的相关配置,我们需要修改的只有最后的输出内容

int checkboard(void)
{
	if (is_mx6ull_9x9_evk())
		puts("Board: MX6ULL 9x9 EVK\n");
	else if (is_cpu_type(MXC_CPU_MX6ULZ))
		puts("Board: MX6ULZ 14x14 EVK\n");
	else
		puts("Board: IGKBoard\n\n");

	return 0;
}

2.5 MAINTAINERS 文件

修改 MAINTAINERS 其中主要是添加维护者和开发板的相关信息

LingYun IoT Gateway Board(IGKBoard)
M:	Guo Wenxue <guowenxue@gmail.com>
S:	Maintained
F:	board/lingyun/igkboard/
F:	include/configs/igkboard.h
F:	configs/igkboard_defconfig

2.6 Makefile 文件

修改 Makefile,添加如下内容,目的是将 igkboard.c 编译进内核

# SPDX-License-Identifier: GPL-2.0+
# (C) Copyright 2016 Freescale Semiconductor, Inc.

obj-y  := igkboard.o
obj-y  += ../../freescale/common/mmc.o

3 添加 igkboard_defconfig 配置文件

在 configs 文件夹下,直接将 mx6ull_14x14_evk_emmc_defconfig 复制过来并改名为 igkboard_defconfig,主要是添加一些个性化配置,修改对应开发板的 usb 的厂商 id 和设备 id,并且添加 overlay 配置,添加和修改的内容如下所示

CONFIG_TARGET_LINGYUN_IGKBOARD=y
CONFIG_DEFAULT_DEVICE_TREE="igkboard"
CONFIG_IMX_CONFIG="board/lingyun/igkboard/imximage.cfg"
CONFIG_SYS_PROMPT="[u-boot@igkboard]# "

CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5

CONFIG_OF_LIBFDT_OVERLAY=y

4 添加开发板对应的头文件

主要在 /include/configs/ 文件夹下,添加 igkboard_overlay.h 和 igkboard.h,这两个个文件的功能是用于配置或者裁剪 uboot,因此 igkboard_defconfig 和 igkboard.h 能够同时对 uboot 的编译发挥剪裁和配置作用
igkboard.h 是将 mx6ullevk.h 拷贝过来进行修改的,其中主要是修改了 CONFIG_EXTRA_ENV_SETTINGS 并包含了 igkboard_overlay.h 头文件,CONFIG_EXTRA_ENV_SETTINGS 的作用是设置默认的 uboot 环境变量,uboot 运行起来后使用 env default -a 命令,可以将这些命令加载到 emmc 中,其次是修改防止头文件重复定义的宏名称,具体修改内容如下

#ifndef __IGKBOARD_CONFIG_H
#define __IGKBOARD_CONFIG_H
#include "igkboard_overlay.h"

#define CONFIG_EXTRA_ENV_SETTINGS \
	"env_conf=config.txt\0" \
	"image=zImage\0" \
	"console=ttymxc0\0" \
	"fdt_file=igkboard.dtb\0" \
	"fdt_addr=0x83000000\0" \
	"splashimage=0x8c000000\0" \
    "ipaddr=192.168.2.22\0" \
    "serverip=192.168.2.2\0" \
    "mmcpart=1\0" \
    "mmcargs=setenv bootargs console=${console},${baudrate} root=/dev/mmcblk${mmc_no}p2 rootwait rw net.ifnames=0\0" \
    "loadenvconf=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${env_conf};env import -t ${loadaddr} ${filesize}\0" \
	"loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
	"loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
    "bdtb=tftp $fdt_addr $fdt_file && fatwrite mmc 1:1 $fdt_addr $fdt_file $filesize\0" \
    "bker=tftp $loadaddr $image&& fatwrite mmc 1:1 $loadaddr $image $filesize\0" \
    "bsys=run bdtb && run bker\0" \
	"mmcboot=echo Booting from mmc ...; " \
        "mmc dev ${mmcdev}; " \
		"run mmcargs; run loadenvconf;" \
        "run loadimage; run loadfdt; " \
        "bootz ${loadaddr} - ${fdt_addr}\0" \
    "netboot=echo Booting from net ...; " \
        "tftp $loadaddr $image; tftp $fdt_addr ${fdt_file};" \
        "run mmcargs; " \
        "bootz ${loadaddr} - ${fdt_addr}\0" \
    "upmode=fastboot 0\0" \
    "bbl=tftp ${loadaddr} u-boot-igkboard.imx && mmc dev ${mmcdev} 1 && mmc write ${loadaddr} 2 0x500\0" \
	MMC_FDT_OVERLAY_SETTING \
	"bootcmd=run mmcbootdto\0" \
	"author=linke\0"

igkboar_overlay.h 的内容如下,主要添加了一些在 uboot 运行起来后使用 dt overlay 的指令

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2022 LingYun IoT System Studio
 *
 * Device Tree overlay env for the LingYun IoT Gateway Board.
 */
#ifndef  __IGKBOARD_OVERLAY_H
#define  __IGKBOARD_OVERLAY_H

#if 0
 dtoverlay_xxx is set in uEnv.txt, then load the corresponding dtbo file

 if env exists dtoverlay_lcd && test ${dtoverlay_lcd} = 1 -o ${dtoverlay_lcd} = yes ; then
	dtbo_file=lcd.dtbo;
    echo "Applying DT overlay: $dtbo_file";
	fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file};
	fdt addr ${fdt_addr};
	fdt resize ${fdt_size};
	fdt apply ${dtbo_addr};
 fi;


 if env exists dtoverlay_uart ; then
    for i in ${dtoverlay_uart};
    do
    	dtbo_file=uart$i.dtbo;
        echo "Applying DT overlay: $dtbo_file";
		fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file};
		fdt addr ${fdt_addr};
		fdt apply ${dtbo_addr};
    done;
 fi;

#endif


#define FDT_APPLY_OVERLAY()          \
    "echo Applying DT overlay ==> ${dtbo_file}; " \
	"fatload mmc ${mmcdev}:${mmcpart} ${dtbo_addr} ${dtbo_dir}/${dtbo_file}; " \
	"fdt addr ${fdt_addr}; " \
	"fdt resize ${fdt_size}; " \
	"fdt apply ${dtbo_addr}; "

#define CHECK_APPLY_OVERLAY( name )     \
	"if env exists dtoverlay_" name " && test ${dtoverlay_" name "} = 1 -o ${dtoverlay_" name "} = yes ; then " \
		"setenv dtbo_file " name ".dtbo; " \
		FDT_APPLY_OVERLAY() \
	"fi; "

#define CHECK_APPLY_OVERLAYS_IDX( name )     \
	"if env exists dtoverlay_" name "; then " \
    	"for i in ${dtoverlay_" name "}; do " \
    		"setenv dtbo_file " name "$i.dtbo; " \
			FDT_APPLY_OVERLAY() \
		" done;" \
	"fi; "

#define CHECK_APPLY_OVERLAYS_DTBO( name )     \
	"if env exists dtoverlay_" name "; then " \
    	"for f in ${dtoverlay_" name "}; do " \
    		"setenv dtbo_file $f.dtbo; " \
			FDT_APPLY_OVERLAY() \
		" done;" \
	"fi; "

#define FDT_ENTRY_DEF_SETTINGS          \
				CHECK_APPLY_OVERLAY("lcd") \
				CHECK_APPLY_OVERLAY("cam") \
				CHECK_APPLY_OVERLAY("i2c1") \
				CHECK_APPLY_OVERLAY("spi1") \
				CHECK_APPLY_OVERLAYS_IDX("uart") \
				CHECK_APPLY_OVERLAYS_IDX("can") \
				CHECK_APPLY_OVERLAYS_IDX("pwm") \
				CHECK_APPLY_OVERLAYS_DTBO("extra") \

#define MMC_FDT_OVERLAY_SETTING                  \
	 	"fdt_size=0x10000\0" \
	 	"dtbo_addr=0x83010000\0" \
 		"dtbo_dir=overlays\0" \
        "mmcbootdto=echo Booting from mmc with overlay...; "     \
 				"mmc dev ${mmcdev}; run mmcargs; run loadenvconf; "   \
 				"run loadimage; run loadfdt; "       \
 				FDT_ENTRY_DEF_SETTINGS               \
 				"bootz ${loadaddr} - ${fdt_addr}\0"

#define ENABLE_UENV_FDTO_SUPPORT

#endif

5 修改 Kconfig,为 uboot 添加开发板相关的图形化配置选项

修改 /arch/arm/mach-imx/mx6/Kconfig,为 MX6 系列开发板中添加我们的开发板选项,并且在该 Kconfig 尾部 source 之前在 board/lingyun/igkboard 下创建的 Kconfig,将 igkboard 下的子 Kconfig 信息传递给 mx6 下的 Kconfig,添加信息如下

config TARGET_LINGYUN_IGKBOARD
	bool "LingYun IoT Gateway Kits Board(IGKBoard)"
	depends on MX6ULL
	select BOARD_LATE_INIT
	select DM
	select DM_THERMAL
	select IMX_MODULE_FUSE
	select OF_SYSTEM_SETUP
	imply CMD_DM
	
source "board/lingyun/igkboard/Kconfig"

6 修改适配驱动

修改适配驱动分两步,一是修改与开发板相关的设备树文件,这些文件在文件夹 /arch/arm/boot/dts 文件夹中,其中主要修改 lcd 和 网络部分,二是在设备树文件夹中的 Makefile 中添加我们开发板设备树的编译支持

6.1 创建 igkboard.dts 设备树文件

首先,将 imx6ull-14x14-evk.dts 的内容复制一份,复制成对应我们开发板的设备树文件 igkboard.dts,修改 model 属性,即设备描述信息

// SPDX-License-Identifier: (GPL-2.0 OR MIT)
//
// Copyright (C) 2016 Freescale Semiconductor, Inc.

/dts-v1/;

#include "imx6ull.dtsi"
#include "imx6ul-14x14-evk.dtsi"
#include "imx6ul-14x14-evk-u-boot.dtsi"

/ {
	model = "LingYun IoT Gateway Board";
	compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
};

&clks {
	assigned-clocks = <&clks IMX6UL_CLK_PLL3_PFD2>;
	assigned-clock-rates = <320000000>;
};

6.2 修改 imx6ul-14x14-evk.dtsi 文件

然后,修改 imx6ul-14x14-evk.dtsi,主要修改 lcd 屏幕部分和 eth 网络部分,因为我们希望 uboot 加载内核和设备树的期间屏幕上有显示,并且加载时可以使用 tftp 从网络上加载内核和设备树文件,除此之外,在 uboot 中把所有扩展的 40pin 管脚初始化为 gpio 模式,这样在之后我们可以用 dt overlay 动态改变管脚的工作模式

6.2.1 修改 lcd 设备树

在这里插入图片描述

如图,我们可以看出 igkboard 的 lcd 使用的像素格式为 RGB565,位深为 16 位,因此修改 pinctrl_lcdif_dat 如下

	pinctrl_lcdif_dat: lcdifdatgrp {
		fsl,pins = <
			MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79
			MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79
			MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79
			MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79
			MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79
			MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79
			MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79
			MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79
			MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79
			MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79
			MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79
			MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79
			MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79
			MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79
			MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79
			MX6UL_PAD_LCD_DATA15__LCDIF_DATA15  0x79
		>;
	};

然后,根据自己屏幕的参数,修改对应参数信息即可,这些参数需要查阅 lcd 对应的 datasheet

&lcdif {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_lcdif_dat
		     &pinctrl_lcdif_ctrl>;

	display = <&display0>;
	status = "okay";

	display0: display@0 {
		bits-per-pixel = <16>;
		bus-width = <16>;

		display-timings {
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <30000000>;
			hactive = <800>;
			vactive = <480>;
			hfront-porch = <40>;
			hback-porch = <88>;
			hsync-len = <48>;
			vback-porch = <32>;
			vfront-porch = <13>;
			vsync-len = <3>;

			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <0>;
			};
		};
	};
};
6.2.2 修改网络相关设备树

网络部分,主要是添加了 phy 复位管脚和 phy 复位的相关属性,以及修改了 phy 器件地址
在这里插入图片描述
在这里插入图片描述

如图可以看到 ENET1 和 ENET2 的原理图,需要关注的点有两个,一个是两个网卡的 phy 器件地址分别为 0x0 和 0x1,其次是关注左上角的复位电路,我们可以得知 ENET1 的复位引脚为 MX6UL_PAD_SNVS_TAMPER7_GPIO5_IO07,ENET2 的复位引脚为 MX6UL_PAD_SNVS_TAMPER4_GPIO5_IO04,因此我们在设备树文件中做出如下修改
注:phy-reset-gpios 用于确定 phy 芯片的复位引脚,phy-reset-duration 和 phy-reset-post-delay 是用来延时复位引脚的状态
首先在 pinctrl_enet1 和 pinctrl_enet2 添加复位引脚,添加之前需要检查设备树中有没有其他位置用到 GPIO5_IO07 和 GPIO5_IO04,如果有删掉即可

	pinctrl_enet1: enet1grp {
		fsl,pins = <
			MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN	0x1b0b0
			MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER	0x1b0b0
			MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00	0x1b0b0
			MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01	0x1b0b0
			MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN	0x1b0b0
			MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00	0x1b0b0
			MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01	0x1b0b0
			MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1	0x4001b031
			MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 /* ENET1 RESET */
		>;
	};

	pinctrl_enet2: enet2grp {
		fsl,pins = <
			MX6UL_PAD_GPIO1_IO07__ENET2_MDC		0x1b0b0
			MX6UL_PAD_GPIO1_IO06__ENET2_MDIO	0x1b0b0
			MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN	0x1b0b0
			MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER	0x1b0b0
			MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00	0x1b0b0
			MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01	0x1b0b0
			MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN	0x1b0b0
			MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00	0x1b0b0
			MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01	0x1b0b0
			MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2	0x4001b031
			MX6UL_PAD_SNVS_TAMPER4__GPIO5_IO04	0x10B0 /* ENET2 RESET */
		>;
	};

然后,修改 phy 器件地址,添加复位管脚和复位属性

&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <50>;
	phy-reset-post-delay = <15>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-reset-gpios = <&gpio5 4 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <50>;
	phy-reset-post-delay = <15>;
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@0 {
			reg = <0>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET_REF>;
			clock-names = "rmii-ref";
		};

		ethphy1: ethernet-phy@1 {
			reg = <1>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET2_REF>;
			clock-names = "rmii-ref";
		};
	};
};

最后,在 /drivers/net/phy/phy.c 中添加复位代码,添加 phy_reset(phydev) 即可

int genphy_config_aneg(struct phy_device *phydev)
{
	int result;

	phy_reset(phydev);

	if (phydev->autoneg != AUTONEG_ENABLE)
		return genphy_setup_forced(phydev);

	result = genphy_config_advert(phydev);

	if (result < 0) /* error */
		return result;

	if (result == 0) {
		/*
		 * Advertisment hasn't changed, but maybe aneg was never on to
		 * begin with?  Or maybe phy was isolated?
		 */
		int ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);

		if (ctl < 0)
			return ctl;

		if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
			result = 1; /* do restart aneg */
	}

	/*
	 * Only restart aneg if we are advertising something different
	 * than we were before.
	 */
	if (result > 0)
		result = genphy_restart_aneg(phydev);

	return result;
}
6.2.3 修改其他 40pin 管脚默认工作模式

把所有扩展的 40pin 管脚初始化为 gpio 模式,这有利于之后 dt overlay 的使用

&iomuxc {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_extgpio>;

	pinctrl_extgpio: extgpiogrp {
		fsl,pins = <
			MX6UL_PAD_GPIO1_IO03__GPIO1_IO03	0x17059 /* 3# I2C1_SDA */
			MX6UL_PAD_GPIO1_IO02__GPIO1_IO02	0x17059 /* 5# I2C1_SCL */
			MX6UL_PAD_UART1_CTS_B__GPIO1_IO18	0x17059 /* 7#	GPIO */
			MX6UL_PAD_UART3_TX_DATA__GPIO1_IO24 0x17059 /* 11# UART3_TX */
			MX6UL_PAD_UART4_TX_DATA__GPIO1_IO28 0x17059 /* 13# UART4_TX */
			MX6UL_PAD_UART4_RX_DATA__GPIO1_IO29 0x17059 /* 15# UART4_RX */
			MX6UL_PAD_LCD_DATA22__GPIO3_IO27	0x17059 /* 19# SPI1_MOSI*/
			MX6UL_PAD_LCD_DATA23__GPIO3_IO28	0x17059 /* 21# SPI1_MISO*/
			MX6UL_PAD_LCD_DATA20__GPIO3_IO25	0x17059 /* 23# SPI1_SCLK*/
			MX6UL_PAD_UART3_CTS_B__GPIO1_IO26	0x17059 /* 27# CAN1_TX */
			MX6UL_PAD_UART3_RTS_B__GPIO1_IO27	0x17059 /* 29# CAN1_RX */
			MX6UL_PAD_UART2_CTS_B__GPIO1_IO22	0x17059 /* 31# CAN2_TX */
			MX6UL_PAD_UART2_RTS_B__GPIO1_IO23	0x17059 /* 33# CAN2_RX */
			MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01	0x17059 /* 35#	GPIO */
			MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08	0x17059 /* 37#	GPIO */
			MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0x17059 /* 8# UART2_TX */
			MX6UL_PAD_UART2_RX_DATA__GPIO1_IO21 0x17059 /* 10# UART2_RX */
			MX6UL_PAD_UART3_RX_DATA__GPIO1_IO25 0x17059 /* 12# UART3_RX */
			MX6UL_PAD_LCD_DATA16__GPIO3_IO21	0x17059 /* 16# UART7_TX */
			MX6UL_PAD_LCD_DATA17__GPIO3_IO22	0x17059 /* 18# UART7_RX */
			MX6UL_PAD_LCD_DATA18__GPIO3_IO23	0x17059 /* 22# GPIO */
			MX6UL_PAD_LCD_DATA21__GPIO3_IO26	0x17059 /* 24# SPI1_SS0 */
			MX6UL_PAD_LCD_DATA19__GPIO3_IO24	0x17059 /* 26# GPIO */
			MX6UL_PAD_JTAG_TRST_B__GPIO1_IO15	0x17059 /* 28# PWM8 */
			MX6UL_PAD_JTAG_TCK__GPIO1_IO14		0x17059 /* 32# PWM7 */
			MX6UL_PAD_JTAG_TMS__GPIO1_IO11		0x17059 /* 36# GPIO */
			MX6UL_PAD_JTAG_MOD__GPIO1_IO10		0x17059 /* 38# GPIO */
			MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09	0x17059 /* 40# GPIO */
		>;
	};
};

6.3 修改设备树 Makefile 文件

最后,在设备树文件夹中的 Makefile 最后添加我们开发板设备树的编译支持

dtb-$(CONFIG_MX6ULL) += \
	igkboard.dtb \
	imx6ull-14x14-ddr3-val.dtb \
	imx6ull-14x14-ddr3-val-epdc.dtb \

7 编译并测试 uboot

7.1 uboot 编译

使用之前提到的命令编译 uboot

make distclean
make igkboard_defconfig
make -j16

编译完成后,可以在 uboot 文件夹下看到如下文件

文件功能
u-boot编译出来的 ELF 格式的 uboot 镜像文件
u-boot.bin编译出来的二进制格式的 uboot 可执行镜像文件
u-boot.imxu-boot.bin 添加头部信息以后的文件, NXP 的 cpu 专用文件

因此,我们把 uboot.imx 通过 sd 卡,usb 等方式烧录到开发板即可,烧录成功以后,启动开发板可以看到如下信息

U-Boot 2022.04 (Jul 25 2022 - 00:43:45 -0700)

CPU:   i.MX6ULL rev1.1 528 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 51C
Reset cause: POR
Model: LingYun IoT Gateway Board
Board: IGKBoard

DRAM:  512 MiB
Core:  65 devices, 17 uclasses, devicetree: separate
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
[*]-Video Link 0 (800 x 480)
        [0] lcdif@21c8000, video
In:    serial
Out:   serial
Err:   serial
flash target is MMC:1
Net:   eth1: ethernet@20b4000 [PRIME]Get shared mii bus on ethernet@2188000
, eth0: ethernet@2188000
Fastboot: Normal
Normal Boot

7.2 uboot 测试

7.2.1 测试网络

用网线连接开发板的网口和 pc 机,然后在开发板上使用如下命令设置 ipaddr 和 serverip
其中,ipaddr 是开发板的 ip 地址,serverip 是 pc 机的 ip 地址

setenv ipaddr 192.168.10.101
setenv serverip 192.168.10.100
saveenv

然后,用开发板 ping pc 机的 ip地址

=> ping 192.168.10.100
Using ethernet@20b4000 device
host 192.168.10.100 is alive

如果出现上图的现象,说明网络测试成功

7.2.2 测试 usb

使用 usb start 和 usb info 可查看到如下信息,还可以使用 fastboot 0 命令,重新烧录 uboot 测试 usb 功能

=> usb start
starting USB...
Bus usb@2184000: Port not available.
Bus usb@2184200: USB EHCI 1.00
scanning bus usb@2184200 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
=> usb info
1: Hub,  USB Revision 2.0
 - u-boot EHCI Host Controller 
 - Class: Hub
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x0000  Product 0x0000 Version 1.0
   Configuration: 1
   - Interfaces: 1 Self Powered 0mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms

2: Hub,  USB Revision 2.0
 - Class: Hub
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x0424  Product 0x2514 Version 11.179
   Configuration: 1
   - Interfaces: 1 Self Powered Remote Wakeup 2mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms
     - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms

3: Vendor specific,  USB Revision 2.0
 - Realtek 802.11n 0095698F95C7
 - Class: (from Interface) Vendor specific
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x0bda  Product 0xf179 Version 0.0
   Configuration: 1
   - Interfaces: 1 Bus Powered Remote Wakeup 500mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 3
     - Class Vendor specific
     - Endpoint 1 In Bulk MaxPacket 512
     - Endpoint 2 Out Bulk MaxPacket 512
     - Endpoint 3 Out Bulk MaxPacket 512
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值