From 425b9306ecc6e981391c9b618a408f36e7de02d5 Mon Sep 17 00:00:00 2001 From: pvvx Date: Sun, 5 Feb 2017 00:26:09 +0300 Subject: [PATCH] update ota & otu --- .../component/common/api/at_cmd/atcmd_sys.c | 24 +- .../application/xmodem/uart_fw_update.c | 169 ++++++++---- .../component/common/utilities/update.c | 260 +++++++++--------- .../soc/realtek/8195a/fwlib/ram_lib/loader.c | 2 +- .../soc/realtek/8195a/fwlib/ram_lib/startup.c | 24 +- .../realtek/8195a/fwlib/rtl8195a/rtl8195a.h | 8 + .../misc/bsp/lib/common/GCC/lib_platform.a | Bin 366322 -> 380602 bytes .../bsp/lib/common/GCC/lib_platform_new.a | Bin 161388 -> 161520 bytes 8 files changed, 275 insertions(+), 212 deletions(-) diff --git a/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c b/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c index 08bca4e..9e0dea2 100644 --- a/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c +++ b/RTL00_SDKV35a/component/common/api/at_cmd/atcmd_sys.c @@ -146,8 +146,12 @@ void fATSR(void *arg) #if CONFIG_UART_XMODEM void fATSY(void *arg) { +#ifdef RTL8710AF + OTU_FW_Update(0, 0, 115200); +#else // use xmodem to update, RX: PA_6, TX: PA_7, baudrate: 1M OTU_FW_Update(0, 2, 115200); +#endif } #endif @@ -1154,20 +1158,16 @@ void fATSL(void *arg) { #if CONFIG_UART_XMODEM void fATSX(void *arg) { -#ifdef RTL8711AM -#error "Set OTU_FW_Update UARTx pins!" +#ifdef RTL8710AF + // use xmodem to update, RX: PC_0, TX: PC_3, baudrate: 1M + OTU_FW_Update(0, 0, 115200); + // use xmodem to update, RX: PE_3, TX: PE_0, baudrate: 1M + // JTAG Off! + // OTU_FW_Update(0, 1, 115200); +#else +//#error "Set OTU_FW_Update UARTx pins!" // use xmodem to update, RX: PA_6, TX: PA_7, baudrate: 1M OTU_FW_Update(0, 2, 115200); - -#else -#ifdef RTL8710AF -#error "OTU_FW_Update work only SDRAM buffer!" -#endif -// use xmodem to update, RX: PC_0, TX: PC_3, baudrate: 1M - OTU_FW_Update(0, 0, 115200); -// use xmodem to update, RX: PE_3, TX: PE_0, baudrate: 1M -// JTAG Off! -// OTU_FW_Update(0, 1, 115200); #endif at_printf("\r\n[ATSX] OK"); } diff --git a/RTL00_SDKV35a/component/common/application/xmodem/uart_fw_update.c b/RTL00_SDKV35a/component/common/application/xmodem/uart_fw_update.c index 22b62d3..4f78bd7 100644 --- a/RTL00_SDKV35a/component/common/application/xmodem/uart_fw_update.c +++ b/RTL00_SDKV35a/component/common/application/xmodem/uart_fw_update.c @@ -20,6 +20,18 @@ #if CONFIG_UART_SOCKET #if /*CONFIG_PERI_UPDATE_IMG*/1 + +#define USE_FLASH_API 1 + +#if USE_FLASH_API +#include "device_lock.h" +#include "flash_api.h" +#endif + +#ifndef FLASH_SECTOR_SIZE + #define FLASH_SECTOR_SIZE 4096 +#endif + #define IMG1_SIGN_OFFSET 0x34 enum { @@ -29,7 +41,7 @@ enum { XMODEM_LOG_UART = 3 }; -FWU_DATA_SECTION char xMFrameBuf[XM_BUFFER_SIZE]; +FWU_DATA_SECTION char * xMFrameBuf; // [XM_BUFFER_SIZE]; FWU_DATA_SECTION XMODEM_CTRL xMCtrl; FWU_DATA_SECTION static u32 fw_img1_size; @@ -44,7 +56,7 @@ FWU_DATA_SECTION static u32 flash_wr_err_cnt; FWU_DATA_SECTION HAL_RUART_ADAPTER xmodem_uart_adp; // we can dynamic allocate memory for this object to save memory -FWU_RODATA_SECTION const char Img2Signature[8]="81958711"; +FWU_RODATA_SECTION const char Img2Signature[8] = IMG_SIGN_RUN; extern u32 SpicCalibrationPattern[4]; extern const u8 ROM_IMG1_VALID_PATTEN[]; extern HAL_RUART_ADAPTER *pxmodem_uart_adp; @@ -61,6 +73,7 @@ extern VOID SpicWaitWipDoneRefinedRtl8195A(SPIC_INIT_PARA SpicInitPara); VOID WriteImg1Sign(u32 Image2Addr); + FWU_TEXT_SECTION void FWU_WriteWord(u32 Addr, u32 FData) { SPIC_INIT_PARA SpicInitPara; @@ -81,7 +94,7 @@ FWU_TEXT_SECTION u32 xModem_MemCmp(const u32 *av, const u32 *bv, u32 len) for (i=0; i (0x80000-0x0B000)) { +#else if (fw_img2_size > (2*1024*1024)) { - DBG_MISC_ERR("xModem_Frame_ImgAll Image2 to Big: fw_img2_addr=0x%x fw_img2_size(%d) \r\n", fw_img2_addr, fw_img2_size); +#endif + DBG_MISC_ERR("OTU: fw_img2_addr=0x%x fw_img2_size(%d) to Big!\n", fw_img2_addr, fw_img2_size); fw_img1_size = 0; fw_img2_size = 0; return rx_len; } + printf("fw_img2_addr=0x%x fw_img2_size(%d)\n", fw_img2_addr, fw_img2_size); fw_img3_addr = fw_img2_addr + fw_img2_size; // erase Flash first - address = fw_img2_addr & (~0xfff); // 4k aligned, 4k is the page size of flash memory + address = fw_img2_addr & (~(FLASH_SECTOR_SIZE-1)); // 4k aligned, 4k is the page size of flash memory while ((address) < (fw_img2_addr+fw_img2_size)) { + DBG_MISC_INFO("Flash Erase: %p\n", address); SpicSectorEraseFlashRtl8195A(SPI_FLASH_BASE + address); - address += 0x1000; + address += FLASH_SECTOR_SIZE; } flash_erased_addr = address; } @@ -280,14 +300,19 @@ u32 xModem_Frame_Img2(char *ptr, unsigned int frame_num, unsigned int frame_siz fw_img3_size = 0; return rx_len; } +/* if ((fw_img3_size & 0x03) != 0) { - DBG_MISC_ERR("xModem_Frame_ImgAll Err#5: fw_img3_addr=0x%x fw_img3_size(%d) isn't 4-bytes aligned\r\n", fw_img3_addr, fw_img3_size); + DBG_MISC_ERR("OTU Err#5: fw_img3_addr=0x%x fw_img3_size(%d) isn't 4-bytes aligned\n", fw_img3_addr, fw_img3_size); fw_img3_size = 0; return rx_len; } - - if (fw_img3_size > (2*1024*1024)) { - DBG_MISC_ERR("xModem_Frame_ImgAll Image3 to Big: fw_img3_addr=0x%x fw_img2_size(%d) \r\n", fw_img3_addr, fw_img3_size); +*/ +#ifdef RTL8710AF + if (fw_img2_size > (0x80000 - fw_img3_addr)) { +#else + if (fw_img2_size > (2*1024*1024)) { +#endif + DBG_MISC_ERR("OTU: fw_img3_addr=0x%x fw_img2_size(%d) to Big!\n", fw_img3_addr, fw_img3_size); fw_img3_size = 0; return rx_len; } @@ -296,21 +321,22 @@ u32 xModem_Frame_Img2(char *ptr, unsigned int frame_num, unsigned int frame_siz if (flash_erased_addr >= fw_img3_addr) { address = flash_erased_addr; } else { - address = fw_img3_addr & (~0xfff); // 4k aligned, 4k is the page size of flash memory + address = fw_img3_addr & (~(FLASH_SECTOR_SIZE-1)); // 4k aligned, 4k is the page size of flash memory } while ((address) < (fw_img3_addr+fw_img3_size)) { - DBG_MISC_INFO("Flash Erase: 0x%x\n", address); + DBG_MISC_INFO("Flash Erase: %p\n", address); #if 0 if ((address & 0xFFFF) == 0) { SpicBlockEraseFlashRtl8195A(SPI_FLASH_BASE + address); - address += 0x10000; // 1 block = 64k bytes + address += FLASH_SECTOR_SIZE; // 1 block = 64k bytes } else #endif { + SpicSectorEraseFlashRtl8195A(SPI_FLASH_BASE + address); - address += 0x1000; // 1 sector = 4k bytes + address += FLASH_SECTOR_SIZE; // 1 sector = 4k bytes } } flash_erased_addr = address; @@ -375,7 +401,7 @@ u32 xModem_Frame_ImgAll(char *ptr, unsigned int frame_num, unsigned int frame_s while (ROM_IMG1_VALID_PATTEN[i] != 0xff) { if (ptr[i+IMG1_SIGN_OFFSET] != ROM_IMG1_VALID_PATTEN[i]) { // image1 validation patten miss match - DBG_MISC_ERR("xModem_Frame_ImgAll Err: Image1 Signature Incorrect\r\n"); + DBG_MISC_ERR("OTU: Image1 Signature Incorrect\n"); fw_img1_size = 0; fw_img2_size = 0; fw_img2_addr = 0; @@ -391,15 +417,15 @@ u32 xModem_Frame_ImgAll(char *ptr, unsigned int frame_num, unsigned int frame_s flash_wr_offset = 0; fw_img1_size = rtk_le32_to_cpu(*((u32*)(ptr + 0x10))) + 0x20; - if ((fw_img1_size & 0x03) != 0) { - DBG_MISC_WARN("xModem_Frame_ImgAll Err: fw_img1_size(0x%x) isn't 4-bytes aligned\r\n", fw_img1_size); +/* if ((fw_img1_size & 0x03) != 0) { + DBG_MISC_WARN("OTU: fw_img1_size(0x%x) isn't 4-bytes aligned\n", fw_img1_size); fw_img1_size = 0; fw_img2_size = 0; fw_img2_addr = 0; fw_img3_size = 0; fw_img3_addr = 0; return 0; - } + } */ address = 0; img_size = fw_img1_size; img_addr = 0; @@ -409,11 +435,11 @@ u32 xModem_Frame_ImgAll(char *ptr, unsigned int frame_num, unsigned int frame_s fw_img2_addr = fw_img1_size; } fw_img2_size = 0; - DBG_MISC_INFO("Update Image All: Image1 Size=%d, Image2 Addr=0x%x\r\n", fw_img1_size, fw_img2_addr); + DBG_MISC_INFO("Update Image All: Image1 Size=%d, Image2 Addr=0x%x\n", fw_img1_size, fw_img2_addr); } else { // It's image2(+image3) only if (fw_img2_addr == 0) { - DBG_MISC_WARN("The single-image format in flash now, it cannot just update the image2\r\n"); + DBG_MISC_WARN("The single-image format in flash now, it cannot just update the image2\n"); fw_img1_size = 0; fw_img2_size = 0; return rx_len; @@ -423,17 +449,17 @@ u32 xModem_Frame_ImgAll(char *ptr, unsigned int frame_num, unsigned int frame_s fw_img1_size = 0; fw_img2_size = rtk_le32_to_cpu(*((u32*)ptr)) + 0x10; fw_img3_addr = fw_img2_addr + fw_img2_size; - if ((fw_img2_size & 0x03) != 0) { - DBG_MISC_ERR("xModem_Frame_ImgAll Err: fw_img2_size(0x%x) isn't 4-bytes aligned\r\n", fw_img2_size); +/* if ((fw_img2_size & 0x03) != 0) { + DBG_MISC_ERR("OTU: fw_img2_size(0x%x) isn't 4-bytes aligned\n", fw_img2_size); fw_img1_size = 0; fw_img2_size = 0; return rx_len; - } + } */ address = fw_img2_addr & (~0xfff); // 4k aligned, 4k is the page size of flash memory img_size = fw_img2_size; img_addr = fw_img2_addr; - DBG_MISC_INFO("Update Image2: Addr=0x%x, Size=%d\r\n", fw_img2_addr, fw_img2_size); + DBG_MISC_INFO("Update Image2: Addr=0x%x, Size=%d\n", fw_img2_addr, fw_img2_size); } @@ -532,15 +558,15 @@ u32 xModem_Frame_ImgAll(char *ptr, unsigned int frame_num, unsigned int frame_s if (ImgIdx < frame_size) { fw_img2_size = rtk_le32_to_cpu(*((u32*)(ptr+ImgIdx))) + 0x10; fw_img3_addr = fw_img2_addr + fw_img2_size; - if ((fw_img2_size & 0x03) != 0) { - DBG_MISC_ERR("xModem_Frame_ImgAll Err#2: fw_img2_addr=0x%x fw_img2_size(%d) isn't 4-bytes aligned\r\n", fw_img2_addr, fw_img2_size); +/* if ((fw_img2_size & 0x03) != 0) { + DBG_MISC_ERR("OTU: fw_img2_addr=0x%x fw_img2_size(%d) isn't 4-bytes aligned\n", fw_img2_addr, fw_img2_size); fw_img1_size = 0; fw_img2_size = 0; return rx_len; - } + }*/ if (fw_img2_size > (2*1024*1024)) { - DBG_MISC_ERR("xModem_Frame_ImgAll Image2 to Big: fw_img2_addr=0x%x fw_img2_size(%d) \r\n", fw_img2_addr, fw_img2_size); + DBG_MISC_ERR("OTU: fw_img2_addr=0x%x fw_img2_size(%d) to Big\n", fw_img2_addr, fw_img2_size); fw_img1_size = 0; fw_img2_size = 0; return rx_len; @@ -601,17 +627,17 @@ u32 xModem_Frame_ImgAll(char *ptr, unsigned int frame_num, unsigned int frame_s if (fw_img3_size == 0x1A1A1A1A) { // all padding bytes, no image3 fw_img3_size = 0; -// DBG_8195A("No Img3\r\n"); +// DBG_8195A("No Img3\n"); return rx_len; } - if ((fw_img3_size & 0x03) != 0) { - DBG_MISC_ERR("xModem_Frame_ImgAll Err#5: fw_img3_addr=0x%x fw_img3_size(%d) isn't 4-bytes aligned\r\n", fw_img3_addr, fw_img3_size); +/* if ((fw_img3_size & 0x03) != 0) { + DBG_MISC_ERR("OTU: fw_img3_addr=0x%x fw_img3_size(%d) isn't 4-bytes aligned\n", fw_img3_addr, fw_img3_size); fw_img3_size = 0; return rx_len; - } + } */ if (fw_img3_size > (2*1024*1024)) { - DBG_MISC_ERR("xModem_Frame_ImgAll Image3 to Big: fw_img3_addr=0x%x fw_img2_size(%d) \r\n", fw_img3_addr, fw_img3_size); + DBG_MISC_ERR("OTU: fw_img3_addr=0x%x fw_img2_size(%d) to Big!\n", fw_img3_addr, fw_img3_size); fw_img3_size = 0; return rx_len; } @@ -678,14 +704,14 @@ xModem_Init_UART_Port(u8 uart_idx, u8 pin_mux, u32 baud_rate) xmodem_uart_func_hook(&(xMCtrl.ComPort)); } else if(uart_idx == XMODEM_LOG_UART) { // update firmware via Log UART -// DiagPrintf("Open xModem Transfer on Log UART...\r\n"); +// DiagPrintf("Open xModem Transfer on Log UART...\n"); // xmodem_loguart_init(); xmodem_loguart_init(baud_rate); xmodem_loguart_func_hook(&(xMCtrl.ComPort)); -// DiagPrintf("Please Start the xModem Sender...\r\n"); +// DiagPrintf("Please Start the xModem Sender...\n"); } else { // invalid UART port - DBG_MISC_ERR("xModem_Init_UART_Port: Invaild UART port(%d)\n", uart_idx); + DBG_MISC_ERR("OTU: Invaild UART port(%d)\n", uart_idx); return -1; } @@ -883,25 +909,32 @@ void OTU_FW_Update(u8 uart_idx, u8 pin_mux, u32 baud_rate) flash_erased_addr = 0; start_with_img1 = 0;; flash_wr_err_cnt = 0; + xMFrameBuf = malloc(XM_BUFFER_SIZE); + if(xMFrameBuf == NULL) { + DBG_MISC_ERR("OTU: SPI Init Fail!\n"); + return; + } - // Get the address of the image2 to be updated +#if USE_FLASH_API + device_mutex_lock(RT_DEV_LOCK_FLASH); +#endif SPI_FLASH_PIN_FCTRL(ON); if (!SpicFlashInitRtl8195A(SpicOneBitMode)){ SPI_FLASH_PIN_FCTRL(OFF); - DBG_MISC_ERR("OTU_FW_Update: SPI Init Fail!!!!!!\n"); - return; + DBG_MISC_ERR("OTU: SPI Init Fail!\n"); + goto end_error; } SpicWaitWipDoneRefinedRtl8195A(SpicInitPara); - - printf("FW Update Over UART%d, PinMux=%d, Baud=%d\r\n", uart_idx, pin_mux, baud_rate); + printf("FW Update Over UART%d, PinMux=%d, Baud=%d\n", uart_idx, pin_mux, baud_rate); + // Get the address of the image2 to be updated fw_img2_addr = SelectImg2ToUpdate(&OldImage2Addr); // Start to update the Image2 through xModem on peripheral device - printf("FW Update Image2 @ 0x%x\r\n", fw_img2_addr); + printf("FW Update Image2 @ 0x%x\n", fw_img2_addr); // We update the image via xModem on UART now, if we want to uase other peripheral device // to update the image then we need to redefine the API if (xModem_Init_UART_Port(uart_idx, pin_mux, baud_rate) < 0) { - return; + goto end_error; } // xModemStart(&xMCtrl, xMFrameBuf, xModem_Frame_ImgAll); // Support Image format: Image1+Image2 or Image2 only @@ -918,13 +951,21 @@ void OTU_FW_Update(u8 uart_idx, u8 pin_mux, u32 baud_rate) #ifdef CONFIG_UPDATE_TOGGLE_IMG2 // Mark the other image2 as old one by modify its signature if (OldImage2Addr != 0) { - printf("Mark Image2 @ 0x%x as Old\r\n", OldImage2Addr); + printf("Mark Image2 @ 0x%x as Old\n", OldImage2Addr); MarkImg2SignOld(OldImage2Addr); } #endif } printf("OTU_FW_Update Done, Write Len=%d\n", wr_len); - SPI_FLASH_PIN_FCTRL(OFF); +end_error: + SPI_FLASH_PIN_FCTRL(OFF); +#if USE_FLASH_API + device_mutex_unlock(RT_DEV_LOCK_FLASH); +#endif + if(xMFrameBuf) { + free(xMFrameBuf); + xMFrameBuf = NULL; + } } FWU_TEXT_SECTION @@ -934,7 +975,7 @@ u8 OTU_check_gpio(void) HAL_GPIO_PIN GPIO_Pin; u8 enter_update; - GPIO_Pin.pin_name = HAL_GPIO_GetIPPinName_8195a(0x21);; //pin PC_1 + GPIO_Pin.pin_name = HAL_GPIO_GetIPPinName_8195a(0x21); //pin PC_1 GPIO_Pin.pin_mode = DIN_PULL_HIGH; _pHAL_Gpio_Adapter = &gBoot_Gpio_Adapter; @@ -1033,8 +1074,12 @@ void OTU_Img_Download(u8 uart_idx, u8 pin_mux, u32 baud_rate, if (xModem_Init_UART_Port(uart_idx, pin_mux, baud_rate) < 0) { return; } + if(xMFrameBuf == NULL) { + DBG_MISC_ERR("OTU: SPI Init Fail!\n"); + return; + } - DBG_MISC_INFO("Image Download: StartOffset=%d StartAddr=0x%x MaxSize=%d\r\n", start_offset, start_addr, max_size); + DBG_MISC_INFO("Image Download: StartOffset=%d StartAddr=0x%x MaxSize=%d\n", start_offset, start_addr, max_size); fw_img2_addr = start_addr; flash_wr_offset = start_offset; @@ -1043,17 +1088,20 @@ void OTU_Img_Download(u8 uart_idx, u8 pin_mux, u32 baud_rate, if ((start_addr & 0xFF000000) == SPI_FLASH_BASE) { // it's going to write the Flash memory if (((start_addr & 0x03) != 0) || ((start_offset&0x03) != 0)) { - DiagPrintf("StartAddr(0x%x), StartOffset(0x%x) Must 4-bytes Aligned\r\n", start_addr, start_offset); + DiagPrintf("StartAddr(0x%x), StartOffset(0x%x) Must 4-bytes Aligned\n", start_addr, start_offset); return; } +#if USE_FLASH_API + device_mutex_lock(RT_DEV_LOCK_FLASH); +#endif SPI_FLASH_PIN_FCTRL(ON); if (!SpicFlashInitRtl8195A(SpicOneBitMode)){ - DBG_MISC_ERR("OTU_FW_Update: SPI Init Fail!!!!!!\n"); + DBG_MISC_ERR("OTU: SPI Init Fail!\n"); SPI_FLASH_PIN_FCTRL(OFF); - return; + goto end_error; } - is_flash = 1; SpicWaitWipDoneRefinedRtl8195A(SpicInitPara); + is_flash = 1; fw_img2_addr = start_addr & 0x00FFFFFF; xModemStart(&xMCtrl, xMFrameBuf, xModem_Frame_FlashWrite); } else { @@ -1065,10 +1113,17 @@ void OTU_Img_Download(u8 uart_idx, u8 pin_mux, u32 baud_rate, xModem_DeInit_UART_Port(uart_idx); DBG_MISC_INFO("OTU_Img_Download Done, Write Len=%d\n", wr_len); - +end_error: if (is_flash) { - SPI_FLASH_PIN_FCTRL(OFF); + SPI_FLASH_PIN_FCTRL(OFF); +#if USE_FLASH_API + device_mutex_unlock(RT_DEV_LOCK_FLASH); +#endif } + if(xMFrameBuf) { + free(xMFrameBuf); + xMFrameBuf = NULL; + } } #endif //#if CONFIG_PERI_UPDATE_IMG diff --git a/RTL00_SDKV35a/component/common/utilities/update.c b/RTL00_SDKV35a/component/common/utilities/update.c index eb4c453..f2fb17a 100644 --- a/RTL00_SDKV35a/component/common/utilities/update.c +++ b/RTL00_SDKV35a/component/common/utilities/update.c @@ -103,16 +103,16 @@ static void update_ota_local_task(void *param) #if CONFIG_WRITE_MAC_TO_FLASH char mac[ETH_ALEN]; #endif - printf("\n\r[%s] Update task start", __FUNCTION__); + printf("[%s] Update task start\n", __FUNCTION__); buf = update_malloc(BUF_SIZE); if(!buf){ - printf("\n\r[%s] Alloc buffer failed", __FUNCTION__); + printf("[%s] Alloc buffer failed\n", __FUNCTION__); goto update_ota_exit; } // Connect socket server_socket = socket(AF_INET, SOCK_STREAM, 0); if(server_socket < 0){ - printf("\n\r[%s] Create socket failed", __FUNCTION__); + printf("[%s] Create socket failed\n", __FUNCTION__); goto update_ota_exit; } server_addr.sin_family = AF_INET; @@ -120,52 +120,52 @@ static void update_ota_local_task(void *param) server_addr.sin_port = cfg->port; if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){ - printf("\n\r[%s] socket connect failed", __FUNCTION__); + printf("[%s] socket connect failed\n", __FUNCTION__); goto update_ota_exit; } // Erase config sectors if(flash_EraseSector(CONFIG_SECTOR) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } #if CONFIG_WRITE_MAC_TO_FLASH // Read MAC address if(flash_Read(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Read MAC error", __FUNCTION__); + printf("[%s] Read MAC error\n", __FUNCTION__); goto update_ota_exit; } #endif // Erase update sectors for(i = UPDATE_SECTOR; i <= FLASH_Sector_11; i += 8){ if(flash_EraseSector(i) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } } // Write update sectors address = flash_SectorAddress(UPDATE_SECTOR); - printf("\n\r"); + printf("\n"); while(1){ read_bytes = read(server_socket, buf, BUF_SIZE); if(read_bytes == 0) break; // Read end if(read_bytes < 0){ - printf("\n\r[%s] Read socket failed", __FUNCTION__); + printf("[%s] Read socket failed\n", __FUNCTION__); goto update_ota_exit; } if(flash_Wrtie(address + size, buf, read_bytes) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes; for(i = 0; i < read_bytes; i ++) checksum += buf[i]; - printf("\rUpdate file size = %d ", size); + printf("Update file size = %d\n", size); } #if CONFIG_WRITE_MAC_TO_FLASH //Write MAC address if(!(mac[0]==0xff&&mac[1]==0xff&&mac[2]==0xff&&mac[3]==0xff&&mac[4]==0xff&&mac[5]==0xff)){ if(flash_Wrtie(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Write MAC failed", __FUNCTION__); + printf("[%s] Write MAC failed\n", __FUNCTION__); goto update_ota_exit; } } @@ -174,10 +174,10 @@ static void update_ota_local_task(void *param) address = flash_SectorAddress(CONFIG_SECTOR); if( (flash_Wrtie(address, (char*)&size, 4) < 0) || (flash_Wrtie(address+4, (char*)&checksum, 4) < 0) ){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } - printf("\n\r[%s] Update OTA success!", __FUNCTION__); + printf("[%s] Update OTA success!\n", __FUNCTION__); update_ota_exit: if(buf) update_free(buf); @@ -186,7 +186,7 @@ update_ota_exit: if(param) update_free(param); TaskOTA = NULL; - printf("\n\r[%s] Update task exit", __FUNCTION__); + printf("[%s] Update task exit\n", __FUNCTION__); vTaskDelete(NULL); return; } @@ -204,16 +204,16 @@ static void update_ota_local_task(void *param) char mac[ETH_ALEN]; #endif - printf("\n\r[%s] Update task start", __FUNCTION__); + printf("[%s] Update task start\n", __FUNCTION__); buf = update_malloc(BUF_SIZE); if(!buf){ - printf("\n\r[%s] Alloc buffer failed", __FUNCTION__); + printf("[%s] Alloc buffer failed\n", __FUNCTION__); goto update_ota_exit; } // Connect socket server_socket = socket(AF_INET, SOCK_STREAM, 0); if(server_socket < 0){ - printf("\n\r[%s] Create socket failed", __FUNCTION__); + printf("[%s] Create socket failed\n", __FUNCTION__); goto update_ota_exit; } server_addr.sin_family = AF_INET; @@ -221,20 +221,20 @@ static void update_ota_local_task(void *param) server_addr.sin_port = cfg->port; if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){ - printf("\n\r[%s] socket connect failed", __FUNCTION__); + printf("[%s] socket connect failed\n", __FUNCTION__); goto update_ota_exit; } // Erase config sectors for(i = CONFIG_SECTOR; i < APPLICATION_SECTOR; i += FLASH_PAGE_SIZE){ if(flash_EraseSector(i) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } } #if CONFIG_WRITE_MAC_TO_FLASH // Read MAC address if(flash_Read(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Read MAC error", __FUNCTION__); + printf("[%s] Read MAC error\n", __FUNCTION__); goto update_ota_exit; } #endif @@ -242,18 +242,18 @@ static void update_ota_local_task(void *param) // Erase update sectors for(i = UPDATE_SECTOR; i < FLASH_Sector_0 + FLASH_SIZE; i += FLASH_PAGE_SIZE){ if(flash_EraseSector(i) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } } // Write update sectors address = UPDATE_SECTOR; - printf("\n\r"); + printf("\n"); while(1){ read_bytes = read(server_socket, buf, BUF_SIZE); if(read_bytes == 0) break; // Read end if(read_bytes < 0){ - printf("\n\r[%s] Read socket failed", __FUNCTION__); + printf("[%s] Read socket failed\n", __FUNCTION__); goto update_ota_exit; } if(flag_a == 0){ @@ -261,14 +261,14 @@ static void update_ota_local_task(void *param) a = buf[read_bytes - 1]; flag_a = 1; if(flash_Wrtie(address + size, buf, read_bytes - 1) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes - 1; } else{ if(flash_Wrtie(address + size, buf, read_bytes) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes; @@ -277,7 +277,7 @@ static void update_ota_local_task(void *param) else{ a = buf[0] << 8 | a; if(flash_Wrtie(address + size, (char*)(&a), 2) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += 2; @@ -287,14 +287,14 @@ static void update_ota_local_task(void *param) a = buf[read_bytes - 1]; flag_a = 1; if(flash_Wrtie(address + size, buf + 1, read_bytes - 2) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes - 2; } else{ if(flash_Wrtie(address + size, buf + 1, read_bytes - 1) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes - 1; @@ -302,11 +302,11 @@ static void update_ota_local_task(void *param) } for(i = 0; i < read_bytes; i ++) checksum += buf[i]; - printf("\rUpdate file size = %d ", size); + printf("Update file size = %d\n", size); } if(flag_a){ if(flash_Wrtie(address + size, (char*)(&a), 2) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed", __FUNCTION__); goto update_ota_exit; } size += 1; @@ -315,7 +315,7 @@ static void update_ota_local_task(void *param) //Write MAC address if(!(mac[0]==0xff&&mac[1]==0xff&&mac[2]==0xff&&mac[3]==0xff&&mac[4]==0xff&&mac[5]==0xff)){ if(flash_Wrtie(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Write MAC failed", __FUNCTION__); + printf("[%s] Write MAC failed\n", __FUNCTION__); goto update_ota_exit; } } @@ -325,10 +325,10 @@ static void update_ota_local_task(void *param) address = CONFIG_SECTOR; if( (flash_Wrtie(address, (char*)&size, 4) < 0) || (flash_Wrtie(address+4, (char*)&checksum, 4) < 0) ){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } - printf("\n\r[%s] Update OTA success!", __FUNCTION__); + printf("[%s] Update OTA success!\n", __FUNCTION__); update_ota_exit: if(buf) update_free(buf); @@ -337,7 +337,7 @@ update_ota_exit: if(param) update_free(param); TaskOTA = NULL; - printf("\n\r[%s] Update task exit", __FUNCTION__); + printf("[%s] Update task exit\n", __FUNCTION__); vTaskDelete(NULL); return; } @@ -367,7 +367,7 @@ int write_ota_addr_to_system_data(flash_t *flash, uint32_t ota_addr) //Get upgraded image 2 addr from offset device_mutex_lock(RT_DEV_LOCK_FLASH); flash_read_word(flash, OFFSET_DATA, &data); - printf("\n\r[%s] data 0x%x ota_addr 0x%x", __FUNCTION__, data, ota_addr); + printf("[%s] data 0x%x ota_addr 0x%x\n", __FUNCTION__, data, ota_addr); if(data == ~0x0){ flash_write_word(flash, OFFSET_DATA, ota_addr); }else{ @@ -413,19 +413,19 @@ static void update_ota_local_task(void *param) uint32_t ota_addr = 0x80000; #endif #if CONFIG_CUSTOM_SIGNATURE - char custom_sig[32] = "Customer Signature-modelxxx"; + char custom_sig[32] = "Customer Signature-modelxxx\n"; uint32_t read_custom_sig[8]; #endif - printf("\n\r[%s] Update task start", __FUNCTION__); + printf("[%s] Update task start\n", __FUNCTION__); buf = update_malloc(BUF_SIZE); if(!buf){ - printf("\n\r[%s] Alloc buffer failed", __FUNCTION__); + printf("[%s] Alloc buffer failed\n", __FUNCTION__); goto update_ota_exit; } // Connect socket server_socket = socket(AF_INET, SOCK_STREAM, 0); if(server_socket < 0){ - printf("\n\r[%s] Create socket failed", __FUNCTION__); + printf("[%s] Create socket failed\n", __FUNCTION__); goto update_ota_exit; } server_addr.sin_family = AF_INET; @@ -433,7 +433,7 @@ static void update_ota_local_task(void *param) server_addr.sin_port = cfg->port; if(connect(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){ - printf("\n\r[%s] socket connect failed", __FUNCTION__); + printf("[%s] socket connect failed\n", __FUNCTION__); goto update_ota_exit; } DBG_INFO_MSG_OFF(_DBG_SPI_FLASH_); @@ -447,9 +447,9 @@ static void update_ota_local_task(void *param) flash_read_word(&flash, IMAGE_x+4, &ImgxAddr); device_mutex_unlock(RT_DEV_LOCK_FLASH); if(ImgxAddr==0x30000000){ - printf("\n\r[%s] IMAGE_3 0x%x Img3Len 0x%x", __FUNCTION__, IMAGE_x, ImgxLen); + printf("[%s] IMAGE_3 0x%x Img3Len 0x%x\n", __FUNCTION__, IMAGE_x, ImgxLen); }else{ - printf("\n\r[%s] no IMAGE_3", __FUNCTION__); + printf("[%s] no IMAGE_3\n", __FUNCTION__); // no image3 IMAGE_x = IMAGE_2; ImgxLen = Img2Len; @@ -459,7 +459,7 @@ static void update_ota_local_task(void *param) (ota_addr < IMAGE_x) || ((ota_addr & 0xfff) != 0)|| (ota_addr == ~0x0)){ - printf("\n\r[%s] illegal ota addr 0x%x", __FUNCTION__, ota_addr); + printf("[%s] illegal ota addr 0x%x\n", __FUNCTION__, ota_addr); goto update_ota_exit; }else write_ota_addr_to_system_data( &flash, ota_addr); @@ -472,7 +472,7 @@ static void update_ota_local_task(void *param) (NewImg2Addr < IMAGE_x) || ((NewImg2Addr & 0xfff) != 0)|| (NewImg2Addr == ~0x0)){ - printf("\n\r[%s] Invalid OTA Address 0x%x", __FUNCTION__, NewImg2Addr); + printf("[%s] Invalid OTA Address 0x%x\n", __FUNCTION__, NewImg2Addr); goto update_ota_exit; } #else @@ -484,15 +484,15 @@ static void update_ota_local_task(void *param) memset(file_info, 0, sizeof(file_info)); if(file_info[0] == 0){ - printf("\n\r[%s] Read info first", __FUNCTION__); + printf("[%s] Read info first\n", __FUNCTION__); read_bytes = read(server_socket, file_info, sizeof(file_info)); // !X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X // !W checksum !W padding 0 !W file size !W // !X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X!X - printf("\n\r[%s] info %d bytes", __FUNCTION__, read_bytes); - printf("\n\r[%s] tx chechsum 0x%x, file size 0x%x", __FUNCTION__, file_info[0],file_info[2]); + printf("[%s] info %d bytes", __FUNCTION__, read_bytes); + printf("[%s] tx chechsum 0x%x, file size 0x%x\n", __FUNCTION__, file_info[0],file_info[2]); if(file_info[2] == 0){ - printf("\n\r[%s] No checksum and file size", __FUNCTION__); + printf("[%s] No checksum and file size\n", __FUNCTION__); goto update_ota_exit; } } @@ -509,7 +509,7 @@ static void update_ota_local_task(void *param) // read Part1/Part2 signature flash_read_word(&flash, Part1Addr+8, &SigImage0); flash_read_word(&flash, Part1Addr+12, &SigImage1); - printf("\n\r[%s] Part1 Sig %x", __FUNCTION__, SigImage0); + printf("[%s] Part1 Sig %x\n", __FUNCTION__, SigImage0); if(SigImage0==0x30303030 && SigImage1==0x30303030) ATSCAddr = Part1Addr; // ATSC signature else if(SigImage0==0x35393138 && SigImage1==0x31313738) @@ -520,7 +520,7 @@ static void update_ota_local_task(void *param) flash_read_word(&flash, Part2Addr+8, &SigImage0); flash_read_word(&flash, Part2Addr+12, &SigImage1); device_mutex_unlock(RT_DEV_LOCK_FLASH); - printf("\n\r[%s] Part2 Sig %x", __FUNCTION__, SigImage0); + printf("[%s] Part2 Sig %x\n", __FUNCTION__, SigImage0); if(SigImage0==0x30303030 && SigImage1==0x30303030) ATSCAddr = Part2Addr; // ATSC signature else if(SigImage0==0x35393138 && SigImage1==0x31313738) @@ -534,11 +534,11 @@ static void update_ota_local_task(void *param) NewImg2Addr = ATSCAddr; } - printf("\n\r[%s] New %x, Old %x", __FUNCTION__, NewImg2Addr, OldImg2Addr); + printf("[%s] New %x, Old %x\n", __FUNCTION__, NewImg2Addr, OldImg2Addr); if( NewImg2Addr==Part1Addr ){ if( file_info[2] > (Part2Addr-Part1Addr) ){ // firmware size too large - printf("\n\r[%s] Part1 size < OTA size", __FUNCTION__); + printf("[%s] Part1 size < OTA size\n", __FUNCTION__); goto update_ota_exit; // or update to partition2 // NewImg2Addr = Part2Addr; @@ -550,46 +550,46 @@ static void update_ota_local_task(void *param) //Erase upgraded image 2 region if(NewImg2Len == 0){ NewImg2Len = file_info[2]; - printf("\n\r[%s] NewImg2Len %d ", __FUNCTION__, NewImg2Len); + printf("[%s] NewImg2Len %d\n", __FUNCTION__, NewImg2Len); if((int)NewImg2Len > 0){ NewImg2BlkSize = ((NewImg2Len - 1)/4096) + 1; - printf("\n\r[%s] NewImg2BlkSize %d 0x%8x", __FUNCTION__, NewImg2BlkSize, NewImg2BlkSize); + printf("[%s] NewImg2BlkSize %d 0x%8x\n", __FUNCTION__, NewImg2BlkSize, NewImg2BlkSize); device_mutex_lock(RT_DEV_LOCK_FLASH); for( i = 0; i < NewImg2BlkSize; i++) flash_erase_sector(&flash, NewImg2Addr + i * 4096); device_mutex_unlock(RT_DEV_LOCK_FLASH); }else{ - printf("\n\r[%s] Size INVALID", __FUNCTION__); + printf("[%s] Size INVALID\n", __FUNCTION__); goto update_ota_exit; } } - printf("\n\r[%s] NewImg2Addr 0x%x", __FUNCTION__, NewImg2Addr); + printf("[%s] NewImg2Addr 0x%x\n", __FUNCTION__, NewImg2Addr); // reset file_checksum.u = 0; // Write New Image 2 sector if(NewImg2Addr != ~0x0){ address = NewImg2Addr; - printf("\n\r"); + printf(""); while(1){ memset(buf, 0, BUF_SIZE); read_bytes = read(server_socket, buf, BUF_SIZE); if(read_bytes == 0) break; // Read end if(read_bytes < 0){ - printf("\n\r[%s] Read socket failed", __FUNCTION__); + printf("[%s] Read socket failed\n", __FUNCTION__); goto update_ota_exit; } checksum += file_checksum.c[0]; // not read end, this is not attached checksum checksum += file_checksum.c[1]; checksum += file_checksum.c[2]; checksum += file_checksum.c[3]; - //printf("\n\r[%s] read_bytes %d", __FUNCTION__, read_bytes); + //printf("[%s] read_bytes %d", __FUNCTION__, read_bytes); #if 1 device_mutex_lock(RT_DEV_LOCK_FLASH); if(flash_stream_write(&flash, address + size, read_bytes, buf) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); device_mutex_unlock(RT_DEV_LOCK_FLASH); goto update_ota_exit; } @@ -615,7 +615,7 @@ static void update_ota_local_task(void *param) if(size == NewImg2Len) break; } - printf("\n\r"); + printf("\n"); // read flash data back and calculate checksum for(i=0;iip_addr = inet_addr(ip); pUpdateCfg->port = ntohs(port); - if(xTaskCreate(update_ota_local_task, "OTA_server", STACK_SIZE, pUpdateCfg, TASK_PRIORITY, &TaskOTA) != pdPASS){ + if(xTaskCreate(update_ota_local_task, "OTA_server\n", STACK_SIZE, pUpdateCfg, TASK_PRIORITY, &TaskOTA) != pdPASS){ update_free(pUpdateCfg); - printf("\n\r[%s] Create update task failed", __FUNCTION__); + printf("[%s] Create update task failed\n", __FUNCTION__); } return 0; } @@ -738,68 +738,68 @@ static void update_ota_cloud_task(void *param) #if CONFIG_WRITE_MAC_TO_FLASH char mac[ETH_ALEN]; #endif - printf("\n\r[%s] Update task start", __FUNCTION__); + printf("[%s] Update task start\n", __FUNCTION__); buf = update_malloc(BUF_SIZE); if(!buf){ - printf("\n\r[%s] Alloc buffer failed", __FUNCTION__); + printf("[%s] Alloc buffer failed\n", __FUNCTION__); goto update_ota_exit_1; } // Init ctx if(updater_init_ctx(&ctx, (char*)cfg->repository, (char*)cfg->file_path) != 0) { - printf("\n\r[%s] Cloud ctx init failed", __FUNCTION__); + printf("[%s] Cloud ctx init failed\n", __FUNCTION__); goto update_ota_exit_1; } - printf("\n\r[%s] Firmware link: %s, size = %d bytes, checksum = 0x%08x, version = %s\n", __FUNCTION__, + printf("[%s] Firmware link: %s, size = %d bytes, checksum = 0x%08x, version = %s\n", __FUNCTION__, ctx.link, ctx.size, ctx.checksum, ctx.version); // Erase config sectors if(flash_EraseSector(CONFIG_SECTOR) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } #if CONFIG_WRITE_MAC_TO_FLASH // Read MAC address if(flash_Read(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Read MAC error", __FUNCTION__); + printf("[%s] Read MAC error\n", __FUNCTION__); goto update_ota_exit; } #endif // Erase update sectors for(i = UPDATE_SECTOR; i <= FLASH_Sector_11; i += 8){ if(flash_EraseSector(i) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } } // Write update sectors address = flash_SectorAddress(UPDATE_SECTOR); - printf("\n\r"); + printf("\n"); while(ctx.bytes < ctx.size){ read_bytes = updater_read_bytes(&ctx, (unsigned char*)buf, BUF_SIZE); if(read_bytes == 0) break; // Read end if(read_bytes < 0){ - printf("\n\r[%s] Read socket failed", __FUNCTION__); + printf("[%s] Read socket failed\n", __FUNCTION__); goto update_ota_exit; } if(flash_Wrtie(address + size, buf, read_bytes) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes; for(i = 0; i < read_bytes; i ++) checksum += buf[i]; - printf("\rUpdate file size = %d/%d bytes ", ctx.bytes, ctx.size); + printf("\rUpdate file size = %d/%d bytes\n", ctx.bytes, ctx.size); } - printf("\n\r[%s] ctx checksum = %08x, computed checksum = %08x\n", __FUNCTION__, ctx.checksum, checksum); + printf("[%s] ctx checksum = %08x, computed checksum = %08x\n", __FUNCTION__, ctx.checksum, checksum); if(checksum != ctx.checksum){ - printf("\n\r[%s] Checksum error", __FUNCTION__); + printf("[%s] Checksum error\n", __FUNCTION__); goto update_ota_exit; } #if CONFIG_WRITE_MAC_TO_FLASH //Write MAC address if(!(mac[0]==0xff&&mac[1]==0xff&&mac[2]==0xff&&mac[3]==0xff&&mac[4]==0xff&&mac[5]==0xff)){ if(flash_Wrtie(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Write MAC failed", __FUNCTION__); + printf("[%s] Write MAC failed\n", __FUNCTION__); goto update_ota_exit; } } @@ -808,10 +808,10 @@ static void update_ota_cloud_task(void *param) address = flash_SectorAddress(CONFIG_SECTOR); if( (flash_Wrtie(address, (char*)&size, 4) < 0) || (flash_Wrtie(address+4, (char*)&checksum, 4) < 0) ){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } - printf("\n\r[%s] Update OTA success!", __FUNCTION__); + printf("[%s] Update OTA success!\n", __FUNCTION__); update_ota_exit: updater_free_ctx(&ctx); @@ -821,7 +821,7 @@ update_ota_exit_1: if(param) update_free(param); TaskOTA = NULL; - printf("\n\r[%s] Update task exit", __FUNCTION__); + printf("[%s] Update task exit\n", __FUNCTION__); vTaskDelete(NULL); return; } @@ -837,31 +837,31 @@ static void update_ota_cloud_task(void *param) #if CONFIG_WRITE_MAC_TO_FLASH char mac[ETH_ALEN]; #endif - printf("\n\r[%s] Update task start", __FUNCTION__); + printf("[%s] Update task start\n", __FUNCTION__); buf = update_malloc(BUF_SIZE); if(!buf){ - printf("\n\r[%s] Alloc buffer failed", __FUNCTION__); + printf("[%s] Alloc buffer failed\n", __FUNCTION__); goto update_ota_exit_1; } // Init ctx if(updater_init_ctx(&ctx, (char*)cfg->repository, (char*)cfg->file_path) != 0) { - printf("\n\r[%s] Cloud ctx init failed", __FUNCTION__); + printf("[%s] Cloud ctx init failed\n", __FUNCTION__); goto update_ota_exit_1; } - printf("\n\r[%s] Firmware link: %s, size = %d bytes, checksum = 0x%08x, version = %s\n", __FUNCTION__, + printf("[%s] Firmware link: %s, size = %d bytes, checksum = 0x%08x, version = %s\n", __FUNCTION__, ctx.link, ctx.size, ctx.checksum, ctx.version); // Erase config sectors for(i = CONFIG_SECTOR; i < APPLICATION_SECTOR; i += FLASH_PAGE_SIZE){ if(flash_EraseSector(i) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } } #if CONFIG_WRITE_MAC_TO_FLASH // Read MAC address if(flash_Read(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Read MAC error", __FUNCTION__); + printf("[%s] Read MAC error\n", __FUNCTION__); goto update_ota_exit; } #endif @@ -869,18 +869,18 @@ static void update_ota_cloud_task(void *param) // Erase update sectors for(i = UPDATE_SECTOR; i < FLASH_Sector_0 + FLASH_SIZE; i += FLASH_PAGE_SIZE){ if(flash_EraseSector(i) < 0){ - printf("\n\r[%s] Erase sector failed", __FUNCTION__); + printf("[%s] Erase sector failed\n", __FUNCTION__); goto update_ota_exit; } } // Write update sectors address = UPDATE_SECTOR; - printf("\n\r"); + printf("\n"); while(ctx.bytes < ctx.size){ read_bytes = updater_read_bytes(&ctx, (unsigned char*)buf, BUF_SIZE); if(read_bytes == 0) break; // Read end if(read_bytes < 0){ - printf("\n\r[%s] Read socket failed", __FUNCTION__); + printf("[%s] Read socket failed\n", __FUNCTION__); goto update_ota_exit; } if(flag_a == 0){ @@ -888,14 +888,14 @@ static void update_ota_cloud_task(void *param) a = buf[read_bytes - 1]; flag_a = 1; if(flash_Wrtie(address + size, buf, read_bytes - 1) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes - 1; } else{ if(flash_Wrtie(address + size, buf, read_bytes) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes; @@ -904,7 +904,7 @@ static void update_ota_cloud_task(void *param) else{ a = buf[0]<< 8 |a; if(flash_Wrtie(address + size, (char*)(&a), 2) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += 2; @@ -914,14 +914,14 @@ static void update_ota_cloud_task(void *param) a = buf[read_bytes - 1]; flag_a = 1; if(flash_Wrtie(address + size, buf + 1, read_bytes - 2) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes - 2; } else{ if(flash_Wrtie(address + size, buf + 1, read_bytes - 1) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += read_bytes - 1; @@ -929,25 +929,25 @@ static void update_ota_cloud_task(void *param) } for(i = 0; i < read_bytes; i ++) checksum += buf[i]; - printf("\rUpdate file size = %d/%d bytes ", ctx.bytes, ctx.size); + printf("\rUpdate file size = %d/%d bytes\n", ctx.bytes, ctx.size); } if(flag_a){ if(flash_Wrtie(address + size, (char*)(&a), 2) < 0){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } size += 1; } - printf("\n\r[%s] ctx checksum = %08x, computed checksum = %08x\n", __FUNCTION__, ctx.checksum, checksum); + printf("[%s] ctx checksum = %08x, computed checksum = %08x\n", __FUNCTION__, ctx.checksum, checksum); if(checksum != ctx.checksum){ - printf("\n\r[%s] Checksum error", __FUNCTION__); + printf("[%s] Checksum error\n", __FUNCTION__); goto update_ota_exit; } #if CONFIG_WRITE_MAC_TO_FLASH //Write MAC address if(!(mac[0]==0xff&&mac[1]==0xff&&mac[2]==0xff&&mac[3]==0xff&&mac[4]==0xff&&mac[5]==0xff)){ if(flash_Wrtie(FLASH_ADD_STORE_MAC, mac, ETH_ALEN) < 0){ - printf("\n\r[%s] Write MAC failed", __FUNCTION__); + printf("[%s] Write MAC failed\n", __FUNCTION__); goto update_ota_exit; } } @@ -957,10 +957,10 @@ static void update_ota_cloud_task(void *param) address = CONFIG_SECTOR; if( (flash_Wrtie(address, (char*)&size, 4) < 0) || (flash_Wrtie(address+4, (char*)&checksum, 4) < 0) ){ - printf("\n\r[%s] Write sector failed", __FUNCTION__); + printf("[%s] Write sector failed\n", __FUNCTION__); goto update_ota_exit; } - printf("\n\r[%s] Update OTA success!", __FUNCTION__); + printf("[%s] Update OTA success!\n", __FUNCTION__); update_ota_exit: updater_free_ctx(&ctx); @@ -970,7 +970,7 @@ update_ota_exit_1: if(param) update_free(param); TaskOTA = NULL; - printf("\n\r[%s] Update task exit", __FUNCTION__); + printf("[%s] Update task exit\n", __FUNCTION__); vTaskDelete(NULL); return; } @@ -983,27 +983,27 @@ int update_ota_cloud(char *repository, char *file_path) update_cfg_cloud_t *pUpdateCfg; if(TaskOTA){ - printf("\n\r[%s] Update task has created.", __FUNCTION__); + printf("[%s] Update task has created.\n", __FUNCTION__); return 0; } pUpdateCfg = update_malloc(sizeof(update_cfg_cloud_t)); if(pUpdateCfg == NULL){ - printf("\n\r[%s] Alloc update cfg failed.", __FUNCTION__); + printf("[%s] Alloc update cfg failed.\n", __FUNCTION__); goto exit; } if(strlen(repository) > (REPOSITORY_LEN-1)){ - printf("\n\r[%s] Repository length is too long.", __FUNCTION__); + printf("[%s] Repository length is too long.\n", __FUNCTION__); goto exit; } if(strlen(file_path) > (FILE_PATH_LEN-1)){ - printf("\n\r[%s] File path length is too long.", __FUNCTION__); + printf("[%s] File path length is too long.\n", __FUNCTION__); goto exit; } strcpy((char*)pUpdateCfg->repository, repository); strcpy((char*)pUpdateCfg->file_path, file_path); if(xTaskCreate(update_ota_cloud_task, "OTA_server", STACK_SIZE, pUpdateCfg, TASK_PRIORITY, &TaskOTA) != pdPASS){ - printf("\n\r[%s] Create update task failed", __FUNCTION__); + printf("[%s] Create update task failed\n", __FUNCTION__); goto exit; } @@ -1016,11 +1016,11 @@ exit: //--------------------------------------------------------------------- void cmd_update(int argc, char **argv) { -// printf("\n\r[%s] Firmware A", __FUNCTION__); +// printf("[%s] Firmware A", __FUNCTION__); #if (SERVER_TYPE == SERVER_LOCAL) int port; if(argc != 3){ - printf("\n\r[%s] Usage: update IP PORT", __FUNCTION__); + printf("[%s] Usage: update IP PORT\n", __FUNCTION__); return; } port = atoi(argv[2]); @@ -1028,7 +1028,7 @@ void cmd_update(int argc, char **argv) #endif #if (SERVER_TYPE == SERVER_CLOUD) if(argc != 3){ - printf("\n\r[%s] Usage: update REPOSITORY FILE_PATH", __FUNCTION__); + printf("[%s] Usage: update REPOSITORY FILE_PATH\n", __FUNCTION__); return; } update_ota_cloud(argv[1], argv[2]); @@ -1056,9 +1056,9 @@ void cmd_ota_image(bool cmd){ device_mutex_lock(RT_DEV_LOCK_FLASH); flash_stream_read(&flash, Part2Addr, FLASH_SECTOR_SIZE, pbuf); if (cmd == 1) - memcpy((char*)pbuf+8, "81958711", 8); + memcpy((char*)pbuf+8, IMG_SIGN_RUN, 8); else - memcpy((char*)pbuf+8, "01958711", 8); + memcpy((char*)pbuf+8, IMG_SIGN_SWP, 8); flash_erase_sector(&flash, Part2Addr); flash_stream_write(&flash, Part2Addr, FLASH_SECTOR_SIZE, pbuf); @@ -1068,9 +1068,9 @@ void cmd_ota_image(bool cmd){ device_mutex_lock(RT_DEV_LOCK_FLASH); flash_stream_read(&flash, Part1Addr, FLASH_SECTOR_SIZE, pbuf); if (cmd == 1) - memcpy((char*)pbuf+8, "01958711", 8); + memcpy((char*)pbuf+8, IMG_SIGN_SWP, 8); else - memcpy((char*)pbuf+8, "81958711", 8); + memcpy((char*)pbuf+8, IMG_SIGN_RUN, 8); flash_erase_sector(&flash, Part1Addr); flash_stream_write(&flash, Part1Addr, FLASH_SECTOR_SIZE, pbuf); diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/loader.c b/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/loader.c index d623b27..0cc1952 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/loader.c +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/loader.c @@ -50,7 +50,7 @@ RAM_START_FUNCTION __attribute__((section(".start.ram.data.e"))) gRamPatchFun2 = RAM_START_FUNCTION __attribute__((section(".image2.ram.data"))) gImage2EntryFun0 = { InfraStart + 1 }; _RAM_IMG2_VALID_PATTEN __attribute__((section(".image2.validate.rodata"))) RAM_IMG2_VALID_PATTEN = - { { "RTKWin" }, { 0xff, 0, 1, 1, 0, 0x95, 0x81, 1, 1, 0, 0, 0, 0 } }; + { { IMG2_SIGN_TXT }, { 0xff, 0, 1, 1, 0, 0x95, 0x81, 1, 1, 0, 0, 0, 0 } }; // "RTKWin" HAL_GPIO_ADAPTER __attribute__((section(".hal.ram.data"))) gBoot_Gpio_Adapter; diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/startup.c b/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/startup.c index 867e3be..4d74751 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/startup.c +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/ram_lib/startup.c @@ -88,7 +88,7 @@ RAM_START_FUNCTION __attribute__((section(".start.ram.data.e"))) gRamPatchFun2 = RAM_START_FUNCTION __attribute__((section(".image2.ram.data"))) gImage2EntryFun0 = { InfraStart + 1 }; _RAM_IMG2_VALID_PATTEN __attribute__((section(".image2.validate.rodata"))) RAM_IMG2_VALID_PATTEN = - { { "RTKWin" }, { 0xff, 0, 1, 1, 0, 0x95, 0x81, 1, 1, 0, 0, 0, 0 } }; + { { IMG2_SIGN_TXT }, { 0xff, 0, 1, 1, 0, 0x95, 0x81, 1, 1, 0, 0, 0, 0 } }; // "RTKWin" HAL_GPIO_ADAPTER __attribute__((section(".hal.ram.data"))) gBoot_Gpio_Adapter; @@ -204,7 +204,7 @@ void __attribute__((section(".hal.ram.text"))) RtlBootToSram(void) { SpicFlashInitRtl8195A(1); // SpicBitMode 1 DBG_8195A("===== Enter Image 1.5 ====\nImg2 Sign: %s, InfaStart @ 0x%08x\n", &__image2_validate_code__, __image2_entry_func__); - if (strcmp((const char * )&__image2_validate_code__, "RTKWin")) { + if (strcmp((const char * )&__image2_validate_code__, IMG2_SIGN_TXT)) { DBG_MISC_ERR("Invalid Image2 Signature!\n"); RtlConsolRom(10000); // ROM: RtlConsolRom = 0xedcd; } @@ -231,7 +231,7 @@ int __attribute__((section(".hal.ram.text"))) IsForceLoadDefaultImg2(void) { u8 gpio_pin[4]; HAL_GPIO_PIN GPIO_Pin; - *((u32 *) &gpio_pin) = *(u32 *) (SPI_FLASH_BASE + 0x9008); // config data + 8 + *((u32 *) &gpio_pin) = *(u32 *) (SPI_FLASH_BASE + FLASH_SYSTEM_DATA_ADDR + 0x08); // config data + 8 int i = 0; _pHAL_Gpio_Adapter = (int) &gBoot_Gpio_Adapter; int result = 0; @@ -347,16 +347,16 @@ void __attribute__((section(".hal.ram.text"))) PreProcessForVendor(void) { { v16 = -1; v17 = -1; - if (sign2 == 0x31313738) { - if (sign1 == 0x35393138) { + if (sign2 == IMG_SIGN2_RUN) { + if (sign1 == IMG_SIGN1_RUN) { v16 = img1size; v17 = -1; - } else if (sign1 == 0x35393130) { + } else if (sign1 == IMG_SIGN1_SWP) { v17 = img1size; v16 = -1; } } - u32 OTA_addr = *(u32 *) (SPI_FLASH_BASE + 0x9000); // config sector data + u32 OTA_addr = *(u32 *) (SPI_FLASH_BASE + FLASH_SYSTEM_DATA_ADDR); // config sector data if (OTA_addr != -1) { u32 image2size = *(u32 *) (img1size + SPI_FLASH_BASE); if (OTA_addr >= (img1size + image2size) @@ -364,9 +364,9 @@ void __attribute__((section(".hal.ram.text"))) PreProcessForVendor(void) { prdflash = (u32 *) (OTA_addr + SPI_FLASH_BASE + 8); sign1 = *prdflash++; sign2 = *prdflash; - if (sign2 == 0x31313738) { - if (sign1 == 0x35393138) v16 = OTA_addr; - else if (sign1 == 0x35393130) v17 = OTA_addr; + if (sign2 == IMG_SIGN2_RUN) { + if (sign1 == IMG_SIGN1_RUN) v16 = OTA_addr; + else if (sign1 == IMG_SIGN1_SWP) v17 = OTA_addr; } LABEL_41: if (IsForceLoadDefaultImg2()) { if (v17 != -1) run_image = v17; @@ -421,7 +421,7 @@ LABEL_55: prdflash = run_image + SPI_FLASH_BASE; (const char * )(Image2Addr + 4), *(u32 *)Image2Addr); if (strcmp((const char * )(Image2Addr + 4), - "RTKWin")) { + IMG2_SIGN_TXT)) { DBG_MISC_ERR("Invalid Image2 Signature\n"); while (1) RtlConsolRom(1000); } @@ -439,7 +439,7 @@ LABEL_55: prdflash = run_image + SPI_FLASH_BASE; goto LABEL_41; } } // if (flash_enable) - if (strcmp((const char * )(Image2Addr + 4), "RTKWin")) { + if (strcmp((const char * )(Image2Addr + 4), IMG2_SIGN_TXT)) { DBG_MISC_ERR("Invalid Image2 Signature\n", 2 * ConfigDebugErr); while (1) RtlConsolRom(1000); } diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/rtl8195a/rtl8195a.h b/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/rtl8195a/rtl8195a.h index 83671df..5c88e54 100644 --- a/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/rtl8195a/rtl8195a.h +++ b/RTL00_SDKV35a/component/soc/realtek/8195a/fwlib/rtl8195a/rtl8195a.h @@ -161,4 +161,12 @@ #define FLASH_ADC_PARA_OFFSET 0x200 #define FLASH_ADC_PARA_BASE (FLASH_SYSTEM_DATA_ADDR+FLASH_ADC_PARA_OFFSET) +#define IMG_SIGN_RUN "81958711" +#define IMG_SIGN_SWP "01958711" +#define IMG_SIGN1_RUN 0x35393138 // "8195" +#define IMG_SIGN1_SWP 0x35393130 // "0195" +#define IMG_SIGN2_RUN 0x31313738 // "8711" +#define IMG_SIGN2_SWP IMG_SIGN2_RUN // "8711" +#define IMG2_SIGN_TXT "RTKWin" + #endif //_HAL_8195A_H_ diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/lib_platform.a b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/lib_platform.a index 90e7f68f1eeafc718a31bbc71b0941426f84eac2..c961b770a0e5395db1c73b433f496b49ca1597d1 100644 GIT binary patch delta 76363 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%0DaRc2Mp?`LuLw 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 delta 62471 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 diff --git a/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/lib_platform_new.a b/RTL00_SDKV35a/component/soc/realtek/8195a/misc/bsp/lib/common/GCC/lib_platform_new.a index 8812dcf5fc064203aa6da5afddd5d118c1a2965e..06639e8bba209bb3123b4bb76abe5f84448fb1a2 100644 GIT binary patch delta 18002 zcmc(`XLwb``aV1}yJRPO@AME7LMns=LP!W9p+q2r0HK8*YC<*i00BY8jfw>;u)u`^ zV*81D#G`^nJyL8(EC?tZ@TdsbX<|W9K>qhVdxChb^WnUo-dxw3d!GKxGqYy3os%a+ z&zuTf(JZ86`wsb?+IM;`{YDw66Y|~v-;R0pThi4AZ(~CC;df;dcYc0BabBMN`@1qz z7H2yt-T@US$vEibHaO{A{(K-j}j?ocl zdh}=a9VeR7@$4?NhNia&+=D!vu86CY5Z?I+GtV0qEyR3p9Te-m_k{_u!21R47kU>V z$?Lptp?|%15BN8D-+^twI}se={n?EHdowsH?`kCH@P371IK2nKcX~LlJ{wNXzo3V@g{qF zh6jX5@zx>aP7EKpye7PRVE(%BuJH=7OL*@A^^Wkq4F7wDcQG{g3Gb8edPsPeBFT@1 zcN_BfM0lHn`6&!gjn7aI1o&KdCxdxJc)viBM^TjRNXj+lLze$G6u>pL=PT&@BB2%O zs$B^i|0MFK^+i|sKZTiVI_Jjew-MSk;}Nhueu440X0q=Sj`mhji{_(0LGo@VSs`yh z-@_glub}VyjkDtJdIo*}_2|1x?xNIx9D{OS#l94dOyuD1_8xR1qLJlY$~|&1!uW;t zOpEvd&mt4|XsX8fQ&2(o81|d^m(ktW#5BkGmiJBo!Ho^0~(|i=`^^CKA;o zmZ``PmlfTztF)~_Ez^4@Bb4xFqLtoUw94BNt;2g2TBo-ht;;(Qt=l^SZHRX~T90=s z+EDLov|-*!*4CD-T5iEqgzVzTBd)`Y<;akCcOqqfKja$n9t$h{@vAc9JA8y;hJ3IW zvel7WQPPk-??VX%tDVhY9(vj05m;OwE>5Cp>M zydTRdY#TUEPeNy~yaH~8cRJ=V$$JYiGopAdQ8UC4JQ23L7%x?GbUk2B6s=^dJMIh=7`3@!9dO*(`#F2zdAYAzG3ZduJ*-HgOTSNCFK z8OSj&^uD$jTkPbCGeziHZ4n+V;$F9I%*yd^#=t^1Xr@2JdL=8X1b zq2J8{_@BnuLyxm7{AWX~knGILObk%CLjQOUsl*@VXob8BED?V%38@Jg-x6~dsx+bE z--ClthbA2H??N}!r3q*J0c9=8ZXeh|Q?KSl#CwoMs9!R@$oMfd4cC&`_z_sJp%I#h zi~or>k(y`{uge~#iTL;d989$2d^U|QrcIpomK6U_tn$z%a=pUD#gs`bj^w`0A8Hj_&byidYSEP8V-=_(Vhu|~J<6)_4W4s9v70_tSKN7gf~o5@P+ z-PX-Ue8sfd$k$-hT_q$k{al^b5tUHD*=#3|LiVLfSWh2$@*7a!s)R6>x-J6r8E`(Sw=i~++rPnFWmmn8OvoIMl;Jg8Sxe_6o*Y)j1MiJxaT$XBo z&1XzmEaZ(&JvVP+i0JD$Ny$uLdC3<`^n+NMWn3p;3$elWsv<`&9Wt8;F*$Q7(mE{82EMf%$w zYk6+-?1da`XAX~lNjT*C0aybq_G!UZ1fB$Di%e@zZbtF%m~&bBSM9%F)-I*?JJgQ80IUjdlIhm{uORzciJgOSjRiHiqgUtxEv1RXaQMz=jn2Tb$4eY z`+~B6V}2-mt8*{8-tuOaX=Ob*T@s7i;!- z6qoG5T`OcKYkgN^vrP-TqYe}vgz$DNy~GF|iqX=sn@~8eq(aWJo+!x<7Uukwg}HEL zVJ==S%x@(>26IT#Vd8QA(9^}M=Jw&nCc|7$B@6Krx`q1m^|`nr+F~c@s*CS;as8X( zhr5`K2o^uWNQ$i&yFJ+K9gJDFm497MAt{J9z?##&L_O%Wp6T9H4zS+to)S!GgidHu zOfaEy-G{1sL#+Wlij(!}+E#}e8rzshJC{D`y53|x+QX8MTScYW@=a?(X_ex^UMaac`Vbx9Ih;_ziVo8iZJN*+aQNkb zU-a4_cUd=X}we0>($#ruZyA0gecHE zT}#DjS_3*yC(%;NUnGs$p4WRFoQL*YBpEDFbphTT;S_1}X``ZRk_k{tr`YFO1I8fU!8c5#b1FKY&YtMe)$>R@gD%U~+E7-Gw3tXGF< z`)`Jj6*sg>xt-RWp<3<9q2wJLYOBNHR^2e2%mc&7+cm68-fX1}=U~PRpQ0WMvtA$0 zs+|~KCYM=xBRa8YGe%JN{t-J#j2TH{`N%5yhIMSDmN%~=t6$Z9a+r0jN~hr;MOK$l zRVvhBtr^8(d@yQ?YU{EJN7MiK(PiqzQ0uYLI>E!EsqGtcpZcfQdTfkN@PjerT^LiP zPJ~(`#%jG4W69e-_C9smYmFGE^_Gq!@0oE`>S>4N8P7;P#!r!ltWD!tuzlmpA1B=>Bdz6=_0YFYChOSbRg^EBLgKM0_sI&Y%Tz6&I+d)|Q>R7W!+mM4 zA3Kc;mnhu9Z?__@j*DLj!aeOtw7s9f)*Ke|2xNUiwsg5VFe2nrY(Gl4tk<>;Z+Xp} zc{AqMO_(%g?7aFp^Q#x;6;w~0H(~aq+UkPBiPaP4Oe0WXpE212TRijZZO zL;{NKy9wPJK8uv`5~-bylGmu6BkkGI@UZhqdpi)x`D0`ob;NIXj*;mg$HmB2?&r4& zaV*-tgRIr|X0TkYeYnclHx{Z``&5jK;K0E~u$Hla_4WY5B6|U$s$oN{?AR1bx#2*L z{CrIy8t1FR^8%kD6>jhfh&X-Ah`1r*qmRM~KZl5`{W2mhuj`13LOe%oj@K~6R3W}2 zX5e`NPuU6=#Z+Rp5bcRM@Jnnb#0X-05fHWP6bf-Iu~>)$#4bX7O}t8oKZrf>LJ3K# zG9j{wy@eP?tPo-bvA+=a5(f#fg*XH+eTc(_xJazRJsNJ%)fgc<6UPfNfH(m!l_s+@ zNr>gdsX}ZZP7`7)aRzQBiL-?`L7a;Rf84sN`MCKfE)=2*aWN7iUWb7Yad)tRc%u+6 z5^ok_5AjwZ&Jvg7(FoO60o=D&uyZfo=Mh&4v5~k&h?j_Kg*Z%Hhs_l?%IZNOa)}S4 zgv7`2c8|D82%Gqn5Zj2Gh4_m2EFP<|Q>!gP6cb;>0}AnFyc+}t)T@|FGIj{@2Jv+v zP7~kaTRPw_A$kzs6Jj*+10fa@vFIKq?ni})2k{<(_-{Oh;^td@hJeH)LX0GSfndb1 zh2VPz^_>v=eIi$=len7j>hL{Y{}J(A*NJ#mhzZ1VLfk__drMyHy7HB7yt6|- zUg-YzE*5uPL)v@N?=QO4yW_y3e(n}U70&Y__Fw13irdSZ)kf8Zl&kDFeo`@mj=vcu z_lY)r_D0vr)^eY0({rzAnPV?LB$L%mE$#ac$&^5H-_Y7!&bR|H=i28@T-2#tta@Zo zVjsCGv43g#L%l~uEyVQZSQBkaX!24+cUSNP7vL3UUiSH5#5)r5SVZMXBT`d zqud@ag=i@KSY9i;-QKV5cV`AQtG)YK45HaTeh?A99V%U>hpcj^qdL#u*w4MfapHCL z;Ua%|^vk2lFa7$*CHFeY9M50dN7�TaIeE^GL|LS;BGNbwRZ7tVt<%t$w8Zq4JOi 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