From 8415b6bc61925a1a234fe393d8375d3828756931 Mon Sep 17 00:00:00 2001 From: WXK <287788329@qq.com> Date: 星期五, 23 五月 2025 11:28:14 +0800 Subject: [PATCH] 修改搬运大小 --- dualboots_Gai_youhua/src/customboot/customboot.c | 299 +++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 207 insertions(+), 92 deletions(-) diff --git a/dualboots_Gai_youhua/src/customboot/customboot.c b/dualboots_Gai_youhua/src/customboot/customboot.c index cd99563..c2625bc 100644 --- a/dualboots_Gai_youhua/src/customboot/customboot.c +++ b/dualboots_Gai_youhua/src/customboot/customboot.c @@ -14,6 +14,8 @@ #include "AppConfig.h" #include "menu.h" #include "aes.h" +#include "AppConfig.h" +#include "mk_sleep_timer.h" static const uint32_t fw_addr = 0x04004000; static const uint32_t fw_bytes = 14712; @@ -22,9 +24,11 @@ #define TEST_UART_INTERUPT_MODE 1 #define TEST_UART_DMA_MODE 2 #define TEST_UART_MODE TEST_UART_DMA_MODE - +volatile unsigned long time_100ms; +volatile unsigned long shengji_time_100ms; volatile unsigned long time32_incr; volatile unsigned long time32_reset = 0; +volatile unsigned long start_timer; static unsigned char buff[100]; uint8_t key[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; @@ -108,67 +112,147 @@ if(data==0xFF) { uint16_t tmp = 0xAAAA,result; -// SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP,2, SPI_FLASH_SECTOR_ERASE_MODE_4K); MK8000修改 -// SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); + flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APP + flash_write_nbytes(FLASH_ID0,APP_CONFIG_IAPFLAG_MAP,(uint8_t*)&tmp,2); state = 0; - } break; } } +uint8_t state111; +unsigned short int APP_byte = 0; unsigned short int updata_byte = 0; uint8_t trx_buf[10] = {0}; +int test1; +int aaa; +uint16_t finalbag; +static unsigned char zhongjian_shuju[128]; +uint8_t jiexi_shuju[128]; +static void app_wdt_callback(void *dev, uint32_t status) +{ + ASSERT(status, "WDT TIMEOUT,程序复位"); + //LOG_INFO(TRACE_MODULE_APP, "程序卡死,看门狗复位"); +} + struct WDT_CFG_T app_wdt_cfg = { + .timeout = 32768 * 30, + .rst_en = true, + .int_en = true, + .callback = app_wdt_callback, + }; +static void sleep_timer_callback(void *dev, uint32_t time) +{ +time_100ms++; + shengji_time_100ms++; + if(shengji_time_100ms>300) + { + NVIC_SystemReset(); + } +} +uint8_t flagmode;/*0是工卡,1是手环*/ +//uint8_t flagshouhuan; int main(void) { uint8_t c; //sys_tick_callback_set(systic_time_callback); board_clock_run(); + calib_chip(); + gpio_open(); board_pins_config(); //board_debug_console_open(TRACE_PORT_UART0); // Chip calibration - calib_chip(); +// calib_chip(); + sleep_timer_open(true, SLEEP_TIMER_MODE_RELOAD, sleep_timer_callback); + sleep_timer_start(__MS_TO_32K_CNT(100));//测试 // Disable watchdog timer wdt_close(WDT_ID0); - + wdt_open(WDT_ID0,&app_wdt_cfg);//30s检测喂狗 //LOG_INFO(TRACE_MODULE_APP, "进入Bootloader串口升级\r\n"); - gpio_open(); +// gpio_open(); board_configure(); - struct UART_CFG_T test_uart_cfg = - { - .parity = UART_PARITY_NONE, - .stop = UART_STOP_BITS_1, - .data = UART_DATA_BITS_8, - .flow = UART_FLOW_CONTROL_NONE, - .rx_level = UART_RXFIFO_CHAR_1, - .tx_level = UART_TXFIFO_EMPTY, - .baud = BAUD_115200, -#if (TEST_UART_MODE == TEST_UART_POLL_MODE) - .dma_en = false, - .int_rx = false, - .int_tx = false, -#elif (TEST_UART_MODE == TEST_UART_INTERUPT_MODE) - .dma_en = false, - .int_rx = true, - .int_tx = true, -#elif (TEST_UART_MODE == TEST_UART_DMA_MODE) - .dma_en = true, - .int_rx = false, - .int_tx = false, -#endif - }; +// struct UART_CFG_T test_uart_cfg = +// { +// .parity = UART_PARITY_NONE, +// .stop = UART_STOP_BITS_1, +// .data = UART_DATA_BITS_8, +// .flow = UART_FLOW_CONTROL_NONE, +// .rx_level = UART_RXFIFO_CHAR_1, +// .tx_level = UART_TXFIFO_EMPTY, +// .baud = BAUD_115200, + +// .dma_en = true, +// .int_rx = false, +// .int_tx = false, +// }; flash_open(FLASH_ID0, NULL); - uart_open(UART_ID1, &test_uart_cfg); +// uart_open(UART_ID1, &test_uart_cfg); //uart_open(UART_ID0, &test_uart_cfg); //uart_receive(UART_ID1, trx_buf, 1, uart_receive_callback); - SerialPutString("MK8000-BootLoader-V1.0启动\r\n"); +// SerialPutString("MK8000-BootLoader-V1.1启动\r\n"); //Serial0PutString("MK8000-BootLoader-V1.0启动\r\n"); + delay_ms(200); + start_timer=time_100ms; + while(time_100ms<start_timer+5) + { + if (Receive_Byte(&c, 0x100000) == 0)//返回0成功收取数据,-1为没收到数据 + { + usartdata_process(c); + } + } +// uart_close(UART_ID1); +// uart1_change_shouhuan(); +// uart_open(UART_ID1, &test_uart_cfg); +// start_timer=time_100ms; +// while(time_100ms<start_timer+5) +// { +// if (Receive_Byte(&c, 0x100000) == 0)//返回0成功收取数据,-1为没收到数据 +// { +// switch(state111) +// { +// case 0: +// if(c==0x55) +// { +// state111 = 1; +// } +// break; +// case 1: +// if(c==0x55) +// { +// state111 = 2; +// }else{ +// state111 = 0; +// } +// break; +// case 2: +// if(c==0x55) +// { +// flagmode=1; +// }else{ +// state111 = 0; +// } +// break; +// } +// usartdata_process(c); +// } +// } +// if(flagmode) +// { +// +// } +// else +// { +// uart_close(UART_ID1); +// uart1_change_gongka(); +// uart_open(UART_ID1, &test_uart_cfg); +// } + + SerialPutString("MK8000-BootLoader-V1.1启动\r\n"); while(1) { - + wdt_ping(WDT_ID0);//喂狗 uint16_t tmp = 0; - tmp=0xAAAA;//测试用 +// tmp=0xAAAA;//测试用 //flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE); //flash_write_nbytes(FLASH_ID0,APP_CONFIG_IAPFLAG_MAP,(uint8_t*)&tmp,2);//测试用 // SPIFlash_Read(SPI_FLASH_ID_0, (HIDO_UINT8*)&tmp, APP_CONFIG_IAPFLAG_MAP, sizeof(tmp)); MK8000修改 @@ -178,7 +262,7 @@ { } updata_byte = tmp;//读取指定地址的值 - if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则升级 + if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则 升级 { SerialPutString("串口升级启动\r\n"); @@ -186,71 +270,102 @@ } else if(updata_byte == 0xBBBB)//判断此地址的值是否为0xBBBB,如果是则网络升级 { - unsigned int i = 0; - unsigned int spiflash_addr = APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS; - unsigned int flashdestination = APP_CONFIG_APPLICATION_ADDRESS; - uint32_t JumpAddress; - pFunction Jump_To_Application; + unsigned int ii = 0; +// unsigned int spiflash_addr = APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS; +// unsigned int flashdestination = APP_CONFIG_APPLICATION_ADDRESS; +// uint32_t JumpAddress; +// pFunction Jump_To_Application; - SerialPutString("网络升级启动启动\r\n"); -// Flash_Init(); -// Flash_Erase(APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//MK8000修改 - flash_erase(FLASH_ID0, APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//擦除APP + SerialPutString("OTA完成,解密文件启动\r\n"); + SerialPutString("OTA固件解压\r\n"); + aesDecInit(); - /* 200KB */ - while(spiflash_addr < (APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS + APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_SIZE)) - { - /* 读取一包数据 */ - //SPIFlash_Read(SPI_FLASH_ID_0, buff, spiflash_addr, sizeof(buff));MK8000修改 - flash_read(FLASH_ID0, spiflash_addr, buff, sizeof(buff)); - while (flash_check_busy(FLASH_ID0)) - { - } - spiflash_addr += sizeof(buff); - - for(i = 0; i < sizeof(buff); i += 16) - { - aesDecrypt(&buff[i],key); - } - - flash_write(FLASH_ID0, flashdestination, buff, sizeof(buff)); - while (flash_check_busy(FLASH_ID0)) - { - } - flashdestination += sizeof(buff); -// Flash_Write(flashdestination, buff, sizeof(buff)); -// flashdestination += sizeof(buff); //MK8000修改 - } - - /* 清标志 */ - tmp = 0xFFFF; - flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, 2);//擦除APPFLAG - flash_write(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, sizeof(tmp)); - delay_ms(500); - NVIC_SystemReset(); -// SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP,2, SPI_FLASH_SECTOR_ERASE_MODE_4K); -// SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); //MK8000修改 - - //HAL_Delay(500); - //SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; MK8000 修改 - - } - else if(updata_byte == 0xCCCC)//OTA - { - SerialPutString("OTA升级启动\r\n"); - IAP_JumpTo(SRAM_BASE); - } - else //不是则跳转到APP,注意F0和其他系列的跳转有些不一样,跳转部分可参考原子哥代码 - { - //Delay_ms(1000); - /* Test if user code is programmed starting from address "APP_CONFIG_APPLICATION_ADDRESS" */ - //Serial0PutString("跳转APPhehe\r\n"); + + flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APP + flash_read(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, 2); + APP_byte = tmp; + if(APP_byte==0XBBBB) + { + uart_close(UART_ID1); + delay_ms(200); memcpy((void *)SRAM_BASE, (void *)APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//size太大导致覆盖没法跳转 __set_MSP(*(uint32_t *)SRAM_BASE); typedef void (*p_entry_t)(void); ((p_entry_t) (*(uint32_t *)(SRAM_BASE + 4) + SRAM_BASE))(); + } + SerialPutString("擦除标注位成功\r\n"); + test1=flash_erase(FLASH_ID0,APP1_ADRESS,APP_CONFIG_APPLICATION_SIZE); + if(test1==0) + { + finalbag=(APP_CONFIG_APPLICATION_SIZE/128)+1; +// wdt_close(WDT_ID0); + for(aaa=0;aaa<finalbag;aaa++) + { +// time32_reset=0; + memcpy(&zhongjian_shuju,(void *)(APP2_ADRESS+(aaa*128)),128); + + for(ii = 0; ii < sizeof(zhongjian_shuju); ii += 16) + {aesDecrypt(&zhongjian_shuju[ii],key);} + + test1=flash_write_nbytes(FLASH_ID0, (APP1_ADRESS+(aaa*128)), zhongjian_shuju, sizeof(zhongjian_shuju)); +// if(test1==0) +// {SerialPutString("解密成功\r\n");} +// else +// {SerialPutString("解密失败\r\n");} + wdt_ping(WDT_ID0);//喂狗 + shengji_time_100ms=0; + } + delay_ms(10); + SerialPutString("OTA解密成功,准备重启\r\n"); + delay_ms(500); + NVIC_SystemReset(); + } + + } + else if(updata_byte == 0xCCCC)//OTA + { + + SerialPutString("进入OTA,升级启动\r\n"); + delay_ms(100); + uart_close(UART_ID1); + gpio_close(); + sleep_timer_close(); + __disable_irq(); + delay_ms(500); + memcpy((void *)SRAM_BASE, (void *)OTA_ADRESS, APP_CONFIG_APPLICATION_SIZE);//size太大导致覆盖没法跳转 + __set_MSP(*(uint32_t *)SRAM_BASE); + typedef void (*p_entry_t)(void); + ((p_entry_t) (*(uint32_t *)(SRAM_BASE + 4) + SRAM_BASE))(); + delay_ms(100); + flash_close(FLASH_ID0); + __enable_irq(); +// Serial0PutString("进入OTA\r\n"); + } + else // + { + SerialPutString("准备跳转app\r\n"); + delay_ms(100); + uart_close(UART_ID1); + gpio_close(); + sleep_timer_close(); + __disable_irq(); + delay_ms(500); + //Delay_ms(1000); + /* Test if user code is programmed starting from address "APP_CONFIG_APPLICATION_ADDRESS" */ + //Serial0PutString("跳转APPhehe\r\n"); + memcpy((void *)SRAM_BASE, (void *)APP_CONFIG_APPLICATION_ADDRESS, APP_CONFIG_APPLICATION_SIZE);//size太大导致覆盖没法跳转 + + + __set_MSP(*(uint32_t *)SRAM_BASE); + typedef void (*p_entry_t)(void); + ((p_entry_t) (*(uint32_t *)(SRAM_BASE + 4) + SRAM_BASE))(); + + delay_ms(100); +// flash_close(FLASH_ID0); +// __enable_irq(); //IAP_JumpTo(SRAM_BASE); } +// delay_ms(200); /* USER CODE BEGIN 3 */ } -- Gitblit v1.9.3