移植NXP官方uboot到IMX6ULL开发板--以及过程中遇到的疑问和错误记录

目录

1 下载uboot源码

2在uboot中添加自己的开发板

2.1 添加开发板默认配置文件

疑问:defconfig文件里面为什么没有CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg,MX6ULL_EVK_EMMC_REWORK" 

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

疑问:mx6ullevk.h文件里查找设备树命令里面的 board_name和board_rev从哪里来的

疑问:uboot要用的设备树和Linux内核要用的设备树怎么区别

2.3 添加开发板对应的板级文件夹

2.3.1 修改文件board/freescale/mx6ullevk/mx6ullevk.c

2.3.2 修改board/freescale/mx6ull_cumtchw_emmc/Makefile

2.3.3 修改board/freescale/mx6ull_cumtchw_emmc/imximage.cfg

2.3.4 修改board/freescale/mx6ull_cumtchw_emmc/Kconfig

2.3.5 修改board/freescale/mx6ull_cumtchw_emmc/MAINTAINERS

2.3.6 修改设备树

2.3.7 修改uboot图形化界面配置文件arch/arm/mach-imx/mx6/Kconfig

3 网络驱动修改适配

3.1 下载NXP官方原理图

3.2 对比NXP官方评估板硬件原理图和我使用的开发板原理图差异

3.2.1复位引脚

3.2.2 phy器件地址

3.3 修改网络相关代码

3.3.1 修改PHY芯片配置文件configs/mx6ull_cumtchw_emmc_defconfig

3.3.2 修改设备树arch/arm/dts/imx6ul-cumtchw.dtsi对LAN8720A进行硬件复位

3.3.3 修改drivers/net/phy/phy.c对LAN8720A进行软件复位

4 LCD驱动修改适配

5 编译修改后的uboot

5.1 报错:arch/arm/mach-imx/mx6/Kconfig:871: can't open file "board/freescale/mx6ul_cumtchw_emmc/Kconfig"

6 烧写uboot

6.1 报错:Error: ethernet@20b4000 address not set

6.2 报错ethernet@20b4000 Waiting for PHY auto negotiation to complete......................................... TIMEOUT !

