91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【RA8D1試用活動(dòng)】RA8D1B-CPKCOR開(kāi)發(fā)板移植linux

RA生態(tài)工作室 ? 2024-11-16 01:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者: xhackerustc@21ic

國(guó)慶前有一塊RA生態(tài)工作室出品的RA8D1B-CPKCOR開(kāi)發(fā)板到了,主控瑞薩RA8D1B MCU,基于Arm Cortex-M85,支持Helium 和 TrustZone,CPU頻率高達(dá)480MHZ。似乎是世界第一款使用Cortex-M85的MCU?RA8D1集成2MB flash和1MB的SRAM,I/D-cache 32KB。集成一堆豐富外設(shè)主控,比如usb、eth、i2c、i3c、spi、sdhci、ospi、canfd、MIPI-DSI、CEU攝像頭、2D圖形、TFT顯示控制等等,MCU功能已經(jīng)非常強(qiáng)大。更有意思的是RA8D1B-CPKCOR板載了32MB SDRAM,16MB的QSPI flash,看到這些尤其是32MB的SDRAM筆者覺(jué)得這板子足夠跑linux系統(tǒng)了,雖然Cortex-M85無(wú)MMU,但主線linux早已經(jīng)支持NOMMU了。要說(shuō)生態(tài)沒(méi)有哪個(gè)RTOS能和linux比生態(tài),在不要求硬實(shí)時(shí)的應(yīng)用場(chǎng)景中利用linux系統(tǒng)的豐富生態(tài)能大大降低軟件工作量。一個(gè)復(fù)雜MCU平臺(tái)的軟件工作量非常大,特別是集成M7、M85這樣高性能的core(M7 coremark/MHZ超過(guò)A7)的MCU,外設(shè)通常也是比較豐富的,大多數(shù)系統(tǒng)還板載了SDRAM或PSRAM,如果再以裸機(jī)思維去做軟件,軟件復(fù)雜度大到不可想象。

那咱們就開(kāi)始RA8D1B移植linux的旅程了:

wKgaomc6sn6AK5HnAAAUT40d1Rs491.png

初始化sdram,其實(shí)RA生態(tài)工作室其實(shí)做好了,直接把他們的board_sdram.c和board_sdram.h拷貝過(guò)來(lái)即可。這一步最好做下內(nèi)存讀寫的壓力測(cè)試,我沒(méi)用他們的測(cè)試code,自己寫了一份,為啥呢:linux下讀寫內(nèi)存1字節(jié)、2字節(jié)、4字節(jié)都可能的,我想都測(cè)到,測(cè)試代碼如下:

#define SDRAM_BASE_ADDRESS (0x68000000U) static void sdram_test(void) { int i; uint32_t addr; uint32_t t1; uint8_t testbuf[64]; void *p = (void *)SDRAM_BASE_ADDRESS; APP_PRINT("Writing SDRAM...\n"); printf("Writing SDRAM...\n"); for (addr = 0; addr < 32 * 1024 * 1024; ++addr) { uint8_t data = addr & 0xff; *(uint8_t *)(p + addr) = data; } APP_PRINT("Reading SDRAM...\n"); printf("Reading SDRAM...\n"); for (addr = 0; addr < 32 * 1024 * 1024; ++addr) { uint8_t data, expected; expected = addr & 0xff; data = *(uint8_t *)(p + addr); if (data != expected) APP_PRINT("SDRAM 8bit read failed at %lx (%x != %x)\n", addr, data, expected); } APP_PRINT("SDRAM 8bit read pass.\n"); printf("SDRAM 8bit read pass.\n"); for (addr = 0; addr < 32 * 1024 * 1024; addr += 2) { uint16_t data, expected; expected = (((addr + 1) & 0xff) << 8) | (addr & 0xff); data = *(uint16_t *)(p + addr); if (data != expected) APP_PRINT("SDRAM 16bit read failed at %lx (%x != %x)\n", addr, data, expected); } APP_PRINT("SDRAM 16bit read pass.\n"); printf("SDRAM 16bit read pass.\n"); for (addr = 0; addr < 32 * 1024 * 1024; addr += 4) { uint32_t data, expected; expected = (((addr + 3) & 0xff) << 24) | (((addr + 2) & 0xff) << 16) | (((addr + 1) & 0xff) << 8) | (addr & 0xff); data = *(uint32_t *)(p + addr); if (data != expected) APP_PRINT("SDRAM 32bit read failed at %lx (%lx != %lx)\n", addr, data, expected); } APP_PRINT("SDRAM 32bit read pass.\n"); printf("SDRAM 32bit read pass.\n"); memset(testbuf, 0x5a, sizeof(testbuf)); DWT_init(); t1 = DWT_get_count(); for (i = 0; i < 10000; ++i) { memcpy(p, testbuf, 64); } t1 = DWT_get_count() - t1; t1 = DWT_count_to_us(t1); t1 /= 1000; APP_PRINT("SDRAM write speed: %ld B/s.\n", 64 * 10000 * 1000 / t1); printf("SDRAM write speed: %ld B/s.\n", 64 * 10000 * 1000 / t1); t1 = DWT_get_count(); for (i = 0; i < 10000; ++i) { memcpy(testbuf, p, 64); } t1 = DWT_get_count() - t1; t1 = DWT_count_to_us(t1); t1 /= 1000; APP_PRINT("SDRAM read speed: %ld B/s.\n", 64 * 10000 * 1000 / t1); printf("SDRAM read speed: %ld B/s.\n", 64 * 10000 * 1000 / t1); for (;;) { APP_PRINT("SDRAM test done\n"); printf("SDRAM test done\n"); __WFI(); } }

這一步其實(shí)還有用FSP配置并生成項(xiàng)目工程,本人因習(xí)慣于Linux下開(kāi)發(fā),所以生成的是CMake工程。這一步網(wǎng)上測(cè)評(píng)很多鋪天蓋地,且FSP使用并非本次主目標(biāo),這里不再贅述。

wKgaomc6spuAGB8FAAAa8vJoVmU014.png

加載內(nèi)核image、dtb等可以從sd卡加載也可以從flash上加載,但bootloader不是本次主目標(biāo),能否偷懶呢?不要忘記板載的jlink,完全可以用jlink把內(nèi)核image和dtb加載到SDRAM指定位置,jlink加載命令語(yǔ)法如下:

loadfile FILE address noreset

比如

loadfile /tmp/Image.bin 0x68008000 noreset

noreset意思是只加載后不要reset目標(biāo)板,jlink loadfile默認(rèn)是reset的。

加載解決了,跳轉(zhuǎn)內(nèi)核入口呢?easy,使用jlink的wreg命令即可,語(yǔ)法如下:

wreg rN value

建議segger這里做下簡(jiǎn)單更新,方便用戶,畢竟打雙引號(hào)再空格再括號(hào)相當(dāng)繁瑣。

wKgZomc6sryAODAhAAATxu779-U999.png

32位arm對(duì)每款cpu都有一個(gè)所謂proc_info的結(jié)構(gòu)體,成員包含cpu setup函數(shù),cache操作函數(shù),hwcaps變量等等,cortex-m85呢筆者做這個(gè)事情的時(shí)候主線linux中還沒(méi)有這個(gè)結(jié)構(gòu)體。經(jīng)閱讀cortex-m85 TRM可以知道就上述操作函數(shù)等來(lái)講它和cortex-m55是兼容的,所以筆者打了個(gè)補(bǔ)丁如下:

