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.

加密版的C6748 NAND FLASH启动问题

Other Parts Discussed in Thread: OMAP-L138, TMS320C6748, CC2541

尊敬的Tony Tang:

你好!目前我们正在使用TMS320C6748BZWT E 这款加密级DSP,按照常规的方式:使用CCS工程加载GEL文件通过nandflash例程烧写或者使用sfh_OMAP-L138.exe将AIS烧录到NAND FLASH或者使用CCS工程将经过SecureHexAIS_OMAP-L138.exe处理的AIS烧录到NAND FLASH,也是无法从NAND启动DSP,另外TI官网的bootloader是怎样配套应用程序使用的,期盼你的解惑,不胜感激!我的邮箱:www.hgw683@163.com,谢谢!

  • #1. 加密版的C6748是连不上仿真器的,所以你说的这个步骤是怎么实现的?是先用一个小工程通过UART启动打开JTAG了吗?

    #2. 加密版的C6748启动,要将.out通过.ini配置文件加入CEK转换成加密的AIS文件,再通过加密版的串口烧写工具写进NAND就可以启动了。不过这时的AIS没有跟芯片的KEK绑定,但是是可以启动的。

    #3. 如果要把AIS跟KEK绑定对于NAND启动有点复杂,因为要更新AIS头文件,要把整个block读出来,erase block,更新加密的header再写入NAND,否则会导致ECC错误而起不来。

    #4. 如果只是为了启动,则不需要绑定KEK这一步了。

    #5. 见过不少用E加密的芯片的,你们是打算用加密版的芯片,还是因为买错了?如果是买错了,建议跟你们的代理商协商看能不能换货。

    #6. 下面这个网页的内容看过了没?

    http://processors.wiki.ti.com/index.php/Basic_Secure_Boot_for_OMAP-L138_C6748

  • 尊敬的Tony Tang:

           你好!非常感谢你的及时回复!关于你在邮件提出的几点:

    #1. 加密版的C6748是连不上仿真器的,所以你说的这个步骤是怎么实现的?是先用一个小工程通过UART启动打开JTAG了吗?

    ----我们是通过一个小工程使用“GenericSecureUartHost.exe”进行解密后使用JTAG调试烧写的。

    #2. 加密版的C6748启动,要将.out通过.ini配置文件加入CEK转换成加密的AIS文件,再通过加密版的串口烧写工具写进NAND就可以启动了。不过这时的AIS没有跟芯片的KEK绑定,但是是可以启动的。

    ----我们使用的.ini配置文件如附件所示(应该不带CEK),使用的是GenericSecureUartHost.exe这个工具烧写到DSP内部RAM是可以运行,但是不是保存在NANDFLASH,断电后将无法工作,你在回复中提到“加密版的串口烧写工具写进NAND就可以启动了”,我们没有这个工具,能否提供给我?另外,我们的.out文件中不带二次加载的bootloader也不带GEL文件(不知道如何使用bootloader和GEL?),就算将AIS文件烧写NANDFLASH中,DSP会自动从NANDFLASH中读取AIS数据到DSP内存运行吗?

    #3. 如果要把AIS跟KEK绑定对于NAND启动有点复杂,因为要更新AIS头文件,要把整个block读出来,erase block,更新加密的header再写入NAND,否则会导致ECC错误而起不来。

    ----这个加密对于我们这个项目很重要,有没有详细的文档讲解“AIS跟KEK绑定”的操作?

    #4. 如果只是为了启动,则不需要绑定KEK这一步了。

    ----不仅仅是为了启动,也需要KEK(我也不知道这个KEK是什么)

    #5. 见过不少用E加密的芯片的,你们是打算用加密版的芯片,还是因为买错了?如果是买错了,建议跟你们的代理商协商看能不能换货。

    ----使用加密DSP是项目需要

    #6. 下面这个网页的内容看过了没?

    ----网页看过,但是不是很懂,你看能否提供一个.ini配置文件?


         目前项目至此卡住了,我们也是首次使用TMS320C6748 这款DSP,很多地方不懂,请你多加指导,谢谢!


            此致,

            敬礼!



    OMAP-L138_generic_secure.ini
  • #1. 第一步能从UART解锁JTAG,说明你的流程.out到AIS的转换通了,即ini文件的配置没有问题。

    #2.  encryptionKey=4A7E1F56AE545D487C452388A65B0C05就是你的CEK啊,这个key是由你指定的,可以随便改。

    串口烧写工具下载:

    http://software-dl.ti.com/dsps/dsps_public_sw/omap_l1x/omapl13x_c674x_generic_secure/latest/index_FDS.html

    链接都在前面的网页里:

    How to convert application image file into secure boot image?

    1. How to convert customer file into secure image?

    In the Secure boot and flashing utility package, we provide Secure_HexAIS utitility that converts a Hex file into a secure boot image that contains an unencrypted secure software header followed by an encrypted customer application.Details of this utility are discussed here:

    boot跟gel没有关系。二级boot对芯片来说都是用户的程序。

    既然你要用加密版的芯片,那么下面这个文档一定要看(2遍以上),真正的文档是里面的链接的文档,需要申请。

    http://www.ti.com/lit/an/sprabk7/sprabk7.pdf

    等你看了后有问题再讨论.

  • 尊敬的Tony Tang:

            你好!仔细看了你的复信,受益匪浅!

            我反复验证后发现通过“GenericSecureUartHost.exe”工具下载AIS文件,根本就没有写到NANDFLASH(通过NANDFLASH读取代码从block1的0page开始查看的),“GenericSecureUartHost.exe”这个工具下载AIS文件应该是下到DSP的内部ARM中了,所以一下载就可以运行,断电后就不能运行!另外,我通过比较不带加密的6748发现:使用工具“AISgen_d800k008.exe”后gel文件是配置到AIS里面的,感觉带加密的6748所使用的工具中就缺少这个类似这种加载gel文件的工具,同时“sfh_OMAP-L138.exe”这个通过串口专门用于写外部nandflash的工具也没有找到。

           综上,我们目前最棘手的问题是如何断电后能让DSP系统自动跑起来(代码保存在外部NANDFLASH),至于怎样加密以后再解决都行的。

           盼复,谢谢!

  • ganwen huang 说:
    GenericSecureUartHost.exe

    这只是个UART boot的工具,不是烧写工具,是从UART 下载AIS文件到芯片上的RAM或DDR运行,因为芯片支持UART boot。跟烧写没有一点关系。

    AISgen_d800k008.exe的GUI界面里可以加入各外设的配置参数如DDR, PLL 等,而不是gel文件,对于加密版的这个工具是SecureHexAIS_OMAP-L138.exe,配置参数放在.ini文件里(如果你的程序要跑在DDR上,记得要在ini里把DDR的参数填对)。你在用GenericSecureUartHost.exe下载一个小的程序解锁JTAG时,这个小程序就要用这个工具转换成AIS的啊。

    用SecureHexAIS_OMAP-L138.exe转换完的ais文件,再用烧写工具写到flash即可。这个烧写工具跟unsecure的工具是一样的,所以要选将JTAG解锁,连上仿真器,运行CCS的NAND writer,将这个AIS烧入即可了。


  • Tony Tang:

             你好!按照你昨天提供的方式实现了一个小LED灯的程序从NANDFLASH正常启动,断电后也可以正常运行。但是UART、I2C, SPI、EMIFA、TIME、EDMA等外设还是无法使用,试着更改了.ini文件的一些配置仍然无法解决,能否提供一份.ini配置文件给我,谢谢!

  • 首先你已经取得了很大的进展了,能boot起来了。

    我觉得你如果问如何在启动后让UART、I2C, SPI、EMIFA、TIME、EDMA等外设能正常使用更好。

    外设不能用应该是因为PSC没使能相应的外设,在ini文件里有相应的说明:

    ; This section should be used to setup the power state of modules
    ; of the two PSCs. This section can be included multiple times to
    ; allow the configuration of any or all of the device modules.
    ; |------24|------16|-------8|-------0|
    ; LPSCCFG: | PSCNUM | MODULE | PD | STATE |
    ;[PSCCONFIG]
    ;LPSCCFG = 0x01030003

    比如下面代表使能PSC1的10号外设即SPI1。

    [PSCCONFIG]
    LPSCCFG=0x010A0003

    相应的可以照着使能其它外设。

    [PSCCONFIG]
    LPSCCFG=0x00030003    ; PSC0的3号外设EMIFA

    你是怎么修改的ini呢。

  • 你好,关于#3我有一个疑问,AIS与KEK绑定需要运行SK,那么此时是无法通过仿真器进行NANDFLASH的读取的。

    那么请问一下,此时如何对block进行读操作?需要额外的工具么?

    期待你的回复,谢谢!

  • 不需要通过JTAG,只是做一个专门的工程,从UART启动,读取head,调用ROM的API将head的CEK用KEK加密后再写回NAND,这样你的NAND里的文件就与芯片绑定了,即使将NAND的内存全盘复制到别的板子上的NAND也用不了。

  • 感谢你的回复,完美的解决了我的问题!

    不过,关于这个问题为什么在手册里面没有进行详细的说明呢?还是说我没有查阅到正确的手册?

  • http://processors.wiki.ti.com/index.php/Basic_Secure_Boot_for_OMAP-L138_C6748#How_to_do_secure_boot_from_NAND_flash.3F


    How to do secure boot from NAND flash?

    EVM board has SPI flash for secure booting, but how can I boot my custom secure board from NAND flash ?

    We have to use "NAND_readPage" function to read unencrypted headers. We would face read/write ECC error due to updating the secure headers into flash (updating encrypted headers without doing block erase), we have to take a backup the whole block before updating with encrypted headers then we can erase the block and able to update the secure encrypted headers into the required block of NAND flash.

    Note that we have to create the buffer with Uint8 for "NAND_readPage" function and need to cast to Uint32 for required headers assignment.

  • Dear Tony Tang 请教一下,bootExitType = SECUREWITHSK 时可以操作外设吗?
    我现在遇到的问题是当 bootExitType = NONSECURE 时,通过 “GenericSecureUartHost.exe”工具可以正确加载程序,
    也可正常控制GPIO点亮LED,通过仿真器载入符号后,可以正常调试。
    但是当 bootExitType = SECUREWITHSK 时,通过 “GenericSecureUartHost.exe”工具可以正确加载程序,
    但是不能控制GPIO点亮LED,通过仿真器载入符号后,可以正常调试,也可以看见加密后的CEK,但是程序执行点亮LED的语句时确没有作用,这是为什么呢?

  • 是不是配置文件最后一句配置有什么影响,把你的ini文件传上来看一下吧。

    [TAPSCONFIG]
    TAPSCFG = 0x0000FFFF

  • 您好,目前我们使用OMAPL138EZWTA3E这款cpu,用串口解锁之后,使用NORFLASH启动。

    将程序烧写进NORFLASH之后,发现CPU能够正确搬移代码到DDR,但是运行的时候是DSP在运行。而不是ARM.

    而CPU手册上说的是启动顺序是系统上电->DSP启动ARM->DSP休眠->ARM根据启动模式来读取NORFLASH->ARM跳转

    这个怎么改动,还是说就是dsp启动

  • 加密版板的L138是DSP先启动。由用户的DSP程序再启动ARM。与非加密版的是相反的,因为加密只针对DSP。

  • Tony Tang,

    您好!

    我们公司的产品也要用NandFlash进行Secure Boot,目前正在搞这一块,也折腾了好几天了。看了您的回答,还有有些没搞明白。希望得到您的指教 。

    因为文字较长,为了能够精确地进行交流,我将问题分解成了许多小问题。给您添麻烦了!

    Q1:所以如果要用NandFlash进行Secure Boot,应该的步骤是:

    Step1. 用SecureHexAIS_OMAP-L138.exe这个工具,生成Secure AIS文件。其中,CEK放在ini里,并且启动的配置(如PLL、DDR、PSC等的配置)也是放在ini里,而不像Nosecure AIS那样,是直接在AIS文件里的。Q1.1:STEP1对吗?

    Step2. 用GenericSecureUartHost.exe这个工具,解锁JTAG,并在CCS中加载Nand Writer程序。Q1.2:STEP2对吗?

    Step3. 用Nand Writer程序将Secure AIS文件烧写到Nandflash中。此时,Nandflash中的Key Header是未经过KEK加密的。Q1.3:STEP3对吗?

    Step4. 用GenericSecureUartHost.exe这个工具,加载一个自己写的程序。该程序从UART启动,读取head,调用ROM的API将head的CEK用KEK加密后再写回NAND。此时,Nandflash中的Key Header是经过KEK加密的。Q1.4:STEP4对吗?

    Q2:我不太理解,虽然Step4,用KEK加密了CEK。但是Nandflash中的AIS文件的剩余部分,就是除了Key Header的其他部分,并没有用KEK加密啊。Q2.1:对吗?

            在Step1中,SecureHexAIS_OMAP-L138.exe用来生成Secure AIS文件。但是该工具并没有办法利用具体芯片上的KEK进行加密。

            难道是SecureHexAIS_OMAP-L138.exe仅仅用CEK对整个AIS文件进行加密,而KEK的唯一作用是对Key Header进行加密,从而隐藏CEK?Q2.2:对吗?

            那么如果别人知道CEK的话,就可以直接对Secure AIS的剩余部分进行解密。Q2.3:对吗?

            或者如果别人知道KEK的话,就可以对Key Header进行解密,从而获得CEK,从而再对Secure AIS的剩余部分进行解密。Q2.4:对吗?

    Q3:我们希望产品的代码收到严格保护,另一方面,又希望产品的固件能够远程升级。

           我们系统的架构是C6748+CC2541,两者通过SPI进行通信,CC2541提供蓝牙与手机进行通信。希望通过手机将新的DSP固件更新至DSP的nandflash。并且使用Basic Secure Boot来保障新的固件的安全。

           我想了很久,觉得这似乎办不到。远程升级的话,如果还想加密固件,就得把CEK发过来,CEK总归要先显示地写入到Nandflash中(此时CEK就暴露了),再去调用API将Key Header加密。Q3.1:您看是这样吗?

           Q3.2:如果要同时实现DSP固件更新和Basic Secure Boot,您有什么建议?

           

           为了便于更多人看到这个问题帮助回答,我在本版发了个新帖。

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_dsp/f/32/postpendingmoderation.aspx

           Secure Boot及远程升级对我们产品至关重要,麻烦TI的工程师给予帮助。

           非常感谢!

    Frank

  • Tony Tang,

         您好!

         我也想问bootExitType = SECUREWITHSK与bootExitType = NONSECURE到底有什么区别?

         文档上说“The only circumstance where the SECURE_WITH_SK option is useful is when the key header data needs

    to be encrypted so that it can be used in future secure boots. ”

         我想用KEK加密Key Header,以保护产品中flash中的内容。因此是不是就SECUREWITHSK就行了?

         还是说在用KEK加密Key Header之后,需要将bootExitType由SECUREWITHSK再改回为NONSECURE?

         谢谢!

    Frank

         

  • 我看到广州创龙的论坛上有个介绍写的挺详细的你可以看看。

    加密版TMS320C6748 DSP处理器加密原理及使用详解。

    http://51dsp.net/forum.php?mod=viewthread&tid=1244&extra=page%3D1

  • Feng Xu3 说:

    我也想问bootExitType = SECUREWITHSK与bootExitType = NONSECURE到底有什么区别?

         文档上说“The only circumstance where the SECURE_WITH_SK option is useful is when the key header data needs

    to be encrypted so that it can be used in future secure boots. ”

         我想用KEK加密Key Header,以保护产品中flash中的内容。因此是不是就SECUREWITHSK就行了?

         还是说在用KEK加密Key Header之后,需要将bootExitType由SECUREWITHSK再改回为NONSECURE?

    对,只是在需要调用secure kernel的API的情况下才需要选择bootExitType = SECUREWITHSK. 所以用KEK加密CEK head的这个专门的小程序需要用这种模式,

    加密完的head只是用来更新原来的head而已,原来的还是原来的模式,并不存在改回来的说法。

  • Hi Tony Tang,

        你好!

        我再整理一下:

        就是,如果不需要加密CEK,只要启动。那bootExitType = SECUREWITHSK或NONSECURE都可以。

        如果要加密CEK,那bootExitType = SECUREWITHSK。

        我如果要保护产品的CEK。肯定要在最后发布的程序前面,加上“加密CEK的小程序”。那么必然是在ini中配置bootExitType = SECUREWITHSK。

        对吧?

        谢谢!

    Frank

  • Hi GC:

        非常感谢你给的链接,上面整理的蛮清楚的,非常有用!

    Frank

        

  • Feng Xu3 说:
    我如果要保护产品的CEK。肯定要在最后发布的程序前面,加上“加密CEK的小程序”。那么必然是在ini中配置bootExitType = SECUREWITHSK。

    这只是在读head加密CEK的小应用程序里需要做的,跟发布程序无关。

    简单两说分为两步:

    #1. 第一步生成未加密CEK的 head + 用CEK加密的用户代码。写到flash.

    #2. 第二步用小应用程序读未加密CEK的 head,并用KEK加密未加密CEK的 head,写回flash。

    此时flash上是: 用KEK加密的CEK head + 用CEK加密的用户代码

    后续如果需要更新代码升级之类的,只要CEK没变,则用KEK加密的CEK head也不需要更新,只需要更新用CEK加密的用户代码,所以只要保护好自己的CEK不要让人知道。

  • Hi GC,

        谢谢你提供的链接,这个帖子里提到了“创龙修改好的ini文件”及“创龙提供的程序”,我有创龙的开发板和光盘,可是始终没有找到提到的文件和程序。

        在该帖子下面发文问创龙也没人回。

        冒昧地请问,你有没有创龙提供的secure boot的ini文件和程序啊?

        谢谢!

    Frank

  • 可以找他们技术支持要的吧。

  • Hi Tony Tang,

        我成功用SecureHexAIS_OMAP-L138.exe将程序从串口下载到-E芯片里了,并且我ini文件里设置了 BootExit type as NONSECUREand TAPCFG= 0x0000FFFF。

        

        然后我启动CCS,并选择LED工程点击debug,运行显示:

        请问是什么原因啊?

        0xB000 0000 这块是DDR2/mDDR Control Regs,不知道为什么会访问不了。

        谢谢!

       附上我的ini文件

    Frank

       

  • 第一个图中的步骤就是加载GPIO_LED2m的工程并运行。我看这一步是成功的,这一步后灯闪了吗?

    第二步是打算要做什么?

  • 貌似把芯片复位一下就可以了。

  • Hi Tony Tang,

         第一步是成功的,灯闪了,但是灯闪的速度很慢。似乎PLL0没有成功配置。

         我在这个帖子里描述了这个问题:http://www.deyisupport.com/question_answer/dsp_arm/c6000_dsp/f/32/p/116078/318073.aspx#318073

         第一步解锁了JTAG,我第二步是想从CCS进入DEBUG,从而好加载Nandflash_Writer程序。

         但是发现,进不了DEBUG。

         谢谢!

  • Hi GC,

        可是复位一下,之前就白解锁了。

        我试着按了下复位键,然后再尝试进入debug,就出现了

        Error connecting to the target:

        Connect to PRSC failed

        只是和之前不解锁直接进debug报的错一样。

    Frank

  • Feng Xu3 说:

    可是复位一下,之前就白解锁了。

        我试着按了下复位键,然后再尝试进入debug,就出现了

        Error connecting to the target:

        Connect to PRSC failed

        只是和之前不解锁直接进debug报的错一样。

    Frank

    复位后当然就恢复芯片初始状态了,这还用试吗?

  • Hi Tony Tang,

        是的。

        我也是没找到解决方法,所以啥都试试了。

        求帮助。

    Frank

  • 你的配置PLL0本来就低,不知道你调试时的PLL0配置是不是也是这样的值?

    ; |------24|------16|-------8|-------0|
    ; PLL0CFG0: | CLKMODE| PLLM | PREDIV | POSTDIV|
    ; PLL0CFG1: | RSVD | PLLDIV1| PLLDIV3| PLLDIV7|
    ;[PLL0CONFIG]
    ;PLL0CFG0 = 0x00130001
    ;PLL0CFG1 = 0x00000104
    PLL0CFG0 = 0x00120101
    ;| 0 | 19 | 1 | 1 |
    PLL0CFG1 = 0x00010309
    ;| 0 | 1 | 4 | 10|

    假设你的输入时钟也是24MHz, CPU=(24x13)/2/2=78MHz.

  • 拨码开关设置为串口BOOT模式,按一下复位按键(不要断电),好像是可以连接仿真器的。

  • Hi Tony Tang,

          我测试时先用的PLL0CFG0 = 0x00130000、PLL0CFG0 = 0x00120101都试过的。都很慢。

          PLL0CFG0 = 0x00130000,就是19倍频,我24M晶振,就是456MHz。

          但是出来还是很慢,跑马灯几十秒闪一下。

          我另一块板上面配的非加密芯片,PLL也设置的19倍频,跑马灯1秒闪一下。

    Frank

      

         

  • Hi GC,

        感谢回复!

        我是设的串口BOOT模式,按复位键,没用。一复位,解锁就白解了。

    Frank

  • 晕,我突然短路了,这个12是0x12。

    你可以在代码里加上PLL0的配置来验证一下,最终生效的是代码里的配置。

  • 您好,我想知道您的DSP输入晶振是多少,我的芯片用串口启动实现不了,显示BOOTME RECEIVED,但是最后显示read error,这是怎么回事