6.3*** ERROR: `serverip' not set

6.4 TFTP error: 'File not found' (1)

6.5 node to update the SoC serial number is not found.ERROR: system-specific fdt fixup failed: FDT_ERR_NOTFOUND - must RESET the board to recover.

参考文献:


上次移植uboot还是很久以前了,那时候设备树都还没用,那时候用的平台也是早已经停产的S3C2440,最近有时间重新移植个新版本的uboot到imx6ull,虽然我工作可能不会接触uboot,但技多不压身,就当学习了,下面记录下过程。

另外,由于我对于uboot并不是特别了解,所以下面的过程可能会有一些错误。

1 下载uboot源码

根据这篇博客的说明;NXP IMX6ULL的官方文档、官方BSP、官方SDK、交叉编译工具链下载-CSDN博客

可以知道,uboot的源码在GitHub - nxp-imx/uboot-imx: i.MX U-Boot 

 然后用下面的命令下载:

git clone -b lf_v2022.04  --single-branch https://github.com/nxp-imx/uboot-imx.git

网上的博客资料移植的都是几年前的老版本uboot,如果是做项目,那当然直接用和别人同样的老版本uboot快速的移植上,然后达到目的,但是我是为了学习,所以我这里直接用最新的uboot移植, 这样过程中遇到的问题肯定多,这样就算最后我移植不成功,那在这个过程中我也能学到一些东西。 

2在uboot中添加自己的开发板

2.1 添加开发板默认配置文件

cp configs/mx6ull_14x14_evk_emmc_defconfig configs/mx6ull_cumtchw_emmc_defconfig

这里是把文件名字中的14x14_evk改成我自己的名字cumtchw,然后修改文件内容

CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_SYS_MALLOC_LEN=0x1000000
CONFIG_NR_DRAM_BANKS=1
CONFIG_SYS_MEMTEST_START=0x80000000
CONFIG_SYS_MEMTEST_END=0x88000000
CONFIG_ENV_SIZE=0x2000
CONFIG_ENV_OFFSET=0xE0000
CONFIG_MX6ULL=y
#CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_TARGET_MX6ULL_CUMTCHW_EMMC=y
CONFIG_SYS_I2C_MXC_I2C1=y
CONFIG_SYS_I2C_MXC_I2C2=y
CONFIG_DM_GPIO=y
#CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk-emmc"
CONFIG_DEFAULT_DEVICE_TREE="imx6ull-cumtchw-emmc"
......
......

疑问:defconfig文件里面为什么没有CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg,MX6ULL_EVK_EMMC_REWORK" 

在看其他博客里面的uboot移植时,他们修改的defconfig文件里面都有CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg,MX6ULL_EVK_EMMC_REWORK",而我修改的里面没有,我在他们版本的uboot源码里面搜了下 MX6ULL_EVK_EMMC_REWORK

而在我使用的新版本uboot代码中根本就没有 MX6ULL_EVK_EMMC_REWORK,所以我觉得这是因为旧版本uboot源码用这个MX6ULL_EVK_EMMC_REWORK控制条件编译,而新版的uboot源码应该是把emmc初始化相关代码放到设备树和driver文件中了,所以根本不需要用这个宏控制条件编译了。

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

cp include/configs/mx6ullevk.h  include/configs/mx6ull_cumtchw_emmc.h

然后首先将重复包含的条件编译判断改掉,即

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2016 Freescale Semiconductor, Inc.
 * Copyright 2017 NXP
 *
 * Configuration settings for the Freescale i.MX6UL 14x14 EVK board.
 */
//#ifndef __MX6ULLEVK_CONFIG_H
//#define __MX6ULLEVK_CONFIG_H
#ifndef __MX6ULLEVK_CUMTCHW_EMMC_CONFIG_H
#define __MX6ULLEVK_CUMTCHW_EMMC_CONFIG_H

然后修改查找设备树的命令,在修改之前我有两个疑问。

疑问:mx6ullevk.h文件里查找设备树命令里面的 board_name和board_rev从哪里来的

先看一下其他博主的修改,

他们添加的时候,这里if判断还加了board_rev=14x14,但是我修改的时候所有的名字里面都把14x14_evk改成了cumtchw,哪里来的14x14呀,包括我看网上其他人的博客他们也是名字里面没有14x14了但是他们这里查找设备还是有14x14,我要理解这里的board_name和board_rev是哪里来的,于是我在uboot源码中搜索board_name,我觉得应该是下面的代码

然后我又看了下#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG这个判断是成立的,因为在defconfig里面有CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y,所以这才是board_name和board_rev的由来,我要是不看源码直接稀里糊涂的把查找设备树那里的代码改成14x14也是成立的,因为这里除了9x9其他的都设置成了14x14。这里先这样,后面会有修改这个board/freescale/mx6ullevk/mx6ullevk.c的时候,本来我已经知道怎么修改查找设备的代码了,但是好像我理解还有误区,也就是下面的疑问。

疑问:uboot要用的设备树和Linux内核要用的设备树怎么区别

本来其实include/configs/mx6ull_cumtchw_emmc.h文件里面查找设备树的命令我已经按照上面方法修改了,没什么疑问了,但是我突然想到这样一个问题,uboot里面要使用设备树做一些初始化工作,而uboot引导Linux内核启动的时候也要给内核一个设备树从而让Linux内核做一些Linux驱动的工作,那么问题来了,uboot使用的设备树和Linux内核要使用的设备树是怎么区别的,于是我又看了下uboot里面的几个文件,我觉得应该是下面这样的,为了便于理解,下面用evk举例子,不用自己修改名字的cumtchw举例子。

首先,configs/mx6ull_14x14_evk_emmc_defconfig文件里面的CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk-emmc"这里指定的设备树是给uboot用的,因为编译uboot的时候不是要用make  mx6ull_14x14_evk_emmc_defconfig吗,这个文件就是用来指定uboot的配置的,里面的这个设备树就是给uboot指定的。

然后,Linux内核的设备树用哪一个呢,我在configs/mx6ull_14x14_evk_emmc_defconfig文件里面发现CONFIG_BOOTCOMMAND="run findfdt;mmc dev ${mmcdev};mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi",这个命令就是bootcommand也就是引导内核时候要执行的命令,然后这里面的额findfdt命令定义在include/configs/mx6ullevk.h里面,定义如下

那也就是说,如果前面没定义fdt_file,那么后面这里findfdt命令就会根据开发板的名字去查找设备树名字,这里查找到的设备树名字是给Linux内核使用的。

经过上面的分析,我发现,那其实我可以不修改查找设备树的命令,我直接把上面的fdt_file给他赋值不就行了。所以最后的修改如下,

这里是给Linux内核用的fdt,所以我直接赋值100ask_imx6ull-14x14.dtb,然后下面的修改是

2.3 添加开发板对应的板级文件夹

直接用下面命令复制

cp board/freescale/mx6ullevk/ -drf board/freescale/mx6ull_cumtchw_emmc

2.3.1 修改文件board/freescale/mx6ullevk/mx6ullevk.c

把 mx6ullevk.c修改为mx6ull_cumtchw_emmc.c 

mv board/freescale/mx6ull_cumtchw_emmc/mx6ullevk.c  board/freescale/mx6ull_cumtchw_emmc/mx6ull_cumtchw_emmc.c

 它的内容也需要修改,修改board_name那一行,这个在前面分析过,头文件里面查找设备的命令在判断boatd_name应该就是从这里得到的。

#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
	//env_set("board_name", "EVK");
	env_set("board_name", "CUMTCHW");

	if (is_mx6ull_9x9_evk())
		env_set("board_rev", "9X9");
	else
		env_set("board_rev", "14X14");

	if (is_cpu_type(MXC_CPU_MX6ULZ)) {
		env_set("board_name", "ULZ-EVK");
		env_set("usb_net_cmd", "usb start");
    }
#endif

修改打印的板子名字

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: MX6ULL 14x14 EVK\n");
		puts("Board: MX6ULL CUMTCHW EMMC\n");

	return 0;
}

2.3.2 修改board/freescale/mx6ull_cumtchw_emmc/Makefile

由于c文件名字修改了,所以makefile也要修改

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

#obj-y  := mx6ullevk.o
obj-y  := mx6ull_cumtchw_emmc.o

2.3.3 修改board/freescale/mx6ull_cumtchw_emmc/imximage.cfg

#ifdef CONFIG_USE_IMXIMG_PLUGIN
/*PLUGIN    plugin-binary-file    IRAM_FREE_START_ADDR*/
#PLUGIN	board/freescale/mx6ullevk/plugin.bin 0x00907000
PLUGIN	board/freescale/mx6ull_cumtchw_emmc/plugin.bin 0x00907000
#else

2.3.4 修改board/freescale/mx6ull_cumtchw_emmc/Kconfig

修改后的内容如下: 

if TARGET_MX6ULL_CUMTCHW_EMMC

config SYS_BOARD
	default "mx6ull_cumtchw_emmc"

config SYS_VENDOR
	default "freescale"

config SYS_CONFIG_NAME
	default "mx6ull_cumtchw_emmc"

config IMX_CONFIG
	default "board/freescale/mx6ull_cumtchw_emmc/imximage.cfg"

config SYS_TEXT_BASE
	default 0x87800000
endif

2.3.5 修改board/freescale/mx6ull_cumtchw_emmc/MAINTAINERS

先看文件原来的样子

MX6ULLEVK BOARD
M:	Peng Fan <peng.fan@nxp.com>
S:	Maintained
F:	board/freescale/mx6ullevk/
F:	include/configs/mx6ullevk.h
F:	configs/mx6ull_14x14_evk_defconfig
F:	configs/mx6ull_14x14_evk_plugin_defconfig
F:	configs/mx6ulz_14x14_evk_defconfig

我修改成

MX6ULLEVK BOARD
M:	Peng Fan <peng.fan@nxp.com>
S:	Maintained
F:	board/freescale/mx6ull_cumtchw_emmc/
F:	include/configs/mx6ull_cumtchw_emmc.h
F:	configs/mx6ull_cumtchw_emmc_defconfig

我把最后面两行直接删掉了,网上其他博主修改的时候,最下面那两行也保留,然后修改了名字,但是他们的configs里面都没有这两个defconfig文件,他们在第一步重命名configs目录下的defconfig文件时只重命名了一个,所以应该是不对的,我觉得这里一个开发板就只需要一个defconfig就行了,最后面那两个不需要保留。

2.3.6 修改设备树

首先看一下evk的设备树包含关系

arch/arm/dts/imx6ull-14x14-evk-emmc.dts

       #include "imx6ull-14x14-evk.dts" 

                #include "imx6ull.dtsi"
                #include "imx6ul-14x14-evk.dtsi"              //注意这里是imx6ul不是imx6ull
                #include "imx6ul-14x14-evk-u-boot.dtsi"  //注意这里是imx6ul不是imx6ull

从上面可以看出来几个设备树文件的包含关系了。所以先复制文件

cp arch/arm/dts/imx6ull-14x14-evk-emmc.dts arch/arm/dts/imx6ull-cumtchw-emmc.dts
cp arch/arm/dts/imx6ull-14x14-evk.dts arch/arm/dts/imx6ull-cumtchw.dts
cp arch/arm/dts/imx6ul-14x14-evk.dtsi arch/arm/dts/imx6ul-cumtchw.dtsi
cp arch/arm/dts/imx6ul-14x14-evk-u-boot.dtsi  arch/arm/dts/imx6ul-cumtchw-u-boot.dtsi

然后前面两个dts需要修改里面包含的头文件的名称。

修改arch/arm/dts/imx6ull-cumtchw.dts为下面的内容

然后修改设备树的Makfile

2.3.7 修改uboot图形化界面配置文件arch/arm/mach-imx/mx6/Kconfig

3 网络驱动修改适配

I.MX6UL/ULL 有两个网络接口 ENET1 和 ENET2,百问网开发板使用 LAN8720A 作为 PHY 芯片,NXP 官方的I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片,LAN8720A 相比 KSZ8081 具有体积小、外围器件少、价格便宜等优点。

3.1 下载NXP官方原理图

先看一下NXP官方评估板的核心板和底板原理图,看一下他的网络芯片硬件是怎么连接的,至于怎么下载NXP官方评估板的原理图,在我之前的博客里面:NXP IMX6ULL的官方文档、官方BSP、官方SDK、交叉编译工具链下载-CSDN博客

他的评估板原理图里面有两个子文件夹,我工作没做过硬件设计不太懂这两个具体指什么,下面是我的猜测,

  • BB可能是baseboard底板,里面是一些外围芯片具体的原理图。SPF-28616_C2.pdf。
  • CM可能是core module核心板,里面是重要的emmc、DDR和电源,SPF-29364_A1.pdf。

从下面的图也能看出来,他确实是分成两部分,CM就是核心模块,BB是外围元器件。

3.2 对比NXP官方评估板硬件原理图和我使用的开发板原理图差异

先看MCIMX6ULL-EVK-DESIGNFILES\MCIMX6ULL_CM_DESIGNFILES\Schematics\SCH-29364_A1\SCH-29364\SPF-29364_A1.pdf的page7里面6ull和网卡芯片的链接。

然后看一下MCIMX6ULL-EVK-DESIGNFILES\MCIMX6ULL_BB_DESIGNFILES\Schematics\SPF-28616_C2.pdf的page10里面phy芯片的具体管脚,

然后看一下100ask的开发板核心板和底板原理图,查看他的6ull和phy芯片连接以及phy芯片管脚。

对两个版本的原理图,有如下东西需要注意:

3.2.1复位引脚

我用的开发板,复位引脚是6ull的SNVS_TAMPER6,

然后查看LAN7720A的芯片手册关于芯片复位的部分

3.8.5 Resets 章节 P39 页 Reset 章节说明,我们需要在 PHY 内进行硬件复位和软件复位操作,请主要查看下图有红色底线所示文字,文章描述了复位需要有硬件复位和软件复位两个操作,其中硬件复位要保持 nRST 引脚持续拉低一段时间,软件复位要求向 Basic Control Register Soft Reset bit 位写入 1。
 

3.2.2 phy器件地址

LAN8720A芯片有一个地址引脚,RXER/PHYAD0,由于它接了上拉电阻也就是高电平,所以,地址是1.

3.3 修改网络相关代码

3.3.1 修改PHY芯片配置文件configs/mx6ull_cumtchw_emmc_defconfig

KSZ8081 这颗 PHY 芯片就是 Micrel 公司生产的,不过 Micrel 已经被Microchip 收购了。如果要使用 LAN8720A,那么就得将 CONFIG_PHY_MICREL 改为 CONFIG_PHY_SMSC,也就是使能 uboot 中的 SMSC 公司中的 PHY 驱动,因为 LAN8720A 就是 SMSC 公司生产的。

3.3.2 修改设备树arch/arm/dts/imx6ul-cumtchw.dtsi对LAN8720A进行硬件复位

我们要修改的是下面的设备树内容

&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	status = "disable";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-reset-gpios = <&gpio5 6 GPIO_ACTIVE_LOW>;//phy-reset-gpios这个属性在drivers/net/dec_mxc.c里面会自动处理,
    phy-reset-duration = <30>;//phy-reset-duration这个属性在drivers/net/dec_mxc.c里面会自动处理,
	status = "okay";

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

		ethphy0: ethernet-phy@2 {
			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";
		};
	};
};

先大体解释一下,这里fec1和fec2是IMX6ull的外设,然后fec2下面的子节点里面的ethphy0和ethphy1是两个外围的PHY芯片。这里做了如下修改

  • 把fec1的status改成disable,然后前面说了phy2的地址是1,在设备树里面也就是reg,
  • 增加了    phy-reset-gpios = <&gpio5 6 GPIO_ACTIVE_LOW>;//phy-reset-gpios这个属性在drivers/net/dec_mxc.c里面会自动处理,不需要自己写代码。
  • 增加了phy-reset-duration = <30>;//phy-reset-duration这个属性在drivers/net/dec_mxc.c里面会自动处理,不需要自己写代码。

还需要在pinctrl里面增加引脚定义,也就是下面的最后一行

	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
			MX6ULL_PAD_SNVS_TAMPER6__GPIO5_IO06 0x17059
		>;
	};

3.3.3 修改drivers/net/phy/phy.c对LAN8720A进行软件复位

具体代码如下

#ifdef CONFIG_PHY_SMSC
    int rc;

    do{
        phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
        udelay(100);
        rc=phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
        udelay(100);

    }while(rc&BMCR_RESET);
#endif
#ifdef CONFIG_PHY_SMSC
        phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
        udelay(1000);
#endif

4 LCD驱动修改适配

LCD的修改我直接抄的其他网友的,因为本来不想改LCD代码的,LCD不重要。

首先修改arch/arm/dts/imx6ul-cumtchw.dtsi里面LCD的复位引脚

	pinctrl_lcdif_ctrl: lcdifctrlgrp {
		fsl,pins = <
			MX6UL_PAD_LCD_CLK__LCDIF_CLK	    0x79
			MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79
			MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79
			MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79
			/* used for lcd reset */
			MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09  0x79
			MX6ULL_PAD_SNVS_TAMPER6__GPIO5_IO06 0x79
		>;
	};

然后修改配置参数

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

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

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

		display-timings {
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <51200000>;
			hactive = <1024>;
			vactive = <600>;
			hfront-porch = <160>;
			hback-porch = <140>;
			hsync-len = <20>;
			vback-porch = <20>;
			vfront-porch = <12>;
			vsync-len = <3>;

			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <0>;
			};
		};
	};
};

5 编译修改后的uboot

make distclean
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
make mx6ull_cumtchw_emmc_defconfig

5.1 报错:arch/arm/mach-imx/mx6/Kconfig:871: can't open file "board/freescale/mx6ul_cumtchw_emmc/Kconfig"

arch/arm/mach-imx/mx6/Kconfig:871: can't open file "board/freescale/mx6ul_cumtchw_emmc/Kconfig"
scripts/kconfig/Makefile:96: recipe for target 'mx6ull_cumtchw_emmc_defconfig' failed
make[1]: *** [mx6ull_cumtchw_emmc_defconfig] Error 1
Makefile:574: recipe for target 'mx6ull_cumtchw_emmc_defconfig' failed
make: *** [mx6ull_cumtchw_emmc_defconfig] Error 2

这里错误的原因是前面修改文件时

这里应该是mx6ull,不是mx6ul,修改完之后,

make distclean
make mx6ull_cumtchw_emmc_defconfig

不再报错了,然后

make -j8

6 烧写uboot

6.1 报错:Error: ethernet@20b4000 address not set

执行下面的操作

setenv eth1addr 00:01:3f:2d:3e:4d
saveenv
reset

6.2 报错ethernet@20b4000 Waiting for PHY auto negotiation to complete......................................... TIMEOUT !

我也不知道这是什么原因,但是看着像是网络问题,我检查了下开发板,发现我的eth2连接到了电脑,没连接到路由器,改一下,我把eth2接到路由器,重新来,

6.3*** ERROR: `serverip' not set

