文章目录
- 声明
- 1 获取源码
- 1.1 从u-boot官网获取
- 1.2 从芯片厂商获取
- 1.3 从开发板厂商获取
- 2 修改顶层Makefile
- 3 xxx_defconfig配置文件
- 3.1 拷贝生成自己的配置文件
- 3.2 修改defconfig文件
- 3.2.1 查看defconfig文件
- 3.2.2 修改defconfig文件
- 3.3 添加其他配置文件
- 3.3.1 添加配置头文件
- 3.3.2 添加对应的板级文件夹
- 3.3.3 修改板级文件夹中的内容
- 4 拷贝设备树
- 4.1 拷贝参考板的设备树
- 4.2 修改设备树
- 4.2.1 修改imx6ull-dang.dts
- 4.3 修改dts目录下的Makefile
- 5 编译、下载、启动
- 5.1 编译
- 5.2 下载
- 5.3 启动
声明
- 在下文中将修改的文件的名字简述为
自己的
,这个根据自己的需要命名。 - 这仅仅是自己根据正点原子的文档进行修改,正点原子教程中使用的uboot版本较低,于是自己想试试高版本的。
- uboot版本为: 2021.07
- 交叉编译器版本: 11.3.1
1 获取源码
1.1 从u-boot官网获取
u-boot官网
使用官方的u-boot的前提是芯片厂商已经将芯片适配相关的代码开源到u-boot官方源码中(要不从头构建太麻烦了,对于现在学习都费劲的我实在是完不成)。
1.2 从芯片厂商获取
从芯片厂商处获得的u-boot一定是对相关芯片适配过的。
去NXP的官网下载u-boot。
1.3 从开发板厂商获取
对于学习使用的开发板,开发板厂商一定会对相关板子进行适配(直接拿来就能用的那种)。
2 修改顶层Makefile
在编译的u-boot源码时需要向Makefile传递两个参数,分别为ARCH
和CROSS_COMPILE
两个参数。
每次使用make编译的时候都需要添加这两个参数,所以直接修改Makefile将两个参数直接添加到Makefile中。
ifeq (arm, arm)
CROSS_COMPILE ?= arm-linux-gnueabihf-
endif
表示一直使用arm-linux-gnueabihf-gcc
编译。
3 xxx_defconfig配置文件
3.1 拷贝生成自己的配置文件
所有的配置文件在configs
配置文件夹下。
-
进入到configs文件夹下
-
查看文件夹下的配置文件,找到自己板子的默认配置文件
-
im6ull的默认配置文件为
mx6ull_14x14_evk_defconfig
,拷贝默认配置文件,并将其重命名。cp mx6ull_14x14_evk_defconfig mx6ull_dang_defconfig #拷贝生成自己的配置文件
3.2 修改defconfig文件
3.2.1 查看defconfig文件
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_SYS_TEXT_BASE=0x87800000
CONFIG_NR_DRAM_BANKS=1
CONFIG_SYS_MEMTEST_START=0x80000000
CONFIG_SYS_MEMTEST_END=0x88000000
CONFIG_ENV_SIZE=0x2000
CONFIG_ENV_OFFSET=0xC0000
CONFIG_MX6ULL=y
CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_DM_GPIO=y
CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk"
CONFIG_SUPPORT_RAW_INITRD=y
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg"
CONFIG_BOARD_EARLY_INIT_F=y
CONFIG_HUSH_PARSER=y
CONFIG_CMD_BOOTZ=y
CONFIG_CMD_MEMTEST=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_I2C=y
CONFIG_CMD_MMC=y
CONFIG_CMD_DHCP=y
CONFIG_CMD_PING=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_EXT2=y
CONFIG_CMD_EXT4=y
CONFIG_CMD_EXT4_WRITE=y
CONFIG_CMD_FAT=y
CONFIG_CMD_FS_GENERIC=y
CONFIG_OF_CONTROL=y
CONFIG_ENV_OVERWRITE=y
CONFIG_ENV_IS_IN_MMC=y
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
CONFIG_SYS_MMC_ENV_DEV=1
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
CONFIG_BOUNCE_BUFFER=y
CONFIG_DM_74X164=y
CONFIG_DM_I2C=y
CONFIG_FSL_USDHC=y
CONFIG_MTD=y
CONFIG_DM_SPI_FLASH=y
CONFIG_SF_DEFAULT_MODE=0
CONFIG_SF_DEFAULT_SPEED=40000000
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_PHYLIB=y
CONFIG_PHY_MICREL=y
CONFIG_PHY_MICREL_KSZ8XXX=y
CONFIG_DM_ETH=y
CONFIG_DM_ETH_PHY=y
CONFIG_FEC_MXC=y
CONFIG_MII=y
CONFIG_PINCTRL=y
CONFIG_PINCTRL_IMX6=y
CONFIG_DM_REGULATOR=y
CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_MXC_UART=y
CONFIG_SPI=y
CONFIG_DM_SPI=y
CONFIG_FSL_QSPI=y
CONFIG_IMX_THERMAL=y
3.2.2 修改defconfig文件
需要修改的主要是下面的内容
CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk"
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg"
将其修改为
CONFIG_TARGET_MX6ULL_DANG=y #将CONFIG_TARGET_MX6ULL_DANG配置成y,自己的编译选项
CONFIG_DEFAULT_DEVICE_TREE="imx6ull-dang" #设备树
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_dang/imximage.cfg" #指明板级配置文件
3.3 添加其他配置文件
3.3.1 添加配置头文件
拷贝 include/configs
文件夹下的mx6ullevk.h
生成自己的头文件。
cd include/configs
cp mx6ullevk.h mx6ull_dang.h
修改mx6ull_dang.h
的内容,将头文件中的宏
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
改为
#ifndef __MX6ULL_DANG_CONFIG_H
#define __MX6ULL_DANG_CONFIG_H
3.3.2 添加对应的板级文件夹
拷贝生成自己的板级文件夹
cd board/freescale/
cp mx6ullevk/ mx6ull_dang -r
3.3.3 修改板级文件夹中的内容
-
将
/board/freescale/mx6ull_dang
中的mx6ullevk.c
重命名为mx6ull_dang.c
。cd mx6ull_dang/ mv mx6ullevk.c mx6ull_dang.c
在
mx6ull_dang.c
中有个打印Board
的语句,可以将其改为自己的(可改可不改)int checkboard(void) { if (is_cpu_type(MXC_CPU_MX6ULZ)) puts("Board: MX6ULZ 14x14 EVK\n"); else puts("Board: Dang MX6ULL\n"); //改为自己的 return 0; }
-
修改
mx6ull_dang
文件夹下的Makefile
文件,将Makefile
修改为# SPDX-License-Identifier: GPL-2.0+ # (C) Copyright 2016 Freescale Semiconductor, Inc. obj-y := mx6ull_dang.o
需要将
obj-y := mx6ullevk.o
修改为obj-y := mx6ull_dang.o
,这样才会编译mx6ull_dang.c
。 -
修改
mx6ull_dang
文件夹下的imximage.cfg
文件将
#ifdef CONFIG_USE_IMXIMG_PLUGIN /*PLUGIN plugin-binary-file IRAM_FREE_START_ADDR*/ PLUGIN board/freescale/mx6ullevk/plugin.bin 0x00907000
改为
#ifdef CONFIG_USE_IMXIMG_PLUGIN /*PLUGIN plugin-binary-file IRAM_FREE_START_ADDR*/ PLUGIN board/freescale/mx6ull_dang/plugin.bin 0x00907000
-
修改
mx6ull_dang
文件夹下的Kconfig
文件将
if TARGET_MX6ULL_14X14_EVK config SYS_BOARD default "mx6ullevk" config SYS_VENDOR default "freescale" config SYS_CONFIG_NAME default "mx6ullevk" endif
改为
if TARGET_MX6ULL_DANG config SYS_BOARD default "mx6ull_dang" config SYS_VENDOR default "freescale" config SYS_CONFIG_NAME default "mx6ull_dang" endif
-
修改
mx6ull_dang
文件夹下的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
改为
MX6ULL_DANG BOARD M: Peng Fan <peng.fan@nxp.com> S: Maintained F: board/freescale/mx6ull_dang/ F: include/configs/mx6ull_dang.h F: configs/mx6ull_damg_defconfig F: configs/mx6ull_dang_plugin_defconfig F: configs/mx6ulz_dang_defconfig
主要修改的是第1、4、5、6行,最后两行可以不改,删除也行。
-
修改U-Boot图形配置界面配置文件
向
arch/arm/mach-imx/mx6
文件夹下的Kconfig
文件中添加config TARGET_MX6ULL_DANG bool "Support mx6ull_dang" depends on MX6ULL select BOARD_LATE_INIT select DM select DM_THERMAL imply CMD_DM source "board/freescale/mx6ull_dang/Kconfig"
4 拷贝设备树
4.1 拷贝参考板的设备树
拷贝参考板的设备树生成自己的设备树,对设备树的操作都在自己的设备树相关文件中进行改动,不要直接修改参考板的设备树。
cd arch/arm/dts
cp imx6ull-14x14-evk.dts imx6ull-dang.dts
cp imx6ul-14x14-evk.dtsi imx6ul-dang.dtsi
4.2 修改设备树
4.2.1 修改imx6ull-dang.dts
以下是未修改的代码块
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
//
// Copyright (C) 2016 Freescale Semiconductor, Inc.
/dts-v1/;
#include "imx6ull.dtsi"
#include "imx6ul-14x14-evk.dtsi"
/ {
model = "Freescale i.MX6 UltraLiteLite 14x14 EVK Board";
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
};
&clks {
assigned-clocks = <&clks IMX6UL_CLK_PLL3_PFD2>;
assigned-clock-rates = <320000000>;
};
将上述文件内容修改为
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
//
// Copyright (C) 2016 Freescale Semiconductor, Inc.
/dts-v1/;
#include "imx6ull.dtsi"
#include "imx6ul-dang.dtsi"
/ {
model = "DANG Freescale i.MX6 UltraLiteLite 14x14 EVK Board";
compatible = "fsl,imx6ull-dang", "fsl,imx6ull";
};
&clks {
assigned-clocks = <&clks IMX6UL_CLK_PLL3_PFD2>;
assigned-clock-rates = <320000000>;
};
imx6ull-dang.dts
主要修改的是第8行,将include的dtsi文件修改为自己的dtsi文件.
因为接下来接下来将修改dtsi
文件中的内容,如果不将其换为自己的文件,那么自己修改的文件不会被编译。
4.3 修改dts目录下的Makefile
修改Makefile
,添加生成自己设备树文件的选项。
dtb-$(CONFIG_MX6ULL) += \
imx6ull-14x14-evk.dtb \
imx6ull-dang.dtb \
imx6ull-colibri.dtb \
imx6ull-myir-mys-6ulx-eval.dtb \
imx6ull-seeed-npi-imx6ull-dev-board.dtb \
imx6ull-phytec-segin-ff-rdk-emmc.dtb \
imx6ull-dart-6ul.dtb \
imx6ull-somlabs-visionsom.dtb \
imx6ulz-14x14-evk.dtb
第三行的为添加的内容。
在文件行末的\
后不能有空格等。
5 编译、下载、启动
5.1 编译
前面已经修改过Makefile了,所以编译的时候就不用使用这么多参数了.
-
生成配置文件
make clean #清除之前的编译文件 make mx6ull_dang_defconfig #编译生成配置文件
-
编译工程
make -j4
5.2 下载
-
查看生成文件
查看是否生成对应的uboot文件
-
下载到开发板中
按照自己的方法下载到开发板中就行,
5.3 启动
启动,查看打印的信息
sionsom.dtb
imx6ulz-14x14-evk.dtb
第三行的为添加的内容。
在文件行末的`\`后不能有空格等。
# 5 编译、下载、启动
## 5.1 编译
前面已经修改过Makefile了,所以编译的时候就不用使用这么多参数了.
1. 生成配置文件
```shell
make clean #清除之前的编译文件
make mx6ull_dang_defconfig #编译生成配置文件
```
2. 编译工程
```shell
make -j4
```
## 5.2 下载
1. 查看生成文件
查看是否生成对应的uboot文件
2. 下载到开发板中
按照自己的方法下载到开发板中就行,
## 5.3 启动
启动,查看打印的信息
[外链图片转存中...(img-N92kPFz6-1693282930636)]
uboot启动成功,但是有报错,接下来就是更改错误。