0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RA8D1试用活动】RA8D1B-CPKCOR开发板移植linux

RA生态工作室 ? 2024-11-16 01:02 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者: xhackerustc@21ic

国庆前有一块RA生态工作室出品的RA8D1B-CPKCOR开发板到了,主控瑞萨RA8D1B MCU,基于Arm Cortex-M85,支持Helium 和 TrustZone,CPU频率高达480MHZ。似乎是世界第一款使用Cortex-M85的MCU?RA8D1集成2MB flash和1MB的SRAM,I/D-cache 32KB。集成一堆丰富外设主控,比如usb、eth、i2c、i3c、spi、sdhci、ospi、canfd、MIPI-DSI、CEU摄像头、2D图形、TFT显示控制等等,MCU功能已经非常强大。更有意思的是RA8D1B-CPKCOR板载了32MB SDRAM,16MB的QSPI flash,看到这些尤其是32MB的SDRAM笔者觉得这板子足够跑linux系统了,虽然Cortex-M85无MMU,但主线linux早已经支持NOMMU了。要说生态没有哪个RTOS能和linux比生态,在不要求硬实时的应用场景中利用linux系统的丰富生态能大大降低软件工作量。一个复杂MCU平台的软件工作量非常大,特别是集成M7、M85这样高性能的core(M7 coremark/MHZ超过A7)的MCU,外设通常也是比较丰富的,大多数系统还板载了SDRAM或PSRAM,如果再以裸机思维去做软件,软件复杂度大到不可想象。

那咱们就开始RA8D1B移植linux的旅程了:

wKgaomc6sn6AK5HnAAAUT40d1Rs491.png

初始化sdram,其实RA生态工作室其实做好了,直接把他们的board_sdram.c和board_sdram.h拷贝过来即可。这一步最好做下内存读写的压力测试,我没用他们的测试code,自己写了一份,为啥呢:linux下读写内存1字节、2字节、4字节都可能的,我想都测到,测试代码如下:

#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(); } }

这一步其实还有用FSP配置并生成项目工程,本人因习惯于Linux下开发,所以生成的是CMake工程。这一步网上测评很多铺天盖地,且FSP使用并非本次主目标,这里不再赘述。

wKgaomc6spuAGB8FAAAa8vJoVmU014.png

加载内核image、dtb等可以从sd卡加载也可以从flash上加载,但bootloader不是本次主目标,能否偷懒呢?不要忘记板载的jlink,完全可以用jlink把内核image和dtb加载到SDRAM指定位置,jlink加载命令语法如下:

loadfile FILE address noreset

比如

loadfile /tmp/Image.bin 0x68008000 noreset

noreset意思是只加载后不要reset目标板,jlink loadfile默认是reset的。

加载解决了,跳转内核入口呢?easy,使用jlink的wreg命令即可,语法如下:

wreg rN value

建议segger这里做下简单更新,方便用户,毕竟打双引号再空格再括号相当繁琐。

wKgZomc6sryAODAhAAATxu779-U999.png

32位arm对每款cpu都有一个所谓proc_info的结构体,成员包含cpu setup函数,cache操作函数,hwcaps变量等等,cortex-m85呢笔者做这个事情的时候主线linux中还没有这个结构体。经阅读cortex-m85 TRM可以知道就上述操作函数等来讲它和cortex-m55是兼容的,所以笔者打了个补丁如下:

--- 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系统必有至少一个clockevent提供心跳中断,一个clocksource提供计时。其中clockevent必须的,clocksource可以由内核的jiffies代替,详细笔者就不赘述了,因为前前后后讲清楚它们可以长篇大论写两三篇大文章,linux内核这块其实还蛮复杂的,但对clockevent和clocksource驱动要提供的接口来说变简单了,以后有机会再写吧。对应到MCU来说,其实就是timer嘛,RA8D1B里集成的timer多的是,各种口味的都有。对着RA8D1B的手册写clockevent/clocksource驱动难度不大,但是,笔者这次想换个**,咱能不能利用arm自由的资源呢?我们知道arm M类cpu都有一个systick且支持中断,所以理论上可以把它抽象成一个clockevent的。目前linux内核主线中把这个systick当clocksource用的,不支持clockevent,它的代码在drivers /clocksource /armv7m _ systick.c。咱给它改造改造整个容,经笔者整容之后的armv7m _ systick.c眉清目秀,盘亮条顺。

wKgaomc6sw6AGrUsAAAI5zHbN_c602.png