可以看到网线连接到路由器后,开发板已经有ip地址了。 

我把网线接到路由器上,重启出现上面的错误,这是服务器地址没设置。

6.4 TFTP error: 'File not found' (1)

然后重启

这是文件没找到,这应该想从网络启动,但是没找到相应的文件

sudo apt install tftpd-hpa
vim /etc/default/tftpd-hpa

将里面修改成下面的内容

# /etc/default/tftpd-hpa
  
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/data/chw/imx6ull_20230512/tftpboot"
TFTP_OPTIONS="-l  -c  -s"
TFTP_ADDRESS=":69"

然后

sudo systemctl start tftpd-hpa   #启动tftp服务器
sudo systemctl status tftpd-hpa  #查看tftp服务器状态

然后把各种文件全都拷贝进去。

再次重启开发板

6.5 node to update the SoC serial number is not found.
ERROR: system-specific fdt fixup failed: FDT_ERR_NOTFOUND
 - must RESET the board to recover.

我去uboot中搜这个错误system-specific fdt fixup failed,

那继续看ft_system_setup函数,在这个函数里面找到了这个错误打印

那么问题就是找不到fsl,imx28-dcp节点,我看了下uboot里面的设备树

我发现里面是有的,然后我去看看韦老师的设备树里面,

那我觉得我把uboot源码改一下,应该也行吧,改就是了,反正是学习。

