IMX Linux 用户手册 — 1
第一章 概述
本文档介绍了i.MX Linux®OS BSP (BSP代表Board Support Package)在i.MX平台上的构建和安装方法。它还涵盖了特殊的i.MX功能和如何使用它们。
本文档还提供了运行i.MX平台的步骤,包括单板拨码开关设置、U-Boot引导加载程序的配置和使用说明。
后面的章节描述了在运行Linux操作系统内核时如何使用一些i.MX特殊特性。
本指南中涉及的功能可能针对特定的板或soc。对于特定板或SoC的能力,请参阅i.MX Linux®发布说明(IMXLXRN)。
1.1观众
本文档主要适用于打算使用本产品的软件、硬件和系统工程师,以及想要了解本产品的任何人。
1.2约定
本文档遵循以下约定:
•Courier New font:该字体用于标识命令、显式命令参数、代码示例、表达式、数据类型和指令。
1.3支持的硬件soc和单板
以下是本指南中涉及的系统:
• i.MX 6Quad SABRE-SD board and platform
• i.MX 6DualLite SABRE-SD platform
• i.MX 6SoloX SABRE-SD platform
• i.MX 7Dual SABRE-SD platform
• i.MX 6QuadPlus SABRE-SD platform
• i.MX 6UltraLite EVK platform
• i.MX 6ULL EVK platform
• i.MX 6ULZ EVK platform
• i.MX 7ULP EVK platform
• i.MX 8QuadMax MEK board
• i.MX 8QuadXPlus MEK platform
• i.MX 8DXL EVK Platform
• i.MX 8M Quad EVK platform
• i.MX 8M Mini EVK Board
• i.MX 8M Nano EVK Board
• i.MX 8M Plus EVK board
• i.MX 8DualX MEK Board
• i.MX 8ULP EVK Board NXP Semiconductors
第二章 介绍
i.MX Linux BSP是二进制文件、源代码和支持文件的集合,可用于创建U-Boot引导加载程序、Linux内核映像和i.MX开发系统的根文件系统。Yocto项目是构建本文中描述的映像的首选框架,当然也可以使用其他方法。
关于如何设置Linux操作系统主机、如何运行和配置Yocto项目、生成映像和生成rootfs的所有信息都包含在i.MX Yocto项目用户指南(IMXLXYOCTOUG)中。
当Linux操作系统运行时,本指南提供了i.MX soc提供的一些特殊特性的使用方法。发布说明提供了特定板上支持的特性。
第三章 基本的终端设置
i.MX单板可以通过串口线与主机服务器(Windows®操作系统或Linux操作系统)通信。已使用超级终端、Tera Term、PuTTY等常用串口通信程序。下面以在Windows操作系统上使用超级终端安装串口为例进行说明。
i.MX 6Quad/QuadPlus/DualLite SABRE-AI单板通过串口线缆连接主机服务器。
其他的i.MX板通过micro-B USB连接器连接主机驱动。
- 使用上述线缆连接目标器和Windows操作系统的PC。
- 在Windows操作系统的PC上打开超级终端,按照下图所示进行设置。
i.MX 8单板通过micro USB连接器连接主机驱动。USB到串行驱动程序可以在www.ftdichip.com/Drivers/VCP.htm下面找到。FT4232 USB to串口转换器提供4个串口。i.MX 8主板的第一个端口用于Arm®Cortex®-A核心控制台,第二个端口用于SCU的控制台。用户需要选择第一个端口(COM)
在终端设置中。i.MX 8DXL板的第三和第四个端口分别用于Arm Cortex-A核心控制台和SCU控制台。
第四章 引导Linux操作系统
在i.MX板上启动Linux操作系统内核之前,需要将镜像(U-Boot、Linux内核、设备树和rootfs)拷贝到启动设备,并设置启动开关以启动该设备。针对不同的单板、启动设备和期望的结果,有不同的引导Linux操作系统的方法。介绍如何准备启动设备,在内存映射中需要放置文件,设置启动开关,以及如何从U-Boot启动Linux操作系统。
4.1软件概述
介绍单板引导和运行Linux操作系统所需的软件。
要在i.MX 6和i.MX 7上启动一个Linux镜像,需要以下元素:
•引导装载程序(U-Boot)
•Linux内核映像(zImage)
•单板的设备树文件(.dtb)
•特定Linux映像的根文件系统(rootfs)
•用于i.MX 7ULP的Arm Cortex-M4映像
要在i.MX 8QuadMax, i.MX 8QuadXPlus和i.MX 8DXL上启动一个Linux镜像,需要多个元素:
•Bootloader (imx-boot由imx-mkimage构建,这是一个将固件和U-Boot结合起来为i.MX 8创建Bootloader的工具),其中包括U-Boot, Arm可信固件,DCD文件,系统控制器固件,以及i.MX 8QuadMax/i以来的SECO固件。MX 8QuadXPlus B0和i.m x8dxl A1。
•(可选) Arm Cortex-M4图像
•Linux内核映像(由Linux -imx构建的映像)
•单板的设备树文件(.dtb)
•特定Linux映像的根文件系统(rootfs)
在i.MX 8M Quad, i.MX 8M Mini, i.MX 8M Nano和i.MX 8M Plus上,需要多个元素:
•imx-boot(由imx-mkimage构建),包括SPL, U-Boot, Arm可信固件,DDR固件
•HDMI固件(仅支持i.m x8m Quad)
•Linux内核映像
•单板的设备树文件(.dtb)。
•特定Linux映像的根文件系统(rootfs)
在i.MX 8ULP上,需要四个要素:
•imx-boot(由imx-mkimage构建),包括SPL, U-Boot, Arm Trusted Firmware, OP-TEE, uPower Firmware, Sentinel Firmware和Arm Cortex-M33映像
•Linux内核映像
•单板的设备树文件(.dtb)
•特定Linux映像的根文件系统(rootfs)
可以为特定的图形化后端配置系统。对于i.MX 8,图形化后端是XWayland。对于i.MX 7ULP,默认后端是XWayland。
4.4.1Bootloader
推荐U-Boot作为i.MX 6和i.MX 7的引导加载工具。i.MX 8需要一个引导加载程序,其中包括U-Boot以及下面描述的其他组件。U-Boot必须加载到一个设备上才能从该设备启动。U-Boot映像是特定于单板的,可以配置为支持从不同源启动。
预构建或Yocto项目默认引导加载程序名称以引导加载程序名称开始,然后是平台和板的名称,然后是配置映像从哪个设备启动的设备名称:u-boot-[platform][board]_[machine_configuration].bin。如果不指定启动设备,则从SD/MMC启动。
该工具可用于将U-Boot加载到所有带有i.MX 6和i.MX 7的设备上。U-Boot可以通过Linux dd命令直接加载到SD卡上。U-Boot支持将U-Boot镜像加载到其他设备上。
在i.MX 8上,U-Boot无法自行启动设备。i.MX 8预构建映像或Yocto Project默认引导加载程序是SD卡的imx-boot,它是由imx-mkimage创建的。imx-boot二进制文件包括U-Boot, Arm可信固件,DCD文件(8QuadMax/8QuadXPlus/8DXL),系统控制器固件(8QuadMax/8QuadXPlus/8DXL), SPL (8M SoC), DDR固件(8M), HDMI固件(8M Quad),和B0的SECO固件(8QuadMax/8QuadXPlus/8DXL)。
在i.MX 8M SoC上,U-Boot中启动第二个SPL (program loader)。SPL被实现为运行在TCML上的第一级引导加载程序(对于i.m x8m Nano和i.m x8m Plus,第一级引导加载程序运行在OCRAM中)。用于初始化DDR,并将U-Boot、U-Boot DTB、Arm可信固件、TEE OS(可选)从启动设备加载到内存中。SPL完成之后加载映像,它跳转到Arm的可信固件BL31直接。BL31启动可选的BL32 (TEE OS)和BL33 (U-Boot)继续引导内核。
在imx-boot中,SPL与DDR固件一起打包,以便ROM可以将它们加载到Arm Cortex-M4 TCML或OCRAM(仅适用于i.MX 8M Nano和i.MX 8M Plus)。U-Boot、U-Boot DTB、Arm Trusted固件和TEE OS(可选)被打包到FIT映像中,最终构建到imx-boot中。
4.1.2 Linux内核镜像和设备树
这个i.MX BSP包含一个基于Linux内核5.15.5版本的预构建内核映像,以及与每个平台相关联的设备树文件。
相同的内核映像用于名称为zImage的所有i.MX 6和i.MX 7。设备树是树形数据结构,它描述了硬件配置,允许一个通用内核在不同的单板或配置下以不同的引脚设置启动。设备树文件使用.dtb扩展名。设备树的配置可以在Linux源代码中的arch/arm/boot/dts下找到.dts文件。
i.MX Linux交付包中包含预构建的各种配置的i.MX板设备树文件。预构建映像的文件名为Image-[platform]-[board]-[configuration].dtb。例如,i.MX 8QuadMax MEK单板的设备树文件为Image-imx8qm-mek.dtb。
对于i.MX 6和i.MX 7来说,是ldo.dtb设备树用于支持启用了ldo的特性。缺省情况下,LDO bypass功能处于开启状态。如果你的单板的CPU设置为1.2 GHz,你应该使用ldo.dtb。因为在1.2 GHz的CPU上不支持LDO旁路模式,所以使用dtb设备树代替默认设置。设备树*hdcp.dtb用于启用HDCP特性,因为
引脚冲突的,这需要在构建时配置。
在i.MX 8, i.MX 8M和i.MX 8ULP上,内核是64位的,设备树位于arch/arm64/boot/dts/freescale文件夹中,并使用dts扩展。内核是使用发行包中提供的linux-imx软件和以Image开头的文件名构建的。
4.1.3根文件系统
根文件系统包(或rootfs)提供busybox、公共库和其他基本元素。
i.MX BSP包包含几个根文件系统。它们的命名规则如下: [image name]- [backend]-[platform][board].[ext4|wic]。“ext4”表示标准文件系统。它可以作为NFS挂载,也可以将其内容存储在引导媒体(如SD/MMC卡)上。
要使用的图形化后端也是由rootfs定义的。
4.2通用更新工具
UUU (Universal Update Utility)运行在Windows或Linux操作系统主机上,用于将镜像下载到i.MX板上的不同设备。
4.2.1下载UUU
从https://github.com/NXPmicro/mfgtools/releases下载uu1.4.193及以上版本。
4.2.2使用UUU
要使用UUU进行i.MX 6, i.MX 7, i.MX 8,请遵循以下说明: - 用计算机的USB线缆连接单板的USB OTG/TYPE C接口。
- 从OTG-to-UART端口连接USB电缆到计算机进行控制台输出。
3.打开终端仿真程序。请参阅本文档中的“基本终端设置”小节。 - 设置启动引脚为串口下载模式。请参阅本文档“制造工具的串行下载模式”一节。
要使用i.MX 8ULP EVK的UUU,请遵循以下说明:
•将单引导映像和rootfs烧刻到eMMC,执行以下命令:
uuu -b emmc_all imx-boot-imx8ulpevk-sd.bin-flash_singleboot_m33 <rootfs.wic.bz2>
•将单引导映像烧录到FlexSPI2 NOR flash,执行以下命令:
uuu -b qspi imx-boot-imx8ulpevk-fspi.bin-flash_singleboot_m33_flexspi
•将双引导映像和rootfs刻录到eMMC和FlexSPI0 NOR flash中,执行以下步骤:
- 准备imx-boot-imx8ulpevk-sd.bin-flash_singleboot_m33, imx-boot-imx8ulpevk-sd.bin-flash_dualboot, imx-boot-imx8ulpevk-sd.bin-flash_dualboot_m33,和<rootfs.wic>。
- 更新UUU脚本文件uuu_8ulp_dual.auto与上述图像的文件路径和名称。
3.运行uuu mfgtools/scripts/samples/uuu_8ulp_dual.auto。
UUU的详细使用方法请参见github.com/NXPmicro/mfgtools/wiki。
例如,下面的命令写入rootfs.wic 到eMMC。
uuu -b emmc_all <bootloader> < rootfs.wic>
执行如下命令解压bz2文件并写入eMMC:
uuu -b emmc_all <bootloader> < rootfs.wic.bz2 / * >
通过USB下载和bootloader (SPL和U-Boot)命令如下:
uuu -b spl <bootloader>
以下命令刻入eMMC(如果该发布包只支持一个单板,且该单板支持eMMC芯片):
uuu <release_package>.zip
注意:对于i.m x8quadxplus B0, UUU以32 KB偏移量将eMMC映像闪烁到引导分区。它可能不兼容所有eMMC设备。建议开启eMMC fastboot模式,并使用UUU内核版本脚本将eMMC镜像flash到偏移量为0的引导分区。
4.3准备SD/MMC卡启动
介绍在Linux主机上启动i.MX板时,需要准备SD/MMC卡。这些说明适用于SD卡和MMC卡,但为了简单起见,通常只列出SD卡。
为了让一个Linux映像能够运行,需要四个独立的部分:
•Linux操作系统内核镜像(zImage/ image)
•设备树文件(*.dtb)
•映像引导装载程序
•根文件系统(例如,EXT4)
Yocto项目创建了一个可以直接闪现的SD卡映像。这是用一个命令将所有需要的东西加载到卡片上的最简单的方法。
一个.wic映像包含为SD卡正确配置的所有4个映像。该版本包含一个预构建的.wic映像,它是专门为单板配置构建的。它运行Wayland图形后端。除非U-Boot、设备树和rootfs被修改,否则不会在其他单板上运行。
当需要更大的灵活性时,可以单独加载各个组件,这些指令也包括在这里。SD卡可以用单个组件逐个加载,也可以加载.wic映像,个别部件可以用特定的组件覆盖。
默认.wic映像上的rootfs限制在小于4 GB,但是重新分区和重新加载rootfs可能会增加到卡的大小。还可以更改rootfs,以指定所使用的图形化后端。
设备树文件(.dtb)包含对内核的特定于单板和配置的更改。更改设备树文件以更改不同的i.MX板或配置的内核。
默认情况下,发行版使用以下布局的图像在SD卡。内核映像和DTB转移到使用FAT分区,而没有SD卡上固定的原始地址。如果需要固定的原始地址,用户需要修改U-Boot的启动环境。
表1. 映像布局
4.3.1准备卡
需准备SD/MMC读卡器,如USB读卡器。它用于传输引导加载程序和内核映像,以初始化分区表和复制根文件系统。为了简化指令,假设使用了4gb的SD/MMC卡。
任何Linux发行版都可以用于以下过程。
运行在Linux主机上的Linux内核为SD/MMC读卡器分配设备节点。内核可能决定设备节点名,或者使用udev规则。在下面的说明中,假设没有使用udev。
为了识别SD/MMC卡所分配的设备节点,可以执行以下命令:
$ cat /proc/partitions
major minor #blocks name
8 0 78125000 sda
8 1 75095811 sda1
8 2 1 sda2
8 5 3028221 sda5
8 32 488386584 sdc
8 33 488386552 sdc1
8 16 3921920 sdb
8 18 3905535 sdb1
本例中分配的设备节点为/dev/sdb,每个块大小为1024字节。
注意:请确认SD/MMC卡的设备节点是否正确。否则,可能会损坏您的操作系统或计算机上的数据。
4.3.2复制全SD卡镜像
SD卡镜像(扩展名为.wic)包含U-Boot、Linux镜像和设备树,以及4gb SD卡的rootfs文件。如果不需要灵活性,可以使用一个命令将镜像安装到SD卡上。
执行如下命令将SD卡镜像拷贝到SD/MMC卡上。更改下面的sdx以匹配SD卡所使用的sdx。
$ sudo dd if=.wic of=/dev/sdx bs=1M && sync
更换SD卡的全部内容。如果SD卡容量大于4gb,则无法访问剩余空间。
4.3.3对SD/MMC卡分区
完整的SD卡映像已经包含分区。本节介绍如何手动设置分区。这需要分别加载引导加载程序、内核和rootfs。
对SD卡进行分区的方法有多种。实际上,引导加载程序映像需要位于卡的开头,然后是Linux映像和设备树文件。它们可以在单独的分区中,也可以不在单独的分区中。根文件系统需要位于Linux部分之后启动的分区中。确保每个部分都有足够的空间。下面的示例创建两个分区。
在大多数Linux主机操作系统中,SD卡在插入时自动挂载。因此,在运行fdisk之前,如果SD卡之前挂载过,请确保已卸载(通过sudo umount /dev/sdx)。
首先以root权限运行fdisk。根据上面的说明来确定卡ID。这里我们以sdx为例。
$ sudo fdisk /dev/sdx
输入以下参数(每个参数后面):
p [lists the current partitions]
d [to delete existing partitions. Repeat this until no unnecessary partitions are reported by the 'p' command to start fresh.]
n [create a new partition]
p [create a primary partition - use for both partitions]
1 [the first partition]
20480 [starting at offset sector]
1024000 [ending position of the first partition to be used for the boot images]
p [to check the partitions]
n
p
2
1228800 [starting at offset sector, which leaves enough space for the kernel, the bootloader and its configuration data]
<enter> [using the default value will create a partition that extends to the last sector of the media]
p [to check the partitions]
w [this writes the partition table to the media and fdisk exits]
4.3.4复制引导加载程序镜像
说明在不使用完整SD卡镜像的情况下,只需要加载引导程序镜像即可。执行如下命令拷贝U-Boot镜像到SD/MMC卡。
$ sudo dd if=<U-Boot image> of=/dev/sdx bs=1k seek= conv=fsync
其中偏移量为:
•1 -表示i.MX 6或i.MX 7
•33 -用于i.MX 8QuadMax A0, i.MX 8QuadXPlus A0, i.MX 8M Quad,和i.MX 8M Mini
•32 -用于i.MX 8QuadXPlus B0、i.MX 8QuadMax B0、i.MX 8DualX、i.MX 8DXL、i.MX 8M Nano、i.MX 8M Plus和i.MX 8ULP
预留SD/MMC卡前16kb,包括分区表。
4.3.5复制内核镜像和DTB文件
介绍在不使用全SD卡镜像时,如何加载内核镜像和DTB。预构建的SD卡映像使用VFAT分区存储内核映像和DTB,这需要一个VFAT分区,该分区作为Linux驱动器挂载,并将文件复制到该分区中。这是首选的方法。
用户可以使用的另一种方法是使用dd命令将内核映像和DTB放到SD卡的固定原始地址中。后面的方法需要修改用于加载内核映像和DTB的U-Boot默认环境变量。
默认值:VFAT分区
- 使用下面的命令将分区1格式化为VFAT:
$ sudo mkfs.vfat /dev/sdx1
- 用这个命令挂载格式化的分区:
$ mkdir mountpoint
$ sudo mount /dev/sdx1 mountpoint
3.通过cp复制zImage和*.dtb的名称应该与U-Boot中指定的变量使用的名称相匹配。用这个命令卸载分区:
$ sudo umount mountpoint
备选方案:预定义的原始地址
将内核镜像拷贝到SD/MMC卡可以使用如下命令:
对于i.MX 6和i.MX7,使用以下命令:
$ sudo dd if=zImage_imx_v7_defconfig of=/dev/sdx bs=512 seek=2048 conv=fsync
对于i.MX 8,使用以下命令:
sudo dd if=Image-imx8qmsabreauto.bin of=/dev/sdx bs=512 seek=2048 conv=fsync
它们每个都在偏移量1 MB (bs x seek = 512 x 2048 = 1 MB)将内核复制到媒介。zImage_imx_v7_defconfig文件指的是使用imx_v7_defconfig配置文件时创建的zImage文件,该文件同时支持i.MX 6和i.MX 7 soc。
可以使用copy命令复制i.MX DTB镜像到第二个分区,或者使用dd命令复制i.MX DTB镜像到SD/MMC卡。
为你的单板选择一个命令:
$ sudo dd if=zImage-imx6qp-sabreauto.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6qp-sabresd.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6q-sabreauto.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6q-sabresd.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6sl-evk.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx7d-sdb.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
对于i.MX 6和i.MX 7,可以使用以下命令将内核镜像拷贝到各单板上,如i.MX 6UltraLite EVK板和i.MX 6ULL EVK板:
$ sudo dd if=zImage-imx6ul-14x14-evk.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
$ sudo dd if=zImage-imx6ull-14x14-evk.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync
对于i.MX 6和i.MX 7,这将在偏移量10 MB (bs x seek = 512 x 20480 = 10 MB)复制特定于板的.dtb文件到媒体。
4.3.6拷贝根文件系统(rootfs)
介绍在不使用完整SD卡镜像的情况下,如何加载rootfs镜像。
将目标文件系统复制到只包含rootfs的分区。本例使用分区2作为rootfs。首先格式化分区。文件系统格式ext3或ext4是可移动媒体的一个很好的选择,因为它内置了日志记录。将sdx替换为您配置中正在使用的分区。
$ sudo mkfs.ext3 /dev/sdx2 Or
$ sudo mkfs.ext4 /dev/sdx2
复制目标文件系统到分区:
$ mkdir /home/user/mountpoint
$ sudo mount /dev/sdx2 /home/user/mountpoint
解压rootfs文件包到以下目录:例如解压imx-image-multimedia-imx7ulpevk.tar。bz2 /home/user/rootfs:
$ cd /home/user/rootfs
$ tar -jxvf imx-image-multimedia-imx7ulpevk.tar.bz2
需要手动创建rootfs目录。
假设根文件系统文件和上一步一样位于/home/user/rootfs中:
$ cd /home/user/rootfs
$ sudo cp -a * /home/user/ mounpoint
$ sudo umount /home/user/mountpoint
$ sync
文件系统内容现在在媒体上。
注意:根据rootfs的大小,复制文件系统需要几分钟的时间。
4.4下载图片
通过安装引导设备上已经加载的U-Boot镜像或通过制造工具uuu下载镜像。使用终端程序与i.MX板进行通信。
4.4.1 U-Boot方式下载镜像
下面介绍如何使用U-Boot引导加载程序下载镜像文件。
下面描述的命令在使用U-Boot时通常是有用的。其他命令和信息可以通过在U-Boot提示符中输入帮助来找到。
U-Boot print命令用于查看环境变量值。
setenv命令可用于设置环境变量的值。
4.4.1.1在QuadSPI上闪烁Arm Cortex-M4图像
i.MX 6SoloX SABRE-SD、i.MX 7ULP EVK和i.MX 7Dual SABRE-SD板都有Arm Cortex-M4处理器和QuadSPI内存,可以用来向其闪烁图像。
请注意:要启用i.MX 7ULP的全部功能,请将Arm Cortex-M4图像烧到QuadSPI。建议使用MFGTool脚本uuu lf5.15.5 _1.0 _images_mx7ulpevk .zip\uuu_sd_m4。自动烧毁BSP和Arm Cortex-M4图像。
i.MX U-Boot提供了i.MX 7Dual SABRESD和i.MX 6SoloX SABRE-SD的参考脚本,用于从SD卡上闪烁Arm Cortex-M4映像。执行脚本的步骤如下:
- 复制Arm Cortex-M4镜像到启动SD卡的第一个VFAT分区。将文件命名为m4_qspi.bin。
- 从SD卡启动。
3.将SD卡上的Arm Cortex-M4图像闪烁到i.MX 6SoloX SABRE-SD板上QuadSPI2 PortB CS0或i.MX 7Dual SABRE-SD板上QuadSPI1 PortA CS0上的NOR Flash上。
U-Boot > run update_m4_from_sd
用户也可以通过以下步骤在TFTP上flash Arm Cortex-M4镜像:
- 从SD卡启动。
- TFTP Arm Cortex-M4映像。
U-Boot > tftp ${loadaddr} m4_qspi.bin
3.选择i.MX 6SoloX SABRE-SD板上QuadSPI2 PortB CS0上的NOR flash。
U-Boot > sf probe 1:0
选择i.MX 7Dual SABRE-SD板和i.MX 7ULP EVK板上QuadSPI1 PortA CS0上的NOR flash。
U-Boot > sf probe 0:0
- 将Arm Cortex-M4映像发送到选定的NOR flash。擦除大小为${filesize},大约64kbytes。这个例子假设它是128 Kbytes。
U-Boot > sf erase 0x0 0x20000
U-Boot > sf write ${loadaddr} 0x0 ${filesize}
i.MX 7Dual SABRE-SD需要将Arm Cortex-M4图像编程到1 MB偏移量,因为前1 MB被QuadSPI中的U-Boot图像使用。
U-Boot > sf erase 0x100000 0x20000
U-Boot > sf write ${loadaddr} 0x100000 ${filesize}
请注意:在i.m x7dual SABRE-SD上,只有当U-Boot从QuadSPI引导的目标mx7dsabresd_qspi1_defconfig构建U-Boot映像时,才支持QuadSPI上的Arm Cortex-M4映像。
imx7dual SABRESD板的默认U-Boot使用SD卡上的Cortex-M4映像,并在OCRAM上运行。
在i.MX 7ULP EVK上,Arm Cortex-M4图像需要编程。否则,它将无法启动。
4.4.1.2下载镜像到MMC/SD
本节介绍U-Boot下载到其他MMC/SD卡的方法。
将MMC/SD卡插入SD卡槽。这是i.MX 6 SABRE的SD3插槽,i.MX 6UltraLite EVK和i.MX 6ULL EVK的SD2插槽,i.MX 7Dual SABRE- sd和i.MX 7ULP EVK (MicroSD)的SD1插槽,以及i.MX 8QuadMax MEK、8QuadXPlus MEK和i.MX 8M Quad EVK的SD1插槽。
请注意:要启用i.MX 7ULP的全部功能,请将Arm Cortex-M4图像烧到QuadSPI。建议使用MfgTool脚本uuu lf5.15.5 _1.0 _images_mx7ulpevk .zip\uuu_sd_m4。自动烧毁BSP和Arm Cortex-M4图像。
对于i.MX 7ULP,将Arm cortex - m4图像刻录到QuadSPI,执行以下步骤:
- 将Arm cortex - m4镜像拷贝到SD卡的vfat分区中,插入SD卡后启动到U-Boot控制台。
- 在U-Boot中探测Quad SPI,并擦除一个足够大的QuadSPI flash空间为这个Arm Cortext-M4映像。
U-Boot > sf probe
U-Boot > sf erase 0x0 0x30000;
3.读取Arm Cortext-M4映像(在SD卡的第一个vfat分区)到内存地址,Arm Cortext-M4映像名称为sdk20-app.img。
U-Boot > fatload mmc 0:1 0x62000000 sdk20-app.img;
- 将Arm Cortext-M4图像写入QuardSPI。
U-Boot > sf write 0x62000000 0x0 0x30000
如果需要将U-Boot版本的U-Boot进行flash操作,请参见准备SD/MMC卡进行启动。
U-Boot引导加载程序能够将镜像从TFTP服务器下载到RAM中,并从RAM写入SD卡。该操作使用以太网接口并初始化U-Boot环境变量,用于网络通信。
启动介质中包含U-Boot,上电后执行。在U-Boot环境变量值bootdelay递减前和超时前按任意键。U-Boot提示时间默认为3秒。
- 要清除存储在MMC/SD上的环境变量,请在U-Boot控制台执行以下命令:
U-Boot > env default -f -a
U-Boot > saveenv
U-Boot > reset
- 配置U-Boot环境,用于网络通信。示例如下。“#”字符前面的行是注释,没有任何作用。
U-Boot > setenv serverip <your TFTPserver ip>
U-Boot > setenv bootfile <your kernel zImage/Image name on the TFTP server>
U-Boot > setenv fdtfile <your dtb image name on the TFTP server>
如果MAC地址没有融合,用户可以通过ethaddr环境设置一个假MAC地址。
U-Boot > setenv ethaddr 00:01:02:03:04:05
U-Boot >save
3.将“zImage/Image”拷贝到TFTP服务器。然后下载到RAM:
U-Boot > dhcp
- 使用实例查询MMC/SD卡信息。
U-Boot > mmc dev
U-Boot > mmcinfo
- 查看mmc命令的使用情况。blk#等于<读写>的偏移量/<卡>的块长度。cnt等于<读写>的大小/<卡>的块长度。
U-Boot > help mmc
mmc - MMC sub system
Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
- 将位于RAM l o a d a d d r 的内核 z I m a g e / I m a g e 写入 S D 卡。例如,将大小为 0 x 800000 的映像从 {loadaddr}的内核zImage/Image写入SD卡。例如,将大小为0x800000的映像从 loadaddr的内核zImage/Image写入SD卡。例如,将大小为0x800000的映像从{loadaddr}写入microSD卡的偏移量0x100000。有关MMC参数的定义,请参阅下面的示例。
blk# = (microSD Offset)/(SD block length) = 0x100000/0x200 = 0x800
cnt = (image Size)/(SD block length) = 0x800000/0x200 = 0x4000
这个示例假设内核映像等于0x800000。如果内核映像超过0x800000,则增加映像长度。执行TFTP命令后,U-Boot环境变量的filesize会根据传输的字节数来设置。这可以通过检查来确定计算所需的正确大小。可以通过U-Boot命令printenv查看。
U-Boot > mmc dev 2 0
U-Boot > tftpboot ${loadaddr} ${bootfile}
### Suppose the kernel zImage is less than 8M.
U-Boot > mmc write ${loadaddr} 0x800 0x4000
- 将位于RAM ${fdt_addr}的dtb文件编程到microSD。
U-Boot > tftpboot ${fdt_addr} ${fdtfile}
U-Boot > mmc write ${fdt_addr} 0x5000 0x800
- 在i.MX 6 SABRE板上,您可以使用HannStar LVDS作为显示器,从SD卡上的rootfs启动系统。内核MMC模块现在对uSDHC槽使用一个固定的mmcblk索引。SD3槽位使用的是i.MX 6 SABRE板上的mmcblk2, SD1槽位使用的是i.MX 7Dual SABRE- sd板上的mmcblk0, SD2槽位使用的是i.MX 6UltraLite板上的mmcblk1和i.MX 6ULL EVK板上的mmcblk1。SD1槽位在i.MX 8 MEK和i.MX 8M单板上使用mmcblk1。
- 引导。
U-Boot > setenv bootcmd_mmc 'run bootargs_base mmcargs;mmc dev;mmc read ${loadaddr} 0x800 0x4000;mmc read ${fdt_addr} 0x5000 0x800;bootz ${loadaddr} - ${fdt_addr}'
U-Boot > setenv bootcmd 'run bootcmd_mmc'
U-Boot > saveenv
4.4.1.3使用eMMC
在i.MX SABRE板、i.MX 8 MEK和EVK板、i.MX 8M EVK板和i.MX 8ULP EVK板上都有eMMC芯片。
通过i.MX 6 SABRE板上的SDHC4、i.MX 7Dual SABRE- sd板上的SDHC3、i.MX 8 MEK/EVK板上的SDHC1和i.MX 8M EVK板上的SDHC0和i.MX 8ULP EVK板上的SDHC0访问。i.MX 7ULP EVK板还支持MicroSD端口上的eMMC返工。下面的步骤描述了如何使用这个内存设备。
请注意:要启用i.MX 7ULP的全部功能,请将Arm Cortex-M4图像烧到QuadSPI。建议使用MfgTool脚本uuu lf5.15.5 _1.0 _images_mx7ulpevk .zip\uuu_sd_m4。自动烧毁BSP和Arm Cortex-M4图像。
- 在U-Boot控制台执行以下命令清理eMMC上存储的环境:
U-Boot > env default -f -a
U-Boot > save
U-Boot > reset
- 配置引导引脚上电单板,根据实际情况设置U-Boot环境变量。例如,
U-Boot > setenv serverip
U-Boot > setenv bootfile U-Boot > setenv fdtfile ### The user can set fake MAC address via ethaddr enviroment if the MAC address is not fused
U-Boot > setenv ethaddr 00:01:02:03:04:05 U-Boot > save
如果MAC地址没有融合,用户可以通过ethaddr环境设置假MAC地址
U-Boot > setenv ethaddr 00:01:02:03:04:05
U-Boot >save
3.将zImage拷贝到TFTP服务器。然后下载到RAM:
U-Boot > dhcp
- 使用实例查询eMMC芯片信息。
U-Boot > mmc dev
U-Boot > mmcinfo
- 查看mmc命令的使用情况。Blk #等于<读写>的偏移量/<卡>的块长度。CNT等于<读写>的大小/<卡>的块长度。
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
- 将内核zImage/Image编写到eMMC中。例如,下面的命令将大小为0x800000的图像从${loadaddr}写入eMMC芯片的偏移量0x100000。这里使用的公式如下:0x800 = 0x10000000 /0x200, 0x4000=0x800000/0x200。这个卡的块大小是0x200。这个示例假设内核映像小于0x800000字节。如果内核映像超过0x800000,则扩大映像长度。
### Select mmc dev 2 (USDHC4) on the i.MX 6 SABRESD board:
U-Boot > mmc dev 2 0
### Select mmc dev 1 (USDHC3) on the i.MX 7Dual SABRESD board:
U-Boot > mmc dev 1 0
### Select mmc dev 1 (USDHC2) on the i.MX 6UltraLite EVK board:
U-Boot > mmc dev 1 0
### Select mmc dev 0 (USDHC1) on the i.MX 7ULP EVK board:
U-Boot > mmc dev 0 0
### Select mmc dev 0 (eMMC0) on the i.MX 8QuadMax MEK, i.MX 8QuadXPlus MEK, i.MX 8M Quad, 8DualX, and 8DXL boards:
U-Boot > mmc dev 0 0
### select mmc dev 2 (USDHC3) on the i.MX 8M Mini EVK, i.MX 8M Nano EVK, and i.MX 8M Plus EVK: U-Boot > mmc dev 2 0
### select mmc dev 0 (USDHC0) on the i.MX 8ULP EVK
U-boot > mmc dev 0
### Suppose kernel zImage is less than 8 MB:
U-Boot > tftpboot ${loadaddr} ${bootfile}
U-Boot > mmc write ${loadaddr} 0x800 0x4000
- 将位于RAM ${fdt_addr}的dtb文件编程到eMMC芯片。
U-Boot > tftpboot ${fdt_addr} ${fdtfile}
U-Boot > mmc write ${fdt_addr} 0x5000 0x800
- 使用HannStar LVDS作为显示,通过eMMC中的rootfs启动系统。内核MMC模块现在对USDHC插槽使用固定的mmcblk索引。immx 6 SABRE单板上的eMMC/SD4槽位为mmcblk3。
i.MX 8QuadMax MEK板、i.MX 8QuadXPlus MEK板、i.MX 8M Quad EVK板上的eMMC5.0为mmcblk0。immx 7Dual SABRE单板上的eMMC5.0/SD3槽位为mmcblk2。eMMC不在i.MX 7Dual SABRE板上。
U-Boot > setenv mmcboot 'run bootargs_base mmcargs; mmc dev 2; mmc read ${loadaddr} 0x800 0x4000; mmc read ${fdt_addr} 0x5000 0x800;bootz ${loadaddr} - $ {fdt_addr} '
U-Boot > setenv bootcmd 'run mmcboot'
U-Boot > saveenv
- 通过eMMC中的rootfs启动系统,使用CLAA WVGA面板显示:
•对于i.MX 6板:
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs}
root=/dev/mmcblk3p2 rootwait rw video=mxcfb0:dev=lcd,CLAA-WVGA,if=RGB565 ip=dhcp'
•对于i.MX 7Dual SABRE板:
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs} root=/dev/mmcblk2p2 rootwait rw video=mxcfb0:dev=lcd,CLAA-WVGA,if=RGB565 ip=dhcp'
- 在eMMC中通过rootfs启动系统,使用HDMI作为显示:
•对于i.MX 6板:
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs} root=/dev/mmcblk3p2 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'
•对于i.MX 7Dual SABRE板:
U-Boot > setenv mmcargs 'setenv bootargs ${bootargs} root=/dev/mmcblk2p2 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'
对于i.MX 8QuadMax/8QuadXPlus/8M quadad /8M Plus,支持以下显示内核参数:
a.为系统启动后的遗留FB模拟选择一个特定的视频模式。
video=HDMI-A-{n}: {video_mode}
n为系统中HDMI连接器的最大数量。Video_mode应该是连接器上的监视器支持的模式。例如,视频= HDMI-A-1:1920x1080@60。缺省情况下,如果命令行无参数,系统将采用监视器推荐的视频模式。
b.启用或禁用遗留FB模拟。
drm_kms_helper.fbdev_emulation=0 or 1
0为禁用,1为启用。缺省情况下,如果命令行中没有参数,则启动仿真。
c.设置遗留FB仿真帧缓冲区的每像素位(bpp)参数。
imxdrm.legacyfb_depth=16 or 24 or 32
缺省情况下,当命令行无参数时,bpp值为16。
如需将rootfs编程到MMC/SD,请参见使用i.MX板作为主机服务器创建rootfs或准备SD/MMC卡引导。
4.4.1.4 U-Boot在SPI-NOR上从U-Boot闪烁
使用TFTPBoot直接闪烁到SPI-NOR仅限于i.MX 6 SABRE-AI板。在SPI-NOR上flash U-Boot的步骤如下:
- 从SD卡启动。
- 将跳线J3设置为位置:2-3。
3.获取内置SPI-NOR支持的U-Boot映像。本例使用u-boot.imx。
U-Boot > tftpboot ${loadaddr} u-boot.imx
- 在SPI-NOR中刷新U-Boot镜像。
U-Boot > sf probe
U-Boot > sf erase 0 0x80000
U-Boot > sf write ${loadaddr} 0x400 0x7FC00
- 在SABRE-AI上将启动开关设置为从SPI-NOR启动。
•S2-1 1
•s2 2 1
•S2-3 0
•S2-4 0
•S1 - [1:10] X - 重新启动目标板。
4.4.1.4.1在QuadSPI上闪烁Arm Cortex-M4图像
i.MX 6SoloX SABRE-SD、i.MX 7ULP EVK和i.MX 7Dual SABRE-SD板都有Arm Cortex-M4处理器和QuadSPI内存,可以用来向其发送映像。
请注意:要启用i.MX 7ULP的全部功能,请将Arm Cortex-M4图像烧到QuadSPI。建议使用MFGTool脚本uuu lf5.15.5 _1.0 _images_mx7ulpevk .zip\uuu_sd_m4。自动烧毁BSP和Arm Cortex-M4图像。
i.MX U-Boot提供了i.MX 7Dual SABRESD和i.MX 6SoloX SABRE-SD的参考脚本,用于从SD卡上闪烁Arm Cortex-M4映像。执行脚本的步骤如下:
- 复制Arm Cortex-M4镜像到启动SD卡的第一个VFAT分区。将文件命名为m4_qspi.bin。
- 从SD卡启动。
3.将SD卡上的Arm Cortex-M4映像闪烁到i.MX 6SoloX SABRE-SD板上QuadSPI2 PortB CS0或i.MX 7Dual SABRE-SD板上QuadSPI1 PortA CS0上的NOR Flash上。
U-Boot > run update_m4_from_sd
用户也可以通过以下步骤在TFTP上flash Arm Cortex-M4镜像:
- 从SD卡启动。
- TFTP Arm Cortex-M4图像。
U-Boot > tftp ${loadaddr} m4_qspi.bin
3.选择i.MX 6SoloX SABRE-SD板上QuadSPI2 PortB CS0上的NOR flash。
U-Boot > sf probe 1:0
选择i.MX 7Dual SABRE-SD板和i.MX 7ULP EVK板上QuadSPI1 PortA CS0上的NOR flash。
U-Boot > sf probe 0:0
- 将Arm Cortex-M4映像发送到选定的NORflash。擦除大小为${filesize},大约64kbytes。这个例子假设它是128 Kbytes。
U-Boot > sf erase 0x0 0x20000
U-Boot > sf write ${loadaddr} 0x0 ${filesize}
i.MX 7Dual SABRE-SD需要将Arm Cortex-M4图像编程到1 MB偏移量,因为前1 MB被QuadSPI中的U-Boot映像使用。
4.4.1.5 U-Boot在Parallel NOR时从U-Boot闪烁
使用TFTPBoot直接发送到Parallel NOR仅限于i.MX 6 SABRE-AI板。在Parallel NOR上flash U-Boot的步骤如下:
- 检查跳线J3,不应在引脚2和引脚3之间。
- 将SD U-Boot升级为EIM NOR版本。相关命令请参见复制引导加载程序镜像。然后从SD卡启动。
3.TFTP安装U-Boot镜像文件。
tftpboot $ {loadaddr} u-boot.imx
- 刷新U-Boot镜像。
cp.b ${loadaddr} 0x08001000 ${filesize}
- 更改启动开关并重新启动。
S2 all 0 S1-6 1 other 0
- 默认情况下,在NFS上挂载rootfs。
4.4.2使用i.MX板作为主机服务器创建rootfs
Linux操作系统提供了多种将镜像编程到存储设备的方法。介绍如何使用i.MX平台作为Linux主机服务器在MMC/SD卡或SATA设备上创建rootfs。以SD卡为例进行说明。对于SATA设备,需要更改设备文件节点名称。 - 从NFS或其他存储引导。确定您的SD卡设备ID。它可以是mmcblk或sd。(索引由USDHC控制器索引决定。)使用以下命令查看分区信息:
$ cat /proc/partitions
- 要在MMC/SD卡上创建一个分区,在Linux控制台中使用fdisk命令(需要root权限):
root@ ~$ sudo fdisk /dev/ S D 将上面的 SD 将上面的 SD将上面的SD替换为您的设备名称。
3.如果是新SD卡,可能会收到如下信息:
The device contains neither a valid DOS partition table, nor Sun, SGI or OSF disk label Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that the previous content won't be recoverable. The number of cylinders for this disk is set to 124368. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)
通常的分区提示和命令如下所示。粗体文本表示用户键入的内容。
Command (m for help): p
Disk /dev/sdd: 3965 MB, 3965190144 bytes
4 heads, 32 sectors/track, 60504 cylinders, total 7744512 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00080bff
Device Boot Start End Blocks Id System
- 如闪存映射中所述,rootfs分区应该位于内核映像之后。第一个0x800000字节可以保留给MBR、引导加载程序和内核部分。从上面显示的日志中,当前MMC/SD卡的单位是32768字节。第一个分区的开始柱面可以设置为“0x300000/32768 = 96”。最后一个圆柱体可以根据rootfs的大小设置。通过输入粗体字母来创建一个新的分区:
Command (m for help): n
e extended
p primary partition (1-4) Select (default p): p
Partition number (1-4): 1
First cylinder (1-124368, default 1): 96
Last cylinder or +size or +sizeM or +sizeK (96-124368, default 124368): Using default value 124368 Command (m for help): w
The partition table has been altered! Calling ioctl() to re-read $SD partition table
- 检查分区(参见上面的内容)以确定分区的名称。这里使用$PARTITION表示要格式化的分区。将MMC/SD分区格式化为ext3或ext4类型。例如,要使用ext3:
root@ ~$ mkfs.ext3 /dev/$PARTITION
mke2fs 1.42 (29-Nov-2011)
Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 248992 inodes, 994184 blocks 49709 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1019215872 31 block groups 32768 blocks per group, 32768 fragments per group 8032 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
- 将rootfs内容拷贝到MMC/SD卡。名称可能与下面使用的不同。检查目录中所需的rootfs。(复制*.ext2到NFS rootfs)。
mkdir /mnt/tmpmnt
mount -t ext3 -o loop /imx-image-multimedia.ext3 /mnt/tmpmnt
cd /mnt
mkdir mmcblk0p1
mount -t ext3 /dev/$PARTITION /mnt/mmcblk0p1
cp -af /mnt/tmpmnt/* /mnt/mmcblk0p1/
umount /mnt/mmcblk0p1
umount /mnt/tmpmnt
- 输入同步将内容写入MMC/SD。
- 输入poweroff关闭系统。请参考在目标器上运行Linux操作系统从MMC/SD卡启动镜像。
将第一个分区格式化为50mb的vfat文件系统,将第二个分区格式化为ext4文件系统。示例如下:
~$ fdisk /dev/sdb
Command (m for help): n
Partition type: p primary (0 primary, 0 extended, 4 free) e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-30318591, default 2048): 4096
Last sector, +sectors or +size{K,M,G} (4096-30318591, default 30318591): +50M
Command (m for help): p
Disk /dev/sdb: 15.5 GB, 15523119104 bytes
64 heads, 32 sectors/track, 14804 cylinders, total 30318592 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3302445d
Device Boot Start End Blocks Id System
/dev/sdb1 4096 106495 51200 83
Linux Command (m for help): n
Partition type: p primary (1 primary, 0 extended, 3 free) e extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (2048-30318591, default 2048): 106496
Last sector, +sectors or +size{K,M,G} (106496-30318591, default 30318591): Using default value 30318591
Command (m for help): p
Disk /dev/sdb: 15.5 GB, 15523119104 bytes 64 heads, 32 sectors/track, 14804 cylinders, total 30318592 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x3302445d
Device Boot Start End Blocks Id System
/dev/sdb1 4096 106495 51200 83 Linux
/dev/sdb2 106496 30318591 15106048 83
Linux Command (m for help): w
The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
~$ mkfs.vfat /dev/mmcblk0p1
~$ mkfs.ext4 /dev/mmcblk0p2
4.5如何启动i.MX单板
当U-Boot加载到支持启动的设备之一时,可以使用拨码开关从该设备启动。i.MX单板的启动方式由单板上的启动配置拨码开关控制。对于定位引导配置开关的帮助,请参见上面参考资料中列出的特定板的快速启动指南。
以下部分列出了基本的启动设置配置。下表表示指定单板上开关块的拨码开关设置。X表示特定的开关设置不影响此操作。
4.5.12如何在单机环境下构建U-Boot和Kernel
要在独立环境下构建U-Boot和Kernel,请执行以下步骤。
首先,生成一个SDK,其中包括工具、工具链和要在主机上编译的小rootfs。
•使用以下命令从Yocto项目构建环境生成SDK。要设置Yocto项目构建环境,请遵循i.MX Yocto项目用户指南(IMXLXYOCTOUG)中的步骤。在下面的命令中,将Target-Machine设置为要构建的计算机。populate_sdk生成一个脚本文件,用于设置一个没有Yocto Project的独立环境。这个SDK应该为每个版本更新,以获取最新的头文件、工具链、以及当前版本的工具。
DISTRO=fsl-imx-fb MACHINE=Target-Machine bitbake core-image-minimal -c populate_sdk
请注意:如果构建过程中断,请修改conf/local.conf,将PACKAGE_CLASSES = "package_deb"这一行注释掉,然后再次执行populate_sdk命令。
•从build目录,bitbake被运行,拷贝sh文件在tmp/deploy/sdk到主机上构建,并执行脚本安装sdk。默认位置在/opt中,但是可以放在主机上的任何位置。
在主机上,以下是构建U-Boot和Kernel的步骤:
•对于在主机上构建的i.MX 8,在构建之前使用以下命令设置环境。
source /opt/fsl-imx-xwayland/5.15-honister/environment-setup-aarch64-poky-linux
export ARCH=arm64
•对于i.MX 8ULP EVK板:
make distclean
make imx8ulp_evk_defconfig
make
•对于主机上的i.MX 6和i.MX 7,在构建之前使用以下命令设置环境。
source /opt/fsl-imx-fb/5.15-honister/environment-setup-cortexa9hf-neon-poky-linux-gnueab
export ARCH=arm
•要在独立环境中构建i.MX 8 U-Boot,需要找到目标启动的配置。在下面的例子中,i.MX 8QuadMax MEK板为目标,默认运行在Arm Cortex-A53内核上。SPL映像(u-boot- spl1 .bin)也使用默认的defconfig生成。使用OP-TEE映像启动时需要它。
make distclean
make imx8qm_mek_defconfig
make
对于i.MX 8QuadXPlus MEK和i.MX 8DualX板:
make distclean
make imx8qxp_mek_defconfig
make
对于i.MX 8DXL EVK板:
make distclean
make imx8dxl_evk_defconfig
make
•为i.MX 8M Quad EVK构建U-Boot:
make distclean
make imx8mq_evk_defconfig
make
•对于i.MX 8M LPDDR4 EVK:
make distclean
make imx8mm_evk_defconfig
make
•对于i.MX 8M DDR4 EVK:
make distclean
make imx8mm_ddr4_evk_defconfig
make
•对于i.MX 8M Plus LPDDR4 EVK板:
make distclean
make imx8mp_evk_defconfig
make
•要在独立环境中构建i.MX 6或i.MX 7 U-Boot,找到目标启动的配置。在下面的例子中,i.MX 6ULL是目标。
Download source by cloning with git clone https://source.codeaurora.org/external/imx/uboot-imx -b lf_v2021.04
cd uboot-imx
make clean
make mx6ull_14x14_evk_defconfig
make
•要在独立的环境中为i.MX 8构建内核,执行以下命令:
make imx_v8_defconfig
make
要在独立环境中为i.MX 6和i.MX 7构建内核,执行以下命令:
Download source by cloning with git clone https://source.codeaurora.org/external/imx/linux-imx -b lf-5.15.y
cd linux-imx
make imx_v7_defconfig
make
4.5.13如何使用imx-mkimage构建imx-boot镜像
对于i.MX 8QuadMax,使用imx-mkimage构建imx-boot 映像,执行以下步骤:
- 从“u-boot/u-boot.bin”目录下拷贝“u-boot.bin”到“imx-mkimage/iMX8QM/”目录下。
- 将SCFW移植套件中的scfw_tcm.bin拷贝到imx-mkimage/iMX8QM/。
3.从Arm Trusted Firmware (imx-atf)拷贝bl31.bin到imx-mkimage/iMX8QM/。 - 拷贝SECO固件容器镜像(ahab-container.img)到imx-mkimage/iMX8QM/。
5.执行make SOC=iMX8QM flash命令生成flash.bin。 - 如果使用OP-TEE,将tee.bin拷贝到imx-mkimage/iMX8QM/,将u-boot/spl/u-boot- splm .bin拷贝到imx-mkimage/iMX8QM/。执行make SOC=iMX8QM flash_spl命令生成flash.bin。
对于i.MX 8QuadXPlus,使用imx-mkimage构建imx-boot image,执行以下步骤: - 从“u-boot/u-boot.bin”目录下拷贝“u-boot.bin”到“imx-mkimage/iMX8QX/”目录下。
- 将SCFW移植套件中的scfw_tcm.bin拷贝到imx-mkimage/iMX8QX/。
3.从Arm Trusted Firmware (imx-atf)拷贝bl31.bin到imx-mkimage/iMX8QX/。 - 拷贝SECO固件容器镜像(ahab-container.img)到imx-mkimage/iMX8QX/。
- 执行make SOC=iMX8QX flash命令生成flash.bin。
- 如果使用OP-TEE,将tee.bin拷贝到imx-mkimage/iMX8QX/,将u-boot/spl/u-boot- splx .bin拷贝到imx-mkimage/iMX8QX/ .执行make SOC=iMX8QX flash_spl命令生成flash.bin。
对于i.MX 8DXL,使用imx-mkimage构建imx-boot image,执行以下步骤: - 从“u-boot/u-boot.bin”目录下拷贝“u-boot.bin”到“imx-mkimage/iMX8DXL/”目录下。
- 将scfw_tcm.bin从SCFW移植套件复制到imx-mkimage/iMX8DXL/。
3.将bl31.bin从Arm Trusted Firmware (imx-atf)拷贝到imx-mkimage/iMX8DXL/。 - 复制SECO固件容器的映像(mx8dxla1-ahab-container.img)到imx-mkimage/iMX8DXL/。
- 执行make SOC=iMX8DXL flash命令生成flash.bin。
- 如果使用OP-TEE,将tee.bin拷贝到imx-mkimage/iMX8DXL/,将u-boot/spl/u-boot- sple .bin拷贝到imx-mkimage/iMX8DXL/. 执行make SOC=iMX8DXL flash_spl命令生成flash.bin。
- 如果跳过加载V2X固件,添加V2X=NO命令,如make SOC=iMX8DXL V2X=NO flash。
以下是i.MX 8QuadMax和i.MX 8QuadXPlus的目标矩阵表。
表56 i.MX 8QuadMax, i.MX 8QuadXPlus和i.MX 8DXL的目标矩阵表
对于i.MX 8ULP EVK,使用imx-mkimage构建imx-boot image,执行以下步骤: - 将“u-boot/u-boot.bin”目录下的“u-boot.bin”和“u-boot/spl/u-boot-spl.bin”目录下的“u-boot-spl.bin”拷贝到“imx-mkimage/iMX8ULP/”目录下。
- 从Arm Trusted firmware (imx-atf)拷贝bl31.bin到imx-mkimage/iMX8ULP/。
3.复制Sentinel固件容器mx8ulpa0-ahab-container的镜像。img imx-mkimage / iMX8ULP /。 - 拷贝uPower固件镜像文件“uppower .bin”到imx-mkimage/iMX8ULP/目录下。
- 将Cortex-M33镜像“m33_image.bin”拷贝到imx-mkimage/iMX8ULP/。
- 如果使用OP-TEE,将tee.bin拷贝到imx-mkimage/iMX8ULP/。在步骤2中复制的bl31.bin必须在启用OP-TEE SPD的情况下构建。
- 执行make SOC=iMX8ULP flash_singleboot_m33命令生成flash.bin。
下表列出了i.MX 8ULP上使用的imx-mkimage目标。
表57 imx-mkimage目标用于i.MX 8ULP
对于i.MX 8M EVK,使用imx-mkimage构建imx-boot image,执行以下步骤: - 从u-boot/tools/mkimage拷贝mkimage并重命名为imx mkimage/iMX8M/mkimage_uboot。
- 从“u-boot/spl/u-boot- spl.bin”目录下拷贝“u-boot- spl.bin”到imx-mkimage/iMX8M/目录下。
3.将u-boot/u-boot-nodtb.bin拷贝到imx-mkimage/iMX8M/。 - imx8mq-evk.dtb(适用于i.m x8m Quad EVK), imx8mm-evk.dtb(适用于i.m x8m Mini LPDDR4 EVK), imx8mm-ddr4-evk.dtb(适用于i.m x8m Mini DDR4 EVK)或imx8mp-evk.dtb(对于i.m x8m Plus LPDDR4 EVK)从u-boot/arch/arm/dts/到imx-mkimage/iMX8M/。
- 从Arm Trusted Firmware (imx-atf)拷贝bl31.bin到imx-mkimage/iMX8M/。
- 从firmware-imx包中拷贝firmware/hdmi/cadence/signed_hdmi_imx8m.bin到imx-mkimage/iMX8M/。
- 对于i.MX 8M Quad和i.MX 8M Mini LPDDR4 EVK,复制lpddr4_pmu_train_1d_dmem.bin,
Lpddr4_pmu_train_1d_imem.bin、lpddr4_pmu_train_2d_dmem.bin和lpddr4_pmu_train_2d_imem.bin从
firmware/ddr/synopsys将firmware-imx包拷贝到imx-mkimage/iMX8M/。
对于i.m x8m Mini DDR4 EVK,从firmware-imx包的“firmware/ddr/synopsys”目录下拷贝ddr4_imem_1d.bin, ddr4_dmem_1d.bin, ddr4_imem_2d.bin, 和ddr4_dmem_2d.bin到imx-mkimage/iMX8M。
对于i.m x8m Plus LPDDR4 EVK,复制lpddr4_pmu_train_1d_dmem_201904.bin, lpddr4_pmu_train_1d_imem_201904.bin, lpddr4_pmu_train_2d_dmem_201904.bin, lpddr4_pmu_train_2d_imem_201904.bin从firmware-imx包的firmware/ddr/synopsys下载到imx-mkimage/iMX8M/。 - 对于i.MX 8M Quad EVK,执行make SOC=iMX8M flash_evk命令生成包含HDMI FW的flash.bin (imx-boot image)。对于i.MX 8M Mini LPDDR4 EVK,执行命令make SOC=iMX8MM flash_evk生成flash.bin (imx-boot image)。
对于i.MX 8M Mini DDR4 EVK,执行命令make SOC=iMX8MM flash_ddr4_evk生成flash.bin (imx-boot image)。
对于i.MX 8M Plus LPDDR4 EVK,执行make SOC=iMX8MP flash_evk命令生成flash.bin (imx-boot-image)。
使用eMMC fasboot在i.m x8m Quad EVK和i.m x8m Mini LPDDR4 EVK上启动flash_evk_emmc_fastboot目标。
4.6 Flash内存映射
介绍i.MX单板在内存设备上的软件布局。
这些信息对于理解关于映像下载以及映像如何放置在内存中的后续部分非常有用。
可以在Linux引导命令中使用mtdparts指令来指定内存映射。下面的例子简要介绍了如何使用内存映射。内存是按照它的排列顺序分配的。破折号(-)表示剩余的内存。
mtdparts=[memory type designator]:[size]([name of partition]),[size]([name of partition]),-([name of final partition])
4.6.1 MMC/SD/SATA内存映射
MMC/SD/SATA的内存方案不同于BSP软件中部署的NAND和NOR flash。MMC/SD/SATA必须保持第一个扇区(512字节)作为主引导记录(MBR),以使用MMC/SD作为rootfs。
在启动时,将执行MBR来查找分区表,以确定使用哪个分区进行启动。引导加载程序应该在MBR之后。内核映像和rootfs可以存储在引导加载程序之后的任何地址。默认情况下,U-Boot启动参数为内核和DTB使用第一个FAT分区,为根文件系统使用下面的ext3分区。或者,用户可以在启动加载程序之后将内核和DTB存储在任何原始内存区域。必须更新引导参数以匹配任何更改的内存地址。
在Linux主机服务器上,在MMC/SD卡上创建分区时,可以通过fdisk命令生成MBR。
4.6.2 NAND闪存映射
NAND闪存映射是从Linux内核命令行配置的。
例如:
mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),-(rootfs)
4.6.3并行NOR闪存映射
默认配置只包含一个并行NOR分区。并行NOR设备一般为4MB。U-Boot在并行NOR开始加载,以便设备从其启动。默认配置是在启动时,U-Boot将内核、DTB和根文件系统从SD/MMC卡加载到DDRAM中。最终用户可以根据自己的需要更改默认设置。可以通过内核命令行添加更多分区。下面命令的内存类型指示器由NOR地址和指示器组成。这些信息可以在arch/arm/boot/dts的i.MX.dtsi设备树文件中找到。下面是一个可能添加到Linux引导命令行的示例:
mtdparts=8000000.nor:1m(uboot),-(rootfs)
对于i.MX 6 SABRE-AI,并行NOR的地址是0x8000000。
4.6.4 SPI-NOR闪存映射
可以使用Linux内核命令行配置SPI-NOR闪存。
U-Boot在QuadSPI内存的开始加载,以便设备可以从它启动。默认配置是在启动时,U-Boot将内核、DTB和根文件系统从SD/MMC卡加载到DDRAM中。最终用户可以根据自己的需求修改默认设置。可以通过内核命令行添加更多分区。下面是一个可能添加到Linux引导命令行的示例:
mtdparts=spi32766.0:768k(uboot),8k(env),128k(dtb),-(kernel)
U-Boot有下面的映射,以帮助在U-Boot中访问非并行模式的QuadSPI闪存。
表58 QuadSPI的U-Boot映射
4.7在目标器上运行Linux操作系统
介绍通过U-Boot在目标器上运行Linux镜像文件的方法。
这些说明假设您已经使用下载映像或准备SD/MMC卡引导中的说明下载了内核映像。如果您还没有设置串口终端,请参见基本终端设置。
在i.MX板上运行Linux操作系统的基本步骤如下。本文档使用一组特定的环境变量名,以便更容易地描述设置。每种类型的设置将在其各自的部分中进行描述,如下所示。
1.单板上电。
2. 当U-Boot启动时,设置特定于您的机器和配置的环境变量。下面描述了常见的设置,具体到设备的设置在单独的章节中描述。
3.保存环境设置:
U-Boot > saveenv
- 执行boot命令:
U-Boot > run bootcmd
env default -f -a和saveenv命令可用于返回默认环境。
指定控制台
可以在Linux引导命令行上指定用于调试的控制台和命令行控制。i.MX 6Quad SABRE-AI板使用ttymxc2,所以不是所有板都一样。通常如下所示,但波特率和端口可以修改。
因此,对于NFS,它可能是ttymxc3。
U-Boot > setenv consoleinfo 'console=ttymxc2,115200'
对于i.MX 7ULP EVK, i.MX 8QuadMax MEK板,和i.MX 8QuadXPlus MEK板,更改为“console=ttyLP0,115200”。
指定显示
可以在Linux boot命令行中指定显示信息。它不依赖于Linux映像的源文件。
如果没有指定显示内容,则使用设备树中的设置。添加${displayinfo}到包含启动项的环境宏中。具体参数可以在i.MX Linux®Release Notes (IMXLXRN)中找到。下面是这些参数的一些示例。
• U-Boot > setenv displayinfo 'video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24' for an HDMI display •U-Boot> setenv displayinfo 'video=mxcfb1:dev=ldb video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24' for LVDS and HDMI dual displays
• U-Boot > setenv displayinfo 'video=mxcfb0:dev=lcd,if=RGB565' for an LCD
• U-Boot > setenv displayinfo 'video=mxcepdcfb:E060SCM,bpp=16 max17135:pass=2,vcom=-2030000' for an EPDC connection
• U-Boot > setenv displayinfo 'video=mxcfb0:mxcfb0:dev=lcd,if=RGB565 video=mxcfb1:dev=hdmi,1920x1080M@60,if=RGB24' for LCD and HDMI dual displays
指定内存地址
Linux操作系统中加载内核和设备树的内存地址不随设备而改变。本章说明使用环境变量loadaddr和ftd_addr来表示这些值。下表显示了不同i.MX板上使用的地址。
此外,还使用fdtfile指定设备树文件的文件名。设置U-Boot环境变量的命令如下:
U-Boot > setenv loadaddr 0x80080000
U-Boot > setenv fdtaddr 0x80f00000
U-Boot > setenv fdtfile fsl-imx7ulp-evk.dtb
指定根文件系统的位置
rootfs可以位于单板上的设备上,也可以位于NFS上。下面的设置显示了用于指定这些参数的一些选项。
• U-Boot > setenv rootfsinfo 'root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp'
• U-Boot > setenv rootfsinfo 'root=/dev/nfs ip=dhcp weim-nor nfsroot=${serverip}:${nfsroot},v3,tcp'
• U-Boot > setenv rootfsinfo 'ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs rootwait rw mtdparts=gpmi-nand:64m(boot),16m(kernel),16m(dtb),-(rootfs)'
• U-Boot > setenv rootfsinfo 'root=/dev/mmcblk0p2 rootwait rw'
特殊的设置
i.xm 6Solo和6UltraLite可以在命令行上指定uart_from_osc来指定应该使用OSC时钟而不是PLL3。这允许系统进入低功耗模式。
U-Boot > setenv special 'uart_from_osc'
创建启动命令行
为了澄清,本文档将boottargs分成一个宏,如下:
U-Boot > setenv bootargsset 'setenv bootargs ${consoleinfo} ${rootfsinfo} ${displayinfo} ${special}'
执行的启动命令如下所示。参数因设备而异。
U-Boot > setenv bootcmd 'run bootargsset; {settings-for-device}; bootz ${loadaddr} - ${fdt_addr}'
4.7.1从NAND运行镜像
NAND可以在i.MX 6 SABRE-AI板上找到。
将单板上电,输入命令。以下设置可以用于从NAND引导Linux系统。
假设内核映像从地址0x1400000字节开始(块的起始地址是0x800)。内核映像大小小于0x400000字节。rootfs位于/dev/mtd2目录下
U-Boot > setenv bootcmd 'run bootargsset; nand read ${loadaddr} 0x1000000 0x800000; nand read $ {fdt_addr} 0x2000000 0x100000; bootz ${loadaddr} - ${fdt_addr}'
4.7.2在Parallel NOR上运行Linux操作系统
并行NOR可用于i.MX 6 SABRE-AI板。可以使用以下过程从Parallel NOR引导系统。
- 假设内核映像从地址0xc0000字节开始。
- 在U-Boot提示符下,设置以下变量:
U-Boot > setenv bootcmd 'run bootargsset; cp.b 0x80c0000 ${loadaddr} 0x800000;cp.b 0x80a0000 ${fdt_addr} 0x20000;bootz ${loadaddr} - ${fdt_addr} '
4.7.3在QuadSPI上运行Linux操作系统镜像
QuadSPI可在i.MX 6SoloX SABRE-SD板、i.MX 7Dual SABRE-SD板、i.MX 6UltraLite EVK板、i.MX 6ULL EVK板、i.MX 8QuadMax MEK和i.MX 8QuadXPlus MEK上使用。可以使用以下步骤从QuadSPI NOR引导Linux系统。
- 假设内核映像从地址0xA00000字节开始,DTB文件从地址0x800000开始。
- 在U-Boot提示符下设置的环境变量如下:
U-Boot > setenv bootcmd 'run bootargsset; sf probe; sf read ${loadaddr} 0xA00000 0x2000; sf read ${fdt_addr} 0x800000 0x800; bootz ${loadaddr} - ${fdt_addr} '
4.7.4运行Arm Cortex-M4镜像
在i.MX 6SoloX板上,有两种方式在U-Boot中启动Arm Cortex-M4图像:
• Arm Cortex-M4处理器Normal Up(支持i.MX 6SoloX SABRE-AI和SABRE-SD板)。通过U-Boot命令执行。要求:
- 如果Arm Cortex-A9处理器从SD卡启动,U-Boot正常SD镜像。如果Arm Cortex-A9处理器从QSPI NOR闪存启动,U-Boot正常QSPI映像。
- 内核的dtb:imx6sx-sdb-m4.dtb用于i.MX 6SoloX SABRE-SD板。imx6sx-sabreauto-m4.dtb用于i.MX 6SoloX SABRE-AI板。
3.烧录Arm Cortex-M4的映像。(QuadSPI2 PortB CS0的NOR flash,用于i.MX 6SoloX SABRE-SD板。i.MX 6SoloX SABRE-AI板QuadSPI1 PortB CS0 NOR flash
•Arm Cortex-M4处理器Fast Up(仅支持i.MX 6SoloX SABRE-SD板)U-Boot为满足Arm Cortex-M4处理器50毫秒启动的需求,在非常早的启动阶段启动。不涉及U-Boot命令。
要求: - U-Boot Arm Cortex-M4快速提升映像和Arm Cortex-A9处理器必须从QSPI2 NORflash启动。
- 内核的dtb:imx6sx-sdb-m4.dtb。
- 烧录Arm Cortex-M4的映像(QuadSPI2 PortB CS0的NOR flash)。
为使Arm Cortex-M4处理器正常启动,在默认U-Boot中增加了一个脚本。下面的步骤可以帮助那些需要运行Cortex-M4处理器Normal Up脚本的用户。
1.单板上电。 - 在i.MX 6SoloX SABRE-SD板上,假设Arm Cortex-M4映像地址为0x78000000 (QuadSPI2 PortB CS0的NOR flash)。在i.MX 6SoloX SABRE-AI板上,假设Arm Cortex-M4映像位于0x68000000 (QuadSPI1 PortB CS0的NOR flash)。
在U-Boot提示符下:
U-Boot > run m4boot
或者用户可以不依赖脚本执行命令:
U-Boot > sf probe 1:0
对于i.MX 6SoloX SABRE-SD板:
U-Boot > bootaux 0x78000000
对于i.MX 6SoloX SABRE-AI板:
U-Boot > bootaux 0x68000000
请注意:关于如何将MCC演示添加到内核并限制内核可用RAM来使用它,请参见i.MX Linux®参考手册(IMXLXRM)的第53章“i.MX 6 SoloX多核通信(MCC)”。
除了支持从QuadSPI运行Arm Cortex-M4映像外,默认的i.MX 7Dual SABRE-SD板还支持从SD卡加载Arm Cortex-M4映像并在OCRAM上运行。
准备Arm Cortex-M4镜像到SD卡的FAT分区。当使用“m4boot”脚本时,将文件命名为“m4_qspi.bin”。
单板上电完成后,U-Boot提示信息显示如下:
U-Boot > run m4boot
或者不依赖脚本执行命令:
u-boot=> fatload mmc 0:0 ${loadaddr} m4_qspi.bin
u-boot=> cp.b ${loadaddr} 0x7e0000 ${filesize}
u-boot=> bootaux 0x7e0000
在i.MX 8M板上执行如下命令启动Arm Cortex-M Core核心:
u-boot=> fatload mmc 1:1 ${loadaddr} m4.bin
u-boot=> cp.b ${loadaddr} 0x7e0000 ${filesize}
u-boot=> bootaux 0x7e0000
在i.MX 8QuadMax和i.MX 8QuadXPlus板上,有两种方式启动Arm Cortex-M4内核:
•从ROM启动
用户需要使用imx-mkimage将Arm Cortex-M4映像打包到imx-boot image中。有必要在构建命令中指定核心ID及其TCML地址。示例如下:
flash_linux_m4: $(MKIMG) mx8qm-ahab-container.img scfw_tcm.bin u-boot-spl.bin m4_image.bin m4_1_image.bin u-boot-atf-container.img
./$(MKIMG) -soc QM -rev B0 -dcd skip -append mx8qm-ahab-container.img -c -flags 0x00200000
-scfw scfw_tcm.bin -ap u-boot-spl.bin a53 0x00100000 -p3 -m4 m4_image.bin 0 0x34FE0000 -p4 -m4
m4_1_image.bin 1 0x38FE0000 -out flash.bin
cp flash.bin boot-spl-container.img
@flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \
pad_cnt=$$(((flashbin_size + 0x400 - 1) / 0x400)); \
echo "append u-boot-atf-container.img at $$pad_cnt KB"; \
dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt;
•从U-Boot启动(不支持多分区)
U-Boot支持从SD卡的FAT分区加载Arm Cortex-M4镜像,默认名为“m4_0.bin”和“m4_1.bin”。单板启动进入U-Boot控制台后,执行如下命令启动Arm Cortex-M4 core 0。
U-Boot > run m4boot_0 Or the command to boot M4 core 1:
U-Boot > run m4boot_1 Or perform the commands for core 0 without depending on the script:
U-Boot > fatload mmc 1:1 0x80280000 m4_0.bin
U-Boot > dcache flush; bootaux 0x80280000 0
4.7.5登录Linux操作系统
说明i.MX Linux操作系统默认登录用户名为“root”,无密码。
4.7.6在MMC/SD上运行Linux操作系统
该场景以配置单板引导U-Boot为例,假设Linux内核镜像名为zImage,保存在SD卡上MS-DOS FAT分区中,该分区中还存放一个或多个设备树文件。rootfs也存储在另一个分区的SD/MMC卡上。
当U-Boot启动时,它会检测到要启动的槽位,并自动设置mmcdev和mmcroot使用该SD卡上的rootfs。本场景下,相同的SD卡可以从i.MX 6/7单板的任意SD卡槽位启动,不需要修改U-Boot设置。在U-Boot命令行输入boot,运行Linux操作系统。
如果不需要默认设置,可以使用以下说明。
将mmcautodetect设置为“no”,关闭mmcdev和mmcroot中SD卡插槽的自动设置。U-Boot mmcdev基于SD/MMC焊接连接,不同单板的连接方式不同。U-Boot mmc dev 0为当前槽位中编号最低的SD槽位,其次为1,以此类推。但是,Linux内核对所有uSDHC控制器进行索引,无论它们是否存在。下表显示了这种映射。
在SD卡的默认配置和本例中,U-Boot的偏移量为1024字节,i.MX 8QuadXPlus B0和i.MX 8QuadMax B0的偏移量为32kb, i.MX 8QuadXPlus A0、i.MX 8QuadMax A0、i.MX 8M EVK板在第一个分区之前的偏移量为33kb,分区1是有Linux内核和设备树的分区,分区2是rootfs。
设置环境变量
为了方便起见,本文使用一组标准变量来描述Linux命令行中的信息。对于不同的机器或配置,此处使用的值可能不同。U-Boot默认支持根据启动的uSDHC槽位自动设置mmcdev和mmcroot。这里假设zImage、设备树文件(DTB)和rootfs在同一个SD/MMC卡上。要手动设置这些环境变量,请将mmcautodetect设置为no以禁用该特性。
下面是一种设置启动Linux OS所需项的方法。
U-Boot > setenv mmcpart 1
U-Boot > setenv loadfdt 'fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdtfile}'
U-Boot > setenv loadkernel 'fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} zImage'
U-Boot > setenv bootcmd 'mmc dev ${mmcdev}; run loadkernel; run mmcargs; run loadfdt; bootz $ {loadaddr} - ${fdt_addr};'
以上变量说明如下:
•mmcpart—这是MMC/SD卡上包含内核映像的分区。
•mmcroot—MMC SD卡上根文件系统的位置,以及用于rootfs的引导命令的指令。
请注意:预建SD卡的U-Boot环境与此不匹配。它更复杂,所以它可以自动处理更多的变化。上面的示例被设计得更容易理解和手动使用。
从eMMC读取内核映像
eMMC有用户区、启动分区1和启动分区2。切换eMMC分区需要使用命令mmc dev [dev id] [partition id]。例如,
mmc dev 2 0 ---> user area
mmc dev 2 1 ---> boot partition 1
mmc dev 2 2 ---> boot partition 2
4.7.7运行NFS镜像文件
从NFS启动,在U-Boot提示符设置以下环境变量:
U-Boot > setenv serverip <your server IP>
U-Boot > setenv image <your kernel zImage name on the TFTP server>
U-Boot > setenv fdtfile <your dtb image name on the TFTP server>
U-Boot > setenv rootfsinfo 'setenv bootargs ${bootargs} root=/dev/nfs ip=dhcp \
nfsroot=${serverip}:/data/rootfs_home/rootfs_mx6,v3,tcp'
U-Boot > setenv bootcmd_net 'run rootfsinfo; dhcp ${image}; dhcp ${fdt_addr} \
${fdtfile}; booti ${loadaddr} - ${fdt_addr}'
U-Boot > setenv bootcmd 'run bootcmd_net'
请注意:如果MAC地址没有烧入熔断器,请在U-Boot中设置为使用网络。
setenv ethaddr xx: xx: xx: xx: xx: xx
4.8 Arm SystemReady-IR
4.8.1 Arm SystemReady-IR ACS符合性测试
在i.MX 8M Mini EVK板上运行SystemReady-IR ACS,请参考Arm SystemReady-IR ACS,网址:https://github.com/ARM-software/arm-systemready
- 克隆ACS Git。
- 将预构建的发布映像或从源代码构建的映像闪存到U-Disk、SD或eMMC上。如果目标存储为
同时启动存储,启动引导映像(flash.bin),然后启动ACS映像。例如,在U-Disk上:
sudo dd if=ir_acs_live_image.img of=/dev/sde bs=64M;sync
3.引导。ACS测试将自动运行。
4. ACS断电测试会有手动步骤。当运行到测试用例时,只需重新启动电路板。测试结果将存储在存储器上。
5. 使用SCT_Parser分析ACS结果。SCT_Parser的获取路径:https://github.com/vstehle/SCT_Parser
6. 复制acs_results\sct_results\Overall\Summary.ekl文件从u盘的RESULT分区到SCT_Parser文件夹。执行python3 parser.py --config EBBR.yaml Summary.ekl EBBR.seq来获得最终报告。
4.8.2胶囊更新
使用以下命令进行胶囊更新:
•对于SD:
U-Boot > env set dfu_alt_info "mmc 1=1 raw 0x42 0x2000"
•对于eMMC:
U-Boot > env set dfu_alt_info "mmc 2=1 raw 0x42 0x2000 mmcpart 1"
U-Boot > efidebug boot add 0 Boot0000 mmc 1:1 capsule1.bin;efidebug boot next 0
U-Boot > setenv serverip 10.192.242.218;dhcp $loadaddr capsule1.bin;fatwrite mmc 1:1 $ {loadaddr} /EFI/UpdateCapsule/capsule1.bin 0x${filesize}
U-Boot > setenv -e -nv -bs -rt -v OsIndications =0x04
U-Boot > efidebug capsule disk-update reset
不要打断U-Boot。让板进入grub。在grub运行之前,它应该自动更新引导加载程序并删除capsule1.bin。然后重新启动主板。U-Boot更新后,单板将启动。
4.8.3 Linux发行版安装
Fedora34:
- 下载Fedora34 IOT版本。
- 烧录到SD卡上。
3.从eMMC引导。 - 从SD卡安装发行版到eMMC。
OpenSUSE: - 下载OpenSUSE Tumbleweed版本。
- 将ISO刻录到u盘。
3.从eMMC引导。 - 从ISO安装到eMMC。