www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式IoT

關(guān)于d1哪吒開(kāi)發(fā)板的啟動(dòng)流程分析


  • 1.本文概述

  • 2.D1上電后啟動(dòng)的第一個(gè)程序

  • 3.啟動(dòng)SPL

  • 4.啟動(dòng)opensbi

  • 5.裸機(jī)程序的編寫(xiě)

  • 6.小結(jié)


1.本文概述

從RISCV生態(tài)的角度上來(lái)看,D1哪吒開(kāi)發(fā)板確實(shí)是一塊不錯(cuò)的可以研究很深的開(kāi)發(fā)板。本文主要從研究D1啟動(dòng)流程的角度出發(fā),探索一下D1的裸機(jī)開(kāi)發(fā)實(shí)踐。對(duì)于研究D1的底層裸機(jī)開(kāi)發(fā),首先需要知道可以玩那些東西,也可以對(duì)RISCV相關(guān)的軟件生態(tài)有比較透徹的理解,本文會(huì)從spl階段到opensbi階段以及后續(xù)階段做一個(gè)簡(jiǎn)單的分析。

2.D1上電后啟動(dòng)的第一個(gè)程序

D1上電后,首先啟動(dòng)一個(gè)(Boot ROM)BROM。根據(jù)芯片手冊(cè)的描述,該BROM的啟動(dòng)地址是0地址處開(kāi)始啟動(dòng)。

一共是48KB的內(nèi)存空間用于運(yùn)行BROM,那么這個(gè)BROM做了哪些事情?首先它根據(jù)efuse和GPIO選擇了啟動(dòng)的媒體類型。支持的啟動(dòng)方式有

  • SD card
  • eMMC
  • SPI NOR Flash
  • SPI NAND Flash

并且可以根據(jù)GPIO的選擇和Efuse的選擇決定啟動(dòng)的模式。同時(shí)也支持USB的啟動(dòng)方式,這就為fel啟動(dòng)方式做了很好鋪墊。

總的說(shuō)來(lái),BROM就是從其他的介質(zhì)中讀取SPL,然后放到SRAM中執(zhí)行,同時(shí)也通過(guò)FEL運(yùn)行環(huán)境。

3.啟動(dòng)SPL

當(dāng)BROM啟動(dòng)完成后,接下來(lái)要去存儲(chǔ)介質(zhì)中尋找SPL的程序,這部分可以通過(guò)對(duì)全志D1 SDK的源代碼進(jìn)行查看。

不難看出,在tina-d1-open的源代碼下有l(wèi)ichee的代碼。另外brandy-2.0下有spl、opensbi和u-boot的代碼。通過(guò)對(duì)spl代碼的研究,主要從流程上可以知道,spl的代碼運(yùn)行在sram中。

通過(guò)查看,可以看到SRAM為32KB,但是實(shí)際編譯出來(lái)的估計(jì)大小在32KB~64KB,遠(yuǎn)大于32KB,這樣懷疑的可能性是SRAM可能大于32KB或者利用了DSP0 IRAM的空間。在編譯的過(guò)程中,發(fā)現(xiàn)SPL的固件的頭部一段區(qū)域,也就是0x00020000地址開(kāi)始處的一段空間,是初始化的參數(shù),SPL可以根據(jù)這個(gè)參數(shù)選擇初始化的串口編號(hào),初始化的DDR參數(shù)等等。在這里面編譯的串口并非開(kāi)發(fā)板的參數(shù)的串口參數(shù),后面在制作固件的時(shí)候,會(huì)將頭部的信息替換。為此我做了一個(gè)專門(mén)研究D1 哪吒裸機(jī)的倉(cāng)庫(kù),來(lái)研究其實(shí)際的啟動(dòng)信息。

https://github.com/bigmagic123/d1-nezha-baremeta

首先下載平頭哥的交叉編譯工具鏈。

鏈接:https://pan.baidu.com/s/1Mpfv_6BlarLSVZcgs548HQ 

提取碼:mipy

然后通過(guò)設(shè)置

export PATH=/yourpath/:$PATH 

將gcc的路徑添加到環(huán)境變量,直接在spl目錄下編譯即可。

編譯后會(huì)在nboot的目錄下生成相關(guān)的固件。

在生成的固件中,每個(gè)固件分別表示從哪種介質(zhì)中啟動(dòng)下一階段。前面說(shuō)過(guò),spl的頭部存放了一些初始化的參數(shù)變量,所以我直接通過(guò)一個(gè)腳本make_download.sh將spl的頭部一些信息替換了。這樣下來(lái),就能夠正常的啟動(dòng)spl階段了,并且可以正常的初始化DDR。按下開(kāi)發(fā)板的FEL鍵并且上電。

下載可以利用tools/windows目錄下的xfel工具進(jìn)行下載。

xfel.exe write 0x20000 boot0_sdcard_sun20iw1p1.bin

xfel.exe exec 0x20000

可以正常的啟動(dòng)SPL。xfel的工具是xboot大佬旨在打造全志裸機(jī)的萬(wàn)能開(kāi)發(fā)工具,感覺(jué)用起來(lái)還是挺好。

https://github.com/xboot/xfel

