i.MX8ULP 从 m33 访问 pbridge2 Hello, 查看 imx8ulp 参考手册中的 i.MX 8ULP 架构图,我们可以看到 PBridge2 是实时域内的 DSP 域的一部分。 我知道 M33 核心没有直接连接到 DSP 域,但我看到交叉开关(XBAR_RTD 和 XBAR_DSP)是连接的;是否可以从 M33 核心访问 DSP 设备? 当我尝试在 DPS 域中使用 LPSPI2 时,尽管按照 examples/evkmimx8ulp/dsp_examples/hello_world_usart 设置了时钟,但 M33 核心还是会挂起/崩溃;因此我假设如果它完全可以访问,那么就必须进行一些操作来映射 cm33 OS 中的 pbridge2 区域。 这里的动机是,imx8ulp 的 IO 比我们之前使用的 SoC 少得多,并且我们希望使用来自 CM33 核心的 LPSPI2 和 LPUART2(均连接到 DSP 域中的 pbridge2) 谢谢! Dominique 回复:i.MX8ULP 从 m33 访问 pbridge2 对于其他关注此事的人来说,在查看此示例后,我们能够访问LPSPI1: https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/Test-LPUART2-DSP-domain-on-i-MX8ULP-M33/ta-p/2084372 (回顾我的差异,我猜我错过了对 Fusion_Init() 的调用?我们还花了很长时间才弄清楚如何正确挂起(深度睡眠),执行 Fusion_Deinit() 以及在恢复后重置 trdc,但最终一切都解决了) 谢谢! 回复:i.MX8ULP 从 m33 访问 pbridge2 谢谢〜我会再试一次! 回复:i.MX8ULP 从 m33 访问 pbridge2 是的,GPIO(PTA~PTC)都可以从 CM33 中使用;您只需要将 pinmux 设置为 GPIO。 回复:i.MX8ULP 从 m33 访问 pbridge2 好的,谢谢!我想测试 LPUART2 环回,所以我尝试将 RX 和 TX 作为 gpio 环路进行测试。但它不起作用。我想确认即使LPUART2 在 DSP 域中,CM33 也可以控制引脚,对吗? 回复:i.MX8ULP 从 m33 访问 pbridge2 我们放弃了这个,并为 SPI 实现了 gpio 位破解,而不是使用 LPSPI2。我仍然相信理论上这是可能的,但我只是不明白为什么 TRDC 配置不起作用。 如果您找到解决方案,我最终仍然会感兴趣,因为位拆解比 LPSPI 更慢/效率更低,但这不是目前的优先事项。 谢谢! 回复:i.MX8ULP 从 m33 访问 pbridge2 你好!你现在能驱动 Pbrigde2 外设吗? 我在void BOARD_SetTrdcGlobalConfig()中添加了一些配置,但结果是 LPUART2[ PCC_REG( kCLOCK_Lpuart2) ] 的寄存器为 0。这意味着外围设备不存在…… 回复:i.MX8ULP 从 m33 访问 pbridge2 Hi @daisukemizobuch
正如我在另一个案例中所说的那样,我们无法控制 dsp 核心之外的模块资源。
此致 志明 回复:i.MX8ULP 从 m33 访问 pbridge2 嗨@Zhiming_Liu ; 谢谢。期待您的回复。 此致 米佐 回复:i.MX8ULP 从 m33 访问 pbridge2 Hi @daisukemizobuch @martinetd
让我花点时间来测试一下。 此致 志明 回复:i.MX8ULP 从 m33 访问 pbridge2 嗨@Zhiming_Liu ; 这方面有新的消息吗?如果您有任何新信息,我将非常感激。 此致 米佐 回复:i.MX8ULP 从 m33 访问 pbridge2 嗨@Zhiming_Liu ; 谢谢您的回复,很抱歉回复得这么慢。 我不确定我们是否同意我在这里所做的事情。 dsp_pdm_sai 示例 (examples/evkmimx8ulp/dsp_examples/pdm_sai) 当然控制 PDM,但它是从 dsp/main_dsp.c 控制的它运行在DSP核上,启动DSP核之后M33核不做任何事情。 我正在尝试直接从 M33 核心访问 DSP 外设,而无需启动 DSP 核心(我没有使用 XCC 修改或构建 DSP 图像的许可证,因此使用邮箱从 M33 控制 DSP 核心也不是解决方案)。 dsp pdm_sai 示例也完全没有从通用板配置修改 TRDC (MRC/MBC)。 我尝试向 TRDC Mbc 添加更多块,但没有成功。我尝试查看 trdc 示例(examples/evkmimx8ulp/driver_examples/trdc),看起来访问 PCC2->PCC_LPSPI2(0x2810_2034)时没有出现故障,但如果该寄存器为 0,LPSPI2 就无法工作。 我已附上我在 trdc 示例中尝试过的补丁,这是我按照您的建议设置 MDC 后(针对 PCC2 块)打印 PCC2->PCC_LPSPI2(以及用于健全性检查的 LPSPI1)得到的输出 TRDC example start
other init
XXXXXXX LPSPI1 80000000 @ 280300fc ; LPSPI2 0 @ 28102034
Set the MRC selected memory region not accessiable
Violent MRC access at address: 0x40000000
The MRC selected region is accessiable now
Set the MBC selected memory block not accessiable
Violent MBC access at address: 0x28800000
The MBC selected block is accessiable now
TRDC example Success 如果您能给我指明正确的方向,我将不胜感激。 谢谢! Dominique 回复:i.MX8ULP 从 m33 访问 pbridge2 Hi
请添加另一个 mbcidx 来映射 pcc2。dsp_pdm_sai 是一个很好的例子,展示了如何从 M33 控制 pdm(dsp 域)。
mbcBlockConfig.memoryBlockIdx = 2U;//PCC2
TRDC_MbcSetMemoryBlockConfig(TRDC, &mbcBlockConfig);
此致 志明 回复:i.MX8ULP 从 m33 访问 pbridge2 谢谢你的域名,我错过了。 不幸的是,当我尝试通过 LPSPI2 发送消息时,m33 核心仍然挂起。 我仔细查看了它挂起的位置, LPSPI_MasterTransferReadDataInFifoNoBuf()挂起,因为LPSPI_GetStatusFlags(LPSPI2)从未从 0 改变。 先说一下,在LPSPI_MasterTransferBlocking()的开头,我正在使用的示例(examples/evkmimx8ulp/driver_examples/lpspi/polling_b2b_transfer/master)已经调用了LPSPI_MasterInit() ,所以 LPSPI2->CR 应该是 1(启用),但事实并非如此;即使在LPSPI_Enable(base, true)之后它仍然保持在 0 所以我不确定我的问题是否出在 TRDC/MBC 上(如果是 MBC,我预计对 LPSPI2 寄存器的任何访问都会挂起或重置控制器,但事实并非如此——或者它只是忽略任何写入的内容,如果访问设置不正确,则始终返回 0?) 再往前追溯,PCC2 内存映射似乎没有映射? 手册说 PCC2 基地址:2810_2000h / PCC_LPSPI2 偏移量为 34h,如果存在(PR 位),则应至少包含 8000_0000h,但它为 0。(同时,2803_00FCh 处的 PCC_LPSPI1 此时包含 9200_0000h) 另一方面,我也没有看到任何明确映射 PCC0(2803_0000h)的东西,所以我不确定这里需要什么。 您觉得怎么样?我是否遗漏了 TRDC 设置之前(或之后)的其他内容? 谢谢! 回复:i.MX8ULP 从 m33 访问 pbridge2 Hi
board.h 中有 TRDC_M33_DOMAIN_ID,你可以使用它。
/* non secure state can access LPSPI2(T-MBC3) for M33 */
mbcBlockConfig.memoryAccessControlSelect = TRDC_MBC_ACCESS_CONTROL_POLICY_ALL_INDEX;
mbcBlockConfig.nseEnable = true;
mbcBlockConfig.mbcIdx = 3U;
mbcBlockConfig.domainIdx = TRDC_M33_DOMAIN_ID;
mbcBlockConfig.slaveMemoryIdx = 0U;
mbcBlockConfig.memoryBlockIdx = 13;
TRDC_MbcSetMemoryBlockConfig(TRDC, &mbcBlockConfig);
参考 pdm_sai dsp 演示,我们需要从 PBRIDGE2 内存映射中获取 memoryBlockIdx。对于LPSPI2,memoryBlockIdx应该是13
此致 志明 回复:i.MX8ULP 从 m33 访问 pbridge2 抱歉重复更新,补丁实际上已附加... 回复:i.MX8ULP 从 m33 访问 pbridge2 你好@Zhiming_Liu 谢谢您的回复! 查看参考手册,就我而言,我想从 m33 访问 pbridge2 设备,因此我发现 MBC3 控制 Pbridge2 的 18 个 4k 块; (我不太确定TRDC_GetMbcHardwareConfig(TRDC, &mbcHwConfig, 3, 0) (以及更高的从属设备)是否都返回mbcHwConfig.blockNum=0;所以也许我遗漏了一些先决条件?但话又说回来,它不需要域名,所以我认为我没有正确理解这一点......) 忽略上述内容并根据手册,我尝试将对 TRDC_MBC_ACCESS_CONTROL_POLICY_ALL_INDEX + nseEnabled 的访问权限设置为所有域(域 0-7、从属 0、块 0-2),虽然这似乎没有失败,但也无济于事,我的 m33 程序在访问 LPSPI2 时仍然会挂起/崩溃 (我还删除了在 board.c 中找到的对 MBC3 的任何其他引用;并且还根据 dsp 示例在 Pcc2 上选择一个时钟,以便 pbridge2 进行设置) 我已附加适用于https://github.com/NXPmicro/mcux-sdk的差异b565979c2155efc49ffcc8cdaa1f932e19a4d0e5 和https://github.com/nxp-mcuxpresso/mcux-sdk-examplesfc18ff0c12ba90fe71714eaa4244717efa18c61c 你知道缺少了什么吗? 回复:i.MX8ULP 从 m33 访问 pbridge2 Hi
您需要在BOARD_SetTrdcGlobalConfig 中设置 MBC 策略,引用 pbridge1,使用 domainIdx 来控制哪个域可以访问它。
.....
/* for DMA1, USB0, USB1, ENET, UDSHC0, USDHC1, UDSHC2, CAMM Master(default domain id is 1), default TRDC
* configuration */
/* non secure state can access Pbridge1(MBC2_MEM1) for DMA1, USB0, USB1, ENET, UDSHC0, USDHC1, UDSHC2, CAMM
* Master
*/
mbcBlockConfig.memoryAccessControlSelect = TRDC_MBC_ACCESS_CONTROL_POLICY_ALL_INDEX;
mbcBlockConfig.nseEnable = true; /* non secure state can access the block for DMA1, USB0, USB1, ENET, UDSHC0,
USDHC1, UDSHC2, CAMM Master */
mbcBlockConfig.mbcIdx = 2U; /* MBC2 */
mbcBlockConfig.domainIdx = 1U; /* MBC2_DOM1 */
mbcBlockConfig.slaveMemoryIdx = 1U; /* MBC2_DOM1_MEM1 */
TRDC_GetMbcHardwareConfig(TRDC, &mbcHwConfig, mbcBlockConfig.mbcIdx, mbcBlockConfig.slaveMemoryIdx);
for (n = 0U; n < mbcHwConfig.blockNum; n++)
{
mbcBlockConfig.memoryBlockIdx = n; /* MBC2_DOM1_MEM1_BLK_CFG_Wx */
TRDC_MbcSetMemoryBlockConfig(TRDC, &mbcBlockConfig);
}
....
/* non secure state can access PCC1(PBridge1 slot 17) and ADC1(PBridge1 slot 34) for cortex-A35 */
mbcBlockConfig.memoryAccessControlSelect = TRDC_MBC_ACCESS_CONTROL_POLICY_ALL_INDEX;
mbcBlockConfig.nseEnable = true; /* non secure state can access the block for cortex-A35 */
mbcBlockConfig.mbcIdx = 2U; /* MBC2 */
mbcBlockConfig.domainIdx = 7U; /* MBC2_DOM7 */
mbcBlockConfig.slaveMemoryIdx = 1U; /* MBC2_DOM7_MEM1 */
mbcBlockConfig.memoryBlockIdx = 17U; /* MBC2_DOM7_MEM1_BLK_CFG_W17 */
TRDC_MbcSetMemoryBlockConfig(TRDC, &mbcBlockConfig);
mbcBlockConfig.memoryBlockIdx = 34U; /* MBC2_DOM7_MEM1_BLK_CFG_W34 */
TRDC_MbcSetMemoryBlockConfig(TRDC, &mbcBlockConfig);
....
此致 志明
View full article