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.

[参考译文] TMS320C6748:仅在调试器中软件复位状态0x0001000C

Guru**** 657500 points
Other Parts Discussed in Thread: OMAP-L138
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1123242/tms320c6748-software-reset-state-0x0001000c-only-in-debugger

器件型号:TMS320C6748
主题中讨论的其他器件:OMAP-L138OMAPL138

大家好、支持、我已经实现了软件复位、它在使用 CCS 调试器时可以工作、但如果没有 CCS 交互、它不能实时工作。  请帮助说明我为何遗漏或遗漏了什么。  这里是代码、下面是硬件套件参考。

#define RSCTRL 0x01C110E8 // RSCTRL 寄存器(复位)
volatile unsigned int* rsctrl =( unsigned int*) RSCTRL;

* rsctrl = 0x5A69;//键解锁

*rsctrl &=~(1 << 16);//断言复位位位

在调试器中、寄存   器的状态变为0x0001000C、但是在硬件上、它从不会进入0x0001000C、它保持在0x00010003。

我使用的硬件是 C6748 LCDK。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您正在使用调试器单步执行代码、其中调试器读取 寄存器并   在写入 0x5A69值后显示0x0001000C 的值。   在写入1到位16之前、您可以看到寄存器值变为0x0001000C。 这使您能够在复位 器件之前查看寄存器解锁状态。

    当您在不单步执行的情况下运行代码时、这两个操作都非常快速、因此会发生解锁、并且您会立即 重置器件。 复位会使器件返回其初始 状态、 此时寄存器被重新锁定。 因此 、如果您在复位后尝试查看寄存器、您将读取0x00010003的值。

    此致、
    Paul  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Paul、谢谢大家、我是对的、我可以在调试器中看到寄存器的内容、但是当我在硬件上运行相同的代码时、我会刷写硬件、 和从 NAND 启动时、同一代码无法从执行相同过程的寄存器获取0x0001000C。  您是否知道硬件(不插入调试器)的运行方式为何不同。  马萨

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Paul、 我希望我们能够找到解决方案、因为我的产品需要此功能进行固件升级设计。  在调试器中、应用程序可以 正确设置0x5A69密钥、寄存器读回结果为 0x0001000C。  此外、当使用同一调试器重新加载代码时、我们可以在 RSTYPE 寄存器中看到0x00000004。  但是、在刷写后、在目标上运行的代码在对寄存器进行写操作的相同0x5A69进行读回时仍然显示 0x00010003。  要执行固件升级、我们可以跳转到引导加载程序、并具有某种刷新系统的感觉、但是、我们希望软件复位能够正常工作。  我们需要读取 RSTYPE 以查看是否发生了软件复位、否则、我们将不知道是否请求了固件升级。  我们还希望 了解如何更好地实现这一目标、我的理解是软件复位是最好的方法。  再次感谢您、Marsha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Paul、您好、我对这么多帖子深表歉意。  我想知道调试器/CCS 中是否有需要对 CCS 创建的.out 文件执行的设置。  我们的应用可能需要更多代码。  我们使用版本10 (CCS)创建了 RTSC 应用程序、没有什么特别之处。  我们不使用链接器 cmd 文件、因为我们使用.cfg 文件中针对 RTSC 工程的设置来进行存储器设置。  我们将 OMAP-L138_LCDK.gel 文件用于 C674x_0初始化脚本。  再次感谢您、Marsha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据原始帖子中显示的代码、我看不到您在等待寄存  器解锁的位置、然后再将0x1写入位16。  您需要插入一个 while 循环、等待寄存器解锁、然后再将 0x1写入位16。

    如果您等待并在  先前 解锁时将0x1写入位16后读取 rsctrl 寄存器、则始终读取值0x3。

    此致、
    Paul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Paul:

    感谢您花时间作出响应。  我看到一封来自 TI 的电子邮件、询问是否已解决、我单击"否"、即在我今天看到您的帖子之前、我希望您仍能与我合作。  

    我最初在这里放置了一个 while 循环、寄存器从不会变为0xC、while 循环一直运行、读取并看到0x3。  这个 while 循环肯定在代码将0x1写入位16之前。  我甚至在这里放置了一个 while 循环、在将0x1设置为位16之前、该循环等待了几秒钟、但它仍然不执行软件复位。   

    提示:从 NAND 运行的硬件上的 RSTYPE 也不会报告正确的值、它总是报告0x1。  使用调试器时、它会报告正确的值。

    为什么读取 PLL 0x01C110E4在从 NAND 引导的硬件上始终提供相同的答案?  PLL 寄存器在某种程度上是只读的、这就是 为什么0x5A69不能解锁的原因。   调试器已经具有代码所需的其他更高权限吗?

    下面是一些数据收集、希望您能帮助我了解我们迫切需要正确设计固件升级功能的产品。

    马萨

    从 NAND 运行、循环永远等待0xC。

    调试器加载后运行、while 循环一次并获取0xC

    这是简单代码、后跟 调试器中正在读取的 RSTYPE PLL 寄存器的更多屏幕截图。  这证明了代码是正确的、(对吧?) 那么,为什么从 NAND 引导的硬件总是提供0x1呢?  (在我们开始工作以软件复位 PLL 控制寄存器之前)??

    static uint8_t gbootMODE = 'B';
    
    static void (*blEntry)();  // bootloader entry
    #define BL_ROM 0x11700000 // BOOTLOADER ROM location
    volatile unsigned int blrom = ( unsigned int )BL_ROM;
    #define RSCTRL_ 0x01C110E8 // RSCTRL register (reset)
    volatile unsigned int *rsctrl = ( unsigned int *)RSCTRL_;
    #define PTSTAT_ 0x01C11128 // PTSTAT Power Domain Transition Status Register
    volatile unsigned int *pstat = ( unsigned int *)PTSTAT_;
    #define RSTYPE_ 0x01C110E4 // RSTYPE local Reset Type Status Register
    volatile unsigned int *rstype = ( unsigned int *)RSTYPE_;
    
    
    int main(void)
    {
        CSL_PllcHandle pll0_handle;
    
        Board_STATUS status;
        Board_initCfg boardCfg;
     
        /*                            */
        /* Initialize Board System    */
        /*                            */
        boardCfg = BOARD_INIT_MODULE_CLOCK |
                   BOARD_INIT_PINMUX_CONFIG |
                   BOARD_INIT_UART_STDIO;
    
        status = Board_init(boardCfg);
        if(status != BOARD_SOK)
        {
            System_printf(" Board Init FAILED!!!\r\n");
        }
    
     
    
     
    
        /* Send the message to UART console */
        UART_printf("Program Reset! [%c]\n", gbootMODE);
          
    
    
        pll0_handle= CSL_PLLC_open (0);
        printf(     "RSTYPE %08X\n", pll0_handle->RSTYPE);
        UART_printf("RSTYPE %08X\n", pll0_handle->RSTYPE);
        printf(     "RSTYPE %08X\n", *rstype);
        UART_printf("RSTYPE %08X\n", *rstype); 
    
     
        /* Reset the WDT upon any character input */
        while(1)
        {
    
    
    
    
            /*
            ** Wait for an input through UART. If no input is given, the WDT 
            ** will timeout and reset will occur
            */
            gbootMODE = UART_getc();
            printf(     "Global Boot Mode [%c]\n", gbootMODE);
            UART_printf("Global Boot Mode [%c]\n", gbootMODE);
    
            if (gbootMODE == 'r')
            {
                printf(     "Assert SW Reset [%c]\n", gbootMODE);
                UART_printf("Assert SW Reset [%c]\n", gbootMODE);
    
                gbootMODE = 'U';
                printf(     "Global Boot Mode [%c]\n", gbootMODE);
                UART_printf("Global Boot Mode [%c]\n", gbootMODE);
    
    #if 1
     
    
    
    
                HWREG(0x01c110e8) = CSL_PLLC_RSTCTRL_VALID_KEY;
                while (1)
                {
                    printf(     "RSCTRL %08X\n", *rsctrl);
                    UART_printf("RSCTRL %08X\n", *rsctrl);
                    if (*rsctrl == 0x0001000C)
                    {
                        break;
                    }
                }
                
                // I also tried this while loop without the printing while 
                // loop above, still does not work
                //   for (i=0;i<1000;i++);
                
                HWREG(0x01c110e8) = ~(CSL_PLLC_RSTCTRL_SWRST_MASK);
    
    
     
    #endif
            }
     
        }
    }

    从 NAND 启动、查看串行控制台、无论复位类型如何、我们仍然读取的 RSTYPE 为0x1??  此屏幕显示热重启和硬重启,当然不会进行软件重置(输入'r',请参阅代码),以要求进行软件重置,因为您将看到另一个重复0x3....的屏幕 ??

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Marsha、您能否发布代码中此部分的反汇编

    HWREG (0x01c110e8)= CSL_PLLC_RSTCTRL_VALLED_KEY;
    while (1)

    printf ("RSCTRL %08X\n"、* rsctrl);
    UART_printf ("RSCTRL %08X\n"、* rsctrl);
    if (* rsctrl == 0x0001000C)

    中断;

    此致、

    James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经为代码捕获了汇编代码。  我还捕获了用于读取 RSTYPE 的启动代码的汇编代码、该代码从 NAND 引导时在硬件上始终提供0x1、而不是调试器加载时提供0x1、0x2或0x4。  尤其是在尝试执行复位之前。  这是否是由 AIS 工具引起的安全启动问题?   我们不打算使用任何安全启动处理;但是我们的芯片编号中有 E。

    始终读取0x 的启动代码

    EVM 板芯片、器件型号中包含 E

    一些其他映像供您支持

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Marsha、我不会轻易地看到您的拆卸过程中出现任何问题。  回读您的帖子、似乎有两种调试方案

    1. 通过 CCS 下载.out 文件,复位正常

    2.从 NAND 映像引导、复位不起作用

    那么、从 NAND 引导时、您是否连接过 CCS?  NAND 映像与.out 文件可能存在一些差异。  调试 NAND 映像的一种方法是在 NAND 映像中放置一个 while (1)循环作为伪断点。  然后、一旦您引导并且代码命中该指令、您就可以通过 JTAG 进行连接、将 PC 推进到通过 while (1)循环的下一条汇编指令、并继续使用 CCS 进行单步执行。  

    这可能揭示了 NAND 映像不会复位器件的原因。

    此外、您提到的安全启动问题可能是问题的一部分。  我不熟悉 AIS 工具。  这是否表示有关安全启动的任何信息?

    此致、

    James   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 James:

    我在 main 中放置了一个 while (1)、并在 NAND 引导后在调试器中捕获该值。  然后、我推进 PC 并让其运行。  软件复位正常工作,并将 CPU 恢复到 main(),因此当从 NAND 引导时,它可以工作,但仅在连接调试器之后。   

    因此、我再次访问了几天前尝试过的 PLL 解锁代码、 我从调试器的 GEL 文件中窃取了该代码。  这一次、在我的代码中、我在 PLL 解锁后添加了一个旋转、现在我的软件复位"主要"起作用。  复位后、RSTYPE 在软件复位时仍然只有0x4、在热复位和下电上电时仍然只有0x1。  使用调试器、我在热复位时得到一个0x2。  因此、部分解决方案是解锁 PLL 代码并在之后旋转一点。

    我是否应该将所有 GEL 代码添加到我的产品的应用程序启动代码中?

    我添加了一些 AIS 工具的屏幕截图以供参考。  我还添加了我添加的 PLL 解锁代码片段以供参考。   

    #define SYS_BASE           0x01C14000
    #define CFGCHIP0           *(unsigned int*)(SYS_BASE + 0x17C)
    
    /* Clear PLL lock bit */
    CFGCHIP0 &= ~(0x00000010);
    
        while (i<1000)  /* adding this wait is what did the trick */
        {
            i++;
        }
        
    /* down here is the software reset code I sent earlier */

    >HexAIS_OMAP-L138.exe -ini OMAP-L138.ini -otype binary -o D:\workspace_new\load_flash_hextool.ais  D:\workspace_new\wdt_c6748_lcdk_rtsc_d.out

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Marsha、您为 NAND 映像构建的代码的基础是什么?  您是否从我们的一款软件 SDK 或 TI 的其他软件产品开始?  这些示例或核心功能可用于执行解锁 PLL 等操作。  您使用的是这些器件吗?  凝胶是一种替代方法、但凝胶通常是未经完全审查的测试代码。  软件 SDK 将是更好的起点

    例如、1000的循环可能甚至不足以解锁 PLL。  理想情况下、您应该检查一个锁定状态位以确保 PLL 在继续之前被解锁。  这种类型的东西应该是 SDK 中的核心函数。

    此致、

    James

       

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 James:

    感谢您的回复。  我正在使用 SDK processor_sdk_rtos_omapl138_6_03_00_106、并已使用 TI CCS 中的典型示例创建了一个基本应用。  您提到  您在我的反汇编中没有看到任何问题。   请告知我应该使用哪个示例来使用软件复位功能。  我是否应该是 PLL 专家来使用软件复位功能?   我很想使用软件复位功能。

    马萨

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    James、我很抱歉、我使用 的是 pdk_omapl138_1_0_11