SWD 保护

概述

串行调试(SWD)是一种嵌入式设备常用的调试接口,可以直接访问和调试处理器内核。

为防止处理器及系统状态被未经授权访问,系统支持 SWD 调试接口的安全保护机制。通过认证手段对调试接口访问进行严格控制,该机制可满足产品在不同生命周期阶段的安全管理需求,有效提升整体安全性。

功能特性

分级访问控制

  • 支持侵入式、非侵入式、安全侵入式和安全非侵入式的多种调试权限。

  • 支持关闭 SWD 接口,彻底禁止调试访问。

密钥认证机制

  • 调试权限通过与 OTP 写入的密钥绑定,实现身份认证,保障调试接口安全。

灵活的安全激活

  • 默认开放,便于开发调试。

  • 量产阶段可通过 OTP 加密配置,激活保护,未通过校验前无法访问系统资源。

SWD 分级访问

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

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

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

下表介绍了配置 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 密钥认证

工作原理

量产阶段

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

调试阶段

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

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

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

访问授权

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

认证方案

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

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

一机一密机制

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

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

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

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

备注

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

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

非一机一密机制

如无需区分单台设备权限,则所有设备可共用同一 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 指令为:

    efuse wraw 300 16 4433221188776655ccbbaa9900ffeedd
    

    读回 OTP 的指令为:

    efuse rraw 300 16
    

    预期读回输出:

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

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

    efuse wraw 360 2 3412
    

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

    efuse rraw 360 2
    

    预期读回输出:

    ...
    addr : 0x360, size: 2
    34 12
    ...
    
  3. 写入 SWD 保护功能使能位 SWD_PWD_EN

    efuse wraw 364 1 fe
    
  4. 写入 SWD 密钥读写保护位 SWD_PWD_R_Protection_ENSWD_PWD_W_Protection_EN ,防止密钥泄漏或被篡改

    efuse wraw 364 1 9e
    

备注

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

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

密钥认证使用步骤

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

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

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

  3. 双击 {SDK}\sources\firmware\amebadxxx_gcc_project\utils\jlink_script 目录下的 swdpwd_User.bat

    如未正确输入 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}\sources\firmware\amebadxxx_gcc_project\utils\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}\sources\firmware\amebadxxx_gcc_project\utils\jlink_script 路径下的 APx_SWDPWD_User.JLinkScript 文件中,将 步骤 5 的 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. 再次双击 swdpwd_User.bat 脚本进行连接。

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

    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 指令为::

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

    efuse 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 接口访问和调试设备。