psutils: Partial AEI Updater class
The AeiUpdater class within the aeiUpdater namespace, responsible for
updating AEI PSU firmware via I2C communication. The code focuses on
executing various stages of the firmware update process, ensuring each
step performed and validated correctly. The following partial functions
of the key component of the class:
doUpdate()
This method initiates the firmware update process. It checks and sets
the ISP (In-System Programming) mode using writeIspKey(),
writeIspMode(), and writeIspStatusReset().
writeIspKey()
Unlocks the ISP by writing a specific key to the KEY_REGISTER. Handles
exceptions for any I2C communication errors and logs the failure.
writeIspMode()
Sends a command to enter ISP mode and checks the status register.
Retries on failure, with a maximum retry limit. Checks the status
register to confirm the mode has been set. Logs any I2C errors
encountered.
writeIspStatusReset()
Resets ISP status register, clearing any existing status flags. Verifies
the reset by reading the status register, retrying as needed. Logs any
I2C errors encountered.
Test:
Tested the function listed in the class on a system with AEI PSU:
- Validated the PSU ISP key was accepted and no error logged.
- Validated an error was logged when I used wrong key.
- Validated the PSU entered to ISP mode by reading back status register
and confirmed the bit is set.
- Validated the PSU status reset by reading the back status register and
confirmed the bit is set.
Change-Id: I1e8e594f088e7d66d8fc5b1723c4bd33b08bd3f8
Signed-off-by: Faisal Awada <faisal@us.ibm.com>
diff --git a/tools/power-utils/aei_updater.hpp b/tools/power-utils/aei_updater.hpp
new file mode 100644
index 0000000..1b872b6
--- /dev/null
+++ b/tools/power-utils/aei_updater.hpp
@@ -0,0 +1,96 @@
+/**
+ * Copyright © 2024 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "updater.hpp"
+
+namespace aeiUpdater
+{
+/**
+ * @class AeiUpdater
+ * @brief A class to handle firmware updates for the AEI PSUs.
+ *
+ * This class provides methods to update firmware by writing ISP keys,
+ * validating firmware files, and performing I2C communications. It includes
+ * functions to manage the update process, including downloading firmware blocks
+ * and verifying the update status.
+ */
+class AeiUpdater : public updater::Updater
+{
+ public:
+ AeiUpdater() = delete;
+ AeiUpdater(const AeiUpdater&) = delete;
+ AeiUpdater(AeiUpdater&&) = delete;
+ AeiUpdater& operator=(const AeiUpdater&) = delete;
+ AeiUpdater& operator=(AeiUpdater&&) = delete;
+ ~AeiUpdater() = default;
+
+ /**
+ * @brief Constructor for the AeiUpdater class.
+ *
+ * @param psuInventoryPath The path to the PSU's inventory in the system.
+ * @param devPath The device path for the PSU.
+ * @param imageDir The directory containing the firmware image files.
+ */
+ AeiUpdater(const std::string& psuInventoryPath, const std::string& devPath,
+ const std::string& imageDir) :
+ Updater(psuInventoryPath, devPath, imageDir)
+ {}
+
+ /**
+ * @brief Initiates the firmware update process.
+ *
+ * @return int Status code 0 for success or 1 for failure.
+ */
+ int doUpdate() override;
+
+ private:
+ /**
+ * @brief Writes an ISP (In-System Programming) key to initiate the update.
+ *
+ * @return bool True if successful, false otherwise.
+ */
+ bool writeIspKey();
+
+ /**
+ * @brief Writes the mode required for ISP to start firmware programming.
+ *
+ * @return bool True if successful, false otherwise.
+ */
+ bool writeIspMode();
+
+ /**
+ * @brief Resets the ISP status to prepare for a firmware update.
+ *
+ * @return bool True if successful, false otherwise.
+ */
+ bool writeIspStatusReset();
+
+ /**
+ * @brief Pointer to the I2C interface for communication
+ *
+ * This pointer is not owned by the class. The caller is responsible for
+ * ensuring that 'i2cInterface' remains valid for the lifetime of this
+ * object. Ensure to check this pointer for null before use.
+ */
+ i2c::I2CInterface* i2cInterface;
+
+ /**
+ * @brief Stores byte-swapped indices for command processing
+ */
+ std::vector<uint8_t> byteSwappedIndex;
+};
+} // namespace aeiUpdater