【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替換為 Winbond 512 MB DDR 方法大公開 ( 下 )

. 前言
世平集團針對 DDR 相關技術整理了一系列博文,下圖為詳細的博文索引架構;筆者希望能夠透過這些博文協助大家更了解如何在 i.MX8 相關平台上使用 DDR,未來筆者也會持續更新此系列的相關博文還懇請支持!而本篇博文會針對 DDR 相關技術索引架構中的【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替換為 Winbond 512 MB DDR 方法大公開 ( 下 ) 這篇文章做介紹,本篇博文會對系統程式如何配合 DDR 容量大小修改做敘述接下來讓我們開始進入正題吧!


博文架構

在上一篇博文 【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替換為 Winbond 512 MB DDR 方法大公開 ( 上 ) 中,我們敘述了如何在 NXP 的 i.MX8M Mini 開發板上使用 Winbond 的 512 MB DDR,並配合其 Datasheet 設置 RPA 文件。而在接下來的這篇博文裡面,將會接續介紹如何依照 512 MB 的容量大小對軟體做修改。以下是本篇博文即將會介紹的內容:

(1) 如何把 Calibration 的結果打包進系統。 ( 這部分需要修改 "optee-os"、"imx-atf"、"u-boot-imx"、"imx-boot" 等程式 )。

(2) 開機後如何透過實驗證明程式修改成功

a. 系統流程圖

以下圖片為替換 DDR 的流程圖。

替換 DDR 的流程圖

由於圖片中提到的「查看 DDR Datasheet」、「配置 RPA 參數」、「透過 DDR Tool 測試參數並壓力測試」以及「產出 "lpddr4_timing.c"」 等部分,已經在 【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替換為 Winbond 512 MB DDR 方法大公開 ( 上 ) 這篇博文中介紹過了,所以本篇博文將會針對以下兩點做介紹:

(1) 依據 DDR 顆粒的容量大小修改程式碼。( 包含了上圖中的 1 ~ 3 點 )

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




二. 針對 512 MB 容量的 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 )

接著請參考以下操作,來達成使用 Winbond 512 MB 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
cmd1

編輯目錄中的 "conf.mk"。
$ vim core/arch/arm/plat-imx/conf.mk
cmd2

修改 CFG_DDR_SIZE 數值。 ( 由於我們 DDR 容量為 512 MB,所以改為 0x20000000 )

CFG_DDR_SIZE

編譯 "optee-os"。
$ bitbake optee-os -f -c compile; bitbake optee-os -f -c deploy
編譯 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/
cmd4

編輯目錄中的 "platform.mk"。
$ vim plat/imx/imx8m/imx8mm/platform.mk

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

platform.mk

那 OP-TEE Start Address 0x5e000000 是怎麼來的呢? 這其實是算來的邏輯可參考 "tmp/work/imx8mmevk-poky-linux/optee-os/3.10.0.imx-r0/git/core/arch/arm/plat-imx/conf.mk" 這隻程式碼。

conf.mk

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

rm

因為目前我們的 DDR 顆粒容量大小是 512 MB,所以 CFG_DDR_SIZE 的值是 0x20000000 ( 512 MB )。

再來將上述數值都帶入以下公式,最後就會算出 CFG_TZDRAM_START 是 0x5e000000。

CFG_TZDRAM_START = 0x40000000 - 0x02000000 + 0x20000000

了解 CFG_TZDRAM_START 如何來的之後,讓我們繼續看下去吧!請輸入以下 Command 編譯 "imx-atf" 。
$ bitbake imx-atf -f -c compile; bitbake imx-atf -f -c deploy
build 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 之替換為 Winbond 512 MB DDR 方法大公開 ( 上 ) 這篇文章。

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

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

lpddr4_timing.c

接著編輯 "lpddr4_timing.c"。
$ vim board/freescale/imx8mm_evk/lpddr4_timing.c

將 "#include <asm/arch/imx8m_ddr.h>" 這行替換為 "#include <asm/arch/ddr.h>"。

替換

再來請編輯 "imx8mm_evk.h"。
$ vim include/configs/imx8mm_evk.h
imx8mm_evk.h

將 PHYS_SDRAM_SIZE 修改為 0x20000000。 ( 0x20000000 就是 512 MB 的意思 )

