This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28023:使用代码安全模块

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/613402/tms320f28023-using-the-code-security-module

器件型号:TMS320F28023

你好

我正在尝试实施代码安全模块。 我对它的实施有几个问题。

  1. 如果我正确理解文献、128位密钥必须包含在存储器位置0x3F 7FF8-0x3F 7FFF 的引导加载程序中。  
  2. 应用程序代码加载(刷写)后,安全密钥(128位)存储在 DSP2803xSystemCtrl.c 文件中,我们使用 csmUnlock()函数将写入闪存的内容与存储在 DSP2803xSystemCtrl.c 文件中的内容进行比较。   是这样吗?  

文献中写入的函数没有意义第一个函数 dspUnsecure();通过存储密钥的闪存存储器并将其与名为"temp"的变量进行比较,然后它分配 CSM 寄存器值。 这不应该使用 CSM 值检查存储器?

void dspUnsecure (void)
{
volatile int * csm =(volatile int *) 0x000AE0;//csm 寄存器文件
volatile int * PWL =(volatile int *) 0x003F7FF8;//密码位置
volatile int tmp;
int i;
//读取128位密码位置(PWL)
//在地址0x3F 7FF8-0x3F 7FFF 处的闪存中
//如果器件是安全的、则读取的值将是
//实际上没有加载到 temp 变量中,所以
//这称为虚拟读取。
对于(i=0;i<8;i++) tmp =* PWL++;
//如果密码地址(PWL)都为1 (0xFFFF),
//则器件现在将不安全。 如果是密码
//不是全1 (0xFFFF)、则需要以下代码
//取消 CSM 的安全保护。
//将128位密码写入密钥寄存器
//如果此密码与中存储的密码匹配
// PWL 则 CSM 将变得不安全。 如果没有
//匹配、则器件将保持安全。
//示例密码为:
//使用0x111122223344455556677778888。
EALLOW;//密钥寄存器受 EALLOW 保护
*CSM++= 0x1111;//寄存器 KEY0位于0xAE0
*CSM++= 0x2222;//在0xE1处注册密钥1
*CSM++= 0x3333;//在0xAE2处注册密钥2
*CSM++= 0x4444;//在0xAE3处注册密钥3
*CSM++= 0x5555;//在0xAE4处注册 KEY4
*CSM++= 0x6666;//在0xAE5上注册 KEY5
*CSM++= 0x7777;//在0xAE6上注册 KEY6
*CSM++= 0x8888;//在0xAE7上注册 KEY7
EDIS;


} 

Nexwe 有一个安全函数 dspSecure();该函数将新值重新分配给 CSMCR 指针,即0x00AEF,现在是0x8000,我不知道它在做什么。 是否分配了新密码?

这是代码

void dspSecure (void)
{
易失性 int * CSMSCR = 0x00AEF;//CSMSCR 寄存器
//设置 FORCESEC 位
EALLOW;/CSMSCR 寄存器受 EALLOW 保护。
* CSMSCR = 0x8000;
EDIS;

}

