SWD 分级访问

本芯片在安全区与非安全区均支持两种调试模式:

  • 侵入式调试(Invasive,能中断 CPU)

  • 非侵入式调试(Noninvasive,仅采样 PC,不中断 CPU)

下表介绍了配置 SWD 调试权限级别的 OTP 字段:

控制 SWD 调试权限级别的 OTP 选项表

名称

OTP 地址

长度(比特)

描述

SWD_DBGEN

物理地址 0x364 bit[1]

1

侵入式调试(中断 CPU)控制

1:允许非安全区侵入式调试(可中断 CPU)

0:禁止非安全区侵入式调试

SWD_NIDEN

物理地址 0x364 bit[2]

1

非侵入式调试(Trace)控制

1:允许非安全区非侵入式调试(Trace, 采样 PC, 不中断 CPU)

0:禁止非安全区非侵入式调试

SWD_SPIDEN

物理地址 0x364 bit[3]

1

安全区侵入式调试控制

1:允许安全区侵入式调试(可中断安全区 CPU)

0:禁止安全区侵入式调试

SWD_SPNIDEN

物理地址 0x364 bit[4]

1

安全区非侵入式调试控制

1:允许安全区非侵入式调试(Trace, 采样 PC, 不中断 CPU)

0:禁止安全区非侵入式调试

  • 默认情况下,上表中所有栏位均未编程,表示设备支持 SWD 全部调试功能

  • 如果希望 禁止 SWD 进行任何调试操作,只需将表中四个 bit 全部编程为 0 即可

  • 用户可根据实际安全需求, 选择性编程部分栏位 ,以灵活控制 SWD 访问权限。

备注

控制 SWD 调试权限级别的 OTP 选项 优先级高于 控制 SWD 保护的 OTP 选项

这意味着即使 SWD 保护的 OTP 配置已开放 SWD 接口,但只要本表将所有调试功能禁用,设备依然无法进行 SWD 调试操作。

SWD 密钥认证

工作原理

1. 量产阶段

密钥存储 : 将密钥写入设备的 OTP 区域中,以确保设备唯一性和安全性。

2. 调试阶段

  • 密钥录入 :在指定的配置文件或自动化工具参数中填入密钥。

  • 认证触发 :通过执行自动化工具,对密钥进行一致性验证。

关于配置文件及路径详见 密钥认证使用步骤

3. 访问授权

仅当录入的密钥与 OTP 存储的 密钥完全匹配 时,系统才授予设备访问和调试权限。

认证方案

系统支持为每台设备烧录唯一的 SWD 密钥(“一机一密”)以提升安全性。

该功能为可选项,用户可根据项目需求来选择是否启用一机一密机制。

1. 一机一密机制

  • 烧录环节 :为每台设备编程唯一的 SWD_IDSWD_PASSWORD ,实现密钥的唯一性和不可复用性。

  • 后台数据库管理 :系统后台建立 SWD_IDSWD_PASSWORD 的一一映射关系,用于后续的身份认证。

  • 设备调试或认证 :通过读取到的 SWD_ID 查询数据库,获取对应的 SWD_PASSWORD ,实现单设备的精确认证操作。

使用该方案,单台设备密钥泄漏不会影响其他设备,显著提升系统整体安全防护能力。

备注

  • SWD_ID 获取方式,详见 SWD 密钥认证使用步骤 中的 swdpwd_password.log 文件。

  • 如采用每台设备独立密钥方案,请妥善维护设备 SWD_ID 与对应的 SWD_PASSWORD

2. 非一机一密机制

如无需区分单台设备权限,则所有设备可共用同一 SWD_PASSWORD ,无需烧录 SWD_ID

使用该方案,设备量产流程简化,但整体安全性相对降低。

密钥管理

OTP 密钥信息说明

OTP 包含的密钥信息如下:

名称

OTP 地址

长度(比特)

描述

SWD_PASSWORD

物理地址 0x300 ~ 0x30F

128

SWD 访问密钥,用于调试访问身份验证

SWD_ID

物理地址 0x360

32

SWD 唯一标识字段,用于关联 SWD 访问密钥

SWD_PWD_EN

