日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

移植U-Boot思路和实践 | 基于RK3399

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移植U-Boot思路和实践 | 基于RK3399 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 0. 背景介紹

我們手里這塊RK3399開發板出廠時帶的是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

在這個基礎之上為這塊開發板移植一個最新版本的U-Boot,也就是U-Boot 2022.01。

1. U-Boot加載方式

U-Boot實質是bootloader,它一肩挑兩頭,第一是初始化操作系統的運行環境,包括初始化CPU、內存、串口等,第二是加載操作系統鏡像文件,通常來說是操作系統內核鏡像,但對于U-Boot SPL而言,它還可以加載U-Boot鏡像文件。

我們暫且先不關心如何加載操作系統鏡像文件,這篇文章的目的是讓新版本的U-Boot在這塊板子上成功的運行起來。

既然U-Boot是bootloader,那么就不得不了解芯片上電后程序的加載流程。對于RK3399而言,關于它的啟動方式請看前文:

CPU上電后加載程序的流程 | 基于RK3399

RK3399提供了外部bootloader加載的路線圖,如下圖示:

啟動流程

按照路線圖,分兩部分介紹,分別是官方固件和TPL/SPL加載U-Boot。

1.1 官方固件加載

流程1是基于RK官方部件ddr.bin和miniloader.bin來實現的,這兩個文件可以從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.img

idbloader.img打包完成之后,由其中的rkxx_miniloader_xxx.bin加載u-boot.img文件。

另外,基于流程1的啟動方式,還需要再生成trust.img,由rkxx_miniloader_xxx.bin負責加載。

流程1這種啟動方式畢竟是基于官方固件的,不能對代碼進行修改,看不見摸不到,所以不建議采用這種方式生成idbloader.img。

1.2 TPL/SPL加載

在啟動流程2中,我們可以基于U-Boot編譯出TPL/SPL,其中TPL負責實現DDR初始化,TPL初始化結束之后會回跳到bootrom程序,bootrom程序繼續加載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技術的嵌入式設備當中,無法避免的需要解決從非安全側切換到安全側的問題,而為了完成這個切換,需要一個專用的進行非安全上下文和安全上下文切換的固件,這個固件一般我們稱為arm trust firmware,在ARM官方維護的github中我們能夠下載到其完整的代碼。

https://github.com/ARM-software/arm-trusted-firmware

當然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.elf

3.移植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

準備bl31.elf文件,如下:

git?clone?git@github.com:rockchip-linux/rkbin.git

進入到u-boot文件夾設置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文件。

rk@ubuntu:u-boot$?ls?configs/?|?grep?3399 evb-rk3399_defconfig ficus-rk3399_defconfig firefly-rk3399_defconfig khadas-edge-captain-rk3399_defconfig khadas-edge-rk3399_defconfig khadas-edge-v-rk3399_defconfig leez-rk3399_defconfig nanopc-t4-rk3399_defconfig nanopi-m4-2gb-rk3399_defconfig nanopi-m4b-rk3399_defconfig nanopi-m4-rk3399_defconfig nanopi-neo4-rk3399_defconfig nanopi-r4s-rk3399_defconfig orangepi-rk3399_defconfig pinebook-pro-rk3399_defconfig puma-rk3399_defconfig rock960-rk3399_defconfig rock-pi-4c-rk3399_defconfig rock-pi-4-rk3399_defconfig rock-pi-n10-rk3399pro_defconfig rockpro64-rk3399_defconfig roc-pc-mezzanine-rk3399_defconfig roc-pc-rk3399_defconfig rk@ubuntu:u-boot$

從log記錄來看,evb-rk3399_defconfig應該是rk官方提交的,因此,選擇這個xxx_defconfig文件作為默認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> ...

生成默認配置文件,如下:

make?evb-rk3399_defconfig

編譯U-Boot,交叉編譯工具鏈使用了開發板自帶的,它又不是全局環境變量,懶得改了,直接用。當然,大家可以使用自己的交叉編譯工具鏈。

#?交叉編譯工具鏈需要指定 make?CROSS_COMPILE=xxxx/aarch64-linux-gnu-

編譯結果:

...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$

至此,我們已經獲取到了所需的idbloader.img和u-boot.itb兩個文件。

- step4

燒錄
我手中這塊開發板基于emmc啟動,按照RK官方要求將idbloader.img燒錄到emmc的0x40扇區,u-boot.itb燒錄到0x4000扇區。

+--------+----------------+----------+-------------+---------+ |?Boot???|?Terminology?#1?|?Actual???|?Rockchip????|?Image???| |?stage??|????????????????|?program??|??Image??????|?Location| |?number?|????????????????|?name?????|???Name??????|?(sector)| +--------+----------------+----------+-------------+---------+ |?2??????|??Secondary?????|?U-Boot???|idbloader.img|?0x40????| |????????|??Program???????|?TPL/SPL??|?????????????|?????????| |????????|??Loader?(SPL)??|??????????|?????????????|?????????| |????????|????????????????|??????????|?????????????|?????????| |?3??????|??-?????????????|?U-Boot???|?u-boot.itb??|?0x4000??|? |????????|????????????????|??????????|?uboot.img???|?????????|? +--------+----------------+----------+-------------+---------+

燒錄方法有兩種,一種是基于RK的官方燒錄工具AndroidTool.exe,另外一種是在開發板上直接燒寫emmc。

官方AndroidTool.exe是基于recovery模式實現的,如果你的板子帶有recovery按鍵,可以使用這種方式。

開發板上直接燒寫emmc,可以通過網絡或者串口直接將待燒錄文件加載到板子中。

[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:/]#

燒寫,需要注意的是燒寫完執行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

重啟開發板,從U-Boot版本和編譯的時間戳可以確認,成功加載并執行了新的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? ......

最后要說的是,我敢這么胡亂搞開發板的固件,并不擔心它會成為一塊磚頭,因為,有Maskrom模式可以將它恢復出廠設置。

Maskrom模式

另外,移植的U-Boot是基于evb-rk3399_defconfig生成的配置文件,后面基于此進行其他修改。

總結

以上是生活随笔為你收集整理的移植U-Boot思路和实践 | 基于RK3399的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。