Other Parts Discussed in Thread: UNIFLASH
你好,工程师
请问有关于awr2944的在线升级(OTA)方案吗?
谢谢
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.
你好
如上面的帖子,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版本仍无法使用
以下是英文论坛的链接,您可以多多关注工程师的答复:
你好
关于在qspi模式下通过串口接收上位机发送的appimage文件,在uart boot mode下,使用uart_uniflash.tiimage烧写脚本,其中使用xmodem协议从串口接收appimage文件,但是在qspi模式下不具备该烧写脚本,能否直接使用uart_read函数读取文件?会不会出现文件读取错误?
请详细的说明一下如何在DSS的L3上开辟内存用于临时存储appimage,然后写入到flash中?在回答中提到的函数Bootloader_socMenInitCpu中会初始化关于L3的bank,而不是分配内存,我在uart_uniflash.c中的中看到了如下内存申请的方式
您好,
关于解答的第二点,调用函数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?