--- a/arch/arm/mm/proc-v7m.S +++ b/arch/arm/mm/proc-v7m.S @[url=home.php?mod=space&uid=72445]@[/url] -194,6 +194,16 @[url=home.php?mod=space&uid=72445]@[/url] ENDPROC(__v7m_setup) .long \cache_fns .endm + /* + * Match ARM Cortex-M85 processor. + */ + .type __v7m_cm85_proc_info, #object +__v7m_cm85_proc_info: + .long 0x410fd230 /* ARM Cortex-M85 0xD23 */ + .long 0xff0ffff0 /* Mask off revision, patch release */ + __v7m_proc __v7m_cm85_proc_info, __v7m_cm7_setup, hwcaps = HWCAP_EDSP, cache_fns = v7m_cache_fns, proc_fns = cm7_processor_functions + .size __v7m_cm85_proc_info, . - __v7m_cm85_proc_info + /* * Match ARM Cortex-M55 processor. */

wKgaoWc6sueAeyMrAAAN8WDWNK4424.png

+++ b/arch/arm/include/asm/v7m.h @[url=home.php?mod=space&uid=72445]@[/url] -51,6 +51,7 @@ */ #define EXC_RET_STACK_MASK 0x00000004 #define EXC_RET_THREADMODE_PROCESSSTACK (3 << 2) +#define EXC_RET_FTYPE (1 << 4) /* Cache related definitions */ diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S index ed7781c84341..fdae077d2654 100644 --- a/arch/arm/mm/proc-v7m.S +++ b/arch/arm/mm/proc-v7m.S @[url=home.php?mod=space&uid=72445]@[/url] -138,6 +138,7 @[url=home.php?mod=space&uid=72445]@[/url] __v7m_setup_cont: 1: cpsid i /* Calculate exc_ret */ orr r10, lr, #EXC_RET_THREADMODE_PROCESSSTACK + orr r10, #EXC_RET_FTYPE ldmia sp, {r0-r3, r12} str r5, [r12, #11 * 4] @ restore the original SVC vector entry mov lr, r6 @ restore LR

wKgZoWc6swCALo-ZAAAQeGtzjR4104.png

linux系統(tǒng)必有至少一個(gè)clockevent提供心跳中斷,一個(gè)clocksource提供計(jì)時(shí)。其中clockevent必須的,clocksource可以由內(nèi)核的jiffies代替,詳細(xì)筆者就不贅述了,因?yàn)榍扒昂蠛笾v清楚它們可以長(zhǎng)篇大論寫兩三篇大文章,linux內(nèi)核這塊其實(shí)還蠻復(fù)雜的,但對(duì)clockevent和clocksource驅(qū)動(dòng)要提供的接口來(lái)說(shuō)變簡(jiǎn)單了,以后有機(jī)會(huì)再寫吧。對(duì)應(yīng)到MCU來(lái)說(shuō),其實(shí)就是timer嘛,RA8D1B里集成的timer多的是,各種口味的都有。對(duì)著RA8D1B的手冊(cè)寫clockevent/clocksource驅(qū)動(dòng)難度不大,但是,筆者這次想換個(gè)**,咱能不能利用arm自由的資源呢?我們知道arm M類cpu都有一個(gè)systick且支持中斷,所以理論上可以把它抽象成一個(gè)clockevent的。目前l(fā)inux內(nèi)核主線中把這個(gè)systick當(dāng)clocksource用的,不支持clockevent,它的代碼在drivers /clocksource /armv7m _ systick.c。咱給它改造改造整個(gè)容,經(jīng)筆者整容之后的armv7m _ systick.c眉清目秀,盤亮條順。

wKgaomc6sw6AGrUsAAAI5zHbN_c602.png

