【迅为iMX6Q】开发板 U-Boot 2026.04 emmc 或者 SD卡 启动

📅 2026/8/3 8:26:44
【迅为iMX6Q】开发板 U-Boot 2026.04 emmc 或者 SD卡 启动
相关参考【迅为iMX6Q】开发板 u-boot 2015.04 SD卡 启动【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动【迅为iMX6Q】开发板 u-boot 2022.04 SD卡 启动前言最近工作接触 嵌入式 Linux 的开发因此找到了买了很久的 迅为imx6q 开发板尝试再熟悉一下嵌入式 Linux 整套开发流程 u-boot、kernel、rootfs 等。开发环境win10 64位VMware Workstation 17 Proubuntu 20.04【迅为imx6q】开发板 2G DDRuboot-imx 下载使用 NXP 官方提供的 uboot-imx代码地址为 https://github.com/nxp-imx/uboot-imx使用 git 下载 uboot-imxgit clone https://github.com/nxp-imx/uboot-imx切换到想要的分支我切换到lf_v2026.04也就是 U-Boot 2026.04 版本 支持 较新的 Linux 6.18.20 版本算是当前比较新的版本了切换分支git checkout -b lf_v2026.04 origin/lf_v2026.04gcc 交叉编译工具链推荐gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf这个可以在 ARM 官方网站下载较老或者较新的gcc 版本可能编译会报错操作步骤一、新建 board mx6q_topeet迅为imx6q 开发板基于 IMX6Q 系列所以可以使用board/nxp/mx6sabresd作为模板新建一个 board 用于开发新建一个 board 目录如取名为mx6q_topeet也可以直接把 boardmx6sabresd复制为mx6q_topeet$ cp -r board/nxp/mx6sabresd/ board/nxp/mx6q_topeet二、新建配置文件mx6q_topeet_defconfig新建一份mx6q_topeet_defconfig可以把mx6qsabresd_defconfig复制为mx6q_topeet_defconfig操作方法$ cp configs/mx6qsabresd_defconfig configs/mx6q_topeet_defconfig三、添加TARGET_MX6Q_TOPEET修改 arch/arm/mach-imx/mx6/Kconfig新增 如下的 配置config TARGET_MX6Q_TOPEET boolmx6q topeetselect BOARD_LATE_INIT select DM select DM_THERMAL select IMX_THERMAL select BOARD_EARLY_INIT_F select NXP_BOARD_REVISION imply CMD_DM select FSL_CAAM select FSL_BLOB select ARCH_MISC_INIT select RNG_SELF_TEST depends on MX6Q修改 arch/arm/mach-imx/mx6/Kconfig尾部位置新增source board/freescale/mx6q_topeet/Kconfig四、新增 mk.sh 脚本vim mk.sh#!/bin/bash export PATH$PATH:/home/zhangsz/tools/gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf/bin make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf-$1$2$3$4增加 mk.sh 执行权限$ chmod x mk.sh可以使用$ ./mk.sh mx6q_topeet_defconfig来配置 board 的默认配置zhangszzhangsz:~/imx6q/uboot-imx$./mk.sh mx6q_topeet_defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o YACC scripts/kconfig/zconf.tab.[ch]LEX scripts/kconfig/zconf.lex.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf ##configurationwritten to.config#五、修改 board mx6q_topeetboard/nxp/mx6q_topeet/mx6sabresd.c重命名为board/nxp/mx6q_topeet/mx6q_topeet.c修改board/nxp/mx6q_topeet/Makefileobj-y : mx6sabresd.o改为obj-y : mx6q_topeet.o修改board/nxp/mx6q_topeet/KconfigifTARGET_MX6Q_TOPEET config SYS_BOARDdefaultmx6q_topeetconfig SYS_VENDORdefaultfreescaleconfig SYS_CONFIG_NAMEdefaultmx6q_topeetconfig SYS_TEXT_BASEdefault0x17800000endif六、修改 configs/mx6q_topeet_defconfig改动一CONFIG_TARGET_MX6QSABRESDy改为CONFIG_TARGET_MX6Q_TOPEETy也就是新board mx6q_topeet改动二CONFIG_DEFAULT_DEVICE_TREEimx6q-sabresd改为CONFIG_DEFAULT_DEVICE_TREEimx6q-topeet七、增加include/configs/mx6q_topeet.h添加 board 头文件include/configs/mx6q_topeet.h可以通过 复制一份$ cp include/configs/mx6sabresd.h include/configs/mx6q_topeet.h八、增加arch/arm/dts/imx6q-topeet.dts新建 board 的设备树可以复制一份如下$ cp arch/arm/dts/imx6q-sabresd.dts arch/arm/dts/imx6q-topeet.dts九、增加arch/arm/dts/imx6qdl-topeet.dtsi新建 board 的设备树arch/arm/dts/imx6q-topeet.dts包含arch/arm/dts/imx6qdl-topeet.dtsi$ cp arch/arm/dts/imx6qdl-sabresd.dtsi arch/arm/dts/imx6qdl-topeet.dtsi修改arch/arm/dts/imx6q-topeet.dts修改一#include imx6qdl-sabresd.dtsi改为 #include “imx6qdl-topeet.dtsi”修改二modeli.MX6 Quad SABRE Smart Device Board;compatiblefsl,imx6q-sabresd,fsl,imx6q;改为 modeli.MX6 Quad Topeet Smart Device Board;compatiblefsl,imx6q-topeet,fsl,imx6q;十、修改arch/arm/dts/Makefile增加 生成imx6q-topeet.dtb编译以上 的操作可以正常编译 新的 board mx6q_topeet 了编译方法为make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- mx6q_topeet_defconfigmake ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- -j4功能修改一、修改为 2G DDR我的这块迅为imx6q 开发板是2G DDR 内存所以需要修改board/nxp/mx6q_topeet/mx6q_4x_mt41j128.cfg修改configs/mx6q_topeet_defconfig默认配置修改mx6q_4x_mt41j128.cfg包含路径把CONFIG_IMX_CONFIGboard/nxp/mx6sabresd/mx6q_4x_mt41j128.cfg修改为CONFIG_IMX_CONFIGboard/nxp/mx6q_topeet/mx6q_4x_mt41j128.cfgDDR 改为 2G可以使用 NXP 的DDR 工具生成也可以把 迅为 android uboot 里面的现有的修改对比并搬过来使用修改的board/nxp/mx6q_topeet/mx6q_4x_mt41j128.cfg文件如下/* * Copyright (C) 2011-2016 Freescale Semiconductor, Inc. * Copyright 2017 NXP * Jason Liu r64343freescale.com * * SPDX-License-Identifier: GPL-2.0 * * Refer doc/README.imximage for more details about how-to configure * and create imximage boot image * * The syntax is taken as close as possible with the kwbimage */#includeconfig.h/* image version */IMAGE_VERSION2/* * Boot Device : one of * spi, sd (the board has no nand neither onenand) */BOOT_FROM sd#ifdefCONFIG_USE_IMXIMG_PLUGIN/*PLUGIN plugin-binary-file IRAM_FREE_START_ADDR*/PLUGIN board/freescale/mx6q_sd/plugin.bin0x00907000#else#ifdefCONFIG_IMX_HABCSF CONFIG_CSF_SIZE#endif/* * Device Configuration Data (DCD) * * Each entry must have the format: * Addr-type Address Value * * where: * Addr-type register length (1,2 or 4 bytes) * Address absolute address of the register * value value to be stored in the register */#ifdefCONFIG_IMX_OPTEESET_BIT40x20c40700x3c00000DATA40x20e00240x00000003CHECK_BITS_SET40x20e00240x3#endifDATA40x020e07980x000C0000DATA40x020e07580x00000000DATA40x020e05880x00000030DATA40x020e05940x00000030DATA40x020e056c0x00000030DATA40x020e05780x00000030DATA40x020e074c0x00000030DATA40x020e057c0x00000030DATA40x020e058c0x00000000DATA40x020e059c0x00000030DATA40x020e05a00x00000030DATA40x020e078c0x00000030DATA40x020e07500x00020000DATA40x020e05a80x00000018DATA40x020e05b00x00000018DATA40x020e05240x00000018DATA40x020e051c0x00000018DATA40x020e05180x00000018DATA40x020e050c0x00000018DATA40x020e05b80x00000018DATA40x020e05c00x00000018DATA40x020e07740x00020000DATA40x020e07840x00000018DATA40x020e07880x00000018DATA40x020e07940x00000018DATA40x020e079c0x00000018DATA40x020e07a00x00000018DATA40x020e07a40x00000018DATA40x020e07a80x00000018DATA40x020e07480x00000018DATA40x020e05ac0x00000018DATA40x020e05b40x00000018DATA40x020e05280x00000018DATA40x020e05200x00000018DATA40x020e05140x00000018DATA40x020e05100x00000018DATA40x020e05bc0x00000018DATA40x020e05c40x00000018DATA40x021b08000xa1390003DATA40x021b080c0x001F001FDATA40x021b08100x001F001FDATA40x021b480c0x001F001FDATA40x021b48100x001F001FDATA40x021b083c0x43180330DATA40x021b08400x03180310DATA40x021b483c0x43200330DATA40x021b48400x0320025CDATA40x021b08480x40363838DATA40x021b48480x38362E3CDATA40x021b08500x3E3C4840DATA40x021b48500x44364640DATA40x021b081c0x33333333DATA40x021b08200x33333333DATA40x021b08240x33333333DATA40x021b08280x33333333DATA40x021b481c0x33333333DATA40x021b48200x33333333DATA40x021b48240x33333333DATA40x021b48280x33333333DATA40x021b08b80x00000800DATA40x021b48b80x00000800DATA40x021b00040x00020036DATA40x021b00080x09444040DATA40x021b000c0x8A8F7955DATA40x021b00100xFF328F64DATA40x021b00140x01FF00DBDATA40x021b00180x00001740DATA40x021b001c0x00008000DATA40x021b002c0x000026D2DATA40x021b00300x008F1023DATA40x021b00400x00000047DATA40x021b00000x841A0000DATA40x021b001c0x04088032DATA40x021b001c0x00008033DATA40x021b001c0x00048031DATA40x021b001c0x09408030DATA40x021b001c0x04008040DATA40x021b00200x00005800DATA40x021b08180x00011117DATA40x021b48180x00011117DATA40x021b00040x00025576DATA40x021b04040x00011006DATA40x021b001c0x00000000/* set the default clock gate to save power */DATA40x020c40680x00C03F3FDATA40x020c406c0x0030FC03DATA40x020c40700x0FFFC000DATA40x020c40740x3FF00000DATA40x020c40780x00FFF300DATA40x020c407c0x0F0000C3DATA40x020c40800x000003FF/* enable AXI cache for VDOA/VPU/IPU */DATA40x020e00100xF00000CF/* set IPU AXI-id0 Qos0xf(bypass) AXI-id1 Qos0x7 */DATA40x020e00180x007F007FDATA40x020e001c0x007F007F/* * Setup CCM_CCOSR register as follows: * * cko1_en 1 -- CKO1 enabled * cko1_div 111 -- divide by 8 * cko1_sel 1011 -- ahb_clk_root * * This sets CKO1 at ahb_clk_root/8 132/8 16.5 MHz */DATA40x020c40600x000000fb#endif二、关闭[ ] Enable the LDO bypass checking and setting迅为imx6q 开发板可以关闭LDO bypass checking可以通过make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- menuconfig图形界面配置修改.config-U-Boot2026.04Configuration-ARM architecture-[]Enable the LDO bypass checking and setting三、关闭[ ] Enable Driver Model for PMIC PFUZE100迅为imx6q 开发板 需要关闭PMIC PFUZE100应该是没有这个 PMIC.config-U-Boot2026.04ConfigurationDevice Drivers-Power-[]Enable Driver ModelforPMIC PFUZE100四、通过 savedefconifg 保存默认配置可以通过make ARCHarm CROSS_COMPILEarm-none-linux-gnueabihf- savedefconfig把手动修改的 menuconfig 配置 保存下来覆盖原来的 defconfigzhangszzhangsz:~/imx6q/uboot-imx$./mk.sh savedefconfig scripts/kconfig/conf--savedefconfigdefconfig Kconfig覆盖生成新的mx6q_topeet_defconfig 操作命令$ cp defconfig configs/mx6q_topeet_defconfig五、 SD卡 的 CD 与 WP 引脚修改此时u-boot 烧写后发现 使用 SD 卡启动时提示找不到 SD 卡也就是saveenv操作失败这是因为 迅为imx6q 开发板 SD CD 引脚需要修改修改设备树文件arch/arm/dts/imx6qdl-topeet.dtsi修改内容设备树节点usdhc2中cd-gpios gpio2 2 GPIO_ACTIVE_LOW;改为cd-gpios gpio1 4 GPIO_ACTIVE_LOW;这个需要根据迅为开发板原理图注释 设备树节点usdhc2中的//wp-gpios gpio2 3 GPIO_ACTIVE_HIGH;因为没有 写保护引脚wp如果设置上一个引脚SD 卡可能会变为【只读】usdhc2{pinctrl-namesdefault;pinctrl-0pinctrl_usdhc2;bus-width8;cd-gpiosgpio14GPIO_ACTIVE_LOW;//wp-gpios gpio2 3 GPIO_ACTIVE_HIGH;no-1-8-v;keep-power-in-suspend;enable-sdio-wakeup;statusokay;};u-boot 编译产物uboot-2026.04 分支uboot 是基于【设备树】的产物是u-boot-dtb.imx这个可以用于烧写到 SD卡或者 emmc 中 imx 后缀是对 u-boot.bin 做了处理用于 imx6q 的 ROM 启动引导 u-boot。也就是需要烧写u-boot-dtb.imx而不是u-boot.bin直接烧写 u-boot.bin 到 emmc 中默认无法正常启动启动方式当前 u-boot 同时支持 emmc 启动 烧写后 boot 选择 emmc 启动方式也支持 SD卡启动烧写编译产物u-boot-dtb.imx到 SD 卡然后 boot 选择选择 SD 卡启动模式SD 卡启动本次使用 SD 卡启动 开发板需要设置为 SD 卡驱动并且准备一个 SD 卡如 32G 的 TF 卡SD 卡插入电脑并且连接到 ubuntu使用df -l查看 SD 识别的SD 卡设备u-boot 烧写编译环境是 VMWare 虚拟机中的 ubuntu 20.04SD卡 烧写u-boot-dtb.imx并不是直接把文件复制到 SD卡中而是通过 Linux dd 烧写命令写入到 SD 卡指定的位置此时 SD 卡可以不分区/dev/sdc1代表 SD 卡 设备/dev/sdc的分区一如果没有分区可以使用sudo fdisk -l查看SD 卡设备烧写命令sudo dd ifu-boot-dtb.imx of/dev/sdc bs512 seek2 syncifu-boot-dtb.imx 表示输入u-boot-dtb.imx 是当前路径下的 u-boot 编译的产物 of/dev/sdd /dev/sdd而不是/dev/sdd1表示 SD 卡设备这里直接烧写到 SD卡指定位置不是分区 sync 表示 同步刷到 SD卡中 bs512表示 读写块512字节 seek2表示 偏移2个 块再烧写也就是 u-boot-dtb.imx 从 SD 卡设备物理地址偏移1K 字节的位置开始烧写 sync 为了刷新缓存同步数据保证写到 SD 卡中【注意事项】of/dev/sdd注意这个是 SD 卡实际识别到的设备每个电脑或者每次插入SD卡可能会变需要注意可以通过df -l命令或者sudo fdisk -l查看 SD 卡设备这个of/dev/sdd 搞错有可能会把 具体的磁盘写坏切忌$ sudo ddifu-boot-dtb.imx of/dev/sdc bs512seek2sync[sudo]passwordforzhangsz:12380records in12380records out633856bytes(634kB,619KiB)copied,0.0835587s,7.6MB/semmc 启动emmc 启动需要使用 mfgtools USB 烧写配置 mfgtools 的cfg.ini如下[profiles]chipLinux[platform]boardsabresd[LIST]nameLinux-SabreSD-eMMC需要配置mfgtools\Profiles\Linux\OS Firmware\ucl2.xml搜索到Linux-SabreSD-eMMC然后更改 u-boot 的文件的名字为u-boot-dtb.imx可以只烧写 u-boot而不烧写 Linux 镜像等节省烧写时间。注意把编译后的u-boot-dtb.imx放在 mfgtools 制定路径下如mfgtools\Profiles\Linux\OS Firmware\files\linuxboot 模式拨码开关设置为 emmc 启动重新上电即可。通过调试串口可以看到 u-boot 启动信息。启动信息把烧写u-boot-dtb.imx后的 SD 卡插入 imx6q 开发板重新上电或者按复位键通过串口查看输出信息U-Boot2026.04-g80a25b0917bc-dirty(Aug022026-11:15:320800)CPU:i.MX6Q rev1.3996MHz(running at792MHz)CPU:Extended Commercial temperaturegrade(-20C to105C)at47C Reset cause:POR Model:i.MX6 Quad Topeet Smart Device Board DRAM:2GiB Core:92devices,23uclasses,devicetree:separate MMC:FSL_SDHC:1,FSL_SDHC:2,FSL_SDHC:3Loading Environment from MMC...Reading fromMMC(3)...OK In:serial Out:serial Err:serial SEC0:RNG instantiated flash target is MMC:3Net:Could not get PHYforFEC0:addr1Could not get PHYforFEC0:addr1No ethernet found.Fastboot:Normal Normal Boot Hit any key to stop autoboot:0MMC:no card present**Bad device specification mmc2**Couldnt find partition mmc2:1Cant set block device Unknown commandboota-tryhelp自此【迅为iMX6Q】开发板 u-boot 2026.04 SD卡 或者 emmc 启动 基本成功以太网驱动、LCD 驱动正在研究如何移植小结本篇 采用 新建 board 的方式移植适配 u-boot 2026.04 到 迅为 imx6q 开发板上为了更进一步的加强嵌入式 Linux 的学习巩固学习方法深入学习与研究 u-boot可以熟悉开发板硬件配置与驱动是个很好的切入点