然后重新编译uboot,下载,

这算是可以了吧。

参考文献:

100ASK-IMX6ULL开发板移值NXP官方UBOOT_tft7016-CSDN博客

NXP IMX6ULL的官方文档、官方BSP、官方SDK、交叉编译工具链下载-CSDN博客

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.8.pdf

i.MX6ULL移植NXP官方uboot2020.04_5.4.47_2.2.0_海上没有钢琴师o的博客-CSDN博客

如何将u-boot.2022.10版本移植到imx6ull开发板 - 嵌入式技术 - 电子发烧友网

i.MX6ULL 开发板系统移植与根文件系统构建(一):U-Boot 的移植 - 白日梦观察

GitHub - nxp-imx/uboot-imx: i.MX U-Boot

 移植新的uboot到正点原子imx6ull开发板遇到emmc的问题 - 哔哩哔哩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196128.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s中pod的hostport端口突然无法访问故障处理

故障背景&#xff1a; 租户告知生产环境的sftp突然无法访问了&#xff0c;登录环境查看sftp服务运行都是正常的&#xff0c;访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查&#xff0c;看看哪里出了问题&#xff0c;看下sftp日志&#…

VIR-SLAM代码分析2——VIR_VINS详解

前言 VIR-SLAM中VIR_VINS文件夹下是基于VINS-mono的结合UWB传感器的估计器&#xff0c;主要改动的文件在uwb_posegraph&#xff0c;vir_estimator中。其他文件夹完成的是UWB数据的处理问题&#xff0c;比较简单上一节介绍足够&#xff0c;代码也容易看懂。本节介绍的VIR_VINS是…