當(dāng)前xfel在d1上支持了ddr初始化,下載到SRAM和DDR3等操作,并支持運(yùn)行程序。非常的強(qiáng)大,后面做裸機(jī)開(kāi)發(fā)會(huì)經(jīng)常用到,后續(xù)如果能夠支持USB燒錄SPI NAND Flash,那會(huì)更加的好用。那么在spl里做了哪些事情?首先SPL是運(yùn)行在SRAM中的程序,這段程序受到SRAM尺寸大小的影響,并不會(huì)做的很復(fù)雜。主要功能來(lái)說(shuō):

  • 1.通過(guò)引腳判斷是否啟動(dòng)JTAG
  • 2.初始化DDR
  • 3.使能MMU
  • 4.根據(jù)SD CARD、SPI NAND FLASH 、SPI NOR FLASH判斷初始化那種外設(shè)。
  • 5.根據(jù)opensbi/rtos/uboot,將其搬運(yùn)到DDR中執(zhí)行,然后程序運(yùn)行在DDR中。

4.啟動(dòng)opensbi

此時(shí)程序就運(yùn)行在DDR中了,對(duì)于開(kāi)發(fā)RISCV的人來(lái)說(shuō),opensbi并不陌生,一方面這個(gè)是后臺(tái)常駐程序,提供S-mode和M-mode的轉(zhuǎn)換層,另外也起到引導(dǎo)下一階段程序的目的。這個(gè)d1下個(gè)階段指的是uboot。然后opensbi就常駐在M-mode下了。作為獨(dú)立的程序,我也在裸機(jī)層面去編譯下載opensbi。

https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/opensbi

編譯的過(guò)程可以通過(guò)

要想在d1上運(yùn)行opensbi,首先需要根據(jù)下面的情況進(jìn)行編譯。

cd d1-nezha-baremeta/opensbi

然后導(dǎo)入環(huán)境變量

export CROSS_COMPILE=/home/bigmagic/work/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-  PLATFORM_RISCV_ISA=rv64gcxthead FW_JUMP_ADDR=0x40200000 FW_TEXT_START=0x40000000

最后進(jìn)行編譯

make PLATFORM=thead/c910

正常情況下,生成

AS        platform/thead/c910/standby-normal/standby.o
 CC        platform/thead/c910/standby-normal/loadelf.o
 CC        platform/thead/c910/sunxi_platform.o
 CC        platform/thead/c910/opensbi_head.o
 AS        platform/thead/c910/sunxi_cpuidle.o
 CC        platform/thead/c910/sunxi_idle.o
 AR        platform/thead/c910/lib/libplatsbi.a
 AS        platform/thead/c910/firmware/fw_dynamic.o
 ELF       platform/thead/c910/firmware/fw_dynamic.elf
 OBJCOPY   platform/thead/c910/firmware/fw_dynamic.bin
 AS        platform/thead/c910/firmware/fw_jump.o
 ELF       platform/thead/c910/firmware/fw_jump.elf
 OBJCOPY   platform/thead/c910/firmware/fw_jump.bin

可以把build/platform/thead/c910/firmware/fw_jump.bin文件下載。

可以通過(guò)下面的三條指令進(jìn)行下載

.\xfel.exe ddr ddr3
.\xfel.exe write 0x40000000 fw_jump.bin
.\xfel.exe exec 0x40000000

最后可以看到啟動(dòng)如下

其中對(duì)opensbi的下載流程,實(shí)際上這里直接是通過(guò)xfel初始化ddr,然后將程序加載到ddr中直接啟動(dòng)運(yùn)行。并沒(méi)有通過(guò)spl階段,如果想要自己編譯的程序通過(guò)spl --> opensbi。可以在Linux上通過(guò)dd命令將程序燒錄到sd卡中。

這里將boot0的固件燒錄到sd卡的8K處,系統(tǒng)可以正常的啟動(dòng)。

5.裸機(jī)程序的編寫(xiě)

在分析了上述SPL和opensbi的啟動(dòng)流程后,自行編譯一個(gè)簡(jiǎn)單的裸機(jī)程序就容易許多。從啟動(dòng)流程的角度上來(lái)說(shuō),只需要實(shí)現(xiàn)初始化時(shí)鐘、串口即可。這樣就能夠享受D1上裸機(jī)開(kāi)發(fā)的樂(lè)趣了。更多的外設(shè)擴(kuò)展需要根據(jù)芯片手冊(cè)去進(jìn)行編程。

https://github.com/bigmagic123/d1-nezha-baremeta/tree/main/src/1.startup

而燒錄的流程,可以利用xfel初始化ddr,然后燒錄到ddr中,這樣方便調(diào)試。目前裸機(jī)開(kāi)發(fā)代碼比較好的可以參考xboot的代碼。

https://github.com/xboot/xboot/tree/test-d1

xboot的底層也會(huì)用到基本的裸機(jī)編程部分的代碼實(shí)現(xiàn),也是非常值得研究和學(xué)習(xí)的。

6.小結(jié)

全志D1芯片的啟動(dòng)流程最底層的分析來(lái)看,和其他全志產(chǎn)品線的芯片的啟動(dòng)流程基本類似,主要需要理解的是fel模式下對(duì)SRAM,DDR等操作,這樣在做裸機(jī)開(kāi)發(fā)的時(shí)候,才能將程序下載進(jìn)去。有了這些理解,在做riscv的底層編程的時(shí)候,才能透徹的理解其啟動(dòng)的流程和原理。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