i.MX8MP平台开发分享(RDC资源分配控制器篇)

1.spec

RDC 配置信息被发送到结构端口、内存垫片、信号控制器和外设,以根据域分配控制访问。
结构使用与每个端口相关的域标识符,将此信息与总线事务一起包含在内。当从属加密垫圈遇到总线事务时,它会将事务域 ID 与 RDC 提供的允许域列表进行比较。如果事务域 ID 在列表中,则允许访问。

RDC 允许将外设和存储器分配到一个或多个域,而每个总线主站或内核则被置于多个域中的一个。主控器在主域分配(MDA)寄存器中分配一个域。外设在 PDAP 寄存器中获得每个域的 R/W 访问权限。内存区域由开始寄存器和结束寄存器中的地址空间(即 MRSA 和 MREA)绑定。每个内存区域在内存区域控制(MRC)寄存器中分配一个或多个允许域和 R/W 权限。内存区域必须在权限激活前启用。否则,权限将不受限制。

RDC 本身应该是隔离的,以确保只有值得信赖的资源管理人员才能配置 RDC 寄存器。例如,这一过程可以在安全启动过程中初始化,也可以在安全世界的运行过程中初始化。如果操作系统不支持运行时可信执行,则可在安全启动过程中锁定 RDC 配置,以防止在操作系统运行后进一步修改。

根据编入 RDC 的资源域分配,CCM 支持多核感知。有关核心资源域与各自 CCM 资源之间的关系,请参阅 CCM 章节。如果在更新内核资源域分配时未遵循正确的顺序,可能会导致时钟被意外门控。

image-20240603195253044

Domain ID:RDC 通过使用称为 “Domain ID”(DID)的标识符来隔离域资源。内核及其资源(包括内存、总线主控和外设)都与单个 DID 相关联。当软件或 DMA 尝试访问外设或内存时,相应的总线事务包括 DID 以及其他总线控制信息,如读取、写入和特权模式。

下面这张表是MDA信息表,控制master节点的分配。

image-20240603195539864

下面这张表是PDAP信息表,控制外设寄存器访问权限和原子访问功能。

image-20240519144835010

支持域隔离的存储器数量因设备而异。特定内存的内存区域数量和这些区域的大小因内存垫圈而异。每个内存区域都有一组寄存器,用于根据起始地址和终止地址定义区域的边界;一个控制寄存器,用于设置域访问权限和启用区域;一个状态寄存器,用于确定是否拒绝访问某个区域。

对于该设备,请参考下表确定支持域的存储器、每个存储器的区域数、区域分辨率、存储器区域寄存器组的标识号,以及访问存储器区域寄存器组的 RDC 寄存器地址。

image-20240519144940604

2.软件设置

下面是Uboot中关于RDC配置,此配置会存储到ocram指定位置,由ATF读取并写入RDC控制器,将对应模块的控制权移动到M7。配置中包含RDC_MDA(mater domian assign)RDC_PDAP(peripheral domian access permission)MRC(Memory Region Control)

mcu_rdc {compatible = "imx8m,mcu_rdc";start-config = <RDC_MDA  RDC_MDA_SDMA3p DID1 0x0 0x0RDC_MDA  RDC_MDA_ENET1_TX DID1 0x0 0x0RDC_MDA  RDC_MDA_ENET1_RX DID1 0x0 0x0RDC_MDA  RDC_MDA_SDMA3b DID1 0x0 0x0RDC_MDA  RDC_MDA_SDMA3_SPBA2 DID1 0x0 0x0RDC_PDAP RDC_PDAP_ENET1 PDAP_D0D1_ACCESS 0x0 0x0RDC_PDAP RDC_PDAP_SAI3  PDAP_D1_ACCESS 0x0 0x0RDC_PDAP RDC_PDAP_UART4 PDAP_D1_ACCESS 0x0 0x0RDC_PDAP RDC_PDAP_GPT1  PDAP_D1_ACCESS 0x0 0x0RDC_PDAP RDC_PDAP_SDMA3 PDAP_D1_ACCESS 0x0 0x0RDC_PDAP RDC_PDAP_I2C3  PDAP_D1_ACCESS 0x0 0x0RDC_MEM_REGION 22 TCM_START TCM_END MEM_D1_ACCESSRDC_MEM_REGION 39 M4_DDR_START M4_DDR_END MEM_D1_ACCESS0x0      0x0            0x0  0x0 0x0>;stop-config = <RDC_MEM_REGION 22 TCM_START TCM_END MEM_D0D1_ACCESSRDC_MEM_REGION 39 M4_DDR_START M4_DDR_END MEM_D0D1_ACCESS0x0      0x0            0x0  0x0 0x0>;};