软件测试简历编写技巧,对症下药,一周面10家...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 作为HR来说&#…

吉利银河L6 纯电模式 空调加热功率

环境 环境10摄氏度左右 空调加热最高档 风速最高档 慢充充电 地下车库 开空调充电 关空调充电 分析 充电功率6kw 开关空调时间差了一倍 所以估算出空调加热峰值功率大概3kw左右

aPEAR包绘制功能富集网络图

本期教程 前言 今天学习aPEAR包&#xff0c;绘制KEGG和GO功能富集网络图&#xff0c;用起来还是比较方便的&#xff0c;直接将clusterProfiler富集结果进行绘制&#xff0c;对人类、动物等分析结果非常方便。对于模式植物&#xff0c;使用自己制作的GO或KEGG背景文件进行富集分…

UI上传组件异步上传更改为同步

实现异步方法 JavaScript 异步 实现异步的五种实现方法_js异步-CSDN博客 这两种比较经常用。 因为上传组件是异步上传的通过Async和await配合使用可以上传完照片视频后返回的地址在继续走下去&#xff0c;而不是图片视频地址还未获取时就上传后端了。

Notion for Mac:打造您的专属多功能办公笔记软件

在如今这个信息爆炸的时代&#xff0c;一款高效、便捷的笔记软件对于办公人士来说已经成为必不可少的工具。Notion for Mac&#xff0c;作为一款多功能办公笔记软件&#xff0c;凭借其简洁优雅的界面、强大的功能以及无缝的云端同步&#xff0c;成为了众多用户的首选。 一、多…

