如何在STM32MP157A-DK1非安全上下文启用并读取STGEN
STM32MP157A-DK1双核时间同步:启用STGEN并实现A7/M4读写计数器
背景
基于Yocto构建core-image-minimal镜像(非OpenST发行版)的STM32MP157A-DK1开发板,需构建Cortex-A7与Cortex-M4的时间同步系统,计划通过读取STGEN系统计数器的软件时间戳实现双核时间一致,核心需求是让A7和M4都能正常读取STGEN计数器值。
当前问题
M4端读取STGENR(非安全上下文只读寄存器)时始终返回0,调试代码持续触发错误上报。
M4读取STGEN的代码
#include "stgen_read.h" #include "openamp.h" #define STGENR_BASE_ADDR 0x5A005000UL #define STGENR_CNTCVL_OFFSET 0x000 #define STGENR_CNTCVU_OFFSET 0x004 #define STGENR_CNTCVL_REG (*(volatile uint32_t *) (STGENR_BASE_ADDR + STGENR_CNTCVL_OFFSET)) #define STGENR_CNTCVU_REG (*(volatile uint32_t *) (STGENR_BASE_ADDR + STGENR_CNTCVU_OFFSET)) // Debug purpose extern struct rpmsg_endpoint ept; uint64_t stgen_get_counter() { uint32_t low, high, high_comp; do { high = STGENR_CNTCVU_REG; low = STGENR_CNTCVL_REG; high_comp = STGENR_CNTCVU_REG; } while (high != high_comp); // temporary debug purpose if (low == 0 || high == 0) { stgen_packet packet; packet.type = 0xBB; // This means error packet packet.data = 1; rpmsg_trysend(&ept, &packet, sizeof(packet)); } // end of debug return ((uint64_t)high << 32) | low; }
尝试过的方案及问题
1. 修改TF-A设备树ETZPC权限
怀疑M4无外设访问权限,尝试将STGENC(安全上下文读写寄存器)的ETZPC访问模式从安全改为非安全:
- DECPROT(STM32MP1_ETZPC_STGENC_ID, DECPROT_S_RW, DECPROT_LOCK) + DECPROT(STM32MP1_ETZPC_STGENC_ID, DECPROT_NS_RW, DECPROT_LOCK)
修改后系统启动触发PANIC,日志如下:
INFO: BL2: Loading image id 16 INFO: Loading image id=16 at address 0x2ffc0000 INFO: Image id=16 loaded: 0x2ffc0000 - 0x2ffc45e2 INFO: BL2: Loading image id 5 INFO: Loading image id=5 at address 0xc0100000 INFO: Image id=5 loaded: 0xc0100000 - 0xc01eced0 NOTICE: BL2: Booting BL32 INFO: Entry point address = 0x2ffc5000 INFO: SPSR = 0x1d3 PANIC at PC : 0x2ffca91b Exception mode=0x00000016 at: 0x2ffca91b
注:修改的是STGENC而非目标的STGENR,推测这是崩溃原因,但仍需验证是否是安全访问限制导致STGENR无法读取。
2. 内核设备树添加STGEN节点
在内核设备树中添加自定义STGEN节点:
stgen: stgen@5a005000 { compatible = "st,stgen", "syscon"; reg = <0x5a005000 0x1000>; clocks = <&rcc STGEN_K>, <&rcc PCLK5>, <&rcc PCLK4>; status = "okay"; };
系统可正常启动,但M4读取STGENR计数器仍始终返回0。
核心目标
- 启用STGEN计数器功能
- 实现Cortex-M4与Cortex-A7均可读取STGEN计数器值
内容的提问来源于stack exchange,提问作者dzziq
相关产品推荐
相关产品推荐

