364 lines
6.1 KiB
C
364 lines
6.1 KiB
C
|
|
//-------------------------------------------------------------------------------
|
|||
|
|
// 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
|
|||
|
|
|