9.二维数组——打印出杨辉三角形(要求打印出10行)

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 打印出杨辉三角形&#xff08;要求打印出10行&#xff09;。 二、题目分析 三、解题 程序运行代码 #include<s…

python实现rpc的几种方式(SimpleXMLRPCServer 自带的、第三方ZeroRPC)、连接linux远程开发分布式锁、分布式id

1 python实现rpc的几种方式 1.1 SimpleXMLRPCServer 自带的 1.2 第三方ZeroRPC 2 连接linux远程开发 3 分布式锁 4 分布式id 1 python实现rpc的几种方式 # 远程过程调用-1 借助于rabbitmq,可以跨语言-2 SimpleXMLRPCServer 自带的-3 ZeroRPC-4 GRPC&#xff1a;跨语言的 htt…

GAN:ImprovedGAN-训练GAN的改进策略

论文&#xff1a;https://arxiv.org/abs/1606.03498 代码&#xff1a;https://github.com/openai/improved_gan 发表&#xff1a;NIPS 2016 一、文章创新 1&#xff1a;Feature matching&#xff1a;特征匹配通过为生成器指定新目标来解决GANs的不稳定性&#xff0c;从而防止…

富富集网络图绘制教程

本期教程 前言 今天学习aPEAR包&#xff0c;绘制KEGG和GO功能富集网络图&#xff0c;用起来还是比较方便的&#xff0c;直接将clusterProfiler富集结果进行绘制&#xff0c;对人类、动物等分析结果非常方便。对于模式植物&#xff0c;使用自己制作的GO或KEGG背景文件进行富集分…