物理地址 0x364 bit[0]

1

使能 SWD 保护功能控制:

0:启用 SWD 访问保护

1:禁用 SWD 访问保护

SWD_PWD_R_Protection_EN

物理地址 0x364 bit[5]

1

使能 SWD 密钥的读取保护控制:

0:启用读取保护,防止被读出

1:禁用读取保护

SWD_PWD_W_Protection_EN

物理地址 0x364 bit[6]

1

使能 SWD 密钥的写入保护控制:

0:启用写入保护,防止被黑客全写0

1:禁用写入保护

OTP 密钥编程(烧录)指南

本节介绍如何通过 AT 指令编程 OTP 密钥信息。

备注

  • 编程 OTP 指定地址的某个位时,需 先读回 该字节当前值, 按位修改 后再写回,防止其他位数据被意外修改。

  • 编程 OTP 指定地址的数据后,请 读回确认 ,以确保写入内容正确。

请根据表 OTP 密钥信息 字段含义,按如下步骤编程 OTP 密钥信息:

  1. 写入并读回确认 SWD_PASSWORD

    例如,密钥为 0x4433221188776655ccbbaa9900ffeedd ,则编程 OTP 指令为:

    AT+OTP=WRAW,300,16,4433221188776655ccbbaa9900ffeedd
    

    读回 OTP 的指令为:

    AT+OTP=RRAW
    

    预期读回输出:

    ...
    RawMap[300]: 44 33 22 11 88 77 66 55 cc bb aa 99 00 ff ee dd
    ...
    
  2. 写入并读回确认 SWD_ID (如采用 非一机一密认证方案, 可跳过该步骤)

    例如,SWD_ID0x3412,则编程 OTP 指令为:

    AT+OTP=WRAW,360,2,3412
    

    读回 OTP 的指令为(后续步骤的读操作命令均一致,不再赘述):

    AT+OTP=RRAW
    

    预期读回输出:

    ...
    RawMap[360]: 34 12 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ...
    
  3. 写入 SWD 保护功能使能位 SWD_PWD_EN

    AT+OTP=WRAW,364,1,fe
    
  4. 写入 SWD 密钥读写保护位 SWD_PWD_R_Protection_ENSWD_PWD_W_Protection_EN ,防止密钥泄漏或被篡改

    AT+OTP=WRAW,364,1,9e
    

备注

  • 一旦烧写 SWD_PWD_R_Protection_ENSWD_PASSWORD 将无法再被读取,因此请务必妥善保存这些密钥。

  • OTP 的数据修改仅在 系统重启后生效

密钥认证使用步骤

请根据 SWD 密钥编程指南 介绍,在编程 SWD 保护的 OTP 配置项后,按照如下步骤使用 SWD 保护机制:

  1. 重启设备以重新加载 OTP 数值。

  2. 连接 J-Link 到板卡 SWD 引脚。

  3. 在 SDK 根目录下执行如下命令:

RTL8721Dx:

ameba.py jlink -t swd -k km4

如未正确输入 SWD 密钥,连接会失败,界面如下:

Connecting to J-Link...
J-Link is connected.
Firmware: J-Link V11 compiled Apr 27 2041 16:36:21
Hardware: V11.00
S/N: 50120677
Feature(s): GDB, JFlash, FlashDL, RDI, FlashBP
Checking target voltage...
Target voltage: 3.33 V
Listening on TCP/IP port 2340
Connecting to target...ERROR: Could not find core in Coresight setup
ERROR: Could not connect to target.
Target connection failed. GDBServer will be closed...
  1. 打开 {SDK}\build_RTL87xxx\jlink_script 目录下的 swdpwd_password.log 文件,查找设备的 SWD_ID

    ***************************************************************
    J-Link script: ResetTarget()
    ******************** SWD ID ********************
    J-Link script: SWD_READ_ID
    SWD ID:0xFFFF1234
    

    备注

    swdpwd_password.log 文件会在执行第 3 步时自动生成。

  2. 根据获得的 SWD_ID ,在数据库中查找对应的 SWD_PASSWORD

  3. {SDK}\tools\scripts\jlink_script 路径下的 jlinkscript_generate.py 文件中,将 SWD_PASSWORD 写入 PASSWORD_0/1/2/3 变量。

    例如,假设 OTP 中已编程 SWD 密钥编程指南 小节示例密钥,请将脚本文件修改如下:

    U32 PASSWORD_0 = 0x11223344;
    U32 PASSWORD_1 = 0x55667788;
    U32 PASSWORD_2 = 0x99AABBCC;
    U32 PASSWORD_3 = 0xDDEEFF00;
    

    备注

    注意:请确保脚本输入的密钥顺序与 OTP 中存储顺序一致,否则会验证失败。

  4. 在 SDK 根目录下执行如下命令:

