ref: e5b73212f6addcfdb5e306df63d7135e543c4f8d
src/drivers/SpiNorFlash.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#pragma once #include <cstddef> #include <cstdint> namespace Pinetime { namespace Drivers { class Spi; class SpiNorFlash { public: explicit SpiNorFlash(Spi& spi); SpiNorFlash(const SpiNorFlash&) = delete; SpiNorFlash& operator=(const SpiNorFlash&) = delete; SpiNorFlash(SpiNorFlash&&) = delete; SpiNorFlash& operator=(SpiNorFlash&&) = delete; struct __attribute__((packed)) Identification { uint8_t manufacturer = 0; uint8_t type = 0; uint8_t density = 0; }; Identification ReadIdentificaion(); uint8_t ReadStatusRegister(); bool WriteInProgress(); bool WriteEnabled(); uint8_t ReadConfigurationRegister(); void Read(uint32_t address, uint8_t* buffer, size_t size); void Write(uint32_t address, const uint8_t* buffer, size_t size); void WriteEnable(); void SectorErase(uint32_t sectorAddress); uint8_t ReadSecurityRegister(); bool ProgramFailed(); bool EraseFailed(); void Init(); void Uninit(); void Sleep(); void Wakeup(); private: enum class Commands : uint8_t { PageProgram = 0x02, Read = 0x03, ReadStatusRegister = 0x05, WriteEnable = 0x06, ReadConfigurationRegister = 0x15, SectorErase = 0x20, ReadSecurityRegister = 0x2B, ReadIdentification = 0x9F, ReleaseFromDeepPowerDown = 0xAB, DeepPowerDown = 0xB9 }; static constexpr uint16_t pageSize = 256; Spi& spi; Identification device_id; }; } } |