一:实际需求
某个检测设备用到MSP430F5529,希望对代码进行加密,不容易被别人看到源码,同时也需要具备现场软件更新能力。
二:实现原理
MSP430有多种方式下载程序,例如通过CCS软件+MSPFET调试器(SBW),或通过UART口,或通过MSP430的USB口更新程序。
其中MSPFET调试器是在CCS环境编译、链接、下载的,是可以接触到源码的,所以,要进行代码加密,第一步要进行源码和执行文件(BIN、TI-txt)的分离,(TI有个自己的特殊执行文件格式TI-txt),也就是让现场的人只接触到可执行文件,通过MSP430的bootloader将执行文件通过串口或者usb口将执行文件烧录进msp430,从而实现加密的情况下的现场更新。
另外说下msp430系列的加密区别,见下图。
其中利用密码访问的最方便,只需要设置密码,每次jtag访问的时候输入对应的密码就可以更新程序。大多数MSP430器件都有一个电子保险丝(e-Fuse),通过设置密码,可以锁定JTAG/SBW接口。加密并使能后,将无法再通过JTAG或SBW来访问器件。在这种情况下,只能通过设置密码保护的引导加载程序来访问器件。可以利用BSL来重新访问器件并清除JTAG签名,但这样需要输入正确的BSL密码或者批量擦除器件。
如果我们只是实现加密和更新功能,其实可以不用记得密码!只需要每次擦除器件,然后引导下载新的执行文件就行!
补充说明下,密码是和中断向量有关的一段地址区间,如果用了很少的中断,那密码会比较简单,需要手动改的复杂些,不然容易被破解。另外如果只是加密也无需后续更新,可以通过禁用BSL实现。
三:实现过程
我是MSP430F5529芯片,是具备USB口的,同时也是具备e-Fuse的,所以我是通过USB口进行现场升级程序的,硬件上大概是如下设计。PUR的按键是固件升级按钮,当按着按钮再插入USB的时候会支持软件更新。
关于如何使能e-Fuse,无法再通过JTAG或SBW来访问器件,TI有个Uniflash软件,里面可以一键加密。
加密了之后,硬件也具备了USB口,这时候就是怎么现场更新了。TI的提供了软件如下图,但是好像官方不在支持更新了,也可以下载到这个软件的源码,但是我用VS就是编译不过。。。
另辟蹊径,发现有个Python方式,其中有个带UI的界面的如下图,另外还可以通过敲命令实现。
我选择了敲命令的方式,具体步骤如下:
1、安装python 2.6 安装 Scripts
首先官网上下载安装包:https://www.python.org/downloads/windows/,目前最高只有 Python2.6.6 版本了可下载了。下载安装成功后,将安装路径添加到系统环境变量中。
2、但是发现没有Scripts 目录,下载 ez_setup.py 进行安装,将压缩包放置到python安装路径并解压,终端cd到解压后的路径,执行 python2 ez_setup.py,报错:urllib2.HTTPError: HTTP Error 403: SSL is required。
3、手动下载 distribute-0.6.28.tar.gz,解压
4、切换到 distribute/ 目录中,执行 python2 setup.py install,至此 Script 安装完成。
添加环境变量
5、分别安装pyserial 和pywinusb(解压,cd到路径python setup.py install )
6、最后安装python-msp430-tools-0.9.2
————————————————
配置好环境后,如何下载TI-txt文件
- 按win+R 调出CMD窗口
- 切换到保密盘路径 比如G: 回车
- 输入dir 看路径下的文件,通过cd XX进入放置txt文件夹
- 执行 python -m msp430.bsl5.hid -e “XXXXXXXXXX.txt” 清除并下载
- 打印programming ok 即为成功
最后补充说明下,为了能够更新过一次之后再能通过USB口更新程序,新程序里面需要保留对USB口的调用,我是利用USB实现的虚拟串口上报调试信息,MSP430的USB口记得是5种用法,有单独的说明文档,有机会再更新。