RDC_MDA示例,下面配置的含义为,分配ENET1_RX这个master到M核。

RDC_MDA  RDC_MDA_ENET1_RX DID1 0x0 0x0

RDC_PDAP示例,下面配置含义是设置ENET1的寄存器读写权限为,M7和A53均可读写。

#define PDAP_D0D1_ACCESS 0x0000000F /* D0R|D0W|D1W|D1R */ 
RDC_PDAP RDC_PDAP_ENET1 PDAP_D0D1_ACCESS 0x0 0x0

RDC_MEM_REGION示例,M7只能访问TCM:0x7E0000-0x81FFFF和DDR:0x80000000-0x81000000地址范围。22和39是Memory Region Register Set Number,具体参考Table 3-4. Memory Region Mapping

RDC_MEM_REGION 22 TCM_START TCM_END MEM_D1_ACCESS
RDC_MEM_REGION 39 M4_DDR_START M4_DDR_END MEM_D1_ACCESS

3.SDK里的设置和A核的设置有什么区别

区别:board.c中的RDC初始化只是启用域1中的时钟门控功能。

门控分类:

typedef enum _clock_gate_value
{kCLOCK_ClockNotNeeded     = 0x0U,    /*!< Clock always disabled.*/kCLOCK_ClockNeededRun     = 0x1111U, /*!< Clock enabled when CPU is running.*/kCLOCK_ClockNeededRunWait = 0x2222U, /*!< Clock enabled when CPU is running or in WAIT mode.*/kCLOCK_ClockNeededAll     = 0x3333U, /*!< Clock always enabled.*/
} clock_gate_value_t;

主函数 main

  1. 初始化内存和板级设置:

    BOARD_InitMemory();
    BOARD_RdcInit();//M7 内核运行于域 1,此时应在 CCM 中启用域 1 中以下 IP/BUS/PLL 的时钟栅极。这样可以确保 M 内核使用的外设时钟不受运行在域 0 的 A 内核的影响。BOARD_InitBootPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();
    

    这些函数初始化板上的内存、RDC 设置、引脚、时钟和调试控制台。

  2. 初始化 GPIO:

    gpio_pin_config_t pinConfig = {kGPIO_DigitalOutput,0,kGPIO_IntRisingEdge,
    };
    GPIO_PinInit(GPIO1, 0, &pinConfig);
    

    配置 GPIO 引脚为数字输出模式,并初始化该引脚。

  3. 设置特定的寄存器值:

    *(volatile uint32_t *)0x30340028 |= (0x0C);
    

    该行代码设置寄存器 0x30340028 的特定位IOMUXC_GPR10[2:3],以确保内存违规触发硬错误。

  4. 初始化 RDC 和 SEMA42模块的时钟:

    RDC_Init(APP_RDC);
    RDC_SEMA42_Init(APP_RDC_SEMA42);
    
  5. 分配当前主域 ID:

    RDC_GetDefaultMasterDomainAssignment(&assignment);
    assignment.domainId = APP_CUR_MASTER_DID;
    RDC_SetMasterDomainAssignment(APP_RDC, APP_CUR_MASTER, &assignment);
    
  6. 调用 RDC 演示函数:

    APP_RDC_Periph();
    APP_RDC_PeriphWithSema42();
    APP_RDC_Mem();
    

    依次调用三个函数,分别演示 RDC 在不同场景下的使用:

    • APP_RDC_Periph: 演示外设访问控制。
    • APP_RDC_PeriphWithSema42: 演示外设访问控制和 SEMA42 的结合使用。
    • APP_RDC_Mem: 演示内存区域访问控制。

