forked from xuos/xiuos
				
			Use the serial port iap method to burn the initial firmware under the bootloader
This commit is contained in:
		
							parent
							
								
									cfadebc3e8
								
							
						
					
					
						commit
						3d16b694dd
					
				| 
						 | 
					@ -385,10 +385,10 @@ static void OtaCmd(void)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        ota_info.down.size = size;
 | 
					        ota_info.down.size = size;
 | 
				
			||||||
        ota_info.down.crc32= calculate_crc32(DOWN_FLAH_ADDRESS, size);
 | 
					        ota_info.down.crc32= calculate_crc32(DOWN_FLAH_ADDRESS, size);
 | 
				
			||||||
        ota_info.down.version = 0x11223344;
 | 
					        ota_info.down.version = ota_info.os.version + 1;
 | 
				
			||||||
        strncpy(ota_info.down.description, "OTA Test!",sizeof(ota_info.down.description));
 | 
					        strncpy(ota_info.down.description, "OTA Test!",sizeof(ota_info.down.description));
 | 
				
			||||||
        ota_info.status = OTA_STATUS_READY;
 | 
					        ota_info.status = OTA_STATUS_READY;
 | 
				
			||||||
        strncpy(ota_info.error_message, "Download the firmware to the download partition successfully!",sizeof(ota_info.error_message));
 | 
					        strncpy(ota_info.error_message, "No error message!",sizeof(ota_info.error_message));
 | 
				
			||||||
        UpdateOTAFlag(&ota_info);
 | 
					        UpdateOTAFlag(&ota_info);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -149,8 +149,8 @@ void UpdateApplication(void)
 | 
				
			||||||
    // 从Flash中读取OTA信息
 | 
					    // 从Flash中读取OTA信息
 | 
				
			||||||
    memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
 | 
					    memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 如果OTA升级状态为准备状态,可以进行升级
 | 
					    // 如果OTA升级状态为准备状态,且APP分区与download分区版本不同,才可以进行升级
 | 
				
			||||||
    if(ota_info.status == OTA_STATUS_READY) 
 | 
					    if((ota_info.status == OTA_STATUS_READY) && (ota_info.os.crc32 != ota_info.down.crc32)) 
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Serial_PutString("\r\n------Start to update the app!------\r\n");
 | 
					        Serial_PutString("\r\n------Start to update the app!------\r\n");
 | 
				
			||||||
        // 校验downlad分区固件CRC
 | 
					        // 校验downlad分区固件CRC
 | 
				
			||||||
