文章目录

  • uboot 移植
    • 1 修改顶层 Makefile
    • 2 在 board 文件夹下添加开发板对应的板级文件
      • 2.1 imximage_lpddr2.cfg 和 imximage.cfg 文件
      • 2.2 plugin.S 文件
      • 2.3 Kconfig 文件
      • 2.4 igkboard.c 文件
      • 2.5 MAINTAINERS 文件
      • 2.6 Makefile 文件
    • 3 添加 igkboard_defconfig 配置文件
    • 4 添加开发板对应的头文件
    • 5 修改 Kconfig,为 uboot 添加开发板相关的图形化配置选项
    • 6 修改适配驱动
      • 6.1 创建 igkboard.dts 设备树文件
      • 6.2 修改 imx6ul-14x14-evk.dtsi 文件
        • 6.2.1 修改 lcd 设备树
        • 6.2.2 修改网络相关设备树
        • 6.2.3 修改其他 40pin 管脚默认工作模式
      • 6.3 修改设备树 Makefile 文件
    • 7 编译并测试 uboot
      • 7.1 uboot 编译
      • 7.2 uboot 测试
        • 7.2.1 测试网络
        • 7.2.2 测试 usb

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_IGKBOARDconfig SYS_BOARDdefault "igkboard"config SYS_VENDORdefault "lingyun"config SYS_CONFIG_NAMEdefault "igkboard"config SYS_TEXT_BASEdefault 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");elseputs("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=0xa4a5CONFIG_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 0dtoverlay_xxx is set in uEnv.txt, then load the corresponding dtbo fileif env exists dtoverlay_lcd && test ${dtoverlay_lcd} = 1 -o ${dtoverlay_lcd} = yes ; thendtbo_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 ; thenfor i in ${dtoverlay_uart};dodtbo_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_IGKBOARDbool "LingYun IoT Gateway Kits Board(IGKBoard)"depends on MX6ULLselect BOARD_LATE_INITselect DMselect DM_THERMALselect IMX_MODULE_FUSEselect OF_SYSTEM_SETUPimply CMD_DMsource "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 设备树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJYEDF96-1660642402386)(.\image\lcd.png)]

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

 pinctrl_lcdif_dat: lcdifdatgrp {fsl,pins = <MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79MX6UL_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 器件地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-upfLR85d-1660642402389)(.\image\eth1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFU4ciwM-1660642402390)(.\image\eth2.png)]

如图可以看到 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 0x1b0b0MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER   0x1b0b0MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00  0x1b0b0MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01  0x1b0b0MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN   0x1b0b0MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00  0x1b0b0MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01  0x1b0b0MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1   0x4001b031MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0 /* ENET1 RESET */>;};pinctrl_enet2: enet2grp {fsl,pins = <MX6UL_PAD_GPIO1_IO07__ENET2_MDC        0x1b0b0MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN   0x1b0b0MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER   0x1b0b0MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00  0x1b0b0MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01  0x1b0b0MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN   0x1b0b0MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00  0x1b0b0MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01  0x1b0b0MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2   0x4001b031MX6UL_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.imx u-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: IGKBoardDRAM:  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) foundscanning 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.0Configuration: 1- Interfaces: 1 Self Powered 0mAInterface: 0- Alternate Setting 0, Endpoints: 1- Class Hub- Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms2: Hub,  USB Revision 2.0- Class: Hub- PacketSize: 64  Configurations: 1- Vendor: 0x0424  Product 0x2514 Version 11.179Configuration: 1- Interfaces: 1 Self Powered Remote Wakeup 2mAInterface: 0- Alternate Setting 0, Endpoints: 1- Class Hub- Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms- Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms3: 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.0Configuration: 1- Interfaces: 1 Bus Powered Remote Wakeup 500mAInterface: 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

