int main(void) { uint32_t JumpAddress = 0; SysTick_Init(); memcpy((uint8*)&tag_info.net_flag_set, (void*)STORE_SYS_INFO_PAGE_ADDR, sizeof(tag_flash_info_t)); #ifdef QRCODE /*check if qrcode can be gernerate*/ if(tag_info.qr_set_flag == SYS_PARA_MAGIC_NUM && tag_info.qr_crc != cal_crc16(&tag_info.qrcode[0], 63)) { if (((*(__IO uint32_t*)APP_ERCODE_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (APP_ERCODE_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) APP_ERCODE_ADDRESS); /* Jump to application */ Jump_To_Application(); } } #endif /*check if soft update flag is set*/ if(SYS_PARA_MAGIC_NUM == tag_info.update_software_flag) { if(tag_info.software_crc == cal_crc16((uint8*)APP_ERCODE_ADDRESS, 0x400*29)) { if(1 == program_move(tag_info.software_crc)) { while(1) { //error update } } } } if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); /* Jump to application */ Jump_To_Application(); } }
uint8 program_move(uint16 crc) { uint16 app_crc; uint16 cmp = 2; int t = 0; uint32_t addr_src = APP_ERCODE_ADDRESS; uint32_t addr_dst = APPLICATION_ADDRESS; FLASH_If_Init(); FLASH_If_Erase(APP_ERCODE_ADDRESS); FLASH_If_Write((__IO uint32_t* )&addr_dst, (uint32_t*)addr_src ,(0x400/4*29)); FLASH_Lock(); app_crc = cal_crc16((uint8*)APPLICATION_ADDRESS, 0x400*29); if(crc == app_crc) return 0; return 1; }
static int st_hub_ymodem_crc_check(struct st_hub_data *hdata, u8 *packet_data, size_t packet_size) { int err; u8 data; u16 temp_crc; temp_crc = cal_crc16(packet_data, packet_size); data = temp_crc >> 8; err = hdata->tf->write_rl(hdata->dev, 1, &data); if (err < 0) return err; data = temp_crc & 0xff; err = hdata->tf->write_rl(hdata->dev, 1, &data); if (err < 0) return err; msleep(ST_HUB_YMODEM_SLEEP_MS); return 0; }