移植U-Boot思路和实践 | 基于RK3399
? 0. 背景介紹
我們手里這塊RK3399開發(fā)板出廠時帶的是2017.09版本的U-Boot。
U-Boot?2017.09?(Sep?26?2021?-?08:53:15?+0000)Model:?Forlinx?OK3399?Evaluation?Board PreSerial:?2 DRAM:??2?GiB Sysmem:?init Relocation?Offset?is:?7dbe9000 Using?default?environment在這個基礎(chǔ)之上為這塊開發(fā)板移植一個最新版本的U-Boot,也就是U-Boot 2022.01。
1. U-Boot加載方式
U-Boot實質(zhì)是bootloader,它一肩挑兩頭,第一是初始化操作系統(tǒng)的運(yùn)行環(huán)境,包括初始化CPU、內(nèi)存、串口等,第二是加載操作系統(tǒng)鏡像文件,通常來說是操作系統(tǒng)內(nèi)核鏡像,但對于U-Boot SPL而言,它還可以加載U-Boot鏡像文件。
我們暫且先不關(guān)心如何加載操作系統(tǒng)鏡像文件,這篇文章的目的是讓新版本的U-Boot在這塊板子上成功的運(yùn)行起來。
既然U-Boot是bootloader,那么就不得不了解芯片上電后程序的加載流程。對于RK3399而言,關(guān)于它的啟動方式請看前文:
CPU上電后加載程序的流程 | 基于RK3399
RK3399提供了外部bootloader加載的路線圖,如下圖示:
啟動流程按照路線圖,分兩部分介紹,分別是官方固件和TPL/SPL加載U-Boot。
1.1 官方固件加載
流程1是基于RK官方部件ddr.bin和miniloader.bin來實現(xiàn)的,這兩個文件可以從RK github上獲取。
git@github.com:rockchip-linux/rkbin.git這個倉庫除了包含以上兩個文件之外,還包括流程2中提到的bl31.elf文件。
RK官方固件使用mkimage將官方的ddr.bin和rkxx.bin打包成Bootrom程序可識別的、帶有ID Block header的文件idbloader.img。
tools/mkimage?-n?rkxxxx?-T?rksd?-d?rkxx_ddr_vx.xx.bin?idbloader.img cat?rkxx_miniloader_vx.xx.bin?>>?idbloader.imgidbloader.img打包完成之后,由其中的rkxx_miniloader_xxx.bin加載u-boot.img文件。
另外,基于流程1的啟動方式,還需要再生成trust.img,由rkxx_miniloader_xxx.bin負(fù)責(zé)加載。
流程1這種啟動方式畢竟是基于官方固件的,不能對代碼進(jìn)行修改,看不見摸不到,所以不建議采用這種方式生成idbloader.img。
1.2 TPL/SPL加載
在啟動流程2中,我們可以基于U-Boot編譯出TPL/SPL,其中TPL負(fù)責(zé)實現(xiàn)DDR初始化,TPL初始化結(jié)束之后會回跳到bootrom程序,bootrom程序繼續(xù)加載SPL,由SPL加載u-boot.itb文件。
通過以下命令將TPL/SPL打包成idbloader.img。
tools/mkimage?-n?rkxxxx?-T?rksd?-d?tpl/u-boot-tpl.bin?idbloader.img cat?spl/u-boot-spl.bin?>>?idbloader.img建議使用流程2的方式加載U-Boot.img,因為,可以基于U-Boot源碼編譯出TPL/SPL,然后自主修改各種配置。
2. U-Boot包
從RK3399啟動流程圖中我們能看到,U-Boot包里面除了u-boot.dtb和u-boot-nodtb.bin這兩個U-Boot源碼編譯出來的文件之外,還包含了bl31.elf、bl32.bin、tee.bin等ARM trust固件。其中bl31.elf是必須要有的,bl32.bin、tee.bin是可選的,可以沒有。
在使用TrustZone技術(shù)的嵌入式設(shè)備當(dāng)中,無法避免的需要解決從非安全側(cè)切換到安全側(cè)的問題,而為了完成這個切換,需要一個專用的進(jìn)行非安全上下文和安全上下文切換的固件,這個固件一般我們稱為arm trust firmware,在ARM官方維護(hù)的github中我們能夠下載到其完整的代碼。
https://github.com/ARM-software/arm-trusted-firmware當(dāng)然RK官方也提供了bl31.elf文件,這樣省去了我們編譯bl31.elf的時間和精力??梢栽赗ockchip官方github下載
https://github.com/rockchip-linux/rkbin/tree/master/bin/rk33基于以上的分析,整理出所需要的文件:
idbloader.img?<--------U-Boot?TPL/SPL u-boot.itb?<-----------U-Boot?和?bl31.elf3.移植U-Boot
- step1
獲取U-Boot源碼,如下:
git?clone?https://gitlab.denx.de/u-boot/u-boot.git獲取到的U-Boot源碼版本是2022.01。
#?SPDX-License-Identifier:?GPL-2.0+VERSION?=?2022 PATCHLEVEL?=?01 SUBLEVEL?= EXTRAVERSION?= NAME?=- step2
準(zhǔn)備bl31.elf文件,如下:
git?clone?git@github.com:rockchip-linux/rkbin.git進(jìn)入到u-boot文件夾設(shè)置bl31.elf文件的路徑。
rk@ubuntu:~/porting/u-boot$?ls?.. rk3399_bl31_v1.35.elf??u-boot rk@ubuntu:~/porting/u-boot$export?BL31=../rk3399_bl31_v1.35.elf- step3
編譯
手頭沒有這塊板子的xxx_defconfig文件,但是從U-Boot源碼中查看到很多其他家板子的xxx_defconfig文件。
從log記錄來看,evb-rk3399_defconfig應(yīng)該是rk官方提交的,因此,選擇這個xxx_defconfig文件作為默認(rèn)config。
rk@ubuntu:~/porting/u-boot$?git?log?configs/evb-rk3399_defconfig ... commit?4473a1c4d648a0567c46333b81533d1030345e12 Author:?Yifeng?Zhao?<yifeng.zhao@rock-chips.com> Date:???Tue?Jun?29?16:24:43?2021?+0800rockchip:?config:?evb-rk3399:?add?hs400?and?SDMA?supportThis?enable?hs400?and?SDMA?support?for?emmc?on?evb-rk3399.Signed-off-by:?Yifeng?Zhao?<yifeng.zhao@rock-chips.com>Reviewed-by:?Kever?Yang?<kever.yang@rock-chips.com> ... commit?5c5435093a6c0a6995351b64c6b8b08fe7d6bf59 Author:?Kever?Yang?<kever.yang@rock-chips.com> Date:???Tue?Aug?11?14:47:01?2020?+0800rockchip:?config:?evb-rk3399:?Add?rockchip?dwmmc?supportThis?enable?support?for?SD?card?on?evb-rk3399.Signed-off-by:?Kever?Yang?<kever.yang@rock-chips.com> ...生成默認(rèn)配置文件,如下:
make?evb-rk3399_defconfig編譯U-Boot,交叉編譯工具鏈?zhǔn)褂昧碎_發(fā)板自帶的,它又不是全局環(huán)境變量,懶得改了,直接用。當(dāng)然,大家可以使用自己的交叉編譯工具鏈。
#?交叉編譯工具鏈需要指定 make?CROSS_COMPILE=xxxx/aarch64-linux-gnu-編譯結(jié)果:
...AR??????tpl/fs/built-in.oLD??????tpl/u-boot-tplOBJCOPY?tpl/u-boot-tpl-nodtb.binCAT?????tpl/u-boot-tpl-dtb.binCOPY????tpl/u-boot-tpl.binSYM?????tpl/u-boot-tpl.symMKIMAGE?u-boot-dtb.img ./"arch/arm/mach-rockchip/make_fit_atf.py"?\ arch/arm/dts/rk3399-evb.dtb?>?u-boot.itsMKIMAGE?u-boot.itbMKIMAGE?tpl/u-boot-tpl-rockchip.binCAT?????idbloader.imgCAT?????u-boot-rockchip.bin rk@ubuntu:~/porting/u-boot$至此,我們已經(jīng)獲取到了所需的idbloader.img和u-boot.itb兩個文件。
- step4
燒錄
我手中這塊開發(fā)板基于emmc啟動,按照RK官方要求將idbloader.img燒錄到emmc的0x40扇區(qū),u-boot.itb燒錄到0x4000扇區(qū)。
燒錄方法有兩種,一種是基于RK的官方燒錄工具AndroidTool.exe,另外一種是在開發(fā)板上直接燒寫emmc。
官方AndroidTool.exe是基于recovery模式實現(xiàn)的,如果你的板子帶有recovery按鍵,可以使用這種方式。
開發(fā)板上直接燒寫emmc,可以通過網(wǎng)絡(luò)或者串口直接將待燒錄文件加載到板子中。
[root@rk3399:/]#?lrz? lrz?waiting?to?receive. Starting?zmodem?transfer.??Press?Ctrl+C?to?cancel. Transferring?idbloader.img...100%?????138?KB?????138?KB/sec????00:00:01???????0?Errors?? Transferring?u-boot.itb...100%?????751?KB?????150?KB/sec????00:00:05???????0?Errors?? [root@rk3399:/]#燒寫,需要注意的是燒寫完執(zhí)行sync操作,否則,可能會燒寫失敗。
[root@rk3399:/]#?dd?if=idbloader.img?of=/dev/mmcblk2?seek=64 277+1?records?in 277+1?records?out 142034?bytes?(142?kB,?139?KiB)?copied,?0.00497?s,?28.6?MB/s [root@rk3399:/]#? [root@rk3399:/]#?dd?if=u-boot.itb?of=/dev/mmcblk2?seek=16384 1503+1?records?in 1503+1?records?out 769952?bytes?(770?kB,?752?KiB)?copied,?0.0608755?s,?12.6?MB/s [root@rk3399:/]#?sync- step5
重啟開發(fā)板,從U-Boot版本和編譯的時間戳可以確認(rèn),成功加載并執(zhí)行了新的U-Boot 2022.01:
U-Boot?2022.01-00450-g25711b07ca?(Jan?14?2022?-?09:37:38?+0800)SoC:?Rockchip?rk3399 Reset?cause:?RST Model:?Rockchip?RK3399?Evaluation?Board DRAM:??2?GiB PMIC:??RK808? Core:??245?devices,?24?uclasses,?devicetree:?separate MMC:???mmc@fe320000:?1,?mmc@fe330000:?0 Loading?Environment?from?MMC...?OK In:????serial Out:???serial Err:???serial Model:?Rockchip?RK3399?Evaluation?Board Net:???eth0:?ethernet@fe300000 Hit?any?key?to?stop?autoboot:??0? ......最后要說的是,我敢這么胡亂搞開發(fā)板的固件,并不擔(dān)心它會成為一塊磚頭,因為,有Maskrom模式可以將它恢復(fù)出廠設(shè)置。
Maskrom模式另外,移植的U-Boot是基于evb-rk3399_defconfig生成的配置文件,后面基于此進(jìn)行其他修改。
總結(jié)
以上是生活随笔為你收集整理的移植U-Boot思路和实践 | 基于RK3399的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你应该知道的,十二大CNN算法
- 下一篇: Java实现的餐厅点餐系统源码Java点