optical/EMBOS/Users/Boot/boottasks.c

364 lines
6.1 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
//-------------------------------------------------------------------------------
// File Name: boottasks.c
// Brief:
// Version: 1.1.0
// Create Date: 2020/07/31
// Create by: Marshal Lee
// Copyright:
// Copyright (c) 2019, GetonAgain Co., LTD.
// All rights reserved.
//
// Modify by: Marshal Lee
// Modify Date: 2020/07/31
//-------------------------------------------------------------------------------
#include "boottasks.h"
#if (CUR_CORE_BOARD == CORE_BOARD_BOOT)
#include "trigger.h"
#include "shell.h"
#include "delay.h"
#include "xmodem.h"
#include "serial.h"
#include "inout.h"
#include "norflash.h"
#include "stiap.h"
#include "stapp.h"
#include "smec98sp.h"
#include "operator.h"
void InitBootloader(void);
int WaitForInput(void);
void BootMainTask(void)
{
int rslt;
InitTrigger(); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
InitShell(); // <20><>ʼ<EFBFBD><CABC>Shell<6C><6C><EFBFBD><EFBFBD>
printf("\r\n================== Bootloader ==================\r\n");
do
{// <20>ϵ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ<D0BE>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
#if (USE_SMEC != 0)
rslt = SMEC_Detection();
#else
rslt = 0;
#endif
if (rslt == 0)
{
break;
}
else
{// <20><><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<D6B8><CABE>1<EFBFBD><31>3<EFBFBD><33>
printf("Err: Encryption chip access failed!\r\n");
SetLedOn();
DelayMs(2000);
SetLedOff();
DelayMs(300);
SetLedOn();
DelayMs(200);
SetLedOff();
DelayMs(300);
SetLedOn();
DelayMs(200);
SetLedOff();
DelayMs(300);
SetLedOn();
DelayMs(200);
SetLedOff();
DelayMs(2000);
}
}while(1);
InitBootloader();
printf("Bootloader init ok\r\n");
rslt = WaitForInput();
if (rslt == 0) // û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
UpdateApp(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
JumpToApp(); // <20><><EFBFBD><EFBFBD>APP
}
else
{
DelayMs(100);
printf("Get input, enter update\r\n");
}
//----------------------------
InitOperator(); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
do
{
TriggerTask(); //
ShellTask();
OperatorTaskWhenBoot();
#if (0) // <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>ٶ<EFBFBD>
static u32 timer = 0;
static u32 temp;
static int runcount = 0;
runcount++;
temp = GetMsSoftTimer();
if (temp - timer >= 1000)
{
timer = temp;
printf("run circle = %d/s\r\n", runcount);
runcount = 0;
}
#endif
}while(1);
}
//--------------------------------------------------
int WaitForInput(void)
{
int rslt;
int timer, tptimer;
int steps;
printf("Press ENTER into bootloader\r\n");
DelayMs(100);
rslt = 0;
steps = 0;
timer = GetMsSoftTimer();
do
{
TriggerTask(); //
if (ShellTask() >= 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3AC>ôִ<C3B4><D6B4><EFBFBD><EFBFBD>Ӧ
{
#if (0)
if (GetHistoryNum() > 0)
{
char input[20];
int tmprst = GetHistoryCmd(0, &input[0]);
if (tmprst == 0 && strcmp(input, "ver") == 0)
{
rslt = 1;
break;
}
}
#else
rslt = 1;
break;
#endif
}
tptimer = GetMsSoftTimer();
if (tptimer - timer > steps)
{
PutChar('.');
steps += 100;
}
if (tptimer - timer > 1000) // 1<><31><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
rslt = 0;
break;
}
}while(1);
printf("\r\n");
return rslt;
}
//--------------------------------------------------
void LoadApp(char * para1, char * para2);
void JpToApp(char * para1, char * para2);
//---------------------------------------------------
void InitBootloader(void)
{
printf("Begin bootloader task\r\n");
InitNorSpi(); // <20><>ʼ<EFBFBD><CABC> nor flash <20><><EFBFBD><EFBFBD> SPI
SNFlashInit(SetNorSpiNssOn, SetNorSpiNssOff, NorSpiReadByte, NorSpiWriteByte); // <20><>ʼ<EFBFBD><CABC>nor flash <20><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
AddShellCmd("LOADAPP", "load the app", LoadApp);
AddShellCmd("JUMPTOAPP", "jump to app", JpToApp);
AddTriggerToList(100, SetLedToggle, NULL); // 100ms <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
#if (CONSOLE_PORT == COMM_USART1)
#define CLEAN_RS_BUFF Usart1CleanRsBuf
#define IS_SDBUF_EMPTY IsUsart1SendBufEmpty
#define GET_DATA Usart1GetData
#define SEND_DATA Usart1SendData
#define GET_RS_LEN Usart1GetRsLen
#endif
// <20>Ӵ<EFBFBD><D3B4>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2> <20><><EFBFBD><EFBFBD>APP
void LoadApp(char * para1, char * para2)
{
int rsv = 'x';
int com = 1;
int rslt = 0;
// IAPCleanUpdateArea(); // <20><><EFBFBD><EFBFBD>nand APP <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (para1 != NULL)
{
if (strcmp(para1, "") == 0 ||
strcmp(para1, "x") == 0 ||
strcmp(para1, "X") == 0 ||
0 )
{
rsv = 'x'; // xmodem
if (para2 != NULL)
{
com = atoi(para2);
if (com <= 0 || com > 2)
{
com = 1;
}
}
}
else if (strcmp(para1, "t") == 0 ||
strcmp(para1, "T") == 0 ||
0 )
{
rsv = 't'; // <20><><EFBFBD><EFBFBD>
}
else if (strcmp(para1, "s") == 0 ||
strcmp(para1, "S") == 0 ||
0 )
{
rsv = 's'; // <20><><EFBFBD><EFBFBD>
}
else
{
}
}
if (rsv == 'x')
{
int timer;
XmodemCtrl xctrl;
printf("receive by xmodem start\r\n");
if (com == 1)
{
SetPauseStatus(1); // <20>ر<EFBFBD><D8B1>ն<EFBFBD>
CLEAN_RS_BUFF(); // <20><><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>buff
// <20>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>buffΪ<66><CEAA>
timer = GetMsSoftTimer(); // <20><>¼ʱ<C2BC><CAB1>
do
{
if (IS_SDBUF_EMPTY() == TRUE)
{
break;
}
if (GetMsSoftTimer() - timer > 2000) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ʱ
{
SetPauseStatus(0); // <20><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
}
}while(1);
// ע<><EFBFBD><E1BAAF>
xctrl.XmodemInBuff = GET_DATA;
xctrl.XmodemOutBuff = SEND_DATA;
xctrl.XmodemGetInBuffLen = GET_RS_LEN;
xctrl.XmodemCleanBuff = CLEAN_RS_BUFF;
xctrl.InitSave = InitSaveApp;
xctrl.SaveData = SaveAppData;
xctrl.savedsize = 0;
rslt = XmodemReceive(&xctrl);
// <20>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>buffΪ<66><CEAA>
timer = GetMsSoftTimer(); // <20><>¼ʱ<C2BC><CAB1>
do
{
if (IS_SDBUF_EMPTY() == TRUE)
{
break;
}
if (GetMsSoftTimer() - timer > 2000) // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>ʱ
{
SetPauseStatus(0); // <20><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
}
}while(1);
CLEAN_RS_BUFF(); // <20><><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>buff
SetPauseStatus(0); // <20><><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>
OutDebugBufInfo();
}
else
{
// <20><>ʱ<EFBFBD><CAB1>֧<EFBFBD><D6A7>
printf("1. not support com port=%d\r\n", com);
}
printf("\r\nreceive by xmodem end\r\n");
if (rslt == 1)
{
printf("receive done, check is save data correct\r\n");
rslt = IsAppReceiveDone(); // <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (rslt == xctrl.savedsize)
{
StartAppUpdate(0); // <20><>֤<EFBFBD>Ƿ񱣴<C7B7><F1B1A3B4>ɹ<EFBFBD>
}
else
{
printf("receive size not equ, xctrl.savedsize=%d, received=%d\r\n", xctrl.savedsize, rslt);
}
}
else
{
printf("receive not finish\r\n");
}
}
else
{
// <20><>ʱ<EFBFBD><CAB1>֧<EFBFBD><D6A7>
printf("2. not support comm type=%c\r\n", rsv);
}
}
void JpToApp(char * para1, char * para2)
{
JumpToApp(); // <20><><EFBFBD><EFBFBD>APP
}
#endif