【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替换为 Nanya 1 GB DDR 方法大公开 ( 下 )

. 前言
世平集团针对 DDR 相关技术整理了一系列博文,下图为详细的博文索引架构;笔者希望能够透过这些博文协助大家更了解如何在 i.MX8 相关平台上使用 DDR,未来笔者也会持续更新此系列的相关博文还恳请支持!而本篇博文会针对 DDR 相关技术索引架构中的【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替换为 Nanya 1 GB DDR 方法大公开 ( 下 )  这篇文章做介绍,本篇博文会对系统程式如何配合 DDR 容量大小修改做叙述接下来让我们开始进入正题吧!



在上一篇博文 【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替换为 Nanya 1 GB DDR 方法大公开 ( 上 ) 中,我们叙述了如何在 NXP 的 i.MX8M Mini 开发板上使用 Nanya 的 1 GB DDR 的方法,并配合其 Datasheet 设置 RPA 文件。而在接下来的这篇博文里面,将会接续介绍如何依照 1 GB 的容量大小对软体做修改。以下是本篇博文即将会介绍的内容:

(1) 如何把 Calibration 的结果打包进系统。 ( 这部分需要修改 "optee-os"、"imx-atf"、"u-boot-imx"、"imx-boot" 等程式 )。

(2) 开机后如何透过实验证明程式修改成功

a. 系统流程图

以下图片为替换 DDR 的流程图。

流程图

由于图片中提到的“查看 DDR Datasheet”、“配置 RPA 参数”、“透过 DDR Tool 测试参数并压力测试”以及“产出 "lpddr4_timing.c"” 等部分,已经在 【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替换为 Nanya 1 GB DDR 方法大公开 ( 上 ) 这篇博文中介绍过了,所以本篇博文将会针对以下两点做介绍:

(1) 依据 DDR 颗粒的容量大小修改程式码。( 包含了上图中的 1 ~ 3 点 )

(2) 把 "lpddr4_timing.c" 打包到 Bootloader 中。( 包含了上图中的 3 ~ 4 点 )

二. 针对 1 GB 容量的 DDR 修改软体设定

本篇博文使用的软体版本为 L5.4.47_2.2.0 将会修改的部分如下:

a. "optee-os"。( 须配合修改 DDR Size )

b. "imx-atf"。( 须配合修改 OP-TEE Address )

c. "u-boot-imx"。( 须配合修改 DDR Size 与替换 "lpddr4_timing.c" )

d. "imx-boot"。( 须配合修改 OP-TEE Address )

接着请参考以下操作,来达成使用 Nanya 1 GB DDR 开机的目的吧!

a. 修改 optee-os

以下将介绍如何修改 OP-TEE 程式的 DDR Size 并编译 "optee-os"。

首先,移动到 "optee-os" 目录。

$ cd tmp/work/imx8mmevk-poky-linux/optee-os/3.10.0.imx-r0/git
optee-os

编辑目录中的 "conf.mk"。
$ vim core/arch/arm/plat-imx/conf.mk
conf.mk

修改 CFG_DDR_SIZE 数值。 ( 由于我们 DDR 容量为 1 GB,所以改为 0x40000000 )

CFG_DDR_SIZE

编译 "optee-os"。
$ bitbake optee-os -f -c compile; bitbake optee-os -f -c deploy
build_optee-os

编译完毕后会生出 "tee.bin" 与 "tee.mx8mmevk.bin",而档案可在 "tmp/work/imx8mmevk-poky-linux/optee-os/3.10.0.imx-r0/deploy-optee-os/" 目录下找到。

b. 修改 imx-atf

以下将介绍如何修改 OP-TEE Start 的 Address 并编译 "imx-atf"。

首先,移动到 "imx-atf" 目录。
$ cd tmp/work/aarch64-mx8mm-poky-linux/imx-atf/2.2+gitAUTOINC+c949a888e9-r0/git/​
imx-atf

编辑目录中的 "platform.mk"。
$ vim plat/imx/imx8m/imx8mm/platform.mk

添加 OP-TEE 的 Start Address ( 0x7e000000 ) 到 "platform.mk"。

platform.mk

