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 0x0
			    RDC_MDA  RDC_MDA_ENET1_TX DID1 0x0 0x0
			    RDC_MDA  RDC_MDA_ENET1_RX DID1 0x0 0x0
			    RDC_MDA  RDC_MDA_SDMA3b DID1 0x0 0x0
			    RDC_MDA  RDC_MDA_SDMA3_SPBA2 DID1 0x0 0x0
			    RDC_PDAP RDC_PDAP_ENET1 PDAP_D0D1_ACCESS 0x0 0x0
			    RDC_PDAP RDC_PDAP_SAI3  PDAP_D1_ACCESS 0x0 0x0
			    RDC_PDAP RDC_PDAP_UART4 PDAP_D1_ACCESS 0x0 0x0
			    RDC_PDAP RDC_PDAP_GPT1  PDAP_D1_ACCESS 0x0 0x0
			    RDC_PDAP RDC_PDAP_SDMA3 PDAP_D1_ACCESS 0x0 0x0
			    RDC_PDAP RDC_PDAP_I2C3  PDAP_D1_ACCESS 0x0 0x0
			    RDC_MEM_REGION 22 TCM_START TCM_END MEM_D1_ACCESS
			    RDC_MEM_REGION 39 M4_DDR_START M4_DDR_END MEM_D1_ACCESS
			    0x0      0x0            0x0  0x0 0x0
			  >;
		stop-config = <
			    RDC_MEM_REGION 22 TCM_START TCM_END MEM_D0D1_ACCESS
			    RDC_MEM_REGION 39 M4_DDR_START M4_DDR_END MEM_D0D1_ACCESS
			    0x0      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);
    #endif
    
        s_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);
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

同一个tomcat不同端口运行不同项目

第一步&#xff1a;修改 server.xml 文件 修改 tomcat 安装目录下 conf/server.xml 文件&#xff0c;需要几个端口就添加几个 Service 节点。 配置 2 个端口&#xff1a;9131 和 9133&#xff0c;于是增加两个 Service 节点。 每个 Service 节点的 name 属性值要设置不同的值…

2024最火爆的6款洗地机推荐,洗地机品质优秀品牌推荐

洗地机将吸尘、拖地、扫地三大功能合一&#xff0c;通过高效吸尘系统迅速吸走灰尘和杂物。内置清洁水箱和智能拖布设计&#xff0c;使其在拖地时能够根据地面材质和清洁需求&#xff0c;自动调节湿度和清洁力度&#xff0c;实现最佳清洁效果。无论是硬地板还是地毯&#xff0c;…

WHAT - 前端开发人员日常提效工具和应用程序

目录 Mac代码编辑器和IDE1. Visual Studio Code (VS Code)2. WebStorm3. VimVim 的优势常用命令&#xff1a;普通模式&#xff08;Normal Mode&#xff09;常用命令&#xff1a;插入模式&#xff08;Insert Mode&#xff09;常用命令&#xff1a;命令行模式&#xff08;Command…

接口自动化-预期值和实际值怎么写?

测试类当中 怎么做接口自动化&#xff0c;返回值校验&#xff0c;就是需要返回值的预期值和实际值进行对比 实际值如下 怎么拿到预期值$.msg?用正则表达式-提取值 建新的类-来编写用正则表达式拿到预期值 源码pattern 使用的compile的方法&#xff0c;传入的是字符串正则表…

[原创][Delphi多线程]TThreadedQueue的经典使用案例.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…

Spi Pwm Tim 对比分析