512 MB

編譯 "u-boot-imx"。
$ bitbake u-boot-imx -f -c compile; bitbake u-boot-imx -f -c deploy
u-boot-imx

編譯完畢後會產生 "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/
imx-boot

編輯 "soc.mak"。
$ vim iMX8M/soc.mak
soc.mak

修改 TEE_LOAD_ADDR 內容,請將 OPTEE 的 Start Address 改為 0x5e000000。

soc.mak

編輯 "mkimage_fit_atf.sh"。
$ vim iMX8M/mkimage_fit_atf.sh

更換 TEE_LOAD_ADDR 為 0x5e000000。

TEE_LOAD_ADDR

再編輯 "print_fit_hab.sh"。
$ vim iMX8M/print_fit_hab.sh

更換 TEE_LOAD_ADDR 為 0x5e000000。

TEE_LOAD_ADDR

最後編譯 "imx-boot"。
$ bitbake imx-boot -f -c compile; bitbake imx-boot -f -c deploy
build 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 改為 512 MB 」的這個目的,需要修改及重新編譯的地方包含了 "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​
umount

最後透過 "dd" Command 來燒錄 Bootloader。( 這裡的 "dev/sdb" 指的是筆者的 SD Card 位置,這應該根據您電腦的路徑做相對應修改 )
$ sudo dd if=imx-boot-imx8mmevk-sd.bin-flash_evk of=/dev/sdb bs=1k seek=33​
DD


b. 開機驗證

把重新燒寫好的 SD Card 放入開發板內並開機之後,可於 U-boot Log 中夠看到 480 MiB 的字眼。

480MB

那 480 MiB 怎麼來的呢? 這是因為容量大小 512 MB 扣除 OP-TEE 32M 產生的結果。若是直接拿除 OP-TEE 將會在這個 Log 中看到完整的 512 MB。

接著開進 Kernel 後,可從 Kernel Log 得知總記憶體大小為 480 MB ( 491520 K ) 跟 U-boot 的 Log 相呼應。

Kernel Log

那 Log 中的 116760 K 怎麼來的? 可以帶入以下算式。

116760 K = 總記憶體大小 - reserved - cma-reserved

                 = 491520 K - 47080 K - 327680 K

當開進 Rootfs 後下 "free" Command 可以看到記憶體大小為 447384 K。

free

那 447384 K 怎麼來的? 可以帶入以下算式。

447384 K = used + free + buff/cache

                 = 198580 K + 218080 K + 30724 K

此外我們可以透過 "free" 命令找到未使用的記憶體空間。由下圖可得知系統的可用空間還有 200 多 MB。
$ free​
free

最後可以透過 "memtester" 程式驗證記憶體讀寫是否正常。( 請讀者自行把 "memtester" 程式 Copy 到系統中 )
$ ./memtester 200M​
200M

這裡的 200M 是指要測試的記憶體大小;為了確保在做記憶體測試時系統能正常運作,輸入的數值不能超過 "free" 的大小,並且預留至少約 60MB 的空間給系統。

"memtester" 命令會不斷的對記憶體做壓力測試,下圖中的 Loop 那行指的就是測試次數它會不斷的累加。

memtester

四. 結語

本篇博文示範了如何在 i.MX8M Mini 平台上成功的使用 Winbond 512 MB 顆粒開機,主要是先將 DDR 的參數配置填入 RPA 文件再根據記憶體容量的大小配合修改 "optee-os"、"imx-atf"、"u-boot-imx"、"imx-boot" 等軟體,最後重新編譯軟體並且重新燒錄後就可以在 i.MX8M Mini 平台上正常開機了。本篇博文也透過壓力測試結果證明了替換 Winbond 512 MB 顆粒後在使用上沒有問題。未來讀者們若是有替換 DDR 顆粒的需求將可以直接套用本博文的方法,之後筆者也會持續撰寫 「如何在 i.MX8M Mini 平台上使用不同容量的 DDR 顆粒的文章」 再請拭目以待。若是讀者們在配置 DDR 參數或修改程式的過程中有遇到任何問題,也歡迎隨時與世平集團討論。

五. 參考文件

★博文內容參考自 網站,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論