前面有說明過 TF-A 的用途,其實就是在 ARM 架構啟動階段的第一個環節,那我們需要修改那些部分呢?
我們要先想一想 TF-A 階段我們需要做哪些事情, 會需要用到 I2C SPI ETH1 嗎?
假如不會使用到,那在這階段可以先不用去做沒關係!
例如某些板子上可能會用到 Power Manager IC (PMIC) , 那他可能是透過 I2C 通訊的,而 PMIC 負責輸出各路電壓,這時我們就需要在 TF-A 階段當中去修改設備樹。另外一個可能會需要修改的就是 DDR,因為在各個階段都會去使用到DDR , 而TF-A 階段會去負責 init DDR,這時我們就要去注意的大小是否與開發板上一致。
這邊使用 stm32mp1 為範例說明,透過 yocto 我們可以很方便地將 src 給 download 下來。
devtool modify tf-a-stm32mp
# 下載後檔案會在 build/workspace/source 資料夾底下
這邊已修改DDR為範例,在ST 官方的 BSP 當中 DDR 預設是 , 那我的開發板查了一下型號是 MT41K128M16JT-125:K , 他是一個 2G 的 DDR。 所以我們就比需要去修改這部分的大小。
我們用的檔案是 stm32mp157-ev1.dts , 在當中引用了 另外一個 dtsi 檔案 如下圖 , 我們因為自己的板子改為 1GB DDR 所以需要來修改這個檔案
找到所引用的檔案 開頭有一段在定義 DDR 的大小,這就是我們需要修改的地方
在 ST 官方當中使用的是 1G 的 DDR , 那我們使用的是 2G 就需要修改這部分。
這邊的檔案名稱為什麼是 2x4Gb , 因為這個Gb 是 Gigabits 不是 Gigabytes (GB) , 4 Gb 轉換為Bytes是 0.5 GB。因此,2x4Gb 指的是兩個 4 Gb 的模組,共計 8 Gb,或者 1 GB。
將這一行
#define DDR_MEM_SIZE 0x40000000
修改為
#define DDR_MEM_SIZE 0x80000000
接著回到 stm32mp157=ev1.dts 當中修改設備樹當中的 memory,如下:
這一段的 reg 說明的是 <起點在哪裡 長度多長(大小)>
memory@c0000000 {
device_type = "memory";
reg = <0xC0000000 0x40000000>;
};
所以我們要將這部分修改為如下
memory@c0000000 {
device_type = "memory";
reg = <0xC0000000 0x80000000>;
};
這樣才可以正確的匹配到我們的開發板上的 DDR。其餘部分也可以依照相同方式去注意設備樹是否有需要修改的地方。
當我們修改完檔案後,我們可以將它存成 Patch,下一次去拉 src 時,yocto 就會自動地將Patch給打上。
作法如下
cd workspace/sources/tf-a-stm32mp/
git diff
這邊我新增了一個註解做為測試
git status
這個指令可以查看我們修改了那些檔案。
git add . && git commit -m "看你要打什麼說明,會變成patch檔名喔"
bitbake-layers create-layer ../layers/meta-custom-layer
可以到 layers 底下查看
接著我們就可以透過指令來做 patch拉
cd workspace/sources/tf-a-stm32mp/
devtool finish tf-a-stm32mp /home/ubuntu0000/stm32mp/layers/meta-custom-layer/
這個步驟會將我們的 patch 給做出來並放到後面的路徑,同時他會將我們所下載的 tf-a source code 給清掉。
bitbake-layers add-layer ../layers/meta-custom-layer/
bitbake-layers show-layers
bitbake core-image-minimal