376 lines
11 KiB
C
376 lines
11 KiB
C
/*
|
||
* Copyright (c) 2022, Shenzhen CVA Innovation CO.,LTD
|
||
* All rights reserved.
|
||
*
|
||
* Shenzhen CVA Innovation CO.,LTD (CVA chip) is supplying this file for use
|
||
* exclusively with CVA's microcontroller products. This file can be freely
|
||
* distributed within development tools that are supporting such microcontroller
|
||
* products.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||
* CVA SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
|
||
* OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||
*/
|
||
|
||
#ifndef _BOOTLOADER_H_
|
||
#define _BOOTLOADER_H_
|
||
|
||
/*! \brief Contains public interface to various functions related
|
||
* to the _BOOTLOADER module
|
||
*/
|
||
|
||
/*******************************************************************************
|
||
* the includes
|
||
******************************************************************************/
|
||
#include <stdbool.h>
|
||
#include <stdint.h>
|
||
#include "bootloader_cfg.h"
|
||
#include "fls.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/*******************************************************************************
|
||
* the defines
|
||
******************************************************************************/
|
||
|
||
/*******************************************************************************
|
||
* the typedefs
|
||
******************************************************************************/
|
||
|
||
typedef void (*pFls_InitFunctionPtr)(uint32_t flashDrvInstance);
|
||
typedef Fls_StdRtnType (*pFls_EraseFunctionPtr)(uint32_t targetAddress, uint32_t sectorNum);
|
||
typedef Fls_StdRtnType (*pFls_WriteFunctionPtr)(uint32_t targetAddress, const uint8_t *sourceAddressPtr, uint32_t bytesNum);
|
||
typedef Fls_StdRtnType (*pFls_ReadFunctionPtr)(uint32_t targetAddress, uint8_t *dataBuff, uint32_t bytesNum);
|
||
typedef uint32_t (*pCalculateCheckSumFunctionPtr)(uint32_t initCrcValue, const uint8_t *dataBuffer, uint32_t bytesNum, bool inverted);
|
||
typedef bool (*pGetBootReqFunctionPtr)(void);
|
||
typedef void (*pJumpFunctionPtr)(void);
|
||
typedef void (*pSwResetFunctionPtr)(void);
|
||
typedef void (*pSetSessionModeFunctionPtr)(uint8_t sessionMode);
|
||
typedef void (*pSetGlobalIsrFunctionPtr)(bool isEnabled);
|
||
typedef void (*pUds_PositiveResponsePtr)(const uint8_t *data, uint16_t len);
|
||
typedef void (*pUds_NegativeResponsePtr)(uint8_t sid, uint8_t rsp_nrc);
|
||
typedef uint8_t (*pUds_PgmConditionCheckPtr)(void);
|
||
|
||
typedef enum
|
||
{
|
||
BOOTLOADER_STATE_INIT = 0u,
|
||
BOOTLOADER_STATE_ERASE,
|
||
BOOTLOADER_STATE_PGM,
|
||
BOOTLOADER_STATE_ERR,
|
||
BOOTLOADER_STATE_CHECK,
|
||
BOOTLOADER_STATE_EXIT,
|
||
|
||
BOOTLOADER_STATE_NUM
|
||
} Bootloader_StateType;
|
||
|
||
typedef enum
|
||
{
|
||
BOOLOADER_OBJECT_NONE = 0u,
|
||
BOOLOADER_OBJECT_FLASH_DRIVER,
|
||
BOOLOADER_OBJECT_APP_CODE,
|
||
BOOLOADER_OBJECT_CALIBRATION_DATA,
|
||
|
||
BOOLOADER_OBJECT_NUM
|
||
} Bootloader_ObjectType;
|
||
|
||
typedef enum
|
||
{
|
||
BOOTLOADER_FLS_DRV_INIT = 0u,
|
||
BOOTLOADER_FLS_DRV_ERASE,
|
||
BOOTLOADER_FLS_DRV_WRITE,
|
||
BOOTLOADER_FLS_DRV_NUM
|
||
} Bootloader_FlsDriverType;
|
||
|
||
typedef enum
|
||
{
|
||
BOOTLOADER_SUB_STATE_NONE = 0u,
|
||
BOOTLOADER_SUB_STATE_DOING,
|
||
BOOTLOADER_SUB_STATE_END
|
||
} Bootloader_SubStateType;
|
||
|
||
typedef enum
|
||
{
|
||
BOOTLOADER_EVENT_NONE = 0u,
|
||
BOOTLOADER_EVENT_EMERGENCY_BOOT,
|
||
BOOTLOADER_EVENT_RESET,
|
||
BOOTLOADER_EVENT_ERASE,
|
||
BOOTLOADER_EVENT_PGM_READY,
|
||
BOOTLOADER_EVENT_PGM_START,
|
||
BOOTLOADER_EVENT_PGM_EXIT,
|
||
BOOTLOADER_EVENT_CHECK,
|
||
|
||
BOOTLOADER_EVENT_NUM
|
||
} Bootloader_EventType;
|
||
|
||
typedef struct
|
||
{
|
||
uint32_t eraseStartAddress;
|
||
uint32_t eraseLength;
|
||
uint32_t eraseSectionNums;
|
||
uint32_t eraseSectionCnt;
|
||
} Bootloader_EraseInfoType;
|
||
|
||
typedef struct
|
||
{
|
||
uint32_t pgmStartAddress;
|
||
uint32_t pgmMemSize;
|
||
uint32_t pgmMemCnt;
|
||
uint32_t pgmBlockByteCnt;
|
||
uint8_t pgmBlockSn;
|
||
uint8_t pgmData[BOOTLOADER_CFG_PGM_BYTES_SIZE];
|
||
uint32_t pgmCrc;
|
||
bool crcResult;
|
||
bool pgmReadyEn;
|
||
bool pgmStartTriggerEn;
|
||
} Bootloader_PgmInfoType;
|
||
|
||
typedef struct
|
||
{
|
||
bool activeCheckReq;
|
||
uint32_t CheckStartAddress;
|
||
uint32_t CheckmemSize;
|
||
Bootloader_ObjectType checkObj;
|
||
uint32_t checkCrc;
|
||
bool crcResult;
|
||
} Bootloader_CheckCrcInfoType;
|
||
|
||
typedef struct
|
||
{
|
||
uint32_t flashInstanceAddr;
|
||
uint32_t startFlsInitAddr;
|
||
uint32_t startFlsClearCommandStateAddr;
|
||
uint32_t startFlsCommandSequenceAddr;
|
||
uint32_t startFlsEraseAddr;
|
||
uint32_t startFlsWriteAddr;
|
||
uint32_t startFlsReadAddr;
|
||
pFls_InitFunctionPtr flsInitFunction;
|
||
pFls_EraseFunctionPtr flsEraseFunction;
|
||
pFls_WriteFunctionPtr flsWriteFunction;
|
||
pFls_ReadFunctionPtr flsReadFunction;
|
||
bool flashDriverDownloaded;
|
||
} Bootloader_FlsDrvInfoType;
|
||
|
||
typedef struct
|
||
{
|
||
pSetGlobalIsrFunctionPtr setGlobalIsrFunction;
|
||
pCalculateCheckSumFunctionPtr calculateCheckSumFunction;
|
||
pGetBootReqFunctionPtr getBootReqFunction;
|
||
pJumpFunctionPtr jumpFunction;
|
||
pSetSessionModeFunctionPtr setSessionModeFunction;
|
||
|
||
pUds_PositiveResponsePtr udsPositiveRespFunction;
|
||
pUds_NegativeResponsePtr udsNegativeRespFunction;
|
||
|
||
pSwResetFunctionPtr swResetFunction;
|
||
|
||
pUds_PgmConditionCheckPtr pgmConditionChecFunction;
|
||
|
||
#if BOOTLOADER_CFG_FLS_COPY_AUTO_EN != 0u
|
||
pFls_InitFunctionPtr flsInitFunction;
|
||
pFls_EraseFunctionPtr flsEraseFunction;
|
||
pFls_WriteFunctionPtr flsWriteFunction;
|
||
pFls_ReadFunctionPtr flsReadFunction;
|
||
#endif
|
||
} Bootloader_CallBackFuncListType;
|
||
|
||
typedef struct
|
||
{
|
||
uint32_t flashInstanceAddress;
|
||
|
||
const Bootloader_CallBackFuncListType *pCallBackFunctionList;
|
||
Bootloader_StateType bootState;
|
||
Bootloader_SubStateType bootSubState;
|
||
Bootloader_EraseInfoType eraseInfo;
|
||
Bootloader_PgmInfoType pgmInfo;
|
||
Bootloader_CheckCrcInfoType checkInfo;
|
||
bool emergeBootReqEn;
|
||
bool resetReqEn;
|
||
bool resetActionReady;
|
||
uint8_t resetReqMode;
|
||
bool bootActive;
|
||
#if BOOTLOADER_CFG_FLS_COPY_AUTO_EN == 0u
|
||
Bootloader_FlsDrvInfoType flsDrvInfo;
|
||
#endif
|
||
|
||
Bootloader_ObjectType downloadObj;
|
||
uint32_t stayInBootTimeoutCnt;
|
||
Bootloader_EventType eventReq;
|
||
} Bootloader_CbType;
|
||
|
||
/*******************************************************************************
|
||
* the globals
|
||
******************************************************************************/
|
||
|
||
/*******************************************************************************
|
||
* the function prototypes
|
||
******************************************************************************/
|
||
/*! \brief Initialize bootloader control block information
|
||
*
|
||
* This function Initialize bootloader control block information
|
||
*
|
||
* \param[in] flashInstanceAddress : flashdriver instance address
|
||
* \param[in] pCallbackFuncList : call back function list
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_Init(uint32_t flashInstanceAddress, const Bootloader_CallBackFuncListType *pCallbackFuncList);
|
||
|
||
/*! \brief Get the pgm condition
|
||
*
|
||
* This function get the pgm condition
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return voltage state
|
||
* 0: voltage normal
|
||
* 1: voltage low
|
||
* 2: voltage high
|
||
*/
|
||
extern uint8_t Bootloader_GetPgmCondition(void);
|
||
|
||
/*! \brief Get boot block size bytes
|
||
*
|
||
* This function get the pgm block byte size
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return void
|
||
*/
|
||
extern uint32_t Bootloader_GetPgmBlockSize(void);
|
||
|
||
/*! \brief Calculate the stay in boot duration
|
||
*
|
||
* This function calculate the timeout when before jump to app if app is ok
|
||
*
|
||
* \param[in] periodms : add in every period
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_TimingProcess(uint8_t periodms);
|
||
|
||
/*! \brief Set the bootloader into the target state
|
||
*
|
||
* This function Set the bootloader into the target state
|
||
*
|
||
* \param[in] state <20><>the target state to be switch to
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_SetBootState(Bootloader_StateType state);
|
||
|
||
/*! \brief Get the bootloader current state
|
||
*
|
||
* This function Get the bootloader current state
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return : return the current state
|
||
*/
|
||
extern Bootloader_StateType Bootloader_GetBootState(void);
|
||
|
||
/*! \brief Get the bootloader current sub state
|
||
*
|
||
* This function Get the bootloader current sub state
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return : return the current sub state
|
||
*/
|
||
extern Bootloader_SubStateType Bootloader_GetBootSubState(void);
|
||
|
||
/*! \brief Get the bootloader current crc result
|
||
*
|
||
* This function Get the bootloader current crc result
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return : return the current crc result
|
||
*/
|
||
extern bool Bootloader_GetCrcResult(void);
|
||
|
||
/*! \brief Set emerge boot request
|
||
*
|
||
* This function Set emerge boot request
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_EventEmergeBootRequest(bool requestEn);
|
||
|
||
/*! \brief Set the reset cup request
|
||
*
|
||
* This function Set the reset cup request
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_EventResetRequest(bool requestEn,uint8_t resetMode);
|
||
|
||
/*! \brief Set the erase information
|
||
*
|
||
* This function set the erase information about where to be start to be erased and how many bytes to be erased
|
||
*
|
||
* \param[in] startAddress : where to be start to be erased
|
||
* \param[in] bytesNum : how many bytes to be erased
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_EventEraseRequest(uint32_t startAddress, uint32_t bytesNum);
|
||
|
||
/*! \brief Set program information
|
||
*
|
||
* This function Set program information about where to be start to be write and how many bytes to be write
|
||
*
|
||
* \param[in] startAddress : where to be start to be write
|
||
* \param[in] bytesNum : how many bytes to be write
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_EventPgmReady(uint32_t startAddress, uint32_t bytesNum);
|
||
|
||
/*! \brief Trigger the pgm start
|
||
*
|
||
* This function indication that can be write datas into flash
|
||
*
|
||
* \param[in] pDatabuffer : stored the datas to be written into flash
|
||
* \param[in] bytesNum : how many bytes to be write into local buffer
|
||
* \param[in] blockSn : current block sn number
|
||
*
|
||
* \return true: ecu start to pgm, false: ecu don't start to pgm
|
||
*/
|
||
extern bool Bootloader_EventPgmData(const uint8_t *pDatabuffer, uint16_t bytesNum, uint8_t blockSn);
|
||
|
||
/*! \brief data check request
|
||
*
|
||
* This function indication that data check request
|
||
*
|
||
* \param[in] memStart : memory start address
|
||
* \param[in] memSize : memory size
|
||
* \param[in] crc : crc result from EOL
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_EventDataCheckRequest(uint32_t memStart, uint32_t memSize, uint32_t crc);
|
||
|
||
/*! \brief Bootloader main state process
|
||
*
|
||
* This function process the bootloader variant state
|
||
*
|
||
* \param[in] void
|
||
*
|
||
* \return void
|
||
*/
|
||
extern void Bootloader_StateProc(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif /* extern "C" */
|
||
|
||
#endif /* _BOOTLOADER_H_ */
|