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

關(guān)鍵字 :i.MX8M MiniNXPWinbond
. 前言
世平集團(tuán)針對(duì) DDR 相關(guān)技術(shù)整理了一系列博文,下圖為詳細(xì)的博文索引架構(gòu);筆者希望能夠透過(guò)這些博文協(xié)助大家更了解如何在 i.MX8 相關(guān)平臺(tái)上使用 DDR,未來(lái)筆者也會(huì)持續(xù)更新此系列的相關(guān)博文還懇請(qǐng)支持!而本篇博文會(huì)針對(duì) DDR 相關(guān)技術(shù)索引架構(gòu)中的【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替換為 Winbond 512 MB DDR 方法大公開(kāi) ( 下 )?這篇文章做介紹,本篇博文會(huì)對(duì)系統(tǒng)程式如何配合 DDR 容量大小修改做敘述接下來(lái)讓我們開(kāi)始進(jìn)入正題吧!


博文架構(gòu)

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

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

(2) 開(kāi)機(jī)後如何透過(guò)實(shí)驗(yàn)證明程式修改成功

a. 系統(tǒng)流程圖

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

替換 DDR 的流程圖

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

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

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




二. 針對(duì) 512 MB 容量的 DDR 修改軟體設(shè)定

本篇博文使用的軟體版本為 L5.4.47_2.2.0 將會(huì)修改的部分如下:

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 )

接著請(qǐng)參考以下操作,來(lái)達(dá)成使用 Winbond 512 MB DDR 開(kāi)機(jī)的目的吧!

a. 修改 optee-os

以下將介紹如何修改 OP-TEE 程式的 DDR Size 並編譯 "optee-os"。

首先,移動(dòng)到 "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 數(shù)值。 ( 由於我們 DDR 容量為 512 MB,所以改為 0x20000000 )

CFG_DDR_SIZE

編譯 "optee-os"。
$ bitbake optee-os -f -c compile; bitbake optee-os -f -c deploy
編譯 optee-os

編譯完畢後會(huì)生出 "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"。

首先,移動(dòng)到 "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 是怎麼來(lái)的呢? 這其實(shí)是算來(lái)的邏輯可參考 "tmp/work/imx8mmevk-poky-linux/optee-os/3.10.0.imx-r0/git/core/arch/arm/plat-imx/conf.mk" 這隻程式碼。

conf.mk

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

rm

因?yàn)槟壳拔覀兊?DDR 顆粒容量大小是 512 MB,所以 CFG_DDR_SIZE 的值是 0x20000000 ( 512 MB )。

再來(lái)將上述數(shù)值都帶入以下公式,最後就會(huì)算出 CFG_TZDRAM_START 是 0x5e000000。

CFG_TZDRAM_START = 0x40000000 - 0x02000000 + 0x20000000

了解 CFG_TZDRAM_START 如何來(lái)的之後,讓我們繼續(xù)看下去吧!請(qǐng)輸入以下 Command 編譯 "imx-atf" 。
$ bitbake imx-atf -f -c compile; bitbake imx-atf -f -c deploy
build imx-atf

編譯完畢後會(huì)生出 "bl31-imx8mm.bin" 與 "bl31-imx8mm.bin-optee"。( 檔案會(huì)產(chǎn)出在 "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" 並根據(jù)目前 DDR 容量大小修改程式碼最後進(jìn)行編譯。如果不知道如何產(chǎn)生出?"lpddr4_timing.c" 檔可以參考?【ATU Book-i.MX8 系列-DDR】NXP i.MX8M Mini 之替換為 Winbond 512 MB DDR 方法大公開(kāi) ( 上 ) 這篇文章。

首先,移動(dòng)到 "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/" 下將本來(lái)的 "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>"。

替換

再來(lái)請(qǐng)編輯 "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

編譯完畢後會(huì)產(chǎn)生 "u-boot-imx8mmevk.bin" 與 "u-boot-imx8mmevk.bin-sd" 等檔案;而檔案會(huì)產(chǎn)出在 "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"。

首先,移動(dòng)到 "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 內(nèi)容,請(qǐng)將 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

編譯完畢後會(huì)產(chǎn)生 "imx-boot" 與 "imx-boot-imx8mmevk-sd.bin-flash_evk";檔案會(huì)產(chǎn)出在 "tmp/work/imx8mmevk-poky-linux/imx-boot/1.0-r0/deploy-imx-boot/" 目錄下。

e. 小結(jié)

透過(guò)以上操作我們了解到如需達(dá)成「將 DDR 改為 512 MB 」的這個(gè)目的,需要修改及重新編譯的地方包含了 "optee-os"、"imx-atf"、"u-boot-imx"、"imx-boot" 等檔案,後續(xù)章節(jié)將介紹如何驗(yàn)證以上修改是否都有正確生效。

三.?驗(yàn)證是否能開(kāi)機(jī)

a.?燒錄 Bootloader

本篇範(fàn)例是用 SD Card 開(kāi)機(jī)。所以筆者請(qǐng)先將 SD 卡放進(jìn) PC 並且先把 Boot 與 Rootfs Partition unmount。
$ sudo umount /media/user/boot
$ sudo umount /media/user/root?
umount

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


b. 開(kāi)機(jī)驗(yàn)證

把重新燒寫(xiě)好的 SD Card 放入開(kāi)發(fā)板內(nèi)並開(kāi)機(jī)之後,可於 U-boot Log 中夠看到 480 MiB 的字眼。

480MB

那 480 MiB 怎麼來(lái)的呢? 這是因?yàn)槿萘看笮?512 MB 扣除 OP-TEE 32M 產(chǎn)生的結(jié)果。若是直接拿除 OP-TEE 將會(huì)在這個(gè) Log 中看到完整的 512 MB。