RDC 演示函数

  1. APP_RDC_Periph:

    • 配置外设访问权限,使其可被所有域访问。
    • 访问外设并检查是否发生故障。
    • 配置外设访问权限,使其不可被当前域访问。
    • 再次访问外设并检查是否发生故障。
    static void APP_RDC_Periph(void)
    {PRINTF("RDC Peripheral access control\r\n");s_demoState = kRDC_DEMO_Periph;/** Item 1: Peripheral accessible.*/RDC_GetDefaultPeriphAccessConfig(&periphConfig);periphConfig.periph = APP_RDC_PERIPH;/* Set peripheral to accessible by all domains. */RDC_SetPeriphAccessConfig(APP_RDC, &periphConfig);s_faultFlag = false;APP_TouchPeriph();/* Peripheral is accessible, there should not be hardfault. */DEMO_CHECK(false == s_faultFlag);/** Item 2: Peripheral inaccessible.*//* Make peripheral not accessible. */periphConfig.policy &= ~(RDC_ACCESS_POLICY(APP_CUR_MASTER_DID, kRDC_ReadWrite));RDC_SetPeriphAccessConfig(APP_RDC, &periphConfig);s_faultFlag = false;APP_TouchPeriph();/* Peripheral is not accessible, there should be hardfault. */DEMO_CHECK(true == s_faultFlag);
    }
    
  2. APP_RDC_PeriphWithSema42:

    • 配置外设访问权限,并启用 SEMA42。
    • 确保当前核心未持有 SEMA42 门。
    • 尝试访问外设,预期会发生故障。
    • 恢复外设访问默认策略。
    static void APP_RDC_PeriphWithSema42(void)
    {PRINTF("RDC Peripheral access control with SEMA42\r\n");/* Demo the SEMA42 used together with RDC. */s_demoState = kRDC_DEMO_PeriphSema42;RDC_GetDefaultPeriphAccessConfig(&periphConfig);periphConfig.periph     = APP_RDC_PERIPH;periphConfig.enableSema = true;RDC_SetPeriphAccessConfig(APP_RDC, &periphConfig);/* Make sure current core does not hold the SEMA42 gate. */RDC_SEMA42_Unlock(APP_RDC_SEMA42, APP_RDC_SEMA42_GATE);DEMO_CHECK(APP_CUR_MASTER_DID != RDC_SEMA42_GetLockDomainID(APP_RDC_SEMA42, APP_RDC_SEMA42_GATE));s_faultFlag = false;APP_TouchPeriph();/* Peripheral is not accessible because SEMA42 gate not locked, there should be hardfault. */DEMO_CHECK(true == s_faultFlag);/* Demo finished, make the peripheral to default policy. */RDC_GetDefaultPeriphAccessConfig(&periphConfig);/* Set peripheral to accessible by all domains. */RDC_SetPeriphAccessConfig(APP_RDC, &periphConfig);RDC_SEMA42_Unlock(APP_RDC_SEMA42, APP_RDC_SEMA42_GATE);
    }
    
  3. APP_RDC_Mem:

    • 配置内存区域访问权限,使其不可被当前域访问。
    • 尝试访问内存,预期会发生故障。
    • 检查内存访问故障状态,恢复内存区域访问权限。
    static void APP_RDC_Mem(void)
    {/** In memory protection, please notice the cache's effect.* For example, if a memory region has been loaded to cache* before it is set not accessible, then CPU only access the* cache but not the memory, application could not detect* access violation.*/PRINTF("RDC memory region access control\r\n");s_demoState = kRDC_DEMO_Mem;RDC_GetDefaultMemAccessConfig(&memConfig);memConfig.mem         = APP_RDC_MEM;memConfig.baseAddress = APP_RDC_MEM_BASE_ADDR;memConfig.endAddress  = APP_RDC_MEM_END_ADDR;/* Make memory not accessible. */memConfig.policy &= ~(RDC_ACCESS_POLICY(APP_CUR_MASTER_DID, kRDC_ReadWrite));RDC_SetMemAccessConfig(APP_RDC, &memConfig);#if APP_USING_CACHE/** Invalidate the cache, so new read will read from memory directly,* to make sure trigger read error.*/DCACHE_InvalidateByRange(APP_RDC_MEM_BASE_ADDR, APP_RDC_MEM_END_ADDR - APP_RDC_MEM_BASE_ADDR);
    #endifs_faultFlag = false;APP_TouchMem();#if APP_USING_CACHE/** Flush the cache, so the modified data is written to memory,* to make sure trigger write error.*/DCACHE_CleanInvalidateByRange(APP_RDC_MEM_BASE_ADDR, APP_RDC_MEM_END_ADDR - APP_RDC_MEM_BASE_ADDR);__DSB();
    #endif/* Memory is not accessible, there should be hardfault. */DEMO_CHECK(true == s_faultFlag);DEMO_CHECK(0 == memDemoError);
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/21950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

串口通讯、RS485、232、SPI、I2C

串行通信与并行通信的比较 1.同步和异步 同步串口通信&#xff08;Synchronous Serial Communication&#xff09; 异步串口通信&#xff08;Asynchronous Serial Communication&#xff09; 比较 2.全双工&#xff0c;半双工&#xff0c;单工 全双工&#xff08;Full Du…

Midjourney绘画参数设置详解

在数字艺术和设计领域&#xff0c;Midjourney是一款强大的绘画工具&#xff0c;它允许艺术家和设计师以数字方式创作出精美的图像。为了充分发挥Midjourney的潜力&#xff0c;正确设置其绘画参数至关重要。本文将深入探讨Midjourney的绘画参数设置&#xff0c;帮助用户更好地掌…

第十五届蓝桥杯物联网试题(国赛)

好&#xff0c;很好&#xff0c;国赛直接来个阅读理解&#xff0c;我猛做4个小时40分钟&#xff0c;cpu都干冒烟了&#xff0c;也算是勉强做完吧&#xff0c;做的很仓促&#xff0c;没多检查就交了&#xff0c;方波不会&#xff0c;A板有个指示灯没做&#xff0c;其他应该都还凑…

使用EMQX搭建MQTT服务

简介&#xff1a;EMQX 是一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息&#xff0c;同时保证毫秒…

内存动态管理

内存动态管理 1 .为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在…

SQL Developer 小贴士:备份和恢复连接信息

问题与概念 有时候SQL Developer需要重装&#xff0c;能备份和恢复连接信息就比较重要。 SQL Developer提供连接的导出和导入功能。 导出连接 第一步&#xff1a;选择连接。 第2步&#xff1a;指定输出文件&#xff0c;例如sqldconns.json 第3步&#xff1a;因为连接中可…

netty LengthFieldBasedFrameDecoder 根据动态长度分包粘包

如下数据格式 在方法&#xff1a; // Integer.MAX_VALUE, // maxFrameLength: 最大允许的帧长度// 4, // lengthFieldOffset: 长度字段在帧中的偏移量&#xff0c;这里是在帧头之后// 4, // lengthFieldLength: 长度字段的长度&#xff0c;4字节表示32位整数// 0, // …

CentOS7配置国内清华源并安装docker-ce以及配置docker加速

说明 由于国内访问国外的网站包括docker网站&#xff0c;由于种种的原因经常打不开&#xff0c;或无法访问&#xff0c;所以替换成国内的软件源和国内镜像就是非常必要的了&#xff0c;这里整理了我安装配置的基本的步骤。 国内的软件源有很多&#xff0c;这里选择清华源作为…

2024下半年Meme币趋势分析

随着加密货币市场的不断演变&#xff0c;Meme币在过去几年中引起了广泛关注。虽然这些数字资产最初因其搞笑和讽刺的性质而受到欢迎&#xff0c;但它们在市场上的表现和投资潜力也逐渐被重视。2024年下半年&#xff0c;Meme币市场将迎来新的趋势和挑战。本篇文章将探讨Meme币的…

Leecode---技巧---颜色分类、下一个排列、寻找重复数

思路&#xff1a; 遍历一遍记录0,1,2的个数&#xff0c;然后再遍历一次&#xff0c;按照0,1,2的个数修改nums即可。 class Solution { public:void sortColors(vector<int>& nums){int n0 0, n1 0, n2 0;for(int x: nums){if(x0) n0;else if(x1) n1;else n2;}for…

大容量异步电机直接转矩(DTC)控制matlab仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; DTC简介 直接转矩控制的基本思想就是利用逆变器所产生的空间电压矢量来控制定子磁链的旋转速度&#xff0c;通过控制定子磁链的走停来改变定子磁链的平均旋转速度的大小&#xff0c;从而改变磁通角的大小进而…

若依前后端分离项目(一)环境搭建

一、代码下载 RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 其中ruoyi-ui为前端项目 二、数据库 1、MySQL 创建数据库ry-vue并导入数据…

IGraph使用实例——贝尔曼-福特算法(求解单源最短路径)

1 概述 本文中求解最短路径使用的方法是igraph中基于贝尔曼-福特算法&#xff08;Bellman-Ford算法&#xff09;。Bellman-Ford算法是一种用于在加权图中找到从单个源点到所有其他顶点的最短路径的算法。这个算法可以处理包含负权重边的图&#xff0c;但不能处理有负权重循环的…

Java集合基础知识点系统性总结篇

目录 集合一、图解集合的继承体系&#xff1f;&#xff08;[图片来源](https://www.cnblogs.com/mrhgw/p/9728065.html)&#xff09;点击查看大图二、List,Set,Map三者的区别&#xff1f;三、List接口的实现3.1、Arraylist 、 LinkedList、Vector3.2、Arraylist 、 LinkedList、…

护网不仅要有好技术、更要有个好身体

护网医疗急救包 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 2024年的护网已经很接近了&#x…

5月更新!优维EasyOps®平台7大新功能上线~

5月&#xff0c;优维EasyOps全平台产品能力又升级啦&#xff01;&#x1f44f; 快来看看都有新增的功能与优化吧&#xff01;&#x1f447; 重点升级 架构可观测 1.系统监控态势感知 过去&#xff0c;用户在使用监控平台的过程中&#xff0c;存在如下问题&#xff1a; 告警…

Samtec技术前沿 | 全新224G互连产品系列现场演示

【摘要/前言】 数据中心、人工智能、机器学习和量子计算等领域的行业进步推动了新兴系统需求的增长。Samtec 224 Gbps PAM4 互连系统经过精心设计&#xff0c;能够满足这些高性能要求&#xff0c;您将在视频中看到这一点。 【Demo演示】 Samtec 系统架构师Ralph Page讲述了可…

成人本科毕业论文怎么写?分享自己的经验

撰写成人本科毕业论文是一个系统而深入的过程&#xff0c;以下是我个人的经验分享&#xff0c;希望能帮助你更好地完成这一任务&#xff1a; 1. 明确论文选题 兴趣与专长&#xff1a;选择自己感兴趣且有一定专长的领域&#xff0c;这样更容易深入研究。可行性&#xff1a;确保…

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…

java17 新特性(实用)

前言&#x1f440;~ 在更新下一章数据库相关知识前&#xff0c;先分享一下java17的一些新特性&#xff0c;有些新特性狠实用&#xff01;&#xff01;&#xff01; 如果各位对文章的内容感兴趣的话&#xff0c;请点点小赞&#xff0c;关注一手不迷路&#xff0c;如果内容有什么…