Python能否成为大型游戏开发的利器?

你是否曾想过&#xff0c;Python这个备受欢迎的编程语言是否能够胜任大型游戏开发的重任&#xff1f;Python以其简洁、易学的特点而著称&#xff0c;但在游戏世界中&#xff0c;性能和效率常常是关键。小编将带你深入探讨Python在大型游戏开发中的潜力&#xff0c;一探究竟&…

【Unity细节】为什么加载精灵图集直接导致Unity引擎崩溃

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

立即修复计算机显示msvcp110.dll丢失问题!4个快速解决方法大揭秘

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp110.dll丢失”。这个错误通常会导致某些程序无法正常运行&#xff0c;给用户带来诸多不便。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何进行修复呢&#xff1f;本文将…

数据仓库建模下篇

在实际业务中&#xff0c;给了我们一堆数据&#xff0c;我们怎么拿这些数据进行数仓建设呢&#xff0c;数仓工具箱作者根据自身多年的实际业务经验&#xff0c;给我们总结了如下四步。 数仓工具箱中的维度建模四步走&#xff1a; 维度建模四步走 这四步是环环相扣&#xff0c…

latex中$$中的字母不显示斜体【已解决】

最近在用latex写论文&#xff0c;其中一篇论文的方法名带有平方&#xff0c;但是当我写方法名的时候发现字母名称是斜体的&#xff0c;如下图所示 引用的论文中FedME这几个字显然不是斜体&#xff0c;最后修改完的图片如下图所示 代码如下所示 /非斜体代码 $\text{FedME}^{2}$…