| 
						 | 
					@ -159,7 +159,27 @@ void UpdateApplication(void)
 | 
				
			||||||
            ota_info.status = OTA_STATUS_UPDATING;
 | 
					            ota_info.status = OTA_STATUS_UPDATING;
 | 
				
			||||||
            UpdateOTAFlag(&ota_info);
 | 
					            UpdateOTAFlag(&ota_info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // 拷贝download分区到XiUOS System分区
 | 
					            // 1.如果CRC校验通过,开始升级,逐字节拷贝Flash,先备份当前XiUOS System分区内容
 | 
				
			||||||
 | 
					            status = flash_copy(XIUOS_FLAH_ADDRESS, BAKUP_FLAH_ADDRESS, ota_info.os.size);
 | 
				
			||||||
 | 
					            if((status == kStatus_Success) &&(calculate_crc32(BAKUP_FLAH_ADDRESS, ota_info.os.size) == ota_info.os.crc32))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Serial_PutString("\r\n------Backup app success!------\r\n");
 | 
				
			||||||
 | 
					                ota_info.bak.size = ota_info.os.size;
 | 
				
			||||||
 | 
					                ota_info.bak.crc32 = ota_info.os.crc32;
 | 
				
			||||||
 | 
					                ota_info.bak.version = ota_info.os.version;
 | 
				
			||||||
 | 
					                strncpy(ota_info.bak.description, ota_info.os.description, sizeof(ota_info.os.description));
 | 
				
			||||||
 | 
					                UpdateOTAFlag(&ota_info);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Serial_PutString("\r\n------Backup app failed!------\r\n");
 | 
				
			||||||
 | 
					                ota_info.status = OTA_STATUS_ERROR;
 | 
				
			||||||
 | 
					                strncpy(ota_info.error_message, "Backup app failed!",sizeof(ota_info.error_message));
 | 
				
			||||||
 | 
					                UpdateOTAFlag(&ota_info);
 | 
				
			||||||
 | 
					                goto finish;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 2.拷贝download分区到XiUOS System分区
 | 
				
			||||||
            status = flash_copy(DOWN_FLAH_ADDRESS, XIUOS_FLAH_ADDRESS, ota_info.down.size);
 | 
					            status = flash_copy(DOWN_FLAH_ADDRESS, XIUOS_FLAH_ADDRESS, ota_info.down.size);
 | 
				
			||||||
            if((status == kStatus_Success) &&(calculate_crc32(XIUOS_FLAH_ADDRESS, ota_info.down.size) == ota_info.down.crc32))
 | 
					            if((status == kStatus_Success) &&(calculate_crc32(XIUOS_FLAH_ADDRESS, ota_info.down.size) == ota_info.down.crc32))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -200,6 +220,5 @@ void UpdateApplication(void)
 | 
				
			||||||
        goto finish;
 | 
					        goto finish;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
finish:
 | 
					finish:
 | 
				
			||||||
    // 跳转到应用程序
 | 
					    return;
 | 
				
			||||||
    jump_to_application(); 
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,25 @@
 | 
				
			||||||
#ifdef MCUBOOT_BOOTLOADER
 | 
					#ifdef MCUBOOT_BOOTLOADER
 | 
				
			||||||
extern void ImxrtMsDelay(uint32 ms);
 | 
					extern void ImxrtMsDelay(uint32 ms);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void InitialVersion(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int32_t size;
 | 
				
			||||||
 | 
					    ota_info_t ota_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&ota_info, 0, sizeof(ota_info_t));
 | 
				
			||||||
 | 
					    size = SerialDownload(XIUOS_FLAH_ADDRESS);
 | 
				
			||||||
 | 
					    if(size > 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ota_info.os.size = size;
 | 
				
			||||||
 | 
					        ota_info.os.crc32 = calculate_crc32(XIUOS_FLAH_ADDRESS, size);
 | 
				
			||||||
 | 
					        ota_info.os.version = 0x1;
 | 
				
			||||||
 | 
					        strncpy(ota_info.os.description, "This is the initial firmware for the device!", sizeof(ota_info.os.description));
 | 
				
			||||||
 | 
					        UpdateOTAFlag(&ota_info);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void jump_to_application(void)
 | 
					void jump_to_application(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SCB->VTOR = (uint32_t)XIUOS_FLAH_ADDRESS;
 | 
					    SCB->VTOR = (uint32_t)XIUOS_FLAH_ADDRESS;
 | 
				
			||||||
| 
						 | 
					@ -34,10 +53,12 @@ void jump_to_application(void)
 | 
				
			||||||
    asm volatile("BX  R0");
 | 
					    asm volatile("BX  R0");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BootLoaderJumpApp(void)
 | 
					void BootLoaderJumpApp(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    uint8_t ch1, ch2;
 | 
					    uint8_t ch1, ch2;
 | 
				
			||||||
    uint32_t ret;
 | 
					    uint32_t ret;
 | 
				
			||||||
 | 
					    ota_info_t ota_info;
 | 
				
			||||||
    uint32_t timeout = 500;
 | 
					    uint32_t timeout = 500;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    BOARD_ConfigMPU();
 | 
					    BOARD_ConfigMPU();
 | 
				
			||||||
| 
						 | 
					@ -71,11 +92,24 @@ void BootLoaderJumpApp(void)
 | 
				
			||||||
                case 0x31:
 | 
					                case 0x31:
 | 
				
			||||||
                    jump_to_application();
 | 
					                    jump_to_application();
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                case 0x32:
 | 
					                case 0x32:
 | 
				
			||||||
                    FLASH_Init();
 | 
					                    FLASH_Init();
 | 
				
			||||||
 | 
					                    memcpy(&ota_info, (const void *)FLAG_FLAH_ADDRESS,sizeof(ota_info_t));
 | 
				
			||||||
 | 
					                    /* 此时APP分区还没有有效的固件,需要在bootloader下通过iap烧写出厂固件 */
 | 
				
			||||||
 | 
					                    if((ota_info.os.size > APP_FLASH_SIZE) || (calculate_crc32(XIUOS_FLAH_ADDRESS, ota_info.os.size) != ota_info.os.crc32))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        Serial_PutString("\r\nNeed to flash initial firmware!\r\n");
 | 
				
			||||||
 | 
					                        InitialVersion();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
                        UpdateApplication();
 | 
					                        UpdateApplication();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    FLASH_DeInit();
 | 
					                    FLASH_DeInit();
 | 
				
			||||||
 | 
					                    jump_to_application();
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                case 0x33:
 | 
					                case 0x33:
 | 
				
			||||||
                    __set_FAULTMASK(1);
 | 
					                    __set_FAULTMASK(1);
 | 
				
			||||||
                    NVIC_SystemReset();
 | 
					                    NVIC_SystemReset();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,15 +26,14 @@
 | 
				
			||||||
#include "flash.h"
 | 
					#include "flash.h"
 | 
				
			||||||
#include "ymodem.h"
 | 
					#include "ymodem.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* OTA升级过程中的状态描述 */
 | 
					/* OTA升级过程中的状态描述 */
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
    OTA_STATUS_IDLE = 0,     // 空闲状态,没有进行OTA升级
 | 
					    OTA_STATUS_IDLE = 0,     // 空闲状态,没有进行OTA升级
 | 
				
			||||||
    OTA_STATUS_READY,        // 准备状态,可以进行OTA升级
 | 
					    OTA_STATUS_READY,        // 准备状态,可以进行OTA升级
 | 
				
			||||||
    OTA_STATUS_DOWNLOADING,  // 正在下载固件
 | 
					    OTA_STATUS_DOWNLOADING,  // 正在下载固件
 | 
				
			||||||
    OTA_STATUS_DOWNLOADED,   // 固件下载完成,可以进行升级
 | 
					    OTA_STATUS_DOWNLOADED,   // 固件下载完成
 | 
				
			||||||
    OTA_STATUS_UPDATING,     // 正在进行OTA升级
 | 
					    OTA_STATUS_UPDATING,     // 正在进行OTA升级
 | 
				
			||||||
    OTA_STATUS_ERROR,        // 出现错误,升级失败
 | 
					    OTA_STATUS_ERROR,        // 出现错误,升级失败
 | 
				
			||||||
} ota_status_t;
 | 
					} ota_status_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,9 +53,8 @@ typedef struct {
 | 
				
			||||||
    firmware_t bak;               // Bakup分区属性信息
 | 
					    firmware_t bak;               // Bakup分区属性信息
 | 
				
			||||||
    firmware_t down;              // Download分区属性信息
 | 
					    firmware_t down;              // Download分区属性信息
 | 
				
			||||||
    uint32_t status;              // 升级状态,取值来自于ota_status_t类型
 | 
					    uint32_t status;              // 升级状态,取值来自于ota_status_t类型
 | 
				
			||||||
    uint32_t initversion;         // 恢复出厂设置的标志,0xFFFFFFFF代表未烧写过,烧写过以后设置为0x12345678
 | 
					    uint32_t lastjumpflag;        // bootloaer跳转失败的标志,bootloader里置0xABABABAB,跳转成功后在应用里置0x00000000
 | 
				
			||||||
    uint32_t jumpfailed;          // bootloaer跳转失败的标志,bootloader里置0xabababab,跳转成功后置0x00000000
 | 
					    uint32_t reserve[2];          // 保留字段
 | 
				
			||||||
    uint32_t reserve;             // 保留字段
 | 
					 | 
				
			||||||
    uint8_t  error_message[128];  // 错误信息,最多128个字符
 | 
					    uint8_t  error_message[128];  // 错误信息,最多128个字符
 | 
				
			||||||
} ota_info_t;
 | 
					} ota_info_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue