2956|1

185

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

【米尔 NXP i.MX93 开发板评测】 U-Boot编译与实践 [复制链接]

本帖最后由 小麦克 于 2024-8-4 04:47 编辑

U-Boot编译与实践

从这期开始,我们从底层uboot开始,构建嵌入式Linux系统,系统的学习一下嵌入式Linux开发的整个流程。

环境准备

从ARM官网下载最新的交叉编译器:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

这里需要选择 AArch64 GNU/Linux target (aarch64-none-linux-gnu)

交叉编译器下载地址

在Ubuntu中安装必要的工具

  1. sudo apt install flex bison libssl-dev gcc-aarch64-linux-gnu u-boot-tools libncurses5-dev libncursesw5-dev uuid-dev gnutls-dev

为了后续操作方便,写个简单的脚本linux_imx93.shCROSS_COMPILE变量导入到当前的环境中

  1. #!/bin/bash
  2. export ARCH=arm64
  3. export CROSS_COMPILE=aarch64-none-linux-gnu-
  4. export PATH=$PATH:/opt/tools/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu/bin

每次打开终端开始编译时执行一下source linux_imx93.sh

IMX93启动镜像

镜像组成

i.MX93上电时会首先运行内部的BOOT ROM,BOOT ROM根据拨码盘或者eFUSE确定从哪个设备启动。启动的设备必须在特定的位置存储下面的镜像。

从上面的框图可以看出,启动镜像必须按照上面的要求封装起来。由于使用uboot启动linux,所以只需要把uboot的镜像按照要求封装即可。BOOT ROM负责加载uboot,uboot启动好就可以加载内核和文件系统。

好在NXP提供了imx-mkimage https://github.com/nxp-imx/imx-mkimage.git ,有了这个工具,可以通过一条命令将所有文件打包成imx-boot镜像

在 《IMX_LINUX_USERS_GUIDE.pdf》提到了打包imx-boot需要的物料。

从文档中得知需要如下部分:

  1. SPL:second program loader,二级程序加载器,为 uboot 的一部分,编译 uboot 的时候会一并编译出;
  2. U-Boot:编译 uboot 的时候一并编译出;
  3. ATF:Arm Trusted Firmware,由 Arm 提供的项目,支持 Arm 架构上的安全启动和运行时需求;
  4. OP-TEE:Open Portable Trusted Execution Environment,开源的可信执行环境(TEE)框架;
  5. Sentinel Firmware:应该就是指 EdgeLock Secure Enclave (ELE) firmware;
  6. DDR PHY Firmware:ddr 固件

UBOOT编译

首先尝试使用NXP官方uboot来尝试一下,然后再用myir官方提供的uboot。

官方uboot编译实践体验

需要提前配置好交叉编译器

  1. git clone https://github.com/nxp-imx/uboot-imx -b lf_v2023.04
  2. cd uboot
  3. make distclean
  4. make imx93_11x11_evk_defconfig
  5. # 可选,可以删掉typec相关的支持
  6. make menuconfig
  7. make -j$(nproc --all)
  8. # 编译成功,生成如下两个文件
  9. ls -alh u-boot.bin
  10. ls -alh ./spl/u-boot-spl.bin
ATF 编译
  1. # 下载源码
  2. git clone https://github.com/nxp-imx/imx-atf
  3. cd imx-atf
  4. git checkout lf-6.6.3-1.0.0
  5. # 执行 make help 查看编译帮助
  6. make help
  7. # 从 make help 中可以知道,执行 make clean 是清除编译;
  8. # 一般的编译命令为 make [PLAT=<platform>] [OPTIONS] [TARGET]
  9. # 所以构建 imx93 的 ATF 命令如下(配置交叉编译器的前提下)
  10. make PLAT=imx93 bl31
  11. # 生成的文件如下:
  12. ls -alh build/imx93/release/bl31.bin
ELE 固件下载
  1. # 在以下文件中,可知下载命令,和最新的分支
  2. # https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf
  3. wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-ele-imx-0.1.1.bin
  4. # 导出固件,firmware-ele-imx-0.1.1.bin 头部是一段 shell 脚本,赋予执行权限
  5. chmod u+x firmware-ele-imx-0.1.1.bin
  6. # 执行 bin 文件,同意许可后会导出固件
  7. ./firmware-ele-imx-0.1.1.bin
  8. # 导出的文件为: mx93a1-ahab-container.img
  9. ls -alh firmware-ele-imx-0.1.1/mx93a1-ahab-container.img
DDR 固件下载
  1. # 在以下文件中,可知下载命令,和最新的分支
  2. # https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf
  3. wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.23.bin
  4. # 导出固件,firmware-imx-8.23.bin 头部是一段 shell 脚本,赋予执行权限
  5. chmod u+x firmware-imx-8.23.bin
  6. # 执行 bin 文件,同意许可后会导出固件
  7. ./firmware-imx-8.23.bin
  8. # 导出的文件为: lpddr4*
  9. ls -alh firmware-imx-8.23/firmware/ddr/synopsys/lpddr4*
imx-mkimage 工具下载
  1. # 在以下文件中,可知 imx-mkimage 仓库
  2. # https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf
  3. git clone https://github.com/nxp-imx/imx-mkimage.git
  4. cd imx-mkimage
  5. git checkout lf-6.6.3-1.0.0
打包

将上面的生成的固件通过 imx-mkimage 打包成一个文件 flash.bin

  1. # 拷贝 3.1 编译的 u-boot.bin 和 spl/u-boot-spl.bin 到 imx-mkimage/iMX93/ 目录
  2. cp uboot-imx/u-boot.bin uboot-imx/spl/u-boot-spl.bin imx-mkimage/iMX93/
  3. # 拷贝 3.2 编译的 bl31.bin 文件到 imx-mkimage/iMX93/ 目录
  4. cp imx-atf/build/imx93/release/bl31.bin imx-mkimage/iMX93/
  5. # 拷贝 3.3 下载的 Sentinel firmware container mx93a1-ahab-container.img 到 imx-mkimage/iMX93/ 目录
  6. cp firmware-ele-imx-0.1.1/mx93a1-ahab-container.img imx-mkimage/iMX93/
  7. # 拷贝 3.4 下载的 ddr 固件 lpddr4* 到 imx-mkimage/iMX93/ 目录
  8. # 参考博客:https://xterra2.avnet.com/poc/nxp/buildroot-for-i.mx93
  9. cp firmware-imx-8.23/firmware/ddr/synopsys/lpddr4* imx-mkimage/iMX93/
  10. # 进入 imx-mkimage 构建 flash.bin
  11. cd imx-mkimage
  12. make SOC=iMX9 REV=A1 flash_singleboot
  13. # 生成的 flash.bin 文件在 iMX93/flash.bin 路径
  14. ls -alh iMX93/flash.bin

myir uboot

参考《MYD-LMX9X_Linux软件开发指南.pdf》4.2节,编译成功会在output/1g文件夹下生成 imx-boot-myd-lmx9x-sd.bin-flash_singleboot

烧录到SD卡

编译出flash.bin 文件,下面将SD卡(此次是64GB)插入Ubuntu系统。

从SD卡32KB开始的位置写flash.bin ,从8MB开始的位置格式化成FAT32boot 分区。

文档《IMX_LINUX_USERS_GUIDE.pdf》中描述,iMX93从0x8000(32KB)开始的位置启动

SD卡设备确认

警告:操作时必须先确认SD卡的设备名,防止操作失误导致数据丢失!

  1. # 查找SD卡设备名
  2. sudo fdisk -l
  3. Disk /dev/sda: 500 GiB, 536870912000 bytes, 1048576000 sectors
  4. Disk model: VMware Virtual S
  5. Units: sectors of 1 * 512 = 512 bytes
  6. Sector size (logical/physical): 512 bytes / 512 bytes
  7. I/O size (minimum/optimal): 512 bytes / 512 bytes
  8. Disklabel type: dos
  9. Disk identifier: 0xd6bcc382
  10. Device Boot Start End Sectors Size Id Type
  11. /dev/sda1 * 2048 1050623 1048576 512M b W95 FAT32
  12. /dev/sda2 1052670 1048573951 1047521282 499.5G 5 Extended
  13. /dev/sda5 1052672 1048573951 1047521280 499.5G 83 Linux
  14. Disk /dev/sdb: 58.27 GiB, 62562238464 bytes, 122191872 sectors
  15. Disk model: STORAGE DEVICE
  16. Units: sectors of 1 * 512 = 512 bytes
  17. Sector size (logical/physical): 512 bytes / 512 bytes
  18. I/O size (minimum/optimal): 512 bytes / 512 bytes
  19. Disklabel type: dos
  20. Disk identifier: 0x00000000

通过以上信息,可以确认SD卡盘设备名为 /dev/sdb

前半部分处理

将SD卡前面的8MB空间全部清零

  1. dd if=/dev/zero of=/dev/sdb bs=1024 count=8096
  2. sync

创建分区

使用fdisk工具创建boot分区。

新建分区n,类型 p,First sector16384,保存 w, 退出 q

注意,由于电脑配置差异,SD卡的盘符可能不一致,我这里是 /dev/sdb,操作不当可能会导致数据丢失。请谨慎操作

  1. # Disk /dev/sdb: 58.27 GiB是我的SD卡
  2. # 在 /dev/sdb 新建分区
  3. sudo fdisk /dev/sdb
  4. Welcome to fdisk (util-linux 2.34).
  5. Changes will remain in memory only, until you decide to write them.
  6. Be careful before using the write command.
  7. Command (m for help): n
  8. Partition type
  9. p primary (0 primary, 0 extended, 4 free)
  10. e extended (container for logical partitions)
  11. Select (default p): p
  12. Partition number (1-4, default 1):
  13. First sector (2048-122191871, default 2048): 16384
  14. Last sector, +/-sectors or +/-size{K,M,G,T,P} (16384-122191871, default 122191871):
  15. Created a new partition 1 of type 'Linux' and of size 58.3 GiB.
  16. Command (m for help): w
  17. The partition table has been altered.
  18. Calling ioctl() to re-read partition table.
  19. Syncing disks.

操作完成检查确认是否出现 /dev/sdb1

  1. sudo fdisk -l
  2. Disk /dev/sdb: 58.27 GiB, 62562238464 bytes, 122191872 sectors
  3. Disk model: STORAGE DEVICE
  4. Units: sectors of 1 * 512 = 512 bytes
  5. Sector size (logical/physical): 512 bytes / 512 bytes
  6. I/O size (minimum/optimal): 512 bytes / 512 bytes
  7. Disklabel type: dos
  8. Disk identifier: 0x00000000
  9. Device Boot Start End Sectors Size Id Type
  10. /dev/sdb1 16384 122191871 122175488 58.3G 83 Linux

格式化成FAT32分区,分区名boot

  1. sudo mkfs.vfat -F 32 -n "boot" /dev/sdb1

将之前编译好的flash.bin写入SD卡32KB开始的位置

  1. dd if=flash.bin of=/dev/sdb bs=32K seek=1 conv=fsync
  2. sync

这样SD卡就处理好了。后面flash.bin如果有更新,只要执行最后一步就行,之前的boot分区不需要动了。

将SD卡插入开发板,接上串口,开始DEBUG

启动日志

补充 DDR配置

从NXP官方提供的UBOOT源码编译的源码发现启动的时候识别到DDR为2GB,其实开发板只有1GB。

尝试在UBOOT中修改配置,发现无效。

uboot中比较重要和初始化相关的源文件

common/board_f.c

board/freescale/imx93_evk/imx93_evk.c

arch/arm/mach-imx/imx9/native/soc.c

soc.c 中通过读取DDR控制器的得到DDR的大小,所有上面的配置无效。

通过查阅代码,这个DDR控制器的寄存器是在 SPL阶段配置好的。

board/freescale/imx93_evk/spl.c spl_dram_init函数通过结构体dram_timing 拿到DDR的配置信息。

这个 dram_timing 是通过NXP的配置工具Config Tool 生成的。配置1GB的内存,生成c配置文件覆盖board/freescale/imx93_evk/lpddr4x_timing.c

将修改后的uboot重新打包成flash.bin并烧入SD卡,重新启动开发板成功识别成1GB的内存

结论

我们从头构建了imx-boot,掌握了IMX镜像的原理;还学习了通过Config Tool配置内存的方法。

点赞 关注
 

回复
举报

185

帖子

3

TA的资源

一粒金砂(高级)

沙发
 

帖子比较长,整理了pdf,有需要的可以下载。

u-boot编译与实践.pdf (1.4 MB, 下载次数: 3)
 
 

回复
您需要登录后才可以回帖 登录 | 注册

猜你喜欢
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖探索 | 和村田一起,深挖 GNSS 开发!
活动时间:即日起-5月11日
活动奖励:智能手环、螺丝刀套装、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 6

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表