<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

講講RK3568開發板上的多核加載流程

jf_NsPBt3VS ? 來源:風火輪技術團隊 ? 2024-03-06 18:17 ? 次閱讀

YY3568主板基于 Rockchip RK3568 芯片平臺,四核 64位 Cortex-A55 核,主頻最高達 2GHz,集成雙核心架構GPU以及高效能NPU,芯片性能優異。開發板功能接口豐富,多媒體性能強悍、可在物聯網、工業控制、智慧交通、輕量級人工智能等領域發揮獨特優勢。

板載有 2路DSI、1路HDMI 和 1路edp顯示接口。支持雙屏異顯輸出和4K分辨率。強大的顯示性能,并且適配了自研的7寸mipi屏和edp屏。在多屏廣告機、電子站牌、自助服務機、工業HMI等領域可發揮強大優勢以及更低的成本。

板載 2 路千兆 以太網,可通過雙網口訪問和傳輸內外網的數據。擁有WIFI/BT,PCIE 3.0接口及 SIM 座,可接 4G 通信模塊,提高網絡傳輸效率。滿足NVR、工業網關等多網口產品需求。

板載 5路 串口,能夠大大降低通信成本。2 路IIC,可接多個IIC設備。1路CAN,能夠滿足汽車電子領域需求。

板載PCIE3.0和SATA接口,支持固態硬盤M.2,SATA硬盤,可擴展大容量硬盤。

YY3568多核啟動方案

瑞芯微官方提供了4種多核軟件方案。但是啟動流程的大致方案是一致的。其方案為:

方案 說明
3kernel + 1hal 0~2核心:Linux(SMP),3核心:裸機
3kernel + 1RT-Thread 0~2核心:Linux(SMP),3核心:RT-Thread(RTOS)
1kernel + 3hal 0核心:Linux,1~3核心:裸機(每一個核心跑一個裸機)
2kernel + 3RT-Thread 0核心:Linux,1~3核心:RT-Thread(每一個核心跑一個RTOS)

YY3568多核啟動分析

我們在風火輪科技的YY3568開發板上驗證的方案:3kernel(SMP) + 1RT-Thread。

啟動配置

多核啟動配置文件路徑:device/rockchip/rk3568/rk3568_amp_linux.its。

rk3568_amp_linux.its配置文件格式,其以設備樹的格式存在。所以操作其內容的方法可以通過操作設備樹一樣。

多核啟動主要分為兩個核心節點:

①conf節點描述:描述需要啟動那些子核心(節點:loadables),linux內核啟動參數(節點:linux)。

②images節點描述:描述需要啟動子核心的參數,如:架構,指令集,分區首地址,核啟動延遲等。

/{
description="FITsourcefileforrockchipAMP";
#address-cells=<1>;

images{
amp3{
description="bare-mental-core3";
data=/incbin/("cpu3.bin");//打包前的固件位置,一般不需要
type="firmware";
compression="none";
arch="arm";//固件的指令架構,當前只支持arm
cpu=<0x300>;//mpidr
thumb=<0>;//0:armorthumb2;1:thumb
hyp=<0>;//0:el1/svc;1:el2/hyp
load=<0x02800000>;//內存分區起始地址
udelay=<10000>;//啟動下一個核心的延遲時間
hash{
algo="sha256";
};
};
};

configurations{
default="conf";
conf{
description="RockchipAMPimages";
rollback-index=<0x0>;
loadables="amp3";

signature{
algo="sha256,rsa2048";
padding="pss";
key-name-hint="dev";
sign-images="loadables";
};

/*-runlinuxoncpu0
*-itisbroughtupbyamp(thatrunonU-Boot)
*-itisbootentrydependsonU-Boot
*/
linux{
description="linux-os";
arch="arm64";
cpu=<0x000>;
thumb=<0>;
hyp=<0>;
udelay=<0>;
};
};
};
};

內存分區

描述了每個核心的內存起始地址以及內存分區大小。

我們采用的方案:3kernel(SMP) + 1RT-Thread,所以RT-Thread的內存位置為:CPU3_MEM_BASE=0x02800000。

# Linux + HAL/RTT形式的內存資源分區示例:
CPU0_MEM_BASE=0x03000000
CPU1_MEM_BASE=0x01800000
CPU2_MEM_BASE=0x02000000
CPU3_MEM_BASE=0x02800000
CPU0_MEM_SIZE=0x00800000
CPU1_MEM_SIZE=0x00800000
CPU2_MEM_SIZE=0x00800000
CPU3_MEM_SIZE=0x00800000

amp固件打包

RK3568的amp固件,其包含的內容:啟動配置信息(rk3568_amp_linux.its) + 從核的代碼。

它是通過mkimage將兩者打包一起的,工具路徑:device/rockchip/common/mkimage。

打包命令:mkimage -f amp.its -E -p 0xe00 amp.img,其中:

0xe00:它是its在固件的大小,如果its文件大小不足對應大小,則補0。

從核的代碼追加在其后面。

2a092f62-dba1-11ee-a297-92fbcf53809c.png

源碼分析

內核啟動流程--準備工作

RK3568的多核啟動是由uboot來管理的,所以我們主要剖析uboot的源碼。

多核啟動流程的代碼路徑:uboot/drivers/cpu/rockchip_amp.c。

多核啟動的函數入口:int amp_cpus_on(void)。

啟動核心的程序,需要提前準備4個動作:

獲取設備的啟動設備,我們YY3568目前采用的是EMMC,所以這里描述的就是EMMC設備;然后從啟動設備獲取AMP分區。

申請存放頭信息的空間,從AMP分區中獲取頭信息(即多核啟動配置信息:rk3568_amp_linux.its);檢測its的合法性,并獲取其大小。

申請固件的內存,從AMP分區獲取從核心的內容。

通過頭部信息,解析可加載項。然后調用brought_up_all_amp()啟動所有核心。

intamp_cpus_on(void)
{
....省略

dev_desc=rockchip_get_bootdev();
....省略

if(part_get_info_by_name(dev_desc,AMP_PART,&part)

內核啟動流程--加載項獲取

核心啟動分為兩部分:Linux內核啟動部分 + 非Linux內核(RT-Thread)啟動部分。

Linux內核啟動部分:從rk3568_amp_linux.its配置中獲取Linux節點。然后調用brought_up_amp()啟動內核。

2a141558-dba1-11ee-a297-92fbcf53809c.jpg

非Linux內核(RT-Thread)啟動部分:從rk3568_amp_linux.its配置中獲取loadables節點,遍歷節點成員,獲取對應的加載項的配置信息,然后調用調用brought_up_amp()啟動內核。

2a23ef3c-dba1-11ee-a297-92fbcf53809c.jpg

staticintbrought_up_all_amp(void*fit,constchar*fit_uname_cfg)
{
....省略

g_bootcpu.boot_on=1;

linux_noffset=fdt_subnode_offset(fit,conf_noffset,"linux");//①
if(linux_noffset>0){
ret=brought_up_amp(fit,linux_noffset,&g_bootcpu,1);
if(ret)
returnret;
}

for(loadables_index=0;//②
uname=fdt_stringlist_get(fit,conf_noffset,
FIT_LOADABLE_PROP,loadables_index,NULL),uname;
loadables_index++){
cpu_noffset=fit_image_get_node(fit,uname);
if(cpu_noffset

內核啟動流程--核心配置參數獲取

我們獲取了加載項節點之后,從節點中獲取其加載參數,獲取方式跟設備樹樹獲取一致。

通過smc_cpu_on()啟動核心

staticintbrought_up_amp(void*fit,intnoffset,
boot_cpu_t*bootcpu,intis_linux)
{

....省略

desc=fdt_getprop(fit,noffset,"description",NULL);
cpu=fit_get_u32_default(fit,noffset,"cpu",-ENODATA);
hyp=fit_get_u32_default(fit,noffset,"hyp",0);
thumb=fit_get_u32_default(fit,noffset,"thumb",0);
entry=load=fit_get_u32_default(fit,noffset,"load",-ENODATA);
us=fit_get_u32_default(fit,noffset,"udelay",0);
boot_on=fit_get_u32_default(fit,noffset,"boot-on",1);
fit_image_get_arch(fit,noffset,&arch);
fit_image_get_type(fit,noffset,&type);
fit_image_get_data_size(fit,noffset,&data_size);
memset(&args,0,sizeof(args));

....省略

/*bootnow*/
ret=smc_cpu_on(cpu,pe_state,entry,&args,is_linux);
if(ret)
returnret;
exit:
if(us)
udelay(us);

return0;
}

內核啟動流程--內核啟動

檢測pe狀態,如果目標pe狀態是默認的arch狀態,則直接給cpu通電

如果非Linux系統則跳轉到finish下,直接啟動啟動內核。

如果是Linux系統需要設置啟動參數,然后再啟動內核。

staticintsmc_cpu_on(u32cpu,u32pe_state,u32entry,
boot_args_t*args,boolis_linux)
{
....省略

/*iftargetpestateisdefaultarchstate,powerupcpudirectly*/
if(is_default_pe_state(pe_state))
gotofinish;

ret=sip_smc_amp_cfg(AMP_PE_STATE,cpu,pe_state,0);
if(ret){
AMP_E("smcpe-state,ret=%d
",ret);
returnret;
}

/*onlylinuxneedsbootargs*/
if(!is_linux)
gotofinish;

ret=sip_smc_amp_cfg(AMP_BOOT_ARG01,cpu,args->arg0,args->arg1);
if(ret){
AMP_E("smcbootarg01,ret=%d
",ret);
returnret;
}

ret=sip_smc_amp_cfg(AMP_BOOT_ARG23,cpu,args->arg2,args->arg3);
if(ret){
AMP_E("smcbootarg23,ret=%d
",ret);
returnret;
}

finish:
ret=psci_cpu_on(cpu,entry);
if(ret){
printf("cpuupfailed,ret=%d
",ret);
returnret;
}
printf("OK
");

return0;
}

多核啟動效果

多核方案:3kernel(SMP) + 1RT-Thread,

我們需要準備兩個串口,一個為Linux端的終端信息打?。?a href="http://www.qd573.com/tags/uart/" target="_blank">UART2),一個為RT-Thread端的終端信息打?。║ART4)

YY3568已經將所有的串口引出,所以我們調試很方便,接線圖如下:

2a2f738e-dba1-11ee-a297-92fbcf53809c.png

運行效果:

2a3bd1ba-dba1-11ee-a297-92fbcf53809c.jpg





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 以太網
    +關注

    關注

    40

    文章

    5135

    瀏覽量

    166757
  • 固態硬盤
    +關注

    關注

    11

    文章

    1380

    瀏覽量

    56588
  • PCIe接口
    +關注

    關注

    0

    文章

    115

    瀏覽量

    9554
  • Rockchip
    +關注

    關注

    0

    文章

    68

    瀏覽量

    18356
  • RK3568
    +關注

    關注

    4

    文章

    445

    瀏覽量

    4349

原文標題:YY3568多核異構(Linux+RT-Thread)--啟動流程

文章出處:【微信號:風火輪技術團隊,微信公眾號:風火輪技術團隊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    請教一下RK3568開發板的啟動流程是怎樣的呢

    請教一下RK3568開發板的啟動流程是怎樣的呢?
    發表于 03-02 06:50

    RK3568開發板如何支持NFS服務呢

    硬件平臺:OK3568-C開發板 操作系統: Linux4.19.206本文硬件平臺采用飛凌嵌入式RK3568開發板,主要講解RK3568
    發表于 11-25 16:04

    toybrick_RK3568X開發板:跑通 android 開發流程

    前段時間買了一塊官方的開發板,瑞芯微的 RK3568 芯片的 toybrick TB-RK3568X 開發板,配置是 4G 內存,32G 存儲,想用這個
    發表于 11-16 21:30

    RK3568開發板數據手冊

    RK3568 開發板主控采用的是瑞芯微 A55 64 位四核處理器 RK3568,其主頻高達 2.0 GHz。集成了 Mali G52 2EE 圖形處理器,支持 4K 解碼和 1080P 編碼
    發表于 08-30 11:56 ?23次下載

    【ROC-RK3568-PC開發板試用體驗】Firefly ROC-RK3568-PC開發板初探

    本文來源電子發燒友社區,作者:ouxiaolong, 帖子地址: https://bbs.elecfans.com/jishu_2303714_1_1.html ROC-RK3568-PC開發板
    的頭像 發表于 10-18 16:11 ?3188次閱讀
    【ROC-<b class='flag-5'>RK3568</b>-PC<b class='flag-5'>開發板</b>試用體驗】Firefly ROC-<b class='flag-5'>RK3568</b>-PC<b class='flag-5'>開發板</b>初探

    瑞芯微rk3568開發板原理圖

    瑞芯微rk3568 開發板 原理圖工程文件AD格式
    發表于 04-24 14:12 ?75次下載

    RK3568開發板借助 U 盤或 TF 卡拷貝程序到開發板

    RK3568開發板借助 U 盤或 TF 卡拷貝程序到開發板
    的頭像 發表于 05-20 18:01 ?808次閱讀
    <b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>借助 U 盤或 TF 卡拷貝程序到<b class='flag-5'>開發板</b>上

    瑞芯為RK3568開發板搭建NFS服務器

    瑞芯為RK3568開發板搭建NFS服務器
    的頭像 發表于 05-24 14:10 ?889次閱讀
    瑞芯為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>搭建NFS服務器

    迅為RK3568開發板實現的NVR/XVR方案

    迅為RK3568開發板實現的NVR/XVR方案
    的頭像 發表于 06-14 18:00 ?922次閱讀
    迅為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>實現的NVR/XVR方案

    【教程上新】基于迅為iTOP-RK3568開發板的OpenCV開發手冊

    【教程上新】基于迅為iTOP-RK3568開發板的OpenCV開發手冊
    的頭像 發表于 02-08 15:22 ?659次閱讀
    【教程上新】基于迅為iTOP-<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>的OpenCV<b class='flag-5'>開發</b>手冊

    瑞芯微RK3568主板開發板PET_RK3568_P01簡述

    瑞芯微RK3568主板開發板PET_RK3568_P01簡述
    的頭像 發表于 08-08 11:41 ?2001次閱讀
    瑞芯微<b class='flag-5'>RK3568</b>主板<b class='flag-5'>開發板</b>PET_<b class='flag-5'>RK3568</b>_P01簡述

    迅為RK3568開發板GPIO之外接模塊

    迅為RK3568開發板GPIO之外接模塊
    的頭像 發表于 08-24 17:41 ?758次閱讀
    迅為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>GPIO之外接模塊

    迅為RK3568開發板可實現多屏異顯控方案

    迅為RK3568開發板可實現多屏異顯控方案
    的頭像 發表于 07-15 17:30 ?1451次閱讀
    迅為<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>可實現多屏異顯控方案

    RK3568開發板規格書

    RK3568開發板規格書
    發表于 03-23 15:28 ?69次下載

    RK3568開發板支持AMP雙系統

    RK3568開發板支持AMP雙系統
    的頭像 發表于 06-04 15:33 ?105次閱讀
    <b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>支持AMP雙系統
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>