由于部分企业需要对芯片内部的程序进行加密处理,C2000提供了两种加密方式:一种是在工程中添加DSP28***_CSMPasswords.asm,一种是直接在CCS的on-chip flash中修改密码。这里以F28335为例,详细描述两种方式的操作方法:
添加CSM加密文件的方法
该方法是直接使用controlSUITE中提供的DSP28***_CSMPasswords.asm文件,将此文件加入工程中,修改其中的密码,与其他文件一起编译烧写即可。文件内容如下:
.sect "csmpasswds"
.int 0xFFFF ;PWL0 (LSW of 128-bit password)
.int 0xFFFF ;PWL1
.int 0xFFFF ;PWL2
.int 0xFFFF ;PWL3
.int 0xFFFF ;PWL4
.int 0xFFFF ;PWL5
.int 0xFFFF ;PWL6
.int 0xFFFF ;PWL7 (MSW of 128-bit password
.sect "csm_rsvd"
.loop (3F7FF5h - 3F7F80h + 1)
.int 0x0000
.endloop
对应的CMD文件中地址分配情况:
MEMORY
{
…
CSM_RSVD : origin = 0x3F7F80, length = 0x000076
…
CSM_PWL : origin = 0x3F7FF8, length = 0x000008
…
}
SECTIONS
{
…
csmpasswds : > CSM_PWL PAGE = 0
…
csm_rsvd : > CSM_RSVD PAGE = 0
…
}
按照上面的方法编译好后,你的程序已经加密好了,最后编译生成.out文件一起写入Flash中。
On – chip flash加密法
这个方法比较简单,烧写完毕.out文件后,在debug界面点击Tools - On-Chip Flash,在弹出的窗口中下拉找到Code Security Password的Key 1~7位置填入你要加密的密码,然后点击Program Password再点击lock就加密了,相当于对密码区写入你上面.asm文件中的内容。
关于解密:
同样以F28335为例:
1、配置芯片的GPIO 84~87引脚的电平状态为1100(也有说只针对key4~key7加密,即只加密高64位密码,则可以不用修改boot模式,直接连接JTAG解密,但本人没有验证过),使芯片进入Branch to check boot mode模式(详情可参考芯片Datasheet第106页,6.1.9 Boot ROM )。如果是TI购买的F28335 controlCARD(以R2.2版本为例),那么把controlCARD上SW2开关的1~4分别配置为1100即可。
2、打开CCS,连接芯片和PC,上电。配置target configuration(View - Target Configuration),配置完成后Test Connection一下,测试成功后进入下一步。(本来以为直接点击debug就可以了,但实验了几次发现一定要做一下这个步骤才行,否则没办法进入debug模式)
3、点击小虫子图标进入debug模式,进入之后如果显示没有连接JTAG的话先点击Connect Target连接JTAG,然后点击Tools - On Chip Flash,在On Chip Flash中的Code Security Password – Key 0~7中输入正确的密码,然后点击Unlock。这样就解锁了,系统会提示:
C28xx: GEL Output:
ADC Calibration not complete, check if device is unlocked and recalibrate.C28xx: Flash Programmer: Warning: The configured device (TMS320F28335), does not match the detected device (). Flash Programming operations could be affected. Please consider modifying your target configuration file.
C28xx: Starting device unlocking...
C28xx: Device unlocked. To clear the programmed password, please erase Sector A of Flash memory.
解锁成功后你就可以正常使用芯片进行烧写flash了。
4、如果你希望不更换程序但需要彻底解锁芯片(以后启动都不需要输入密码解锁),那么按照上述系统提示的“To clear the programmed password, please erase Sector A of Flash memory.”操作。接着刚才的步骤,跳到On Chip Flash中的Erase Sector Selection,选择Sector A(默认是全选的),然后点击“Erase Flash”。这样就去掉密码了,系统会提示:
C28xx: Erasing Flash memory...
C28xx: GEL Output:
ADC Calibration not complete, check if device is unlocked and recalibrate.C28xx: Operation completed successfully.
或者也可以把Code Security Password - Key0~7全部改为F,默认就是不加密状态。
以上就完成了芯片的解锁和清除密码操作了。
加密注意事项:
将128-bit全部设为1意味着不加密,即所谓的”unsecure”。
将128-bit全部设为0意味着永久加密,此时芯片不可被解密,即无法再操作flash,也无法读取其中的程序和数据。一般情况下,不要进行此设置。
DSP烧写过程中如果密码区被写入密码、烧写过程中受到干扰、电源不稳定、时钟不稳定等等原因都会导致芯片锁死。以上情况即为意外上锁,即你不知道密码的情况下,几乎是没有办法解锁的,只能考虑更换芯片。
PS:
最新的28004x、2837x等芯片中增加了双代码安全模块(DCSM),该功能支持将芯片中的memory划为两个独立区域,并设置各自独立的的128位CSM密码。该功能可以阻止未授权人员访问加密内容,进而有效防止您的代码被重复或逆向编译;与此同时,需要维护与升级的代码可以存储于另一个独立区域内,并授权给相关人员使用。详细的可以参考这篇FAE分享的blog: