前提说明
操作系统:ubuntu 20.04
硬件环境:野火IMX6ULL NAND
注意有些路径为我自己的本地路径,后期我会完善一些过程。
交叉编译器
1. 下载最新版本
# 下载
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 解压
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
2. 配置环境变量
# 修改配置文件
vim ~/.bashrc
# 追加路径和添加环境变量
export PATH=$PATH:/home/bohao/Nand/tool/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
# 生效
source ~/.bashrc
3. 查看版本信息
# 查看版本信息
arm-linux-gnueabihf-gcc --version
# 显示如下信息
arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4. 安装相关工具
$ sudo apt install bc build-essential git libncurses5-dev lzop perl libssl-dev bison flex
Uboot 编译和烧录
uboot-imx - i.MX U-Boot
1. 下载2020版本
$ git clone https://source.codeaurora.org/external/imx/uboot-imx -b imx_v2020.04_5.4.70_2.3.0
2. 修改配置文件
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_2022ZZU=y
CONFIG_ENV_SIZE=0x100000
CONFIG_ENV_OFFSET=0x600000
CONFIG_DM_GPIO=y
CONFIG_NR_DRAM_BANKS=1
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/2022zzu/imximage.cfg"
CONFIG_NAND_BOOT=y
CONFIG_CMD_NAND=y
CONFIG_CMD_NAND_TRIMFFS=y
CONFIG_CMD_UBI=y
CONFIG_MTD=y
CONFIG_DM_MTD=y
CONFIG_MTD_RAW_NAND=y
CONFIG_CMD_MTDPARTS=y
CONFIG_MTDIDS_DEFAULT="nand0=gpmi-nand"
CONFIG_MTDPARTS_SKIP_INVALID=y
CONFIG_NAND=y
CONFIG_NAND_MXS=y
CONFIG_NAND_MXS_DT=y
CONFIG_ENV_IS_IN_NAND=y
CONFIG_BOOTDELAY=3
# CONFIG_CONSOLE_MUX is not set
CONFIG_SYS_CONSOLE_IS_IN_ENV=y
CONFIG_SUPPORT_RAW_INITRD=y
CONFIG_BOUNCE_BUFFER=y
CONFIG_BOARD_EARLY_INIT_F=y
CONFIG_HUSH_PARSER=y
CONFIG_CMD_BOOTZ=y
# CONFIG_CMD_IMLS is not set
CONFIG_CMD_MEMTEST=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_I2C=y
CONFIG_CMD_MMC=y
CONFIG_CMD_USB=y
CONFIG_CMD_DHCP=y
CONFIG_CMD_PING=y
CONFIG_CMD_BMP=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_NET=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_DEFAULT_DEVICE_TREE="2022zzu"
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
CONFIG_DM_74X164=y
CONFIG_DM_I2C=y
CONFIG_DM_MMC=y
CONFIG_FSL_USDHC=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_SPI=y
CONFIG_DM_SPI=y
CONFIG_SOFT_SPI=y
CONFIG_USB=y
CONFIG_DM_USB=y
CONFIG_USB_STORAGE=y
CONFIG_USB_HOST_ETHER=y
CONFIG_USB_ETHER_ASIX=y
CONFIG_DM_VIDEO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_USB_GADGET_MANUFACTURER="FSL"
CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_CMD_FASTBOOT=y
CONFIG_USB_FUNCTION_FASTBOOT=y
CONFIG_FASTBOOT_UUU_SUPPORT=y
CONFIG_FASTBOOT=y
CONFIG_FASTBOOT_BUF_ADDR=0x86800000
CONFIG_FASTBOOT_BUF_SIZE=0x40000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_EFI_PARTITION=y
CONFIG_LOCALVERSION_AUTO=n
3. 修改头文件
a. mtdparts
Nand Flahs分区信息,我这里要存了两个系统,因此我大概分了9块。
b. CONFIG_MFG_ENV_SETTINGS
这个参数供mfgtool工具使用,分区操作是由fireware文件夹中的uboot(逻辑上)完成的。
c. CONFIG_EXTRA_ENV_SETTINGS
uboot启动时,先从Flash中读取变量,如果Flash的环境变量CRC校验错误,则会使用以下默认变量。
$ cp include/configs/mx6ullevk.h include/configs/2022zzu.h
#ifndef __2022ZZU_CONFIG_H
#define __2022ZZU_CONFIG_H
#ifdef CONFIG_NAND_BOOT
#define MFG_NAND_PARTITION "mtdparts=gpmi-nand:6m(boot),1m(env),10m(kernel1),1m(dtb1),100m(rootfs1),10m(kernel2),1m(dtb2),100m(rootfs2),-(app) "
#else
#define MFG_NAND_PARTITION ""
#endif
#define CONFIG_MFG_ENV_SETTINGS \
"mfgtool_args=setenv bootargs console=${console},${baudrate} " \
BOOTARGS_CMA_SIZE \
"rdinit=/linuxrc " \
"g_mass_storage.stall=0 g_mass_storage.removable=1 " \
"g_mass_storage.file=/fat g_mass_storage.ro=1 " \
"g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF "\
MFG_NAND_PARTITION \
"\0" \
"initrd_addr=0x83800000\0" \
"initrd_high=0xffffffff\0" \
"bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};\0" \
#if defined(CONFIG_NAND_BOOT)
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
TEE_ENV \
"splashimage=0x8c000000\0" \
"fdt_addr=0x83000000\0" \
"fdt_high=0xffffffff\0" \
"tee_addr=0x84000000\0" \
"console=ttymxc0\0" \
"ethaddr=00:04:9f:04:d2:35\0" \
"eth0addr=00:04:9f:04:d2:36\0" \
"eth1addr=00:04:9f:04:d2:37\0" \
"ipaddr=192.168.0.121\0" \
"netmask=255.255.255.0\0" \
"gatewayip=192.168.0.1\0" \
"serverip=192.168.0.104\0" \
"bootargs=console=ttymxc0,115200 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs " \
BOOTARGS_CMA_SIZE \
MFG_NAND_PARTITION \
"\0" \
"bootcmd=nand read 0x80800000 0x700000 0xA00000;nand read 0x83000000 0x1100000 0x100000;bootz 0x80800000 - 0x83000000;\0"
4. 修改板级文件
$ cp board/freescale/mx6ullevk/ board/freescale/2022zzu -rf
$ mv board/freescale/2022zzu/mx6ullevk.c board/freescale/2022zzu/2022zzu.c
$ vim board/freescale/2022zzu/imximage_lpddr2.cfg
# 修改以下内容
PLUGIN board/freescale/2022zzu/plugin.bin 0x00907000
$ vim board/freescale/2022zzu/imximage.cfg
# 修改以下内容
PLUGIN board/freescale/2022zzu/plugin.bin 0x00907000
$ vim board/freescale/2022zzu/Kconfig
# 修改以下内容
if TARGET_2022ZZU
config SYS_BOARD
default "2022zzu"
config SYS_VENDOR
default "freescale"
config SYS_CONFIG_NAME
default "2022zzu"
config SYS_TEXT_BASE
default 0x87800000
endif
$ vim board/freescale/2022zzu/MAINTAINERS
修改以下内容
2022ZZU BOARD
M: Peng Fan <peng.fan@nxp.com>
S: Maintained
F: board/freescale/2022zzu/
F: include/configs/2022zzu.h
F: configs/2022zzu_defconfig
$ vim board/freescale/2022zzu/Makefile
obj-y := 2022zzu.o
5. 修改Kconfig文件
$ vim arch/arm/mach-imx/mx6/Kconfig
config TARGET_2022ZZU
bool "Support 2022zzu"
select BOARD_LATE_INIT
select DM
select DM_THERMAL
select MX6ULL
imply CMD_DM
source "board/freescale/2022zzu/Kconfig"
6. 修改设备树文件
我们主要用到了串口和网络口,目前我们的板子和NXP的评估版一样,因此可以不修改。
$ cp arch/arm/dts/imx6ull-14x14-evk-gpmi-weim.dts arch/arm/dts/2022zzu.dts
$ vim arch/arm/dts/Makefile
dtb-$(CONFIG_MX6ULL) += \
... ...
imx6ull-14x14-evk-gpmi-weim.dtb \
2022zzu.dtb \
... ...
7. 编译烧录
将uboot-dtb.imx文件分别下载到mfgtool工具的file文件夹和firmware文件夹。
U-Boot 2020.04+ (Apr 23 2022 - 11:04:23 -0700)
CPU: i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 49C
Reset cause: POR
Model: i.MX6 ULL 14x14 EVK Board
Board: MX6ULL ZZU GATEWAY
DRAM: 512 MiB
NAND: 512 MiB
MMC: FSL_SDHC: 0
Loading Environment from NAND... OK
[*]-Video Link 0 (480 x 272)
[0] lcdif@21c8000, video
In: serial
Out: serial
Err: serial
Net: eth1: ethernet@20b4000 [PRIME]Get shared mii bus on ethernet@2188000
, eth0: ethernet@2188000
Fastboot: Normal
Normal Boot
Hit any key to stop autoboot: 0
=>
=> ping 192.168.0.104
Using ethernet@20b4000 device
host 192.168.0.104 is alive
Uboot 原理分析