前提说明
操作系统:ubuntu 20.04
硬件环境:野火IMX6ULL NAND
注意有些路径为我自己的本地路径,后期我会完善一些过程。
交叉编译器
Linaro Releases
1. 下载最新版本
# 下载wget /components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-.12-x86_64_arm-linux-gnueabihf.tar.xz# 解压tar -xvf gcc-linaro-7.5.0-.12-x86_64_arm-linux-gnueabihf.tar.xz
2. 配置环境变量
# 修改配置文件vim ~/.bashrc# 追加路径和添加环境变量export PATH=$PATH:/home/bohao/Nand/tool/gcc-linaro-7.5.0-.12-x86_64_arm-linux-gnueabihf/binexport ARCH=armexport CROSS_COMPILE=arm-linux-gnueabihf-# 生效source~/.bashrc
3. 查看版本信息
# 查看版本信息arm-linux-gnueabihf-gcc --version# 显示如下信息arm-linux-gnueabihf-gcc (Linaro GCC 7.5-.12) 7.5.0Copyright (C) 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. 下载版本
$ git clone /external/imx/uboot-imx -b imx_v.04_5.4.70_2.3.0
2. 修改配置文件
CONFIG_ARM=yCONFIG_ARCH_MX6=yCONFIG_TARGET_ZZU=yCONFIG_ENV_SIZE=0x100000CONFIG_ENV_OFFSET=0x600000CONFIG_DM_GPIO=yCONFIG_NR_DRAM_BANKS=1CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/zzu/imximage.cfg"CONFIG_NAND_BOOT=yCONFIG_CMD_NAND=yCONFIG_CMD_NAND_TRIMFFS=yCONFIG_CMD_UBI=yCONFIG_MTD=yCONFIG_DM_MTD=yCONFIG_MTD_RAW_NAND=yCONFIG_CMD_MTDPARTS=yCONFIG_MTDIDS_DEFAULT="nand0=gpmi-nand"CONFIG_MTDPARTS_SKIP_INVALID=yCONFIG_NAND=yCONFIG_NAND_MXS=yCONFIG_NAND_MXS_DT=yCONFIG_ENV_IS_IN_NAND=yCONFIG_BOOTDELAY=3# CONFIG_CONSOLE_MUX is not setCONFIG_SYS_CONSOLE_IS_IN_ENV=yCONFIG_SUPPORT_RAW_INITRD=yCONFIG_BOUNCE_BUFFER=yCONFIG_BOARD_EARLY_INIT_F=yCONFIG_HUSH_PARSER=yCONFIG_CMD_BOOTZ=y# CONFIG_CMD_IMLS is not setCONFIG_CMD_MEMTEST=yCONFIG_CMD_GPIO=yCONFIG_CMD_I2C=yCONFIG_CMD_MMC=yCONFIG_CMD_USB=yCONFIG_CMD_DHCP=yCONFIG_CMD_PING=yCONFIG_CMD_BMP=yCONFIG_CMD_CACHE=yCONFIG_CMD_NET=yCONFIG_CMD_EXT2=yCONFIG_CMD_EXT4=yCONFIG_CMD_EXT4_WRITE=yCONFIG_CMD_FAT=yCONFIG_CMD_FS_GENERIC=yCONFIG_OF_CONTROL=yCONFIG_DEFAULT_DEVICE_TREE="zzu"CONFIG_SYS_RELOC_GD_ENV_ADDR=yCONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=yCONFIG_DM_74X164=yCONFIG_DM_I2C=yCONFIG_DM_MMC=yCONFIG_FSL_USDHC=yCONFIG_PHYLIB=yCONFIG_PHY_MICREL=yCONFIG_PHY_MICREL_KSZ8XXX=yCONFIG_DM_ETH=yCONFIG_DM_ETH_PHY=yCONFIG_FEC_MXC=yCONFIG_MII=yCONFIG_PINCTRL=yCONFIG_PINCTRL_IMX6=yCONFIG_DM_REGULATOR=yCONFIG_DM_REGULATOR_FIXED=yCONFIG_DM_REGULATOR_GPIO=yCONFIG_SPI=yCONFIG_DM_SPI=yCONFIG_SOFT_SPI=yCONFIG_USB=yCONFIG_DM_USB=yCONFIG_USB_STORAGE=yCONFIG_USB_HOST_ETHER=yCONFIG_USB_ETHER_ASIX=yCONFIG_DM_VIDEO=yCONFIG_SYS_WHITE_ON_BLACK=yCONFIG_USB_GADGET=yCONFIG_USB_GADGET_DOWNLOAD=yCONFIG_USB_GADGET_MANUFACTURER="FSL"CONFIG_USB_GADGET_VENDOR_NUM=0x0525CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5CONFIG_CI_UDC=yCONFIG_CMD_FASTBOOT=yCONFIG_USB_FUNCTION_FASTBOOT=yCONFIG_FASTBOOT_UUU_SUPPORT=yCONFIG_FASTBOOT=yCONFIG_FASTBOOT_BUF_ADDR=0x86800000CONFIG_FASTBOOT_BUF_SIZE=0x40000000CONFIG_FASTBOOT_FLASH=yCONFIG_EFI_PARTITION=yCONFIG_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/zzu.h#ifndef __ZZU_CONFIG_H#define __ZZU_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/zzu -rf$ mv board/freescale/zzu/mx6ullevk.c board/freescale/zzu/zzu.c$ vim board/freescale/zzu/imximage_lpddr2.cfg# 修改以下内容PLUGINboard/freescale/zzu/plugin.bin 0x00907000$ vim board/freescale/zzu/imximage.cfg# 修改以下内容PLUGINboard/freescale/zzu/plugin.bin 0x00907000$ vim board/freescale/zzu/Kconfig# 修改以下内容if TARGET_ZZUconfig SYS_BOARDdefault "zzu"config SYS_VENDORdefault "freescale"config SYS_CONFIG_NAMEdefault "zzu"config SYS_TEXT_BASEdefault 0x87800000endif$ vim board/freescale/zzu/MAINTAINERS修改以下内容ZZU BOARDM:Peng Fan <peng.fan@>S:MaintainedF:board/freescale/zzu/F:include/configs/zzu.hF:configs/zzu_defconfig$ vim board/freescale/zzu/Makefileobj-y := zzu.o
5. 修改Kconfig文件
$ vim arch/arm/mach-imx/mx6/Kconfigconfig TARGET_ZZUbool "Support zzu"select BOARD_LATE_INITselect DMselect DM_THERMALselect MX6ULLimply CMD_DMsource "board/freescale/zzu/Kconfig"
6. 修改设备树文件
我们主要用到了串口和网络口,目前我们的板子和NXP的评估版一样,因此可以不修改。
$ cp arch/arm/dts/imx6ull-14x14-evk-gpmi-weim.dts arch/arm/dts/zzu.dts$ vim arch/arm/dts/Makefiledtb-$(CONFIG_MX6ULL) += \... ...imx6ull-14x14-evk-gpmi-weim.dtb \zzu.dtb \... ...
7. 编译烧录
将uboot-dtb.imx文件分别下载到mfgtool工具的file文件夹和firmware文件夹。
U-Boot .04+ (Apr 23 - 11:04:23 -0700)CPU: i.MX6ULL rev1.1 792 MHz (running at 396 MHz)CPU: Industrial temperature grade (-40C to 105C) at 49CReset cause: PORModel: i.MX6 ULL 14x14 EVK BoardBoard: MX6ULL ZZU GATEWAYDRAM: 512 MiBNAND: 512 MiBMMC: FSL_SDHC: 0Loading Environment from NAND... OK[*]-Video Link 0 (480 x 272)[0] lcdif@21c8000, videoIn: serialOut: serialErr: serialNet: eth1: ethernet@20b4000 [PRIME]Get shared mii bus on ethernet@2188000, eth0: ethernet@2188000Fastboot: NormalNormal BootHit any key to stop autoboot: 0=>=> ping 192.168.0.104Using ethernet@20b4000 devicehost 192.168.0.104 is alive