Part Number:TMS320C6748Other Parts Discussed in Thread: OMAP-L138
目的:编写一个辅助加密版TMS320C6748的烧录程序,退出模式为SECUREWITHSK(因为要加密UserKey),辅助程序运行在128K共享RAM里,实现串口启动辅助烧录程序并通过串口接收要烧录的程序数据,接收的数据存放在DDR2里,然后调用加密函数根据KEK加密CEK在内的UserKey,最后将完整数据烧录到NandFlash,完成加密版C6748的加密烧录工作。
问题:当bootExitType = SECUREWITHSK,串口接收完毕烧录的程序数据,Debug暂停查看数据结构时,发现数据异常。
分析:疑似跟INI文件里IOPU的配置有关,但是IOPU的资料极其缺乏,仅能从零星的几个英文回复里找到一些信息,描述IOPU的文献《Memory_Protection_03_2012_v01.pdf》更是没有获取渠道,没辙,只好发此贴求助这个10年老芯片。
我的问题与英文论坛里此链接反馈的问题一致,但是回复里面并未找到解决办法:e2e.ti.com/…/ddr-problem-with-secure-device-in-secure-mode
San Zhang:
我使用的INI文件
SecureWithSK_ZZY.zip
,
Nancy Wang:
邮件中看到了您之前的回复,请问问题解决了吗?
,
San Zhang:
并没有,是我自己搞错了退出模式,跟IOPU4无关
,
Tony Tang:
bootExitType = SECUREWITHSK的bin文件跑起来后,能用JTAG通过CCS查看内存数据?
,
San Zhang:
能,数据存放在L2RAM,通过JTAG查看是正常的;放在DDR2,通过JTAG查看就不正常了,上面有图。因为要烧录到NandFlash的程序大小超过了256K,所以我想存放在DDR2,加密完头部,再从DDR2写入到NandFlash,但是放在DDR2却是这样的异常
,
Tony Tang:
可以先用NONSECURE模式解锁JTAG, 通过JTAG用通用的flash writer将用CEK加密后的bin写到flash里,再将binidng app以SECUREWITHSK模式启动读出flash的header,用KEK加密再写回flash.
,
San Zhang:
这样就太麻烦了,一:要连接JTAG使用CCS运行通用flash writer.out,需要专业人士来操作烧录工作;二:切换退出模式需要再次上下电;
目前大于256KB的bin文件要烧录和加密,我想过这样来完成烧录和加密工作: “先调整为串口启动,第一次上电,通过串口启动以NONSECURE模式运行程序1,程序1通过串口接收用CEK加密后的bin写到flash里,然后断电第二次上电,通过串口启动以SECUREWITHSK模式运行程序2,读出flash存放header的block,用KEK加密后再写回flash,最后把调整为flash启动” 。还是有点麻烦,希望解决DDR2数据异常的问题。
小于256KB的bin文件要烧录和加密我已经能实现以下流程: “先调整为串口启动,第一次上电,通过串口启动以SECUREWITHSK模式运行程序3,程序3通过串口接收用CEK加密后的bin,读出bin的header,用KEK加密,然后整体写入flash,最后把调整为flash启动” ,这个流程我在L2RAM已经能实现,目前的问题就是当bin超过256KB转存到DDR2上时,数据是异常的。
,
Tony Tang:
San Zhang 说:目前大于256KB的bin文件要烧录和加密,我想过这样来完成烧录和加密工作: “先调整为串口启动,第一次上电,通过串口启动以NONSECURE模式运行程序1,程序1通过串口接收用CEK加密后的bin写到flash里,然后断电第二次上电,通过串口启动以SECUREWITHSK模式运行程序2,读出flash存放header的block,用KEK加密后再写回flash,最后把调整为flash启动”
这样是可以的。我看到的binding过程的建议都是这样分两步的。只是TI没有提供“程序1”,只提供了通过JTAG烧写的CCS工程。原理是一样的。
你的第二种方法里是怎么查看DDR上的数据的?
,
San Zhang:
1、使用“SecureHexAIS_OMAP-L138.exe”工具生成解锁JTAG和以SECUREWITHSK退出模式的bin文件,使用的是空白的out文件和简化后的ini文件;
2、使用“GenericSecureUartHost.exe”工具进行串口启动,使用的文件是第1步生成的bin文件;(此时已解锁JTAG)
3、使用“CCS 5.5版本”,Debug程序3工程,使用的gel文件是我根据官方gel文件和自己的板子硬件修改得来的;
4、PC通过串口助手发送第1步生成的bin文件;
5、CCS暂停程序3,可以看到unAppData起始地址是0xC010 0000,这是DDR2的映射范围,我的DDR2是256MB,是在有效范围内的;
6、查看unAppData的数据结构内容,对应MagicWord应该为0x41504954,代表AIS启动的标记,但在异常情况下显示0x0005A120,同理数据结构里其它数据也是错误的。
,
Tony Tang:
secureboot_test.ini
在你的ini文件里没有看到DDR的配置,参考附件的ini文件。
,
San Zhang:
加和不加都一样出错,INI文件我也试过加上DDR配置,而且Debug时的软复位后加载gel文件会重新初始化DDR,目前我需要的资料是关于IOPU的解释,我现在遇到的问题跟IOPU的配置有关联,我怀疑是IOPU设置不对,保护了DDR不给访问,我查遍了互联网都找不到[IOPUCONFIG]段的参数解释
,
San Zhang:
C6748_ZZY_SecureWithSK.zip
这是我完整的INI文件
,
Tony Tang:
关注一下我发的那个ini文件里的这个注释。可能跟这个有关系,试一下吧。
[EMIF3DDR]PLL1CFG0 = 0x18010001PLL1CFG1 = 0x00000002DDRPHYC1R = 0x000000C5SDCR = 0x00134832SDTIMR = 0x264A3209SDTIMR2 = 0x3C14C722SDRCR = 0x00000492CLK2XSRC = 0x00000000
; This section allow setting the MPU1 or MPU2. If the ; rangenum is out of the allowed range then all the ranges; (including the fixed range) take the start, end, and ; protection values.; |——24|——16|———-8|———-0|; MPUSELECT: | RSVD | mpuNum | rangeNum |; STARTADDR: | startAddr |; ENDADDR: | endAddr |; MPPAVALUE: | mppaValue |;; This MPU control must happen after the DDR init or else the; MPU control has no effect[MPUCONFIG]MPUSELECT = 0x000002FFSTARTADDR = 0x00000000ENDADDR = 0xFFFFFFFFMPPAVALUE = 0xFFFFFFFF