移植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");elseenv_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_EMMCconfig SYS_BOARDdefault "mx6ull_cumtchw_emmc"config SYS_VENDORdefault "freescale"config SYS_CONFIG_NAMEdefault "mx6ull_cumtchw_emmc"config IMX_CONFIGdefault "board/freescale/mx6ull_cumtchw_emmc/imximage.cfg"config SYS_TEXT_BASEdefault 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		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	0x4001b031MX6ULL_PAD_SNVS_TAMPER6__GPIO5_IO06 0x17059>;};

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

具体代码如下

#ifdef CONFIG_PHY_SMSCint 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_SMSCphy_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	    0x79MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79/* used for lcd reset */MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09  0x79MX6ULL_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-hpaTFTP_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的问题 - 哔哩哔哩

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MVP矩阵】裁剪空间、NDC空间、屏幕空间

裁剪空间概述 裁剪空间是一个顶点乘以MVP矩阵之后所在的空间&#xff0c;Vertex Shader的输出就是在裁剪空间上&#xff08;划重点&#xff09; NDC空间概述 接上面&#xff0c;由GPU自己做透视除法将顶点转到NDC空间 两者的转换 透视除法将Clip Space顶点的4个分量都除以…

抽象类-Java

抽象类 一、父类方法的不确定性二、抽象类介绍三、抽象类细节四、练习题 一、父类方法的不确定性 引入&#xff1a;对于一个动物&#xff0c;不知道它吃什么&#xff0c;比如猫吃鱼&#xff0c;兔子吃萝卜。动物类中的 eat 方法往往由它的子类去具体实现。 class Animal {pub…

百度人工智能培训第一天笔记

参加了百度人工智能初步培训&#xff0c;主要是了解一下现在人工智能的基本情况&#xff0c;以便后续看可以参与一些啥&#xff1f; 下面就有关培训做一些记录&#xff0c;以便后续可以继续学习。 一、理论基础部分 二、实际操作部分 主要学习的百度人工智能平台如下&#xf…

性能自动化测试?

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能…

Vscode中字符串报错:Unknown word.cSpell

一. 报错现象 二. 原因 是vscode IDE工具中的插件 Code Spell Checker 会检查字符串的合理性&#xff0c;我们写的中式拼音的字符串&#xff0c;不是一个标准英文单词&#xff0c;就会提示错误&#xff0c;解决方法就是让该插件遇到特定词汇不报错 三. 解决方法

NX二次开发UF_MTX3_initialize_z 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX3_initialize_z Defined in: uf_mtx.h int UF_MTX3_initialize_z(const double z_vec [ 3 ] , double mtx [ 9 ] ) overview 概述 Returns a 3x3 matrix with the given Z-d…

系列二十一、Spring中bean的创建顺序

一、概述 我们知道启动IOC容器时&#xff0c;Spring会为我们创建各种各样的bean&#xff0c;那么思考一个问题&#xff0c;bean的创建顺序是由什么决定的呢&#xff1f;答&#xff1a;bean的创建顺序是由BeanDefinition的注册信息决定的&#xff0c;这个其实很好理解&#xff0…

2023年【广东省安全员B证第四批(项目负责人)】证考试及广东省安全员B证第四批(项目负责人)复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年广东省安全员B证第四批&#xff08;项目负责人&#xff09;证考试为正在备考广东省安全员B证第四批&#xff08;项目负责人&#xff09;操作证的学员准备的理论考试专题&#xff0c;每个月更新的广东省安全员B证…

leetcode:2133. 检查是否每一行每一列都包含全部整数(python3解法)

难度&#xff1a;简单 对一个大小为 n x n 的矩阵而言&#xff0c;如果其每一行和每一列都包含从 1 到 n 的 全部 整数&#xff08;含 1 和 n&#xff09;&#xff0c;则认为该矩阵是一个 有效 矩阵。 给你一个大小为 n x n 的整数矩阵 matrix &#xff0c;请你判断矩阵是否为一…

Flask Session 登录认证模块

Flask 框架提供了强大的 Session 模块组件&#xff0c;为 Web 应用实现用户注册与登录系统提供了方便的机制。结合 Flask-WTF 表单组件&#xff0c;我们能够轻松地设计出用户友好且具备美观界面的注册和登录页面&#xff0c;使这一功能能够直接应用到我们的项目中。本文将深入探…

【详细版】基于AWS EC2使用Docker安装部署Superset v2.0

文章目录 1. SuperSet介绍2. 实验说明3. 实验配置4. SSH连接云实例5. 系统版本查看6. 主机名映射7. Docker安装[可选] Docker Compose安装8. 安装superset9. 初始化superset容器10. 为superset加入连接Athena需要的依赖11. 为superset准备一个具有权限的IAM用户12. 添加此IAM用…

解决企业异地组网混合办公网络挑战的最佳选择

在传统的网络架构中&#xff0c;企业在实现异地组网时面临着高昂的成本、低效的管理和有限的带宽等痛点。购买昂贵的专用线路和设备、手动配置和管理分布在不同地理位置的分支机构、以及无法满足高速数据传输需求的限制性带宽&#xff0c;给异地组网带来了困难和挑战。 案例背景…