| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| #ifndef _F_SPIFLASH_UPDATER_H__ |
| #define _F_SPIFLASH_UPDATER_H__ |
| |
| #include <openssl/sha.h> |
| |
| #include <algorithm> |
| #include <cstdint> |
| #include <cstring> |
| #include <iomanip> |
| #include <iostream> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "sw/host/spiflash/spi_interface.h" |
| |
| namespace opentitan { |
| namespace spiflash { |
| |
| // Implements the bootstrap SPI frame message. |
| struct Frame { |
| // Frame header definition. |
| struct { |
| // SHA2 of the entire frame_t message starting at the |frame_num| offset. |
| uint8_t hash[32]; |
| |
| // Frame number. Starting at 0. |
| uint32_t frame_num; |
| |
| // Flash target offset. |
| uint32_t offset; |
| } hdr; |
| |
| uint8_t data[1024 - sizeof(hdr)]; |
| |
| // Returns available the frame available payload size in bytes. |
| size_t PayloadSize() const { return 1024 - sizeof(hdr); } |
| }; |
| |
| // Implements SPI flash update protocol. |
| // |
| // The firmare image is split into frames, and then sent to the SPI device. |
| // More details will be added on the ack protocol once implemented. |
| // This class is not thread safe due to the spi driver dependency. |
| class Updater { |
| public: |
| // Updater configuration settings. |
| struct Options { |
| // Firmware image in binary format. |
| std::string code; |
| }; |
| |
| // Constructs updater instance with given configuration |options| and |spi| |
| // interface. |
| Updater(Options options, std::unique_ptr<SpiInterface> spi) |
| : options_(options), spi_(std::move(spi)) {} |
| virtual ~Updater() = default; |
| |
| // Not copy or movable |
| Updater(const Updater &) = delete; |
| Updater &operator=(const Updater &) = delete; |
| |
| // Runs update flow returning true on success. |
| bool Run(); |
| |
| private: |
| // Generates |frames| for |code| image. |
| bool GenerateFrames(const std::string &code, std::vector<Frame> *frames); |
| |
| Options options_; |
| std::unique_ptr<SpiInterface> spi_; |
| }; |
| |
| } // namespace spiflash |
| } // namespace opentitan |
| |
| #endif |