#ifndef LIVOX_UPGRADE_FIRMWARE_H_
#define LIVOX_UPGRADE_FIRMWARE_H_
#include <fstream>
#include <ios>
#include "FastCRC/FastCRC.h"
namespace livox {
namespace lidar {
const uint32_t kMd5SignatureLength = 16;
const uint32_t kEnlFileVersionV2 = 0x02000000;
const uint32_t kEnlFileVersionV3 = 0x03000000;
typedef enum {
kFirmwareMultiApp = 0,
kFirmwareApp = 1,
kFirmwareLoader = 2,
kFirmwareUnknown = 3,
} FirmwareType;
typedef enum {
kFirmwareDeviceTypeHub = 0,
kFirmwareDeviceTypeLidarMid40 = 1,
kFirmwareDeviceTypeLidarTele = 2,
kFirmwareDeviceTypeLidarHorizon = 3,
kFirmwareDeviceTypeLidarHubV2 = 4,
kFirmwareDeviceTypeLidarMidLite = 5,
kFirmwareDeviceTypeLidarMid70 = 6,
kFirmwareDeviceTypeLidarAvia = 7,
kFirmwareDeviceTypeLidarXxx1 = 8,
kFirmwareDeviceTypeLidarXxx2 = 9,
kFirmwareDeviceTypeLidarHap = 10,
kFirmwareDeviceUnkown
} FirmwareDeviceType;
#pragma pack(1)
typedef struct {
uint32_t file_version;
uint32_t firmware_version;
uint32_t firmware_length;
uint8_t firmware_type;
uint8_t device_type;
uint8_t encrypt_type;
uint8_t rsvd[2];
uint8_t checksum_type;
uint16_t checksum_length;
uint8_t checksum[128];
uint8_t hw_whitelist[128];
uint64_t modify_time;
uint16_t header_checksum;
} LivoxEncryptFirmwareHeader;
typedef struct {
uint8_t overall_signature[kMd5SignatureLength];
} LivoxEncryptFirmwareTail;
typedef enum {
kEverythingIsOk = 0,
kFirmwareOutOfLength = 1,
kSystemIsNotReady = 2,
kFirmwareTypeMismatch = 3,
kUpgradeStateMismatch = 4,
} RequestUpgradeReturnCode;
const uint32_t kGeneralTryCountLimit = 10;
const uint32_t kGetProcessTryCountLimit = 30;
const uint32_t kGetProgressTryCountLimit = 10;
#pragma pack()
class Firmware {
public:
Firmware();
~Firmware();
bool Open(const char *firmware_path);
void Close();
const uint32_t FirmwarePackageVersion() const { return header_.file_version; }
LivoxEncryptFirmwareHeader header_;
uint8_t *data_;
LivoxEncryptFirmwareTail tail_;
uint64_t file_size_;
private:
uint64_t MiniFileSize();
bool ReadAndCheckHeader();
std::ifstream file_;
FastCRC16 crc16_;
};
}
}
#endif