那 OP-TEE Start Address 0x7e000000 是怎么来的呢? 这其实是算来的逻辑可参考 "tmp/work/imx8mmevk-poky-linux/optee-os/3.10.0.imx-r0/git/core/arch/arm/plat-imx/conf.mk" 这只程式码。

0x7e000000

可以透过 NXP 的 Reference Manual 文件得知 CFG_DRAM_BASE 的数值是 0x40000000 ( 1 GB )。

rm

因为目前我们的 DDR 颗粒容量大小是 1 GB,所以 CFG_DDR_SIZE 的值是 0x40000000 ( 1 GB )。

再来将上述数值都带入以下公式,最后就会算出 CFG_TZDRAM_START 是 0x7e000000。

CFG_TZDRAM_START = 0x40000000 - 0x02000000 + 0x40000000

了解 CFG_TZDRAM_START 如何来的之后,让我们继续看下去吧!请输入以下 Command 编译 "imx-atf" 。
$ bitbake imx-atf -f -c compile; bitbake imx-atf -f -c deploy
imx-atf

编译完毕后会生出 "bl31-imx8mm.bin" 与 "bl31-imx8mm.bin-optee"。( 档案会产出在 "tmp/work/aarch64-mx8mm-poky-linux/imx-atf/2.2+gitAUTOINC+c949a888e9-r0/ deploy-imx-atf/imx-boot-tools/" 下 )

c. 修改 u-boot-imx

以下将介绍如何把 "lpddr4_timing.c" 打包到 "u-boot-imx" 并根据目前 DDR 容量大小修改程式码最后进行编译。如果不知道如何产生出 "lpddr4_timing.c" 档可以参考 【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替换为 Nanya 1 GB DDR 方法大公开 ( 上 ) 这篇文章。

首先,移动到 "u-boot-imx" 目录下。
$ cd tmp/work/imx8mmevk-poky-linux/u-boot-imx/1_2020.04-r0/git/
u-boot-imx

将 "lpddr4_timing.c" 放置到 "board/freescale/imx8mm_evk/" 下将本来的 "lpddr4_timing.c" 取代。

replace

接着编辑 "lpddr4_timing.c"。
$ vim board/freescale/imx8mm_evk/lpddr4_timing.c

将 "#include <asm/arch/imx8m_ddr.h>" 这行替换为 "#include <asm/arch/ddr.h>"。

include replace

再来请编辑 "imx8mm_evk.h"。

$ vim include/configs/imx8mm_evk.h


将 PHYS_SDRAM_SIZE 修改为 0x40000000 。 ( 0x40000000 就是 1 GB 的意思 )



编译 "u-boot-imx"。
$ bitbake u-boot-imx -f -c compile; bitbake u-boot-imx -f -c deploy


编译完毕后会产生 "u-boot-imx8mmevk.bin" 与 "u-boot-imx8mmevk.bin-sd" 等档案;而档案会产出在 "tmp/work/imx8mmevk-poky-linux/u-boot-imx/1_2020.04-r0/deploy-u-boot-imx/" 目录下。

d. 修改 imx-boot

以下将介绍如何修改 OP-TEE Start 的 Address 并编译 "imx-boot"。

首先,移动到 "imx-boot" 目录。
$ cd tmp/work/imx8mmevk-poky-linux/imx-boot/1.0-r0/git/


编辑 "soc.mak"。
$ vim iMX8M/soc.mak
soc.mk

修改 TEE_LOAD_ADDR 内容,请将 OPTEE 的 Start Address 改为 0x7e000000。



编辑 "mkimage_fit_atf.sh"。
$ vim iMX8M/mkimage_fit_atf.sh

更换 TEE_LOAD_ADDR 为 0x7e000000。

0x7e000000

再编辑 "print_fit_hab.sh"。
$ vim iMX8M/print_fit_hab.sh

更换 TEE_LOAD_ADDR 为 0x7e000000。

0x7e000000

最后编译 "imx-boot"。
$ bitbake imx-boot -f -c compile; bitbake imx-boot -f -c deploy
imx-boot