要看基本linux启动成功可用,最简单的还是一个tty console。console用uart做比较简单,这个RA8D1B里也有好几个uart,而且特性丰富功能强大,而且似乎内核中有一个同出一门众芯片的串口驱动drivers/tty/serial/sh-sci.c,但似乎寄存器不是太一致,所以接下来咱就对着手册改写串口驱动吗?NoNoNo,一般来说特性丰富功能强大就暗示着还是蛮复杂的,不信你去读一读sh-sci.c,咱能否粗糙猛方式搞定linux呢?咱又看上jlink了,它不是有个RTT (Real Time Terminal)么,既然号称Real Time Terminal,代替个串口做console那是小菜一碟阿。但是Segger的RTT代码不能直接用,因为SDRAM有32MB,这么大空间都搜一遍么?而且别忘记Cortex-M85是可以带有D-cache的,恰好RA8D1B里的这个M85就配置了D-Cache, linux肯定开启cache了,RTT代码注释和文档里对使能了cache这块其实有很多的说明。笔者这>里换了一个思路,不要用SDRAM而是SRAM阿或者DTCM一部分来做RTT控制块,DTCM是不经cache的。另外为了通用性,咱们这里还需要使用DT(Device Tree)技术而不是hardcoding来设置RTT控制块的地址,然后通过如下命令告诉jlink到哪里去找RTT控制块:

exec SetRTTAddr 0x20000000

wKgaomc6sy6AeZT8AAAD6KAqjTU791.png

最后根据MCU和板级具体情况做个简单的dts,主要就是告诉SDRAM起始地址阿大小阿什么的,还有上面说的rtt的设备节点。

至此,linux内核层的事情搞定了,咱来搞定linux用户层。

wKgZomc6sziAJC_NAAAZAjD3Z4I514.png

buildroot对NOMMU Linux支持得非常好,基本是拿来就用,buildroot使用方法网上也是很多的,前后>讲完也是很费时的,这里笔者也不多着笔墨了,因为linux userspace也不是主要目标。这个步骤的输>出是一个用busybox做的简单rootfs,可以在内核编译时builtin进去省去加载initrd/rootfs的过程。

wKgaomc6s0OAQR_9AAAODHmBc9w563.png

上述dts编译成一个dtb,重命名为dtb.bin,内核(带rootfs builtin)编译成一个Image,重命名为Image.bin。

wKgaomc6s02AXDjwAAAITggVwxg595.png

板子上电,烧录前面讲的bootloader,重启板子,运行jlink挂上去,运行如下命令:

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

第一个命令停止cpu,第二个命令是告诉jlink RTT控制块地址,后面是加载内核Image和跳转内核入口,至于为啥这么设置请参考arm linux内核启动协议,网上很多,笔者不再赘述了。

再起一个shell运行如下命令获得RA8D1B的linux shell

telnet 127.0.0.1 19021

最后运行NOMMU Linux的视频供参考:

wKgaomc6tDCAPdtQAAAPwOQ8768648.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    18013

    浏览量

    368469
  • Linux
    +关注

    关注

    87

    文章

    11521

    浏览量

    214052
  • 开发板
    +关注

    关注

    25

    文章

    5718

    浏览量

    105376
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RA4L1-SENSOR】+ RA4L1-SENSOR开发板之读取RA4L1 Sensor开发板芯片温度

    RA4L1-SENSOR开发板的温度值,断码屏显示 串口助手显示 RA4L1-SENSOR开发板上面是有个内部温度传感器的,可以直接测量到RA
    发表于 06-13 15:29

    瑞萨RA8系列教程 | RA8基于e2s实现RTC实时时钟功能

    本文结合e2 studio开发环境、RA8D1单片机给大家描述RTC这个模块的使用方法。
    的头像 发表于 05-13 17:07 ?603次阅读
    瑞萨<b class='flag-5'>RA8</b>系列教程 | <b class='flag-5'>RA8</b>基于e2s实现RTC实时时钟功能

    基于瑞萨电子RA8D1 MCU的USB和I2S数字音频应用解决方案

    今天给大家介绍一下上海觉鑫智能科技有限公司基于瑞萨电子RA8D1 MCU的USB&I2S数字音频应用解决方案。
    的头像 发表于 04-30 14:47 ?1929次阅读
    基于瑞萨电子<b class='flag-5'>RA8D1</b> MCU的USB和I2S数字音频应用解决方案

    瑞萨RA8系列教程 | 基于 Keil 开发 RA8单片机

    本文结合瑞萨Cortext-M85单片机RA8D1、Keil MDK,以及瑞萨自家的代码初始化工具(Smart Configurator)给大家描述一下,快速在Keil MDK上点亮Cortext-M85单片机一个LED。
    的头像 发表于 04-22 17:41 ?560次阅读
    瑞萨<b class='flag-5'>RA8</b>系列教程 | 基于 Keil <b class='flag-5'>开发</b> <b class='flag-5'>RA8</b>单片机

    瑞萨RA8D1单片机IO中断配置实现方法

    本文为结合瑞萨e2 studio工具,以及CPKCOR_RA8D1B评估,给大家讲述瑞萨RA8D1单片机IO中断配置实现的方法。
    的头像 发表于 04-09 15:05 ?1040次阅读
    瑞萨<b class='flag-5'>RA8D1</b>单片机IO中断配置实现方法

    有奖试用!!RA-Eco-RA4M2-100PIN-V1.0开发板试用活动报名

    RA-Eco-RA4M2-100PIN-V1.0开发板试用活动
    的头像 发表于 03-13 12:10 ?538次阅读
    有奖<b class='flag-5'>试用</b>!!<b class='flag-5'>RA-Eco-RA</b>4M2-100PIN-V1.0<b class='flag-5'>开发板</b><b class='flag-5'>试用活动</b>报名

    瑞萨电子RA8E1RA8E2 MCU新品解读

    Arm Cortex-M85 RA8系列于2024年11月推出RA8E1RA8E2两款新产品。这两款新产品已正式量产上市,将高算力的RA8系列扩展到入门级领域的应用,降低BOM成本,
    的头像 发表于 12-09 10:35 ?1178次阅读
    瑞萨电子<b class='flag-5'>RA8E1</b>和<b class='flag-5'>RA8</b>E2 MCU新品解读

    RA8D1加密引擎功能体验和实践

    本次实践完成了RA8D1芯片AES密钥封装和芯片上加解密功能验证
    的头像 发表于 11-23 01:01 ?936次阅读
    <b class='flag-5'>RA8D1</b>加密引擎功能体验和实践

    有奖试用!!RA-Eco-RA4E2-64PIN-V1.0开发板试用活动开始报名

    有奖试用!!RA-Eco-RA4E2-64PIN-V1.0开发板试用活动开始报名
    的头像 发表于 11-09 01:02 ?641次阅读
    有奖<b class='flag-5'>试用</b>!!<b class='flag-5'>RA-Eco-RA</b>4E2-64PIN-V1.0<b class='flag-5'>开发板</b><b class='flag-5'>试用活动</b>开始报名

    RA-Eco-RA2E1-48PIN-V1.0开发板试用】带你认识RA-Eco-RA2E1-48PIN-V1.0开发板

    今天收到论坛里试用RA-Eco-RA2E1-48PIN-V1.0开发板,开箱后第一感觉开发板线路设计的非常合理,各个元件在开发板上的布局很
    发表于 11-04 22:53

    【瑞萨RA8D1 CPK开发板RA8D1移植ThreadX操作系统

    CPKCOR-RA8D1B核心 是瑞萨电子为中国市场设计的模块化开发板, 使用瑞萨RA8D1MCU,支持MIPI-DSI显示输出接口。核心
    发表于 10-20 20:22

    RA-Eco-RA2E1-48PIN-V1.0开发板试用】先来点个灯

    收到瑞萨RA2E1开发板,十分小巧精致。 今天就来点个灯吧。 e2 studio(自带FSP)软件安装就不赘述了,详见: 【RA-Eco-RA0E1-32PIN-V1.0开发板
    发表于 10-18 22:50

    【瑞萨RA8D1 CPK开发板试用】开箱与点灯

    一、前言 瑞萨RA8D1 CPK开发板是业界首款基于Arm Cortex-M85内核的32位图形微控制器,板载资源丰富,性能优越。运行在480MHz的主频下可实现超过3000 CoreMark分数
    发表于 10-08 01:04

    RA-Eco-RA0E1-32PIN-V1.0开发板试用】点灯

    RA0E1开发板试用报告 试用单位 : 个人开发板 : RA0E1 一、背景 很荣幸获得由电子发
    发表于 09-24 11:54

    试用活动 | 100套!!瑞萨RA6E2/RA4E2开发板评测活动

    活动简介: 瑞萨RA6E2/RA4E2开发板评测活动是一个针对瑞萨电子推出的通用微控制器(MCU)RA
    的头像 发表于 09-10 11:18 ?1069次阅读
    <b class='flag-5'>试用活动</b> | 100套!!瑞萨<b class='flag-5'>RA</b>6E2/<b class='flag-5'>RA</b>4E2<b class='flag-5'>开发板</b>评测<b class='flag-5'>活动</b>