接著開(kāi)進(jìn) Kernel 後,可從 Kernel Log 得知總記憶體大小為 480 MB ( 491520 K ) 跟 U-boot 的 Log 相呼應(yīng)。

Kernel Log

那 Log 中的 116760 K 怎麼來(lái)的? 可以帶入以下算式。

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

? ? ? ? ? ? ? ? ?= 491520 K - 47080 K - 327680 K

當(dāng)開(kāi)進(jìn) Rootfs 後下 "free" Command 可以看到記憶體大小為 447384 K。

free

那 447384 K 怎麼來(lái)的? 可以帶入以下算式。

447384 K = used + free + buff/cache

? ? ? ? ? ? ? ? ?= 198580 K + 218080 K + 30724 K

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

最後可以透過(guò) "memtester" 程式驗(yàn)證記憶體讀寫(xiě)是否正常。( 請(qǐng)讀者自行把 "memtester" 程式 Copy 到系統(tǒng)中 )
$ ./memtester 200M?
200M

這裡的 200M 是指要測(cè)試的記憶體大小;為了確保在做記憶體測(cè)試時(shí)系統(tǒng)能正常運(yùn)作,輸入的數(shù)值不能超過(guò) "free" 的大小,並且預(yù)留至少約 60MB 的空間給系統(tǒng)。

"memtester" 命令會(huì)不斷的對(duì)記憶體做壓力測(cè)試,下圖中的 Loop 那行指的就是測(cè)試次數(shù)它會(huì)不斷的累加。

memtester

四. 結(jié)語(yǔ)

本篇博文示範(fàn)了如何在 i.MX8M Mini 平臺(tái)上成功的使用 Winbond 512 MB 顆粒開(kāi)機(jī),主要是先將 DDR 的參數(shù)配置填入 RPA 文件再根據(jù)記憶體容量的大小配合修改?"optee-os"、"imx-atf"、"u-boot-imx"、"imx-boot" 等軟體,最後重新編譯軟體並且重新燒錄後就可以在 i.MX8M Mini 平臺(tái)上正常開(kāi)機(jī)了。本篇博文也透過(guò)壓力測(cè)試結(jié)果證明了替換 Winbond 512 MB 顆粒後在使用上沒(méi)有問(wèn)題。未來(lái)讀者們?nèi)羰怯刑鎿Q DDR 顆粒的需求將可以直接套用本博文的方法,之後筆者也會(huì)持續(xù)撰寫(xiě) 「如何在 i.MX8M Mini 平臺(tái)上使用不同容量的 DDR 顆粒的文章」 再請(qǐng)拭目以待。若是讀者們?cè)谂渲?DDR 參數(shù)或修改程式的過(guò)程中有遇到任何問(wèn)題,也歡迎隨時(shí)與世平集團(tuán)討論。

五. 參考文件

★博文內(nèi)容參考自?網(wǎng)站,與平臺(tái)無(wú)關(guān),如有違法或侵權(quán),請(qǐng)與網(wǎng)站管理員聯(lián)繫。

★文明上網(wǎng),請(qǐng)理性發(fā)言。內(nèi)容一周內(nèi)被舉報(bào)5次,發(fā)文人進(jìn)小黑屋喔~

參考來(lái)源

評(píng)論