编译完毕后会产生 "imx-boot" 与 "imx-boot-imx8mmevk-sd.bin-flash_evk";档案会产出在 "tmp/work/imx8mmevk-poky-linux/imx-boot/1.0-r0/deploy-imx-boot/" 目录下。

e. 小结

透过以上操作我们了解到如需达成“将 DDR 改为 1 GB ”的这个目的,需要修改及重新编译的地方包含了 "optee-os"、"imx-atf"、"u-boot-imx"、"imx-boot" 等档案,后续章节将介绍如何验证以上修改是否都有正确生效。

三. 验证是否能开机

a. 烧录 Bootloader

本篇范例是用 SD Card 开机。所以笔者请先将 SD 卡放进 PC 并且先把 Boot 与 Rootfs Partition unmount。
$ sudo umount /media/user/boot
$ sudo umount /media/user/root​



最后透过 "dd" Command 来烧录 Bootloader。( 这里的 "dev/sdb" 指的是笔者的 SD Card 位置,这应该根据您电脑的路径做相对应修改 )
$ sudo dd if=imx-boot-imx8mmevk-sd.bin-flash_evk of=/dev/sdb bs=1k seek=33​



b. 开机验证

把重新烧写好的 SD Card 放入开发板内并开机之后,可于 U-boot Log 中够看到 992 MiB 的字眼。

992M

那 992 MiB 怎么来的呢? 这是因为容量大小 1024 MB 扣除 OP-TEE 32M 产生的结果。若是直接拿除 OP-TEE 将会在这个 Log 中看到完整的 1 GB。

接着开进 Kernel 后,可从 Kernel Log 得知总记忆体大小为 992 MB ( 1015808 K ) 跟 U-boot 的 Log 相呼应。



那 Log 中的 1015808 K 怎么来的? 可以带入以下算式。

311576 K = 总记忆体大小 - reserved - cma-reserved

                 = 1015808 K - 48872 K - 655360 K

当开进 Rootfs 后下 "free" Command 可以看到记忆体大小为 969880 K。



那 969880 K 怎么来的? 可以带入以下算式。

969880 K = used + free + buff/cache

                 = 199568 K + 739628 K + 30684 K

此外我们可以透过 "free" 命令找到未使用的记忆体空间。由下图可得知系统的可用空间还有 700 多 MB。
$ free​


最后可以透过 "memtester" 程式验证记忆体读写是否正常。( 请读者自行把 "memtester" 程式 Copy 到系统中 )
$ ./memtester 600M​


这里的 600M 是指要测试的记忆体大小;为了确保在做记忆体测试时系统能正常运作,输入的数值不能超过 "free" 的大小,并且预留至少约 60MB 的空间给系统。

"memtester" 命令会不断的对记忆体做压力测试,下图中的 Loop 那行指的就是测试次数它会不断的累加。



四. 结语

本篇博文示范了如何在 i.MX8M Mini 平台上成功的使用 Nanya 1 GB 颗粒开机,主要是先将 DDR 的参数配置填入 RPA 文件再根据记忆体容量的大小配合修改 "optee-os"、"imx-atf"、"u-boot-imx"、"imx-boot" 等软体,最后重新编译软体并且重新烧录后就可以在 i.MX8M Mini 平台上正常开机了。本篇博文也透过压力测试结果证明了替换 Nanya 1 GB 颗粒后在使用上没有问题。未来读者们若是有替换 DDR 颗粒的需求将可以直接套用本博文的方法,之后笔者也会持续撰写 “如何在 i.MX8M Mini 平台上使用不同容量的 DDR 颗粒的文章” 再请拭目以待。若是读者们在配置 DDR 参数或修改程式的过程中有遇到任何问题,也欢迎随时与世平集团讨论。

五. 参考文件

★博文内容参考自 网站,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

参考来源

false: https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/i-MX-8M-Family-DDR-Tool-Release/ta-p/1104467

评论

YTC

YTC

2022年8月25日
請教一下,燒入上述文件sudo dd if=imx-boot-imx8mmevk-sd.bin-flash_evk of=/dev/sdb bs=1k seek=33?前,是否要先建構環境,進行Image 燒錄 dd if=.sdcard of=/dev/sd bs=1M conv=fsync,謝謝。