You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:33:11