相关参考
【迅为iMX6Q】开发板 u-boot 2015.04 SD卡 启动
【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动
开发环境
- win10 64位
- VMware Workstation Pro 16
- ubuntu 22.04
- 【迅为imx6q】开发板, 2G DDR
uboot-imx 下载
- 使用 NXP 官方提供的 uboot-imx,代码地址为: https://github.com/nxp-imx/uboot-imx
- 使用 git 下载 uboot-imx,
git clone https://github.com/nxp-imx/uboot-imx
- 切换到想要的分支,我切换到:
lf_v2022.04
,也就是 u-boot 2022.04 版本, 支持 较新的Linux 5.15.72 版本,算是当前比较新的版本了
- 切换分支
git checkout -b lf_v2022.04 origin/lf_v2022.04
- gcc 交叉编译工具链推荐:
gcc-arm-11.2-2022.02-x86_64-arm-none-linux-gnueabihf
,这个可以在 ARM 官方网站下载,较老或者较新的gcc 版本,可能编译会报错
操作步骤
一、新建 board mx6q_topeet
- 迅为imx6q 开发板,基于 IMX6Q 系列,所以可以使用
board/freescale/mx6sabresd
作为模板,新建一个 board 用于开发
- 新建一个 board 目录,如取名为:
mx6q_topeet
,也可以直接把 board mx6sabresd
复制为 mx6q_topeet
, $ cp -r board/freescale/mx6sabresd/ board/freescale/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
bool "mx6qsabresd"
select 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 脚本
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- $1 $2 $3 $4
- 增加 mk.sh 执行权限
$ chmod +x mk.sh
- 可以使用
$ ./mk.sh mx6q_topeet_defconfig
来配置 board 的默认配置
zhangsz@zhangsz-virtual-machine:~/linux/imx6q/uboot/uboot-imx_2022.04$ ./mk.sh mx6q_topeet_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
YACC scripts/kconfig/zconf.tab.c
LEX scripts/kconfig/zconf.lex.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
五、修改 board mx6q_topeet
-
board/freescale/mx6q_topeet/mx6sabresd.c
重命名为 board/freescale/mx6q_topeet/mx6q_topeet.c
- 修改
board/freescale/mx6q_topeet/Makefile
, obj-y := mx6sabresd.o
改为 obj-y := mx6q_topeet.o
- 修改
board/freescale/mx6q_topeet/Kconfig
if TARGET_MX6Q_TOPEET
config SYS_BOARD
default "mx6q_topeet"
config SYS_VENDOR
default "freescale"
config SYS_CONFIG_NAME
default "mx6q_topeet"
config SYS_TEXT_BASE
default 0x17800000
endif
六、修改 configs/mx6q_topeet_defconfig
- 改动一:
CONFIG_TARGET_MX6QSABRESD=y
改为:CONFIG_TARGET_MX6Q_TOPEET=y
,也就是新board mx6q_topeet
改动二:CONFIG_DEFAULT_DEVICE_TREE="imx6q-sabresd"
改为CONFIG_DEFAULT_DEVICE_TREE="imx6q-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
$ 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”``
- 修改二:
model = "i.MX6 Quad SABRE Smart Device Board";
compatible = "fsl,imx6q-sabresd", "fsl,imx6q";
改为 :
model = "i.MX6 Quad Topeet Smart Device Board";
compatible = "fsl,imx6q-topeet", "fsl,imx6q";
十、修改 arch/arm/dts/Makefile
- 增加 生成
imx6q-topeet.dtb
编译
- 以上 的操作,可以正常编译 新的 board mx6q_topeet 了,编译方法为:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- mx6q_topeet_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j4
功能修改
一、修改为 2G DDR
- 我的这块迅为imx6q 开发板是2G DDR 内存,所以需要修改
board/freescale/mx6q_topeet/mx6q_4x_mt41j128.cfg
- 修改
configs/mx6q_topeet_defconfig
默认配置,修改 mx6q_4x_mt41j128.cfg
包含路径
把 CONFIG_IMX_CONFIG="board/freescale/mx6sabresd/mx6q_4x_mt41j128.cfg"
修改为 CONFIG_IMX_CONFIG="board/freescale/mx6q_topeet/mx6q_4x_mt41j128.cfg"
- DDR 改为 2G,可以使用 NXP 的DDR 工具生成,也可以把 迅为 android uboot 里面的现有的修改,对比并搬过来使用
- 修改的
board/freescale/mx6q_topeet/mx6q_4x_mt41j128.cfg
文件如下
/*
* Copyright (C) 2011-2016 Freescale Semiconductor, Inc.
* Copyright 2017 NXP
* Jason Liu <r64343@freescale.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
*/
#include <config.h>
/* image version */
IMAGE_VERSION 2
/*
* Boot Device : one of
* spi, sd (the board has no nand neither onenand)
*/
BOOT_FROM sd
#ifdef CONFIG_USE_IMXIMG_PLUGIN
/*PLUGIN plugin-binary-file IRAM_FREE_START_ADDR*/
PLUGIN board/freescale/mx6q_sd/plugin.bin 0x00907000
#else
#ifdef CONFIG_IMX_HAB
CSF 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
*/
#ifdef CONFIG_IMX_OPTEE
SET_BIT 4 0x20c4070 0x3c00000
DATA 4 0x20e0024 0x00000003
CHECK_BITS_SET 4 0x20e0024 0x3
#endif
DATA 4 0x020e0798 0x000C0000
DATA 4 0x020e0758 0x00000000
DATA 4 0x020e0588 0x00000030
DATA 4 0x020e0594 0x00000030
DATA 4 0x020e056c 0x00000030
DATA 4 0x020e0578 0x00000030
DATA 4 0x020e074c 0x00000030
DATA 4 0x020e057c 0x00000030
DATA 4 0x020e058c 0x00000000
DATA 4 0x020e059c 0x00000030
DATA 4 0x020e05a0 0x00000030
DATA 4 0x020e078c 0x00000030
DATA 4 0x020e0750 0x00020000
DATA 4 0x020e05a8 0x00000018
DATA 4 0x020e05b0 0x00000018
DATA 4 0x020e0524 0x00000018
DATA 4 0x020e051c 0x00000018
DATA 4 0x020e0518 0x00000018
DATA 4 0x020e050c 0x00000018
DATA 4 0x020e05b8 0x00000018
DATA 4 0x020e05c0 0x00000018
DATA 4 0x020e0774 0x00020000
DATA 4 0x020e0784 0x00000018
DATA 4 0x020e0788 0x00000018
DATA 4 0x020e0794 0x00000018
DATA 4 0x020e079c 0x00000018
DATA 4 0x020e07a0 0x00000018
DATA 4 0x020e07a4 0x00000018
DATA 4 0x020e07a8 0x00000018
DATA 4 0x020e0748 0x00000018
DATA 4 0x020e05ac 0x00000018
DATA 4 0x020e05b4 0x00000018
DATA 4 0x020e0528 0x00000018
DATA 4 0x020e0520 0x00000018
DATA 4 0x020e0514 0x00000018
DATA 4 0x020e0510 0x00000018
DATA 4 0x020e05bc 0x00000018
DATA 4 0x020e05c4 0x00000018
DATA 4 0x021b0800 0xa1390003
DATA 4 0x021b080c 0x001F001F
DATA 4 0x021b0810 0x001F001F
DATA 4 0x021b480c 0x001F001F
DATA 4 0x021b4810 0x001F001F
DATA 4 0x021b083c 0x43180330
DATA 4 0x021b0840 0x03180310
DATA 4 0x021b483c 0x43200330
DATA 4 0x021b4840 0x0320025C
DATA 4 0x021b0848 0x40363838
DATA 4 0x021b4848 0x38362E3C
DATA 4 0x021b0850 0x3E3C4840
DATA 4 0x021b4850 0x44364640
DATA 4 0x021b081c 0x33333333
DATA 4 0x021b0820 0x33333333
DATA 4 0x021b0824 0x33333333
DATA 4 0x021b0828 0x33333333
DATA 4 0x021b481c 0x33333333
DATA 4 0x021b4820 0x33333333
DATA 4 0x021b4824 0x33333333
DATA 4 0x021b4828 0x33333333
DATA 4 0x021b08b8 0x00000800
DATA 4 0x021b48b8 0x00000800
DATA 4 0x021b0004 0x00020036
DATA 4 0x021b0008 0x09444040
DATA 4 0x021b000c 0x8A8F7955
DATA 4 0x021b0010 0xFF328F64
DATA 4 0x021b0014 0x01FF00DB
DATA 4 0x021b0018 0x00001740
DATA 4 0x021b001c 0x00008000
DATA 4 0x021b002c 0x000026D2
DATA 4 0x021b0030 0x008F1023
DATA 4 0x021b0040 0x00000047
DATA 4 0x021b0000 0x841A0000
DATA 4 0x021b001c 0x04088032
DATA 4 0x021b001c 0x00008033
DATA 4 0x021b001c 0x00048031
DATA 4 0x021b001c 0x09408030
DATA 4 0x021b001c 0x04008040
DATA 4 0x021b0020 0x00005800
DATA 4 0x021b0818 0x00011117
DATA 4 0x021b4818 0x00011117
DATA 4 0x021b0004 0x00025576
DATA 4 0x021b0404 0x00011006
DATA 4 0x021b001c 0x00000000
/* set the default clock gate to save power */
DATA 4 0x020c4068 0x00C03F3F
DATA 4 0x020c406c 0x0030FC03
DATA 4 0x020c4070 0x0FFFC000
DATA 4 0x020c4074 0x3FF00000
DATA 4 0x020c4078 0x00FFF300
DATA 4 0x020c407c 0x0F0000C3
DATA 4 0x020c4080 0x000003FF
/* enable AXI cache for VDOA/VPU/IPU */
DATA 4 0x020e0010 0xF00000CF
/* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
DATA 4 0x020e0018 0x007F007F
DATA 4 0x020e001c 0x007F007F
/*
* 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
*/
DATA 4 0x020c4060 0x000000fb
#endif
二、关闭 [ ] Enable the LDO bypass checking and setting
- 迅为imx6q 开发板可以关闭
LDO bypass checking
- 可以通过
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
图形界面配置修改
.config - U-Boot 2022.04 Configuration
-> ARM architecture
-> [ ] Enable the LDO bypass checking and setting
三、关闭 [ ] Enable Driver Model for PMIC PFUZE100
- 迅为imx6q 开发板 需要关闭 PMIC PFUZE100,应该是没有这个 PMIC
.config - U-Boot 2022.04 Configuration
> Device Drivers
-> Power
-> [ ] Enable Driver Model for PMIC PFUZE100
四、通过 savedefconifg 保存默认配置
- 可以通过
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- savedefconfig
,把手动修改的 menuconfig 配置 保存下来,覆盖原来的 defconfig
zhangsz@zhangsz-virtual-machine:~/linux/imx6q/uboot/uboot-imx_2022.04$ ./mk.sh savedefconfig
scripts/kconfig/conf --savedefconfig=defconfig 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-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <8>;
cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
//wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
no-1-8-v;
keep-power-in-suspend;
enable-sdio-wakeup;
status = "okay";
};
重新编译与烧写到SD卡
- 本次使用 SD 卡启动, 开发板需要设置为 SD 卡驱动,并且准备一个 SD 卡,如 32G 的 TF 卡
- SD 卡插入电脑,并且连接到 ubuntu,使用
df -l
查看 SD 识别的SD 卡设备
u-boot 产物
- uboot-2022.04 分支,uboot 是基于【设备树】的,产物是
u-boot-dtb.imx
,这个可以用于烧写到 SD卡或者 emmc 中, imx 后缀,是对 u-boot.bin 做了处理,用于 imx6q 的 ROM 启动引导 u-boot,直接烧写 u-boot.bin 到 emmc 中,默认无法正常启动
u-boot 烧写
- 编译环境是: VMWare 虚拟机中的 ubuntu 22.04
- SD卡 烧写
u-boot-dtb.imx
,并不是直接把文件复制到 SD卡中,而是通过 Linux dd 烧写命令写入到SD 卡指定的位置,此时 SD 卡可以不分区
-
/dev/sdc1
代表 SD 卡 设备 /dev/sdc
的分区一,如果没有分区,可以使用 sudo fdisk -l
查看SD 卡设备
- 烧写命令:
sudo dd if=u-boot-dtb.imx of=/dev/sdc bs=512 seek=2 && sync
if=u-boot-dtb.imx 表示输入,u-boot-dtb.imx 是当前路径下的 u-boot 编译的产物
of=/dev/sdd , /dev/sdd,而不是 /dev/sdd1,表示 SD 卡设备,这里直接烧写到 SD卡指定位置,不是分区
sync 表示 同步,刷到 SD卡中,
bs=512 :表示 读写块 512 字节
seek=2 :表示 偏移 2 个 块再烧写,也就是 u-boot-dtb.imx 从 SD 卡设备物理地址偏移 1K 字节的位置开始烧写
sync : 为了刷新缓存,同步数据,保证写到 SD 卡中
【注意事项】
-
of=/dev/sdd
,注意这个是 SD 卡实际识别到的设备,每个电脑或者每次插入SD卡,可能会变,需要注意,可以通过 df -l
命令或者 sudo fdisk -l
查看 SD 卡设备
- 这个`of=/dev/sdd 搞错,有可能会把 具体的磁盘写坏,切忌
zhangsz@zhangsz-virtual-machine:~/linux/imx6q/uboot/uboot-imx_2022.04$ sudo dd if=u-boot-dtb.imx of=/dev/sdc bs=512 seek=2 && sync
[sudo] password for zhangsz:
1238+0 records in
1238+0 records out
633856 bytes (634 kB, 619 KiB) copied, 0.0835587 s, 7.6 MB/s
启动信息
- 把烧写
u-boot-dtb.imx
后的 SD 卡插入 imx6q 开发板,重新上电或者按复位键,通过串口查看输出信息
U-Boot 2022.04-00027-g68064d3ce8 (Jan 07 2023 - 17:40:45 +0800)
CPU: i.MX6Q rev1.3 996 MHz (running at 792 MHz)
CPU: Extended Commercial temperature grade (-20C to 105C) at 32C
Reset cause: POR
Model: i.MX6 Quad Topeet Smart Device Board
DRAM: 2 GiB
Core: 80 devices, 19 uclasses, devicetree: separate
MMC: FSL_SDHC: 1, FSL_SDHC: 2, FSL_SDHC: 3
Loading Environment from MMC... OK
No panel detected: default to Hannstar-XGA
Display: Hannstar-XGA (1024x768)
In: serial
Out: serial
Err: serial
SEC0: RNG instantiated
switch to partitions #0, OK
mmc1 is current device
flash target is MMC:1
Net: Could not get PHY for FEC0: addr 1
Could not get PHY for FEC0: addr 1
No ethernet found.
Fastboot: Normal
Normal Boot
Hit any key to stop autoboot: 0
=>
=>
- 自此,【迅为iMX6Q】开发板 u-boot 2022.04 SD卡 启动 基本成功,以太网驱动、LCD 驱动正在研究如何移植
小结
- 本篇 采用 新建 board 的方式,移植适配 u-boot 2022.04 到 迅为imx6q开发板上,为了更进一步的加强嵌入式Linux 的学习,巩固学习方法
- 深入学习与研究u-boot,可以熟悉开发板硬件配置与驱动,是个很好的切入点