[uboot 移植]uboot 移植过程相关推荐

  1. U-Boot移植教程之一:U-Boot分析与启动过程

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.Bootloader的引出 当系统上电时,并不是直接进入Linux系统的,而是需要先执行一段程序来把单片机的硬件外围初始化好,比如 ...

  2. U-Boot 之三 U-Boot 源码文件解析及移植过程详解

      在之前的博文 Linux 之八 完整嵌入式 Linux 环境介绍及搭建说明 中我们说了要一步步搭建整个嵌入式 Linux 运行环境.我所使用的硬件平台及整个要搭建的嵌入式 Linux 环境见博文 ...

  3. 2.4.U-Boot配置和编译过程详解-U-Boot和系统移植第4部分视频课程笔记

    目录 2.uboot 主Makefile分析 2.1.Makefile 分析2 2.2.Makefile 分析3 2.3.Makefile 分析4 2.4.链接脚本的定义 2.5.指定链接地址 如果T ...

  4. 移植uboot之修改代码支持NorFlash记录续集二

    先说一个事:我会在最后把移植好的uboot,内核,分别做一个补丁文件,以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~ 上一个移植uboot续集,我们解决了无法 ...

  5. 移植uboot之修改代码支持NorFlash记录续集

    接着上一篇文章写的内容(上一篇文章链接:移植uboot之修改代码支持NORFLASH),上一篇结尾测试flash的擦除读写功能,结果无法写flash,卡在了这里: 前面已经擦除成功,这里写内容写不进去 ...

  6. S5PV210 Uboot开发与移植02:Uboot配置与编译

    目录 1. uboot源码目录简介 2. uboot编译原理引入 2.1 功能模块配置 2.1.1 在.c文件中不编译相应的功能语句 2.1.2 在make时不编译相应的功能模块 2.2 跨平台编译环 ...

  7. S5PV210 Uboot开发与移植03:Uboot启动流程详解

    目录 1. start.S解析 1.1 uboot入口分析 1.2 头文件包含 1.2.1 config.h 1.2.2 version.h 1.2.3 asm/proc/domain.h 1.2.4 ...

  8. fpga烧写bin文件_S3C2440移植uboot之编译烧写uboot

    @[TOC] 移植环境 主 机:VMWare--ubuntu16.04 开发板:S3C2440 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2012.04.01 ...

  9. 移植u-boot v2018

    本篇文章阐述移植 u-boot v2018.01 至 S5PV210 开发板上的主要流程和细节.市场上的S5PV210开发板,均是基于三星smdkv210公版平台山寨出来的.我使用的GEC210开发板 ...

  10. 【u-boot】uboot代码简要分析 (u-boot 移植)

    uboot代码简要分析 (u-boot 移植) 2012-12-19 22:46:04 [转] 先来看看源码目录结构,再按照代码的执行顺序简单地分析源码 1.U-boot源码整体框架 源码解压以后,我 ...

最新文章

  1. LINUX - pthread_detach()与pthread_join()
  2. MySQL根被拒绝_[转载]phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接。...
  3. Raspberry学习——raspberry pi 3 截图及查看
  4. 如何使用React,TypeScript和React测试库创建出色的用户体验
  5. Git 用户名和邮箱配置_01
  6. Python符号计算入门及隐函数图像绘制
  7. 面试题系列:网络篇夺命连环12问
  8. R语言 朴素贝叶斯分类预测
  9. python与机器学习(五)——决策树
  10. 机器学习中常见的最优化方法
  11. mx350显卡天梯图_2019.8月CPU和显卡性能天梯图
  12. ps常见颜色以及其色值
  13. Tor源码 -- 启动模块
  14. 比吸烟还可怕的九大“爱好”
  15. INT8量化原理理解
  16. 【地理信息系统GIS】教案(七章全)第五章:空间数据查询与空间分析
  17. asterisk服务器搭建 入门教程
  18. 【MySQL--03】表的操作
  19. 镭神16线激光雷达跑SC-LeGo-LOAM算法
  20. altiium designer改变图纸大小

热门文章

  1. CentOS7.2安装linux版QQ
  2. 网路岗 - Cisco 交换机端口镜像配置图解
  3. 博物馆施工组织设计方案
  4. CSS的BEM命名规范
  5. linux下删除服务
  6. 445端口的简单利用
  7. Flex Builder 3.0正式版+破解补丁
  8. Ubuntu下libxml2的安装和使用
  9. 商淘软件已成为ThinkPHP商城系统之标杆产品
  10. 解放生产力「GitHub 热点速览 v.21.51」