1 #pragma once 2 3 #include "common/include/i2c/i2c.hpp" 4 #include "i2c-vr/vr.hpp" 5 6 #include <sdbusplus/async.hpp> 7 8 #include <cstdint> 9 #include <unordered_set> 10 11 namespace phosphor::software::VR 12 { 13 14 class TDA38640A : public VoltageRegulator 15 { 16 public: 17 TDA38640A(sdbusplus::async::context& ctx, uint16_t bus, uint16_t address); 18 19 sdbusplus::async::task<bool> verifyImage(const uint8_t* image, 20 size_t imageSize) final; 21 22 sdbusplus::async::task<bool> updateFirmware(bool force) final; 23 sdbusplus::async::task<bool> getCRC(uint32_t* checksum) final; 24 25 bool forcedUpdateAllowed() final; 26 27 private: 28 struct Configuration 29 { 30 uint32_t rev; 31 uint32_t checksum; 32 std::vector<uint16_t> offsets; 33 std::vector<std::vector<uint8_t>> data; 34 clearphosphor::software::VR::TDA38640A::Configuration35 void clear() 36 { 37 rev = 0; 38 checksum = 0; 39 offsets.clear(); 40 data.clear(); 41 } 42 }; 43 44 sdbusplus::async::task<bool> getUserRemainingWrites(uint8_t* remain); 45 sdbusplus::async::task<bool> getDeviceId(uint32_t* deviceId); 46 sdbusplus::async::task<bool> program(); 47 sdbusplus::async::task<bool> getProgStatus(uint8_t* status); 48 sdbusplus::async::task<bool> unlockDevice(); 49 sdbusplus::async::task<bool> programmingCmd(); 50 sdbusplus::async::task<bool> setPage(uint8_t page); 51 sdbusplus::async::task<bool> getDeviceRevision(uint8_t* revision); 52 53 bool parseImage(const uint8_t* image, size_t imageSize); 54 55 phosphor::i2c::I2C i2cInterface; 56 57 struct Configuration configuration; 58 }; 59 } // namespace phosphor::software::VR 60