RTL8721Dx:

ameba.py jlink -t swd -k km4

正确输入密钥后,可以正常连接设备,界面如下:

Connecting to J-Link...
J-Link is connected.
Firmware: J-Link V11 compiled Apr 27 2041 16:36:21
Hardware: V11.00
S/N: 50120677
Feature(s): GDB, JFlash, FlashDL, RDI, FlashBP
Checking target voltage...
Target voltage: 3.33 V
Listening on TCP/IP port 2340
Connecting to target...Connected to target
Waiting for GDB connection...

RMA 模式 SWD 密钥认证

当芯片出现疑似故障且需要 Realtek 协助分析时,请务必在寄回芯片前将其切换至 RMA 模式, 并提供 RMA 模式的 认证密钥。

这是因为 Realtek 在没有客户协助的情况下,无法通过 SWD 连接与调试设备。

RMA 模式 SWD 密钥信息

RMA 模式 OTP 密钥配置信息

名称

OTP 地址

长度(比特)

描述

RMA_SWD_PASSWORD

物理地址 0x710 ~ 0x71F

128

设备进入 RMA 模式时使用的 SWD 密钥

RMA_SWD_PWD_R_Protection_EN

物理地址 0x702 bit[0]

1

使能 RMA 模式 SWD 密钥读取保护控制:

0:启用保护,防止被读出

1:禁用该保护

RMA_SWD_PWD_W_Protection_EN

物理地址 0x702 bit[1]

1

使能 RMA 模式 SWD 密钥写入保护控制:

0:启用保护,防止被黑客全写0

1:禁用该保护

建议 RMA 模式下的密钥不要与正常工作模式的密钥一致。

RMA 模式 SWD 密钥编程(烧录)指南

本节介绍如何通过 AT 指令方式烧写 RMA 模式 SWD 保护 OTP 配置项。

编程 RMA 模式相关 OTP 内容前,请务必参考 SWD 密钥编程注意事项 ,以确保操作正确避免潜在风险。

请根据表 RMA 模式密钥信息 字段含义,按如下步骤编程 RMA 模式 OTP 密钥信息:

  1. 写入 RMA 模式 SWD 访问密钥 RMA_SWD_PASSWORD

    例如,RMA 模式的密钥为 0x00333231242322211413121104030201 ,则编程 OTP 指令为:

    AT+OTP=WRAW,710,16,00333231242322211413121104030201
    
  2. 写入 RMA_SWD_PWD_R_Protection_ENRMA_SWD_PWD_W_Protection_EN ,使能 RMA 模式的 认证密钥读写保护,防止密钥泄漏或被篡改

    AT+OTP=WRAW,702,1,fc
    

    备注

    • 烧写 RMA_SWD_PWD_R_Protection_EN,则 RMA_SWD_PASSWORD 无法再被读取,因此请务必妥善保存这些密钥。

    • OTP 的数据修改仅在 系统重启后生效

RMA 模式使用 SWD 调试注意事项

进入 RMA 模式后,读取 OTP 安全区域的数据将全部返回 0xFF,这意味着:

  • 通过 SWD_ID 获取方式 读取 SWD_ID 时,始终返回 0xFFFFFFFF即使 OTP 中已写入实际值

    • 建议 :在 切换至 RMA 模式前,提前读取并妥善保存芯片的 SWD_ID ,以便后续在数据库中准确查询对应的(RMA)认证密钥。

  • SWD 分级访问控制 功能无效,即:密钥认证成功后,总是可以通过 SWD 接口访问和调试设备。