blob: 0bdc2bb34f06e2dfc9e986607d8e4503cace0f72 [file] [log] [blame]
Daniel Hsuf6470b52025-02-26 15:03:47 +08001#pragma once
2#include "common/include/i2c/i2c.hpp"
3
4#include <chrono>
5#include <iostream>
6#include <string_view>
7#include <utility>
8
9struct cpldI2cInfo
10{
11 unsigned long int QF; // Quantity of Fuses
12 unsigned int* UFM; // User Flash Memory
13 unsigned int version;
14 unsigned int checksum;
15 std::vector<uint8_t> cfgData;
16 std::vector<uint8_t> ufmData;
17};
18
19class CpldLatticeManager
20{
21 public:
22 CpldLatticeManager(sdbusplus::async::context& ctx, const uint16_t bus,
23 const uint8_t address, const uint8_t* image,
24 size_t imageSize, const std::string& chip,
25 const std::string& target, const bool debugMode) :
26 ctx(ctx), image(image), imageSize(imageSize), chip(chip),
27 target(target), debugMode(debugMode),
28 i2cInterface(phosphor::i2c::I2C(bus, address))
29 {}
30 sdbusplus::async::task<bool> updateFirmware(
31 std::function<bool(int)> progressCallBack);
32 sdbusplus::async::task<bool> getVersion(std::string& version);
33
34 private:
35 sdbusplus::async::context& ctx;
36 cpldI2cInfo fwInfo{};
37 const uint8_t* image;
38 size_t imageSize;
39 std::string chip;
40 std::string target;
41 bool isLCMXO3D = false;
42 bool debugMode = false;
43 phosphor::i2c::I2C i2cInterface;
44
45 sdbusplus::async::task<bool> XO2XO3FamilyUpdate(
46 std::function<bool(int)> progressCallBack);
47
48 int indexof(const char* str, const char* ptn);
49 bool jedFileParser();
50 bool verifyChecksum();
51 sdbusplus::async::task<bool> readDeviceId();
52 sdbusplus::async::task<bool> enableProgramMode();
53 sdbusplus::async::task<bool> eraseFlash();
54 sdbusplus::async::task<bool> resetConfigFlash();
55 sdbusplus::async::task<bool> writeProgramPage();
56 sdbusplus::async::task<bool> programUserCode();
57 sdbusplus::async::task<bool> programDone();
58 sdbusplus::async::task<bool> disableConfigInterface();
59 sdbusplus::async::task<bool> readBusyFlag(uint8_t& busyFlag);
60 sdbusplus::async::task<bool> readStatusReg(uint8_t& statusReg);
61 sdbusplus::async::task<bool> waitBusyAndVerify();
62 sdbusplus::async::task<bool> readUserCode(uint32_t& userCode);
63};