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.

AWR2944: awr2944的在线升级方案

Part Number: AWR2944
Other Parts Discussed in Thread: UNIFLASH

你好,工程师

           请问有关于awr2944的在线升级(OTA)方案吗?

谢谢

  • 你好

    如上面的帖子,SBL应该是在.appimage烧写之后,将appimage文件加载到对应的cpu的。我需要的是如何在AWR2944处于qspi boot mode的情况下,通过串口向flash写入新的.appImage文件。

    1.了解到正常的烧写应该切换到uart boot mode,并且烧写需要3个文件uart_uniflash.release.tiimage 、sbl_release.tiimage 、appimage文件,其中第一个文件uart_uniflash.release.tiimage是引导后两个文件烧写到flash中的固定位置的。在qspi boot mode的情况下,能否每次更新固件只烧写.appimage文件,保持SBL和uart_uniflash文件不变?或者能否在不更换SOP的情况下,通过寄存器实现boot模式的切换?

    2.在烧写完成后,需要复位AWR2944使其重新从flash中boot,请问要怎么实现软复位?

    3.注意到通过串口的烧写过程较慢,需要约1分钟,串口的模式为interrup模式,readmode为block,所以要先暂停DPC和frame,然后在烧写完成后重启,请问要如何实现?

    4.在1.中提到的uart_uniflash.release.tiimage会在DSS的L3分配一块内存暂存从串口收到的.appimage文件,再写入到flash中,请问在板子正常工作时,怎样通过MCU这边的程序在DSS上申请内存,有什么函数可以查看当前2944的内存使用情况?

  • 对于上面的2,有没有类似文档Soft Reset Using CLI User Guide (ti.com)中提到的复位的方法,如果有应该往哪个寄存器地址写什么?

  • 您好,我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 你好,

    对于上述的第2点,我在论坛上找到一个相关的帖子AWR2944: Warm reset is reinitializing the MSS_L2 and DSS_L3 RAM - Sensors forum - Sensors - TI E2E support forums,我按照里面的做法对代码做了更改并重新生成并更新了sbl_qspi.tiimage文件,但是仍然不起作用,当使用CLI命令输入reset的指令后,板子就宕机了,并没有重新进入SBL。

  • 你好

    谢谢你在英文论坛上帮忙提问。关于解答的第二点,调用函数Bootloader_runSelfCpu只会重置ARM R5F我在CLI中定义的函数中调用该函数后,程序直接宕机了,而且该函数在SBL的main程序中的位置是SBL引导.appimage文件完成后。我想要实现的是当收到CLI命令后,可以重新运行SBL函数,及从RBL开始运行。

  • 参照AWR2944EVM: How to reset all program(include bootloader) by software - Sensors forum - Sensors - TI E2E support forums,在SDK4.3.1版本可以使用CLI命令进行复位,但是在SDK4.2.2版本仍无法使用

  • 以下是英文论坛的链接,您可以多多关注工程师的答复:

    e2e.ti.com/.../4514988

  • 你好

    关于在qspi模式下通过串口接收上位机发送的appimage文件,在uart boot mode下,使用uart_uniflash.tiimage烧写脚本,其中使用xmodem协议从串口接收appimage文件,但是在qspi模式下不具备该烧写脚本,能否直接使用uart_read函数读取文件?会不会出现文件读取错误?

    请详细的说明一下如何在DSS的L3上开辟内存用于临时存储appimage,然后写入到flash中?在回答中提到的函数Bootloader_socMenInitCpu中会初始化关于L3的bank,而不是分配内存,我在uart_uniflash.c中的中看到了如下内存申请的方式

    #define BOOTLOADER_UNIFLASH_MAX_FILE_SIZE (0x200000) /* This has to match the size of DDR section in linker.cmd */
    uint8_t gUniflashFileBuf[BOOTLOADER_UNIFLASH_MAX_FILE_SIZE] __attribute__((aligned(128), section(".bss.dss_l3")));
    uart_uniflash.c的main函数中调用了函数Bootloader_socCpuPowerOnReset(CSL_CORE_ID_C66SS0);在该函数的内部有调用上面提到的函数Bootloader_socMenInitCpu,请问这种方式是否可行?我尝试用这种方法进行内存分配时,当调用函数Bootloader_socCpuPowerOnReset后,程序宕机了,请问是为什么?是否需要先关闭DSP核再调用该函数?
    谢谢
  • 您好,

    关于解答的第二点,调用函数Bootloader_runSelfCpu只会重置ARM R5F我在CLI中定义的函数中调用该函数后,程序直接宕机了,而且该函数在SBL的main程序中的位置是SBL引导.appimage文件完成后。我想要实现的是当收到CLI命令后,可以重新运行SBL函数,及从RBL开始运行。
    参照AWR2944EVM: How to reset all program(include bootloader) by software - Sensors forum - Sensors - TI E2E support forums,在SDK4.3.1版本可以使用CLI命令进行复位,但是在SDK4.2.2版本仍无法使用

    以上两点工程师已跟进,您可以多多关注。

    关于在qspi模式下通过串口接收上位机发送的appimage文件,在uart boot mode下,使用uart_uniflash.tiimage烧写脚本,其中使用xmodem协议从串口接收appimage文件,但是在qspi模式下不具备该烧写脚本,能否直接使用uart_read函数读取文件?会不会出现文件读取错误?

    请详细的说明一下如何在DSS的L3上开辟内存用于临时存储appimage,然后写入到flash中?在回答中提到的函数Bootloader_socMenInitCpu中会初始化关于L3的bank,而不是分配内存,我在uart_uniflash.c中的中看到了如下内存申请的方式

    #define BOOTLOADER_UNIFLASH_MAX_FILE_SIZE (0x200000) /* This has to match the size of DDR section in linker.cmd */
    uint8_t gUniflashFileBuf[BOOTLOADER_UNIFLASH_MAX_FILE_SIZE] __attribute__((aligned(128), section(".bss.dss_l3")));
    uart_uniflash.c的main函数中调用了函数Bootloader_socCpuPowerOnReset(CSL_CORE_ID_C66SS0);在该函数的内部有调用上面提到的函数Bootloader_socMenInitCpu,请问这种方式是否可行?我尝试用这种方法进行内存分配时,当调用函数Bootloader_socCpuPowerOnReset后,程序宕机了,请问是为什么?是否需要先关闭DSP核再调用该函数?

    我们跟进给工程师看下。

  • 你好

    我现在已经可以实现reboot了,但是在读取串口发送的appimage文件时,会在开头多收到一个0x0A,经过我多次测试,该字符一直出现,我打开过appimage文件查看过,这个0x0A并不是appimage文件中的字符,现在暂时通过从串口多读一个字符,在写入flash时跳过第一个字符的方式解决,请问这是偶然发生的还是一直会有的?该怎么避免,不然会导致写入到flash中的appimage文件出错,导致SBL失败。代码如下

    static int32_t MYRESETFUNCTION(int32_t argc,char* argv[])
    {
        uint32_t filesize = 0;
        if(argc<2)
        {
            return 0;
        }
        else
        {
            CLI_write("FILESIZE=%s\r\n",argv[1]);
            filesize = atof(argv[1]);
        }
        CLI_write("filesize = %d\r\n",filesize);
        CLI_write("COPY appimage file\r\n");
        //从串口读取appimage文件
        uint32_t done = 0U;
        rlFrameStartStop(1,0x0000);   //停止信号帧的传输,现在指定的device map id 为1
        ClockP_usleep(1000);//等待当前帧执行完,并关闭前端
        uint8_t *databuf1 = (uint8_t *)(0x88000000);
        UART_Transaction trans;
        while(!done)
        {
            UART_Transaction_init(&trans);
            trans.buf = databuf1;
            trans.count = filesize+1;   //读取大小为1M的空间+1
            if(!UART_read( UART_getHandle(1),&trans))
            {
                Bootloader_uniflashFlashFile(0,databuf1+1,filesize,0xA0000);//+1是为了跳过每次固定会收到的0x0A
                UART_write(UART_getHandle(1),&trans);    //打印收到的数据,dcb.fNULL = 0;
                CLI_write("END OUT PRINT\r\n");
                done = 1;
            }
            else
            {
                CLI_write("RECEIVE ERROR\r\n");
            }
        }
        //重新进入reboot模式
        uint32_t baseAddr;
        volatile uint32_t *kickAddr;
        uint32_t i=0;
        //uint32_t value = 0;
        baseAddr = CSL_MSS_TOPRCM_U_BASE;
        kickAddr = (volatile uint32_t*)(baseAddr+CSL_MSS_TOPRCM_LOCK0_KICK0);
        CSL_REG32_WR(kickAddr,KICK0_UNLOCK_VAL);
        kickAddr = (volatile uint32_t*)(baseAddr+CSL_MSS_TOPRCM_LOCK0_KICK1);
        CSL_REG32_WR(kickAddr,KICK1_UNLOCK_VAL);
        uint32_t*regAddr = (uint32_t*)0x02140100;
        uint32_t dbg = *regAddr&0xFFFFF8FF;
        while(i<0xFFFF)
        {
            i++;
        }
        *regAddr = dbg;
        return 0;
    }

    谢谢

  • 好的我们跟进给工程师看下。

  • 您好,

    您试下探测 UART 线路,然后看下探测log中是否显示0x0A?