本帖最后由 1009109508 于 2013-9-23 11:36 编辑
DSP锁死解决办法相信有很多人都遇到过这样的问题:编了很久的项目终于在ram中运行通过了,但在往flash中烧写的过程中却出现了很多的问题。于是乎,我们各种上网查资料,各种修改cmd文件。结果一不小心,就把dsp锁死了。这时候你可能会纳闷,我并没有给dsp加密啊,为什么dsp会锁死呢?于是你又换了一片dsp,小心翼翼的重新下载。结果dsp又锁死了……后续的内容我就不再假设了。出现上述问题的原因,主要是因为对dsp的cmd文件和memory map不了解。言归正传,本文提供了一种dsp解锁的办法。其实相关的解决办法网上已经有了许多。我这里只是对其进行了补充和总结。并以我在做项目中遇到的问题为例进行具体说明。
首先,要想解锁你的dsp必须要有的两个文件:1.下载到dsp中的.out文件。2.工程项目debug文件夹下的.map文件。如果下载完之后你把工程项目修改并编译了。那么再将文件修改回来重新编译就行了。不用和之前的项目完全一样,只要cmd文件改回来基本就没问题。但是如果你将工程文件改的乱七八糟,而且还改不回来了。那这篇文章帮不到你了,估计除了
ti以外也没人能帮得到你。由上面的两个条件,也可以看出,这里的解锁dsp是必须要已知dsp的工程项目。并不是随便拿一块dsp就能解锁的。所以如果你想解锁他人的dsp并盗取别人的程序,那这篇文章也帮不到你。
能看到这里的人,应该就是我真正能帮到的人了。首先声明我用到的芯片是2812,这里也已2812为例。众所周知,2812中有一个代码安全模块(CSM)。它就像一个保险箱,保护我们的知识产权。但是如果没有用好就会给我们带来麻烦,比如开篇提到的问题。CSM模块由8个16位的单元组成,默认的各位全是1.当128位全为1的时候,说明器件时不安全的,并未受到密码保护。正常我们在调试固化的时候,应该是这种状态。通过查看dsp的memory map 我们可以看的,这128位密匙的起始地址为0x3F7FF8。也就是说正常情况下,从这一地址开始的128位应该为1才对。
这里我先介绍一下.map文件。MAP文件是dsp开发软件编译后产生的有关DSP用到所有程序、数据及IO空间的一种映射文件。有很多时候,我们仅靠错误和警告的提示信息并不能解决我们所遇到的问题。而这时候如果我们多关注一下.map文件往往能有意想不到的收获。不只是dsp,只要是程序运行的地方都会涉及的地址的映射问题。只要我们多多关注.map文件,往往都能找到程序运行错误的原因。没错!.map文件就是这么神奇。
好了,既然.map文件这么神奇。那我们就看一看2812的.map文件吧。这里我找到一个正常没有加密的.map文件打开。什么?你打不开.map文件。那是因为你打开的方式不对。跟着我做:右击.map文件,选择“用记事本打开”。看!这不是打开了嘛!
图(1)
我们可以看的这里明确的dsp的存储空间分为不同的块。上面明确写着各个块的起始地址、长度和使用情况。这里每一个块之所以被使用是因为下面将各个段分配到了这些空间中。下面各个段的分配情况我就不做截图了。大家只要打开自己的.map文件观看就行了。至于各个段和各个空间的分配。是和cmd文件的编写和memory map 是对应的。大家如果在这有什么疑问的话。去网上搜一下cmd文件的编写就行了。这个地方很重要,一定要把这个地方弄懂。这里我们重点看一下我选中的部分,看一下起始地址为0x003f7ff8,长度为8。每一个单元都有16位。也就是说这个空间总共长为16x8 = 128位。也就是说这就是我们前面提到的CSM模块。我们可以看到在正常的cmd文件中。这个区域被使用的单元应为0.如果你的dsp被锁住了。那么这个区域的使用单元肯定不是0.所以我建议在你下载你的程序到flash中时。最好先看一下这个地方是否被使用。如果被使用了,那么你就要注意了,是不是你主动使用的。如果不是的话,我建议你还是不要把文件固化到flash中。以免引起不必要的麻烦。当然了如果你已经将文件固化到flash中了。用我下面的方法,这个问题也能解决。
图(2)是一个不小心将dsp锁死的map文件,可以看的这是对应的CSM区域已经被使用了.
图(2)
DSP被锁住的原因有很多,但往往都是因为不小心把别的段存放的CSM区域所致。我就是因为这个原因把dsp锁住的。这里我创建了一个长度为0x00000002的.reset段,但并没有给其指定分配空间。于是它就被自动分配到PASSWDS这个空间了。图(3)是.reset段的分配情况。
图(3)
我们看一下这个段的起始地址就知道它被分配到了CSM模块,导致dsp锁死。这时我在想既然是自动分配空间,会不会是随机的呢?也就是说每次编译都会讲这个段分配到不同的空间。经测试它不是随机将一个段放到任意一个存储空间的,而是遵循了某种原则。为了验证这个原则我创建了一个长度为0x00000002的空间。但是依然没有给.reset段分配空间。结果和我想的一样。这是.reset段被分配到了我创建长度为0x00000002的这个段里。见图(4)图(5),图(4)为我创建的空间,图(5)是将.reset段分配到该空间中。所以dsp分配没有指定段的原则应该是:将没有指定存放空间的段放到能放下该段且存储空间最小的空间里。这也是一种优化原则。
图(4)
图(5)
以上分析了dsp锁住的原因,下面终于到了关键时刻——dsp的解锁。通过上面的分析我们知道,CSM模块的密码肯定存放在从0x3f7ff8开始的空间里。而我们下载到dsp中的.out文件肯定包含这部分的信息。所以我们只要打开.out文件,就一定能找到这一部分的信息。当然.out文件不像.map文件那样这么容易打开。我们需要借助一些工具。这些工具具体就是:1.ccs自带的hex2000.exe。2. windows操作系统。这两样东西我想大家都有吧。hex2000.exe其ccs自带默认路径为:..C2000cgtoolsbinhex2000.exe。更多有关此程序的命令选项请参考相关资料。通过以上两个工具,我们产生build.bat和build.cmd这两个文件。当然这两个文件在下面的附件中都有,大家只要会使用就行。
1. 用记事本打开build.bat批处理文件,内填写hex2000.exe在你电脑中的目录(里面有我电脑中ccs自带的路径,大家只要对应修改就行)。
2. 用记事本打开build.cmd命令文件。对应下面指令修改内容:
-memwidth 16 设定存储器格式为16bit ,不用管
-romwidth 16 设定rom格式为16bit&,不用管
-a 设定输出文件格式,填写你的.OUT名如我的是Eva_AD.out
-o 设定输出文件名,随便起个名字,是你得到密码的文件名
-map 设定输出映射文件,填写你的.map名 如我的是Eva_AD.map
-boot 设定引导数据流,不做操作
3. 然后将文件夹拷贝到ccs安装目录下(不知道不考行不行,没试过)
4. 打开ccs连接目标板
5.双击build.bat会产生一个记事本文件,打开用查找功能(ctrl+f)找到3F 7F F8。
6.再看一遍你的.map文件,看一下PASSWDS这个空间你使用了多少。如我是将这个区域使用了0x00000002.所以我就在3F 7F F8 后面找到8位十六进制数作为解锁密码。从低位到高位填写。其余保持为F不变。
7.恭喜你成功解锁!
下面是部分截图情况: