如何为TI AM62x SoC移植U-Boot bootcount功能?
适配U-Boot通用bootcount-rtc驱动到TI AM62x SoC
一、通用驱动适配可行性确认
AM62x的RTCSS块SCRATCH寄存器(如你验证的SCRATCH2)具备复位后数据持久化能力,且支持解锁写入,完全符合通用bootcount-rtc驱动的核心要求——依赖一个可稳定存储bootcount值的RTC scratch寄存器。该通用驱动不绑定特定SoC,只要在设备树中正确描述寄存器信息,并确保驱动能完成解锁、读写流程即可适配。
二、具体配置步骤
1. 设备树(DTS)修改
在AM62x的RTC节点下补充bootcount相关属性,指定使用的scratch寄存器、解锁寄存器偏移及魔数:
&rtc { compatible = "ti,am625-rtc", "ti,am3352-rtc"; ti,scratch-reg = <2>; /* 对应SCRATCH2寄存器 */ ti,rtc-kick-regs = <0x60 0x64>; /* RTCSS的KICK0、KICK1寄存器偏移 */ ti,rtc-kick-values = <0x83E70B13 0x95A4F1E0>; /* AM62x RTC解锁魔数 */ bootcount; };
注:需确保RTC节点基地址已正确定义,
ti,scratch-reg的序号与目标寄存器对应,KICK相关参数需与AM62x datasheet匹配。
2. U-Boot Kconfig配置
启用通用bootcount-rtc驱动及AM62x RTC基础驱动:
CONFIG_BOOTCOUNT_LIMIT=y CONFIG_BOOTCOUNT_RTC=y CONFIG_RTC_TI_K3=y /* 确保AM62x RTC驱动已开启 */
若
CONFIG_RTC_TI_K3未定义,需确认U-Boot代码中已引入AM62x RTC驱动支持,或依赖通用RTC框架完成适配。
3. RTC驱动接口补充(按需)
通用bootcount-rtc驱动依赖RTC框架提供的rtc_write_scratch和rtc_read_scratch接口。如果AM62x的RTC驱动(drivers/rtc/rtc-ti-k3.c)未实现这两个接口,需补充以下逻辑:
读写scratch寄存器函数实现
static int rtc_ti_k3_write_scratch(struct udevice *dev, int idx, u32 val) { struct ti_k3_rtc_priv *priv = dev_get_priv(dev); u32 kick0, kick1; /* 解锁RTCSS */ kick0 = readl(priv->base + TI_K3_RTC_KICK0); kick1 = readl(priv->base + TI_K3_RTC_KICK1); writel(TI_K3_RTC_KICK0_MAGIC, priv->base + TI_K3_RTC_KICK0); writel(TI_K3_RTC_KICK1_MAGIC, priv->base + TI_K3_RTC_KICK1); /* 写入指定scratch寄存器 */ writel(val, priv->base + TI_K3_RTC_SCRATCH0 + idx * 4); /* 恢复寄存器锁定 */ writel(kick0, priv->base + TI_K3_RTC_KICK0); writel(kick1, priv->base + TI_K3_RTC_KICK1); return 0; } static int rtc_ti_k3_read_scratch(struct udevice *dev, int idx, u32 *val) { struct ti_k3_rtc_priv *priv = dev_get_priv(dev); *val = readl(priv->base + TI_K3_RTC_SCRATCH0 + idx * 4); return 0; }
绑定到RTC操作集
在驱动的struct rtc_ops中添加接口指针:
static const struct rtc_ops rtc_ti_k3_ops = { .get = rtc_ti_k3_get, .set = rtc_ti_k3_set, .write_scratch = rtc_ti_k3_write_scratch, .read_scratch = rtc_ti_k3_read_scratch, /* 其他已有接口 */ };
三、方案对比
- 通用
bootcount-rtc驱动:符合U-Boot模块化设计,无需新增SoC专属驱动,后续维护成本低,为优先选择方案。 - 修改legacy的
bootcount_davinci.c:虽能快速适配,但属于旧驱动架构,不利于后续版本升级,不推荐。
内容的提问来源于stack exchange,提问作者thom_nic
相关产品推荐
相关产品推荐