spi SPI时序图 (spi是主从机 所以主机需要从机数据 需要主极先喊从机 把从机喊答应了 才能开始读从机的数据&#xff09; cpol时钟极性 和cpha时钟相位分析 1.cpha为高&#xff0c;cpol为高&#xff0c;则偶数上升沿有效 2.cpha为高&#xff0c;cpol为低&#xff0c;则偶数…

安装Subversion和配置 svn服务端

Subversion是一个免费/开源的版本控制系统(VCS),也被称为SVN。它能够对文件和目录以及它们的修改进行跨时间的管理,允许用户恢复数据的旧版本或检查数据的修改历史。Subversion建立在二进制文件区别算法基础上,对文本和二进制文件都有一致的操作方式,并将它们压缩存放在版…

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

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

晶圆几何量测系统支持半导体制造工艺量测,保障晶圆制造工艺质量

晶圆面型参数厚度、TTV、BOW、Warp、表面粗糙度、膜厚、等是芯片制造工艺必须考虑的几何形貌参数。其中TTV、BOW、Warp三个参数反映了半导体晶圆的平面度和厚度均匀性&#xff0c;对于芯片制造过程中的多个关键工艺质量有直接影响。 TTV、BOW、WARP对晶圆制造工艺的影响 对…

每日两题 / 198. 打家劫舍 74. 搜索二维矩阵(LeetCode热题100)

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; dp[i]表示考虑前i 1号房屋&#xff0c;能获取的最大金额。对于没一间房屋都有偷与不偷两种选择 如果偷&#xff0c;需要从dp[i - 2]转移&#xff0c;因为不能偷窃相邻房屋&#xff0c;dp[i] dp[i - 2] nums[i] 如果…

双指针解题

验证回文数&#xff08;验证回文数-CSDN博客&#xff09;和判断在子序列&#xff08;判断子序列-CSDN博客&#xff09;已经在之前进行了计算&#xff0c;今天有三个新的双指针问题&#xff1a; 两数之和II—输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0…

国产信创CPU之飞腾CPU剖析

CPU&#xff1a;信创根基&#xff0c;国之重器 国产CPU已形成自主架构、x86、ARM三大阵营。自主阵营中&#xff0c;龙芯、申威分别基于MIPS和Alpha推出loong ISA和SW-64。ARM阵营以鲲鹏、飞腾为代表&#xff0c;利用ARM IP授权开发处理器。x86阵营由海光、兆芯等主导&#xff…

Linux命令 netstat -anp | grep 的用法

文章目录 1、第一种解释2、第二种解释3、第三种解释4、第四种解释5、第五种解释6、netstat --help 在Windows中&#xff0c;杀死端口占用的博客链接 1、第一种解释 在Unix和Linux系统中&#xff0c;netstat -anp 命令用于显示所有的网络连接&#xff08; -a 表示所有&#xff…

内核宕机自救

【问题】在测试内核级防篡改时&#xff0c;偶尔会遇到内核宕机的问题 【结论】进入紧急救援模式&#xff0c;将服务进程文件的start注释掉&#xff0c;即可 在Linux系统启动时&#xff0c;内核启动顺序选择界面&#xff0c;进入系统欢迎界面按上下左右键进入GRUB界面&#xff…

面试题:说一下 http 报文都有哪些东西?

面试题&#xff1a;说一下 http 报文都有哪些东西&#xff1f; HTTP 是传输超文本&#xff08;实际上除了 HTML&#xff0c;可以传输任何类型的文件&#xff0c;如视频、音频、文本等&#xff09;的协议&#xff0c;是一组用于浏览器-服务器之间数据传输的规则。 HTTP 位于 OS…

20240603每日通信--------springboot使用netty-socketio集成即时通信WebSocket

简单效果图 群聊&#xff0c;私聊&#xff0c;广播都可以支持。 基础概念&#xff1a; springbootnetty-socketioWebSocket POM文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/…

蓝桥杯物联网竞赛_STM32L071_19_输出方波信号(PWM)

国赛考了一个方波&#xff0c;第一次考这个&#xff0c;连个示波器都没有 CUBMX配置&#xff1a; 按上述配置刚好是32MHZ / 32 / 100 1KHZ 理论&#xff1a; 频率&#xff1a;就是一秒钟能产生多少个脉冲&#xff0c;如下图: 这算是一个脉冲&#xff0c;1KHZ说明一秒钟产生1…

MySQL -- 连接查询

MySQL使用连接查询&#xff08;JOIN&#xff09;是为了从多个相关表中获取数据。连接查询是一种强大且常用的操作&#xff0c;可以根据某些条件将两张或多张表中的数据组合在一起&#xff0c;返回一个联合结果集。 1.为什么使用连接查询 数据规范化&#xff1a; 数据库设计时通…

结账和反结账

结账与反结账功能在财务软件和会计系统中扮演着重要的角色&#xff0c;以下是关于这两个功能的详细解释&#xff1a; 一、结账功能 结账功能是计算和结转各个会计科目本期发生额和期末余额的过程&#xff0c;同时标志着一定时期内财务活动的结束和财务数据的固化。结账功能的…

Elo7下单购物教程:如何利用自养号测评提升产品曝光度?

Elo7 是巴西的一个独特电商平台&#xff0c;专注于手工艺品和定制商品。它被誉为“巴西的 Etsy”&#xff0c;为当地和国际手工艺者提供了一个销售其独特创作的市场。Elo7 成立于 2008 年&#xff0c;其主要目标是支持小型创业者和手工艺人&#xff0c;让他们能够将自己的作品推…