一. 前言
世平集團針對 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) 開機後如何透過實驗證明程式修改成功。
(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 點 )
(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
編輯目錄中的 "conf.mk"。
$ vim core/arch/arm/plat-imx/conf.mk
修改 CFG_DDR_SIZE 數值。 ( 由於我們 DDR 容量為 1 GB,所以改為 0x40000000 )
編譯 "optee-os"。
$ bitbake optee-os -f -c compile; bitbake optee-os -f -c deploy
編譯完畢後會生出 "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/?
編輯目錄中的 "platform.mk"。
$ vim plat/imx/imx8m/imx8mm/platform.mk
添加 OP-TEE 的 Start Address ( 0x7e000000 ) 到 "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" 這隻程式碼。
可以透過 NXP 的 Reference Manual 文件得知 CFG_DRAM_BASE 的數值是 0x40000000 ( 1 GB )。
因為目前我們的 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
編譯完畢後會生出 "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/
將 "lpddr4_timing.c" 放置到 "board/freescale/imx8mm_evk/" 下將本來的 "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
將 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
修改 TEE_LOAD_ADDR 內容,請將 OPTEE 的 Start Address 改為 0x7e000000。
編輯 "mkimage_fit_atf.sh"。
$ vim iMX8M/mkimage_fit_atf.sh
更換 TEE_LOAD_ADDR 為 0x7e000000。
再編輯 "print_fit_hab.sh"。
$ vim iMX8M/print_fit_hab.sh
更換 TEE_LOAD_ADDR 為 0x7e000000。
最後編譯 "imx-boot"。
$ bitbake imx-boot -f -c compile; bitbake imx-boot -f -c deploy
編譯完畢後會產生 "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 的字眼。
那 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 怎麼來的? 可以帶入以下算式。
那 Log 中的 1015808 K 怎麼來的? 可以帶入以下算式。
311576 K = 總記憶體大小 - reserved - cma-reserved
? ? ? ? ? ? ? ? ?= 1015808 K - 48872 K - 655360 K
當開進 Rootfs 後下 "free" Command 可以看到記憶體大小為 969880 K。
那 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 參數或修改程式的過程中有遇到任何問題,也歡迎隨時與世平集團討論。
五. 參考文件
參考來源