[uboot 移植]uboot 移植过程

article/2025/10/6 16:29:28

文章目录

  • 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 设备树

在这里插入图片描述

如图,我们可以看出 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 器件地址
在这里插入图片描述
在这里插入图片描述

如图可以看到 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.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: 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

http://chatgpt.dhexx.cn/article/D2ykuJ2y.shtml

相关文章

UBoot 移植

1 NXP官方开发板uboot编译测试 1 查找 NXP 官方的开发板默认配置文件 因为我们的开发板是参考 NXP 官方的 I.MX6ULL EVK 开发板做的硬件&#xff0c;因此我们在移植 uboot 的时候就可以以 NXP 官方的 I.MX6ULL EVK 开发板为蓝本。 在 NXP 官方 I.MX6UL/6ULL 默认配置文件中找…

大话uboot 移植

结合作者多年的移植经验&#xff0c;尽量简单的为大家描述一个uboot 的移植过程。希望通过描述&#xff0c;给初入移植行道的你带来美好的希望。接下来&#xff0c;我们通过以下几个方面来描述。 1. arm soc 的启动方式 在描述soc 前&#xff0c;我们先看下一个简单的arm soc:…

uboot移植步骤

Uboot移植具体步骤(本例子为Samsung origen板) 第一步:准备源码 网上下载现成的uboot开源代码:https://ftp.denx.de/pub/u-boot/ 在该网站中选择与板子兼容的uboot源文件(公司中一般咨询硬件工程师) 在Linux系统下解压 tar xf 压缩包名 第二步:修改源码 1.抄板:将和你板子兼容…

(二)uboot移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

目录 一、前言 二、F1C200s上电启动顺序 三、前期准备 四、新建用户 五、交叉编译环境配置 六、uboot简介 七、uboot移植 &#x1f34f; uboot下载 &#x1f34f; uboot默认配置 &#x1f34f; uboot图形界面配置 &#x1f34f; uboot编译 &#x1f34f; 烧录bin…

U-Boot 移植初探

1. NXP官方开发板uboot编译测试 uboot移植不需要从零开始将uboot移植到使用的开发板上。因为半导体厂商通常都会自己做一个开发板&#xff0c; 将uboot移植到他们自己的原厂开发板上&#xff0c;再将这个uboot&#xff08;原厂BSP 包&#xff09;发布出去。因此使用自已的开发…

U-Boot移植

一、U-Boot Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;芯片上电以后先运行一段bootloader程序。 bootloader程序会先初始化DDR等外设&#xff0c;然后将Linux内核从flash(NAND&#xff0c;NOR FLASH&#xff0c; SD&#xff0c; eMMC 等)拷贝到 DDR 中&…

uboot移植

一、我们知道uboot就是一个Bootloader。但是&#xff0c;arm不像我们的pc机一样&#xff0c;用一个老毛桃随便找一个网站下一个windows镜像就可以直接装了。 我们的uboot对应的就是老毛桃里面刷的引导程序。 虽然uboo支持很多架构很多不同的厂家的板子&#xff0c;但是UBOOT它…

【Linux】系统移植篇四--uboot移植

系统移植篇四--uboot移植 一、uboot源码结构1、uboot源码获取2、uboot特点3、uboot源码结构 二、uboot的配置与编译1、uboot配置2、uboot编译 前言&#xff1a;本篇主要介绍uboot的一些结构与相关配置&#xff0c;uboot是一款免费开源的芯片启动软件&#xff0c;代码完全开源&a…

uboot移植过程

uboot移植过程 IMX6ULL 文章目录 uboot移植过程 IMX6ULL 前言一、从原厂中移植uboot进行测试二、在U-Boot中添加自己的硬件1. 添加默认配置文件2. 添加对应的头文件3. 添加对应的板级文件夹3.1 修改Makefile文件3.2 修改 mx6ull_alientek 目录下的 imximage.cfg 文件3.3 修改 m…

MediaCodec对接到OMX的简单分析

一、引言&#xff1a; nuplayer播放器是使用MediaCodec来进行编解码的&#xff0c;而OMX组件则是MediaCodec的解码核心&#xff0c;但是因为涉及的面太过底层&#xff0c;往往是芯片公司才会涉及到这一块&#xff0c;所以就做一个简单分析&#xff0c;对通路有个大致了解就行。…

MediaCodec(native)状态机分析

一、引入&#xff1a; MediaCodec这条通路的调用逻辑是MediaCode->ACodec->OMX&#xff0c;因为OMX有自己的状态机&#xff0c;所以MediaCodec和ACodec也分别基于OMX组件的调用维护了其状态机&#xff0c;这篇博客就先分析MediaCodec的状态机是如何运转的。 二、MediaCo…

视频-MediaCodec

1.解析视频可以使用android 提供的api MediaPlayer,实现简单的播放暂停&#xff0c;提取视频中的一帧或者编辑视频&#xff0c;需要另一个api MediaCodec&#xff08;硬解&#xff0c;控制DSP芯片&#xff09;或者 ffmpeg(软解&#xff0c;耗时)&#xff0c;选择的优先级一定要…

MediaCodec解析MP4视频

MediaCodec讲解 MediaCodec是Android提供的用于对音视频进行编解码的类&#xff0c;它通过访问底层的codec来实现编解码的功能。是Android media基础框架的一部分&#xff0c;通常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTra…

Android视频编解码之MediaCodec简单入门

本篇只是简单入门&#xff0c;后面会继续写文章详细讲解&#xff1a; 由于MediaCodec涉及内容众多&#xff0c;原本想一篇文章把所有内容概括&#xff0c;但是后来发现不太可能&#xff0c;限于自己能力&#xff0c;想要考虑全面太难&#xff0c;我也是刚开始学习需要借助网上…

Android:MediaCodec基本原理

最近需要使用MediaCodec做一些工作&#xff0c;因此对MediaCodec做了些研究和代码编写&#xff0c;在此先对MediaCodec的一些基础原理、工作流程、常用API等做个初步总结&#xff0c;方便后续开发过程中查阅。 1.MediaCodec简介 1.1 MediaCodec来历 Android从最初的API 1.0版…

MediaCodec原理及使用

使用MediaCodec目的 MediaCodec是Android底层多媒体框架的一部分&#xff0c;通常与MediaExtractor、MediaMuxer、AudioTrack结合使用&#xff0c;可以编码H264、H265、AAC、3gp等常见的音视频格式 MediaCodec工作原理是处理输入数据以产生输出数据 MediaCodec工作流程 Medi…

Android MediaCodec

Android中可以使用MediaCodec来访问底层的媒体编解码器&#xff0c;可以对媒体进行编/解码。 MediaCodec可以处理的数据有以下三种类型&#xff1a;压缩数据、原始音频数据、原始视频数据。这三种类型的数据均可以利用ByteBuffers进行处理&#xff0c;但是对于原始视频数据应提…

android P MediaCodec编解码流程分析

1.MediaCodec初始化流程分析 通过上面流程分析可知&#xff0c;MediaCodecList初始化是通过调用它的getLocalInstance函数&#xff0c;然后在里面new的MediaCodecList对象。在MediaCodec的CreateByType函数中new了MediaCodec对象。 allocateNode调用流程是在ACodec.cpp中的onA…

MediaCodec_Analyze-3-start

MediaCodec Analyse – start Refrence: https://source.android.google.cn/devices/media 一 APK调用的核心API Android APK使用 MediaCodec API 播放音视频的简易流程&#xff1a; MediaCodec codec MediaCodec.createDecoderByType("video/avc"); MediaFormat …

mediacodec api

mediacodec api 官网&#xff1a; https://developer.android.com/reference/android/media/MediaCodec 中文&#xff1a; https://www.apiref.com/android-zh/android/media/MediaCodec.html 学习mediacodec api的使用说明&#xff0c;在android源码查看&#xff1a; andro…