目录
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 = <ðphy0>;
status = "disable";
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
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的问题 - 哔哩哔哩