怎么把dwg格式转换pdf?

怎么把dwg格式转换pdf&#xff1f;DWG是一种由AutoCAD开发的二维和三维计算机辅助设计&#xff08;CAD&#xff09;文件格式&#xff0c;它的名称是“绘图&#xff08;Drawing&#xff09;”的缩写。DWG文件通常包含了设计图纸、模型和元数据等信息&#xff0c;并且被广泛用于工…

利用STM32和蓝牙模块构建智能物联网设备的开发指南

智能物联网设备在现代生活中扮演着重要的角色&#xff0c;而STM32微控制器和蓝牙模块则为实现智能物联网设备提供了基础支持。本文将介绍如何使用STM32微控制器和蓝牙模块构建智能物联网设备的开发指南&#xff0c;包括硬件设计、蓝牙模块配置、传感器数据采集和云平台连接等关…

【开源威胁情报挖掘1】引言 + 开源威胁情报挖掘框架 + 开源威胁情报采集与识别提取

基于开源信息平台的威胁情报挖掘综述 写在最前面摘要1 引言近年来的一些新型网络安全威胁类型挖掘网络威胁的情报信息威胁情报分类&#xff1a;内、外部威胁情报国内外开源威胁情报挖掘分析工作主要贡献研究范围和方法 2 开源威胁情报挖掘框架1. 开源威胁情报采集与识别2. 开源…

Android Studio 添加so无法打包进apk问题

1.开发环境&#xff1a; Android Studio 2022.3.1 Patch 2 jdk 17 gradle-7.4 2.build.grade配置检查 首先查看build.gradle中是否设置sourceSets &#xff0c;如果设置的话&#xff0c;打包的时候so是被指导libs目录下的&#xff0c;所有就不能把jnilibs下。 sourceSets {mai…