WXK
2025-05-23 8415b6bc61925a1a234fe393d8375d3828756931
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,17 +112,23 @@
            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,程序复位");
@@ -130,56 +140,119 @@
        .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.1启动\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修改
@@ -189,7 +262,7 @@
        {
        }
    updata_byte = tmp;//读取指定地址的值
    if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则升级
    if(updata_byte == 0xAAAA)//判断此地址的值是否为0xAAAA,如果是则 升级
    {
        SerialPutString("串口升级启动\r\n");
         
@@ -197,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 */
  }