要看基本linux啟動(dòng)成功可用,最簡(jiǎn)單的還是一個(gè)tty console。console用uart做比較簡(jiǎn)單,這個(gè)RA8D1B里也有好幾個(gè)uart,而且特性豐富功能強(qiáng)大,而且似乎內(nèi)核中有一個(gè)同出一門眾芯片的串口驅(qū)動(dòng)drivers/tty/serial/sh-sci.c,但似乎寄存器不是太一致,所以接下來(lái)咱就對(duì)著手冊(cè)改寫串口驅(qū)動(dòng)嗎?NoNoNo,一般來(lái)說(shuō)特性豐富功能強(qiáng)大就暗示著還是蠻復(fù)雜的,不信你去讀一讀sh-sci.c,咱能否粗糙猛方式搞定linux呢?咱又看上jlink了,它不是有個(gè)RTT (Real Time Terminal)么,既然號(hào)稱Real Time Terminal,代替?zhèn)€串口做console那是小菜一碟阿。但是Segger的RTT代碼不能直接用,因?yàn)镾DRAM有32MB,這么大空間都搜一遍么?而且別忘記Cortex-M85是可以帶有D-cache的,恰好RA8D1B里的這個(gè)M85就配置了D-Cache, linux肯定開(kāi)啟cache了,RTT代碼注釋和文檔里對(duì)使能了cache這塊其實(shí)有很多的說(shuō)明。筆者這>里換了一個(gè)思路,不要用SDRAM而是SRAM阿或者DTCM一部分來(lái)做RTT控制塊,DTCM是不經(jīng)cache的。另外為了通用性,咱們這里還需要使用DT(Device Tree)技術(shù)而不是hardcoding來(lái)設(shè)置RTT控制塊的地址,然后通過(guò)如下命令告訴jlink到哪里去找RTT控制塊:

exec SetRTTAddr 0x20000000

wKgaomc6sy6AeZT8AAAD6KAqjTU791.png

最后根據(jù)MCU和板級(jí)具體情況做個(gè)簡(jiǎn)單的dts,主要就是告訴SDRAM起始地址阿大小阿什么的,還有上面說(shuō)的rtt的設(shè)備節(jié)點(diǎn)。

至此,linux內(nèi)核層的事情搞定了,咱來(lái)搞定linux用戶層。

wKgZomc6sziAJC_NAAAZAjD3Z4I514.png

buildroot對(duì)NOMMU Linux支持得非常好,基本是拿來(lái)就用,buildroot使用方法網(wǎng)上也是很多的,前后>講完也是很費(fèi)時(shí)的,這里筆者也不多著筆墨了,因?yàn)閘inux userspace也不是主要目標(biāo)。這個(gè)步驟的輸>出是一個(gè)用busybox做的簡(jiǎn)單rootfs,可以在內(nèi)核編譯時(shí)builtin進(jìn)去省去加載initrd/rootfs的過(guò)程。

wKgaomc6s0OAQR_9AAAODHmBc9w563.png

上述dts編譯成一個(gè)dtb,重命名為dtb.bin,內(nèi)核(帶rootfs builtin)編譯成一個(gè)Image,重命名為Image.bin。

wKgaomc6s02AXDjwAAAITggVwxg595.png

板子上電,燒錄前面講的bootloader,重啟板子,運(yùn)行jlink掛上去,運(yùn)行如下命令:

halt exec SetRTTAddr 0x20000000 loadfile /tmp/Image.bin 0x68008000 noreset loadfile /tmp/dtb.bin 0x68004000 noreset wreg "R15 (PC)" 0x68008001 wreg r0 0 wreg r2 0x68004000 go

第一個(gè)命令停止cpu,第二個(gè)命令是告訴jlink RTT控制塊地址,后面是加載內(nèi)核Image和跳轉(zhuǎn)內(nèi)核入口,至于為啥這么設(shè)置請(qǐng)參考arm linux內(nèi)核啟動(dòng)協(xié)議,網(wǎng)上很多,筆者不再贅述了。

再起一個(gè)shell運(yùn)行如下命令獲得RA8D1B的linux shell

telnet 127.0.0.1 19021

最后運(yùn)行NOMMU Linux的視頻供參考:

wKgaomc6tDCAPdtQAAAPwOQ8768648.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18917

    瀏覽量

    397867
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    218997
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    26

    文章

    6288

    瀏覽量

    117999
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RA MCU眾測(cè)寶典 | 在瑞薩CPKCOR-RA8D1B核心上實(shí)現(xiàn)QSPI讀取外部Flash

    RA生態(tài)工作室關(guān)注我們“RAMCU眾測(cè)寶典”中I2C/SPI通信與顯示驅(qū)動(dòng)專題更新了。這次我們聚焦瑞薩【CPKCOR-RA8D1B核心開(kāi)發(fā)板,一步步實(shí)現(xiàn)QSPI讀取外部Flash。
    的頭像 發(fā)表于 02-06 18:02 ?5219次閱讀
    <b class='flag-5'>RA</b> MCU眾測(cè)寶典 | 在瑞薩<b class='flag-5'>CPKCOR-RA8D1B</b>核心<b class='flag-5'>板</b>上實(shí)現(xiàn)QSPI讀取外部Flash

    CPKCOR-RA8D1】基于CPKCOR-RA8D1的GNSS RTK系統(tǒng)設(shè)計(jì)

    CPKCOR-RA8D1基于瑞薩RA8D1高性能單片機(jī)。 核心優(yōu)勢(shì):基于Arm CortexM85內(nèi)核(最高240MHz主頻),支持單精度浮點(diǎn)運(yùn)算(FPU),適合RTK解算輔助處理;內(nèi)置豐富外設(shè)
    發(fā)表于 11-09 19:55

    CPKCOR-RA8D1】基于G.729A算法研究

    Renesas RA8D1 核心CPKCOR-RA8D1B; CPKEXP-EKRA8X1 擴(kuò)展板; 軟件 開(kāi)發(fā)環(huán)境搭建:包括 FSP
    發(fā)表于 10-31 00:50

    CPKCOR-RA8D1】基礎(chǔ)串口打印測(cè)試

    本文將演示如何為瑞薩CPKCOR-RA8D1開(kāi)發(fā)板配置串口功能,并實(shí)現(xiàn)最簡(jiǎn)單的“Hello World”數(shù)據(jù)打印。串口是嵌入式開(kāi)發(fā)中最常用、最重要的調(diào)試手段,此測(cè)試是后續(xù)所有開(kāi)發(fā)的基礎(chǔ)
    發(fā)表于 10-30 15:23

    CPKCOR-RA8D1開(kāi)發(fā)套件全攻略:從硬件解析到攝像頭顯示Demo實(shí)戰(zhàn)

    的核心與擴(kuò)展板分工明確:* ??核心 (CPKCOR-RA8D1B)??:承載RA8D1最小系統(tǒng)及關(guān)鍵存儲(chǔ)和外設(shè)。* ??擴(kuò)展板 (CPKEXP-EKRA
    發(fā)表于 10-30 15:13

    CPKCOR-RA8D1】指紋掃描器

    硬件選型與連接 2.1 所需硬件組件 CPKCOR-RA8D1核心 :搭載R7FA8D1BHECBD MCU,支持高達(dá)480MHz的主頻[](https://bbs.elecfans.com/m
    發(fā)表于 10-30 11:38

    CPKCOR-RA8D1】+ 基礎(chǔ)串口打印測(cè)試

    本文將演示如何為瑞薩CPKCOR-RA8D1開(kāi)發(fā)板配置串口功能,并實(shí)現(xiàn)最簡(jiǎn)單的“Hello World”數(shù)據(jù)打印。串口是嵌入式開(kāi)發(fā)中最常用、最重要的調(diào)試手段,此測(cè)試是后續(xù)所有開(kāi)發(fā)的基礎(chǔ)
    發(fā)表于 10-30 09:40

    CPKCOR-RA8D1開(kāi)發(fā)套件全攻略:從硬件解析到攝像頭顯示Demo實(shí)戰(zhàn)

    與擴(kuò)展板分工明確: ??核心 (CPKCOR-RA8D1B)??:承載RA8D1最小系統(tǒng)及關(guān)鍵存儲(chǔ)和外設(shè)。 ??擴(kuò)展板 (CPKEXP-EKRA8X1)??:提供豐富的外設(shè)接口,方便
    發(fā)表于 10-30 09:34

    CPKCOR-RA8D1】+ 3.RA8D1 測(cè)試MCU跑分性能 coremark

    首先,來(lái)個(gè)美女鎮(zhèn)樓吧,最近在健身中?。?! 很榮幸收到了瑞薩電子發(fā)放的CPKCOR-RA8D1B開(kāi)發(fā)板, RA8D1是瑞薩的Arm? Cortex?-M85 core旗艦版M85處理器,是專門用來(lái)跑
    發(fā)表于 10-12 17:49

    CPKCOR-RA8D11、VSCODE+CMAKE開(kāi)發(fā)環(huán)境搭建

    /cpk_examples.git 其中提供了2個(gè)pack: 【核心cpkcor_ra8d1b\\\\docs\\\\Renesas.RA_board_ra8d1_cpkcor.5.1.0.pack 【擴(kuò)展
    發(fā)表于 10-09 16:17

    CPKCOR-RA8D1RA8D1開(kāi)箱測(cè)試報(bào)告

    。 1.RA8D1核心 CPKCOR-RA8D1B上使用224BGA封裝的RA8D1 MCU(U1
    發(fā)表于 10-02 17:25

    CPKCOR-RA8D1】+ 1.RA8D1開(kāi)箱點(diǎn)燈

    很榮幸收到了瑞薩電子發(fā)放的CPKCOR-RA8D1B開(kāi)發(fā)板,之前瑞薩的直播間講過(guò)這款板子,但是沒(méi)中,還好RA生態(tài)工作室的工作人員給與了我試用名額,很快就收到板子了,今天來(lái)進(jìn)行開(kāi)箱點(diǎn)燈!
    發(fā)表于 09-24 18:55

    【有獎(jiǎng)評(píng)測(cè) 】最強(qiáng)Cortex-M85單片機(jī)!RA8D1套件(顯示屏+攝像頭)免費(fèi)評(píng)測(cè)

    瑞薩RA8D1套件測(cè)評(píng),帶顯示屏,帶攝像頭,支持MIPI-DSI顯示輸出接口。上除了實(shí)現(xiàn)RA8D1最小系統(tǒng)外,還搭載了實(shí)用的外設(shè)功能
    的頭像 發(fā)表于 09-02 08:04 ?996次閱讀
    【有獎(jiǎng)評(píng)測(cè) 】最強(qiáng)Cortex-M85單片機(jī)!<b class='flag-5'>RA8D1</b>套件(顯示屏+攝像頭)免費(fèi)評(píng)測(cè)

    瑞薩RA8D1單片機(jī)IO中斷配置實(shí)現(xiàn)方法

    本文為結(jié)合瑞薩e2 studio工具,以及CPKCOR_RA8D1B評(píng)估,給大家講述瑞薩RA8D1單片機(jī)IO中斷配置實(shí)現(xiàn)的方法。
    的頭像 發(fā)表于 04-09 15:05 ?1831次閱讀
    瑞薩<b class='flag-5'>RA8D1</b>單片機(jī)IO中斷配置實(shí)現(xiàn)方法

    有獎(jiǎng)試用??!RA-Eco-RA4M2-100PIN-V1.0開(kāi)發(fā)板試用活動(dòng)報(bào)名

    RA-Eco-RA4M2-100PIN-V1.0開(kāi)發(fā)板試用活動(dòng)
    的頭像 發(fā)表于 03-13 12:10 ?1449次閱讀
    有獎(jiǎng)<b class='flag-5'>試用</b>??!<b class='flag-5'>RA-Eco-RA</b>4M2-100PIN-V1.0<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>試用活動(dòng)</b>報(bào)名