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.

[参考译文] CCS/TMS320F2.8032万:我不太了解如何实施代码安全模块。 有人能回答我的问题吗?

Guru**** 2399305 points
Other Parts Discussed in Thread: C2000WARE, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/639404/ccs-tms320f28032-i-don-t-quite-understand-how-to-implement-the-code-security-module-can-someone-answer-my-questions

部件号:TMS320F2.8032万
主题中讨论的其他部件: C2000WAREcontrolSUITE

工具/软件:Code Composer Studio

问候,

我负责在TMS320F2.8032万芯片上实施代码安全模块。 阅读后,我对如何实施这一措施有一些疑问。 这就是我的想法。 我不想实施任何操作,除非我确信这不会使芯片被封堵。

1.我必须进入DSP2803x_sysctrl.c并将CsmUnlock功能更改为我们要使用的密码。

2.我有手册中的代码  

void dspUnsecure (void){

volatile int *CSM =(volatile int *)0x000AE0;//CSM寄存器文件
volatile int *PWL =(volatile int *)0x003F7FF8;//密码位置
易失性int tmp;
int i;
//读取密码位置(PWL)的128位
//在地址0x3F 7FF8 - 0x3F 7FFF处闪存
//如果设备是安全的,则读取的值将是
//实际上没有加载到temp变量中,所以
//这称为虚拟读取。
对于(i=0;i<8;i++) tmp =*PWL++;
//如果密码位置(PWL)全部= 1 (0xFFff),
//则设备现在将不安全。 如果密码
//不是所有的(0xFFFF),则需要以下代码
//取消CSM的安全。
//将128位密码写入密钥寄存器
//如果此密码与中存储的密码匹配
// PWL,则CSM将变得不安全。 如果没有
//匹配,则设备将保持安全。
//密码示例为:
//使用0x11.1122万2233344445555666677778888。22.3334万。</s>44.4555万 56.6667万777.8888万
EALLOW;//密钥寄存器受EALLOW保护
*CSM++= 0x1111;//在0xAE0处注册KEY0
*CSM++= 0x2222;//在0xAE1处注册密钥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;


}

void dspSecure (void){

volatile int *CSMSCR = 0x00AEF;//CSMSCR寄存器
//设置FORCESEC位
EALLOW;/CSMSCR寄存器受EALLOW保护。
*CSMSCR = 0x8000;
EDIS;

} 

一旦实现,如何解锁和锁定芯片。 我们正在通过UART从另一个芯片对设备进行编程,该芯片可能会将扳手扔进系统。 有人能向我解释解锁和锁定芯片的过程吗?

谢谢!  

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

    锁定芯片涉及对密码位置中所有1之外的值进行编程。 如果您使用的是c2000ware,则应在DSP2803x_CSMPassings.asm文件中输入密码。 一旦您在闪存中编译,链接和编程项目,该设备就从那时起就很安全。

     

    SPRUGL8C第28页的2.3 3节对设备解锁(解除固定)进行了说明。 请指出不清楚的具体步骤。

     

    由于您正在通过SCI对闪存进行编程,我认为您将利用片上引导ROM中的SCI选项。 我建议您在不使用密码的情况下刷新此流程数次,并且仅在确保流程按预期工作后才包括密码。

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

    Hareesh,

    感谢您的回复。 我在设计中有CSM.c和.h文件,它们的作用与ASM文件相同。它们是DSP不安全函数和DSP安全函数。  

    根据我从阅读SPRUGL8C文档中得到的理解,我需要将DSP2803x_sysctrl.c中的寄存器更改为密码。   然后,我编译代码并通过UART上载到芯片。 这适用于不安全的文件。上传后,我认为芯片现在已"锁定",以便解锁它。我是否需要在main函数开头使用DSPunsecure函数上传新代码? 或者如何解锁此芯片以升级固件?

    谢谢  

    账单

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

    您必须先解锁设备才能上传新代码。 IOW,在您甚至可以擦除闪存之前,闪存必须先处于不安全状态。 通过JTAG解锁或重新编程闪存相当简单。 这可以通过低成本仿真器(如XDS100 (http://processors.wiki.ti.com/index.php/XDS100))来启用。 如果不能使用JTAG,而UART是唯一可以使用的选项,则仍需要在运行闪存API之前先解锁设备。

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

    如果我正确理解这一点,通过UART重新刷新芯片将无法利用CSM解锁,因为该功能仅在JTAG上可用。 但是,使用JTAG仿真器将允许我们通过UART锁定和解锁芯片,以便重新刷新?

    谢谢你

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

    您应该能够将一小段代码(通过UART)加载到不安全的存储器中,当运行时,该存储器可以解锁闪存。 然后,您应该能够擦除并重新编程闪存。

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

    很棒! 您是否有任何示例代码或信息,说明我可以如何实现这一目标? 这正是我所需要的。

    谢谢

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

    无论您如何连接到设备(JTAG或UART),都必须在擦除/编程之前解锁设备。 解锁设备的代码可以通过任一管道传输。 如果在已锁定的部件上使用JTAG,则ECSL可能会跳闸与CCS的连接。 在这种情况下,您可能必须使用等待引导模式才能建立JTAG连接。 您可以在我们的文档中找到详细信息。 也有许多帖子讨论此问题。

    P.s.:无论使用JTAG还是SCI,解锁的代码都是相同的。

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

    您已经拥有此函数"dspUnsecure。 在通过UART加载此小段代码后,您只需从不安全的RAM运行此功能。

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

    您能将我指向正确的文档吗? 我找不到它。 谢谢
    账单
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Manoj

    我们有一些内存被用作引导加载程序。我是否需要重置处理器并引导至引导加载程序并在那里运行一些代码? 很抱歉,我很难理解这一点。 如何在RAM的特定部分中运行代码的特定部分?\

    谢谢

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

    很抱歉,我们没有任何具体的AppNote /文档显示如何完成。 但是,您是否已经查看过此示例代码

    C:\ti\controlSUITE\DEVICE_SUPPORT\F2803x\V130\DSP2803x_Examples_ccsv5\F2803x_flash_kernel</s>2803 2803

    此致,
    Manoj
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    数据表(SPRS584),SPRUGL8和SPRUGO0B中包含您所需的所有信息。 www.ti.com/.../sprabv4b.pdf 也是一个很好的资源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Manoj

    通过UART闪存时,我是否应该使用正确的密码对地址0x33FFF8编程,然后继续闪存? 从UART编程时,这是否是使用CSM的正确方式?

    谢谢  

    账单

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

    Bill,

    我建议您首先对闪存进行编程,然后继续编程闪存密码,以确保在编程过程中不会锁定自己。 如果您在设定密码后重置了设备,则可能会发生这种情况。

    此致,

    Manoj

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

    我可以可靠地对闪存进行编程,但是,您是否说我仍可以在设备锁定时对闪存进行编程,然后对密码进行编程以解锁? 在哪里设置密码? 地址?

    谢谢!

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

    除非先将其解锁,否则无法对闪存进行擦除/编程。 正如我在第一份答复中所指出的,如果您使用的是c2000ware,您可以在DSP2803x_CSMPasspasswords.asm文件中输入您的密码。

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

    好的,我不确定我是否有C200Ware,我想我有,但您指定的路径我没有。 这让我很恼火,我真的很困惑,我又收到了一两句话。 我对此不熟悉,我真的可以利用您的帮助。  

    1.我可以对芯片小瓶UART进行编程。 我在工厂安装的bootloader中将十六进制文件发送到闪存。  

    2.我不知道先发送什么来解锁芯片,我已经问过很多次,但没有收到如何解锁的回复。 电话呼叫或我将要接听的任何事情  

    3.下面是我无法找到 控制套件目录的内容。 如果您坐下并帮助我解决这个问题,我将不胜感激。  类似步骤1:执行此操作,然后执行此操作等

    谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然不知道如何做到这一点。 有人能帮忙吗? 这一问题没有得到解决,正在拖延其他事情。

    谢谢

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

    Bill,

               我很不清楚您在哪里遇到了问题,以及在哪里需要帮助。 查看以下内容是否有帮助。 如果不是,则进行呼叫可能更具时间效率。 如果需要,请通过TI FAE帮助您安排。

      

    区分这两个步骤非常重要,即

    (i)如何为项目添加密码

    这是通过编辑C:\ti\c2000\C2000Ware_1_00_02_00\DEVICE_support\F2803x\common\source中2000中的2803的DSP2803x_CSMPassings.asm文件来完成的,编译并链接您的项目并将其刻录到闪存中。 从那时起,设备是"安全"的,在访问任何安全存储器(RAM/Flash)之前必须是"不安全"的。 这包括闪存的擦除/编程操作。

     

    (ii)如何在擦除/编程操作之前解锁设备。

    您需要先使用密码解锁设备,然后才能访问闪存。 您需要从不安全的内存运行CsmUnlock()。 您可以编辑链接程序命令文件,将代码的任何部分放入所需的内存中。

     

    首先通过JTAG使用密码对COFF文件进行编程,读取密码位置,并确保在尝试通过SCI进行编程之前有正确的密码。

     

    下面是可用于此主题的现有示例代码/文档。

     

    现有示例代码:

    我想您正在使用c2000ware来开发您的项目。 C2000ware是代码开发的首选平台,并取代controlSUITE。 如果没有安装controlSUITE (您可以从TI网站 www.ti.com/.../controlsuite轻松下载)controlSUITE\DEVICE_SUPPORT\F2803x\V130\DSP2803x_Examples_ccsv5\F2803x_flash_kernel的2803的等2803等效路径

    C:\ti\c2000Ware_1_00_02_00\device_support\F2803x\examples\c28\F2803x_flash_kernel</s>2803 2803

     

    说明如何从BootROM调用闪存API函数调用的示例代码和文档。

     

    controlSUITE\libs\utilities\flash_api\2803x\v100a\doc (在c2000ware中,它是C:\ti\c2000Ware_1_00_02_00\libraries\flash_api\F2803x\docs)2803)

    controlSUITE\libs\utilities\flash_api\2803x\v100a\example_ccsv5 (在c2000ware中,它是C:\ti\c2000Ware_1_00_02_00\libraries\flash_api\F2803x\example_ccsv5)2803)

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

    Hareesh,

    感谢您的回复。 遗憾的是,此芯片中的代码不是由C2000ware启动的。 我继承了它并理解了其中的大部分。 我有c2000ware 1_00_01_00,其中包含您正在描述的文件。 我附上一份流程图,以帮助解释我的来源  

    该芯片包含一个启动加载器和一个加载到其中的应用程序。 引导加载程序不需要保护,我希望通过UART向芯片发送命令,然后通过UART发送CSM密码,引导加载程序可以将其加载到0x 3F780,从而将芯片置于引导加载程序模式  

    密码加载到地址后,我是否能够将十六进制数据加载到闪存中? 以下是内存的快照

    这就是我现在所处的位置。 非常感谢您的帮助

    账单

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您的项目是使用controlSUITE开发的,则可以。 它在很大程度上与c2000ware兼容。

    您的引导加载程序的确切位置是什么?

    地址“0x3F780”似乎不正确。 您是指钥匙寄存器的地址AE0-AEF吗?

    我不明白您所说的“bootloader不需要保护”。 在该设备中,整个闪存是否受到保护。 我对流程图也不是很了解。 包含"将数据发送至程序3F7F80-3F7FF5"的框有什么作用? 了解我们的文档如果使用CSM,建议必须将这些位置编程为0,但它如何/为什么与启动闪存编程过程相关? 请您为流程图添加更多精确度吗? 具体而言,两个MCU之间交换了哪些数据,这些数据存储在何处,以及根据这些数据启动了什么操作? IOW,从开始到结束的闪存编程的顺序。 了解您正在寻找解锁部分的指导,但希望公平地了解您所想到的顺序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Hareesh,

    再次感谢您的回复。 下面是我的引导加载程序所在的位置:  

    内存
    {
    第0页:/*
    begin用于“boot to SARAM”bootloader模式*/
    
    begin :Origin = 0x0万,length = 0x0.0002万
    RAMM0 :原点= 0x0.005万,长度= 0x0003B0
    RAML0L1:原点= 0x0.8万,长度= 0x000C00
    重置 :原点= 0x3FFFC0,长度= 0x0.0002万
    IQTABLES:原点= 0x3FE000,长度= 0x000B50 /*引导ROM中的IQ数学表*/
    IQTABLES2:原点= 0x3FEB50,长度= 0x0.0008万C /*引导ROM中的IQ数学表*/
    IQTABLES3:Origin = 0x3FEBDC,length = 0x0000AA	/*引导ROM中的IQ数学表*/
    
    BootROM:origin = 0x3FF27C,length = 0x000D44
    
    
    page 1:
    
    boot_RSVD:origin = 0x0.0002万,length = 0x0.0004万E /* M0的一部分,引导ROM将使用此堆栈*/
    RAMM1 :原点= 0x0.048万,长度= 0x0.038万 /*片上RAM块M1 */
    RAML2 :原点= 0x008C00,长度= 0x0.04万
    RAML3 :原始= 0x0.9万,长度= 0x0.1万
    } 

    应用程序代码从0x0.088万开始,以CSM 0x3F7FF8结束,持续8个字节。

    Atmel微控制器发送一条命令进入引导加载程序,并开始向引导加载程序发送应用程序代码,然后引导加载程序将数据从应用程序代码所在的位置开始放入内存中。 发出重置命令,C2000启动至应用程序。  因此,两个处理器之间共享的数据主要是十六进制图像数据。  

    我要做的唯一事情就是防止有人将JTAG连接到器件上,并将C2000中的闪存代码从闪存中取出。 我希望在发送十六进制数据之前,当C2000位于启动加载器中时,我所要做的就是将一些数据发送到芯片上的正确寄存器并解锁器件,以便我可以发送其余的数据和 引导加载程序可以将其放置在正确的位置以运行应用程序。 如果这样做不起作用,您是否会打开屏幕共享会话或电话?

    谢谢  

    账单

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    能否发布整个链接程序命令文件(带有部分分配)? 是的,我可以接听电话或进行屏幕共享会话。