写入错误的代码是否是用于保护 DSP 的方法?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

    此致
    Baskaran
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    dspSecure 函数正在写入 FORSEC 位、该位强制开启安全性。 它导致 CSM 再次被保护。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    SAL 准确指出了函数的作用。 我将提供有关这方面的位模式详细信息-

    [引用] Nexwe 有一个安全函数 dspSecure();它将新值重新分配给 CSMCR 指针,即0x00AEF,现在是0x8000,我不知道它在做什么。 是否分配了新密码? [/报价]

    否、它不会分配新密码、而是设置 FORCESEC 位以再次保护器件。  如果器 件由于某种原因(例如调试目的)变得不安全并且用户想要再次进行保护、那么他可以设置 CSMSCR (也称为 CSMCR)寄存器中的 FORCESEC 位。 以下是该位的定义。

    希望这一点很清楚。

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vivek、

    感谢您的回复、您能否以非常具体的方式告诉我、如果 DSP 安全、如何取消对其进行调试的安全保护? 有关这一点的另一个问题是、如果我们通过 UART 对器件进行编程、是否可以保护器件并使其不受保护?

    谢谢你

    Bill
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要取消器件的安全保护、请将正确的密码写入 CSM 密钥寄存器(128位)

    要保护器件、请写入 CSM 寄存器中的 FORCESEC 位。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sal、

    何时应写入密码以解锁器件? 我是否需要在特定的时间限制内或在初始化任何内容之前执行它?

    我的初始化代码如下:

    void main (void)
    
    {
    // pl、watchdog、enable Peripheral Clocks */
    InitSysCtrl();
    
    //设置所有默认 GPIO */
    InitGpio();
    
    //清除所有中断并初始化 PIE 矢量表:
    禁用 CPU 中断*/
    DINT;
    
    //将 PIE 控制寄存器初始化为默认状态。
    默认状态是禁用所有 PIE 中断并
    清除标志。 */
    InitPieCtrl();
    
    /*禁用 CPU 中断并清除所有 CPU 中断标志:*/
    IER = 0x0000;
    IFR = 0x0000;
    
    /*使用指向 shell 中断
    服务例程(ISR)的指针初始化 PIE 矢量表。
    这将填充整个表、即使此
    示例中未使用中断也是如此。 这对于调试很有用。 */
    InitPieVectTable();
    
    //本示例中使用的中断被重新映射到此
    文件中的 ISR 函数。 //
    EALLOW;//需要写入 EALLOW 受保护寄存
    
    
    
    
    器// PieVectTable.EPWM1_INT=&epwm1_TIMER_ISR;// EDIS;//这是禁用写入 EALLOW 受保护寄存器所需的//此示例中使用的中断被重新映射到此文件中的// ISR 函数。
    EALLOW;//这是写入 EALLOW 受保护寄存
    器 PieVectTable.TINT0 =&CPU_timer0_ISR;
    EDIS;//这是禁用写入 EALLOW 受保护寄存器所必需
    
    
    的//初始化所有设备外设:*/
    InitAdc();
    InitEPwm();
    InitComp ();
    
    InitECap();
    InitCpuTimer();
    ConfigCpuTimer (&CpuTimer0、60、50);//将 Timer1设置为20k 中断
    StartCpuTimer0 ();
    //ConfigCpuTimer (&CpuTimer1、6000、100000);//将 Timer1的周期设置为10s
    StartCpuTimer1 ();
    //确保精确计时,只使用整个寄存器的写指令。 因此、如果
    在 ConfigCpuTimer 和 InitCpuTimers (在 DSP2803x_CpuTimer.h 中)中更改了任何//配置位、
    也必须更新以下//设置。
    CpuTimer0Regs.TCR.ALL = 0x4001;//使用只写指令来设置 TSS 位= 

    是否应该在初始化所有计时器或在 initsysctrl()之后返回起始位置后执行该操作?

    使用我要运行的文献中的通用代码  

    void dspUnsecure (void)
    {
    volatile int * csm =(volatile int *) 0x000AE0;//csm 寄存器文件
    volatile int * PWL =(volatile int *) 0x003F7FF8;//密码位置
    volatile int tmp;
    int i;
    //读取128位密码位置(PWL)
    //在地址0x3F 7FF8-0x3F 7FFF 处的闪存中
    //如果器件是安全的、则读取的值将是
    //实际上没有加载到 temp 变量中,所以
    //这称为虚拟读取。
    对于(i=0;i<8;i++) tmp =* PWL++;
    //如果密码地址(PWL)都为1 (0xFFFF),
    //则器件现在将不安全。 如果是密码
    //不是全1 (0xFFFF)、则需要以下代码
    //取消 CSM 的安全保护。
    //将128位密码写入密钥寄存器
    //如果此密码与中存储的密码匹配
    // PWL 则 CSM 将变得不安全。 如果没有
    //匹配、则器件将保持安全。
    //示例密码为:
    //使用0x111122223344455556677778888。
    EALLOW;//密钥寄存器受 EALLOW 保护
    *CSM++= 0x1111;//寄存器 KEY0位于0xAE0
    *CSM++= 0x2222;//在0xE1处注册密钥1
    *CSM++= 0x3333;//在0xAE2处注册密钥2
    *CSM++= 0x4444;//在0xAE3处注册密钥3
    *CSM++= 0x5555;//在0xAE4处注册 KEY4
    *CSM++= 0x6666;//在0xAE5上注册 KEY5
    *CSM++= 0x7777;//在0xAE6上注册 KEY6
    *CSM++= 0x8888;//在0xAE7上注册 KEY7
    EDIS;
    
    
    } 

    也存储在引导加载程序和特定存储器位置"

    0x003F7FF8"、我很困惑如何实现它 

    谢谢

    Bill
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不清楚这个问题。 您可以在需要解锁器件时将其解锁。

    为什么需要解锁器件?

    SAL