关于RK3506 的MCU软复位后跑不起问题

官方SDK在系统不断电软复位时mcu起不来,原因是在配置入口地址前没有去写MCU和总线复位。这里修改一下MCU启动时序。

  1. 先通过 PMU 将 mcu_rst_dis_cfg 置 0(assert PMU 侧复位,系统级复位,高优先级)
  2. 再通过 CRU SOFTRST_CON5 bit10 assert 复位 (CRU逻辑复位,总线复位。)
  3. 配置入口地址(sip_smc_mcu_config)
  4. 开时钟
  5. 配置 stcalib
  6. 先释放 CRU 复位(SOFTRST_CON5 bit10=0)
  7. 最后通过 PMU 将 mcu_rst_dis_cfg 置 1(release PMU 侧复位,MCU 开始运行)

下面是uboot(arch/arm/mach-rockchip/rk3506/rk3506.c)改动点:

复制代码
int fit_standalone_release(char *id, uintptr_t entry_point)
{
	/*
	 * MCU reset is controlled by two independent sources that must both
	 * be asserted before reconfiguring the entry address:
	 *
	 * 1. PMU_INT_MASK_CON[2] mcu_rst_dis_cfg (0xFF90000C):
	 *    0 = assert MCU reset, 1 = release MCU reset
	 *    On soft-reboot this bit is still 1 (release), so we must
	 *    explicitly drive it to 0 first.
	 *
	 * 2. CRU SOFTRST_CON5[10] hresetn_m0 (0xFF9A0A14):
	 *    1 = assert reset, 0 = release reset (standard RW with write-mask)
	 *
	 * Sequence: assert both resets → configure entry → enable clocks →
	 *           release CRU reset → release PMU reset (MCU starts here).
	 */

	/* Assert PMU MCU reset (mcu_rst_dis_cfg=0, write-mask bit2=1) */
	writel(0x00040000, PMU_BASE + PMU_INT_MASK_CON);

	/* Assert CRU bus M0 reset (hresetn_m0=1, write-mask bit10=1) */
	writel(0x04000400, CRU_BASE + CRU_SOFTRST_CON5);
	udelay(10);

	/* Configure MCU address map: map 0 to entry_point via ATF */
	sip_smc_mcu_config(ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID,
		ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR,
		entry_point);

	/* Enable bus M0 clocks: swclktck_m0 (bit11=0) and hclk_m0 (bit10=0) */
	writel(0x0c000000, CRU_BASE + CRU_GATE_CON5);
	writel(0xe0000000, CRU_BASE + CRU_GATE_CON6);

	/* Set M0 system time calibration (GRF_SOC_CON36 grf_con_m0_stalib) */
	writel(0xbcd3d80, 0xff288090);

	/* Release CRU bus M0 reset (hresetn_m0=0, write-mask bit10=1) */
	writel(0x04000000, CRU_BASE + CRU_SOFTRST_CON5);
	udelay(10);

	/*
	 * Release PMU MCU reset and unmask MCU global interrupt
	 * (mcu_rst_dis_cfg=1, glb_int_mask_mcu=0, write-mask bits 2:1=1)
	 * MCU begins execution from entry_point after this write.
	 */
	writel(0x00060004, PMU_BASE + PMU_INT_MASK_CON);

	return 0;
}
相关推荐
qetfw5 小时前
UOS DHCP Relay:跨网段分配与 IP、DNS、网关验证
linux·服务器·网络·tcp/ip·uos
szxinmai主板定制专家7 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
叼烟扛炮7 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
ynchyong7 小时前
Linux 有两个 “版本“
linux·发行版·内核版本
叼烟扛炮7 小时前
Linux 学习笔记(四十四):HTTP 协议解析与极简 Web 服务器实战
linux·服务器·学习
叼烟扛炮8 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
Escalating_xu8 小时前
【Linux 网络编程】DNS 与 ICMP:从域名解析到 ping、traceroute,把“网络通不通”问清楚
linux·网络·php
HQB20269 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
一枕槐安48710 小时前
大模型限流、重试、超时处理:API 调用健壮性方案
linux·服务器·php·大模型api·指数退避·限流控制·超时预算
西索斯coding10 小时前
gpt-image-2.5-sunburst 和 gemini-3.1-flash-image 差多少?60 组项目素材的成功成本评测框架
java·linux·gpt·ai