Files
lishanpi/libs/common/iap/iap.h
T

57 lines
1.4 KiB
C++

#ifndef __IAP_H__
#define __IAP_H__
#include <cstdint>
#include "common_types.h"
class UartBus;
#define IAP_APP_BASE_ADDR 0x08010000U
#define IAP_BOOTLOADER_SIZE (64U * 1024U)
#define IAP_FIRMWARE_MAX_SIZE (1024U * 1024U - IAP_BOOTLOADER_SIZE)
#define IAP_BUFFER_SIZE (1024U * 1024U)
class Iap {
public:
static Iap &instance();
RetCode init();
RetCode receiveFirmware(UartBus &uart, uint32_t timeout_ms = 120000);
RetCode programFirmware(uint32_t flash_addr);
RetCode verifyFirmware(uint32_t flash_addr);
__attribute__((noreturn)) void jumpToApp(uint32_t app_addr);
static bool isValidApp(uint32_t app_addr);
static void bootFlagWrite(uint32_t magic);
static uint32_t bootFlagRead(void);
uint32_t firmwareSize() const { return firmware_size_; }
const char *firmwareName() const { return firmware_name_; }
private:
Iap();
~Iap() = default;
Iap(const Iap &) = delete;
Iap &operator=(const Iap &) = delete;
static RetCode backupDomainEnable(void);
RetCode ymodemReceive(UartBus &uart, uint32_t timeout_ms);
int ymodemReadPacket(UartBus &uart, uint8_t *buf, uint32_t timeout_ms);
void ymodemSend(UartBus &uart, uint8_t b);
int ymodemRead(UartBus &uart, uint32_t timeout_ms);
static uint16_t crc16(const uint8_t *data, uint32_t len);
bool initialized_;
uint32_t firmware_size_;
char firmware_name_[32];
};
#endif