mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/driver-w25qxxx.git
synced 2025-09-29 00:37:33 +00:00
Some driver updates to work for the W25Q128
This commit is contained in:
289
include/sta/drivers/w25qxx.hpp
Normal file
289
include/sta/drivers/w25qxx.hpp
Normal file
@@ -0,0 +1,289 @@
|
||||
#ifndef STA_SENSORS_W25Q128_HPP
|
||||
#define STA_SENSORS_W25Q128_HPP
|
||||
|
||||
#include <sta/bus/spi/device.hpp>
|
||||
#include <sta/drivers/w25qxx_defs.hpp>
|
||||
|
||||
|
||||
namespace sta
|
||||
{
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
enum class BlockSize
|
||||
{
|
||||
_32KB,
|
||||
_64KB
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
enum class ChipState
|
||||
{
|
||||
NORMAL,
|
||||
POWERED_DOWN
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
enum class AddressMode
|
||||
{
|
||||
_24BIT,
|
||||
_32BIT
|
||||
};
|
||||
|
||||
class W25Qxx
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief Construct a new W25Qxx object
|
||||
*
|
||||
* @param device
|
||||
* @param addrMode
|
||||
*/
|
||||
W25Qxx(SPIDevice * device, AddressMode addrMode = AddressMode::_24BIT);
|
||||
|
||||
uint8_t init();
|
||||
|
||||
/**
|
||||
* @brief Set the Address Mode object
|
||||
*
|
||||
* @param addrMode
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t setAddressMode(AddressMode addrMode);
|
||||
|
||||
/**
|
||||
* @brief Get the Address Mode object
|
||||
*
|
||||
* @return AddressMode
|
||||
*/
|
||||
AddressMode getAddressMode();
|
||||
|
||||
/**
|
||||
* @brief Get the Chip I D object
|
||||
*
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t getChipID();
|
||||
|
||||
/**
|
||||
* @brief Get the Manufacturer I D object
|
||||
*
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t getManufacturerID();
|
||||
|
||||
/**
|
||||
* @brief Get the Unique I D object
|
||||
*
|
||||
* @return uint64_t
|
||||
*/
|
||||
uint64_t getUniqueID();
|
||||
|
||||
// TODO: SFDP register?
|
||||
|
||||
/**
|
||||
* @brief Puts the chip into power-down state which significantly reduces power consumption.
|
||||
*
|
||||
* @remarks Every instruction but the releasePowerDown instruction are ignored in this state,
|
||||
* allowing for maximum write protection.
|
||||
*
|
||||
* @return uint8_t Returns 1 if the operation was successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t powerDown();
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t releasePowerDown();
|
||||
|
||||
// enable reset
|
||||
|
||||
// reset device
|
||||
|
||||
// Extended address register read / write?
|
||||
|
||||
// Enter 4-Byte address mode
|
||||
|
||||
// Exit 4-Byte address mode
|
||||
public:
|
||||
/*
|
||||
* Status registers.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Read one of the flash's status registers.
|
||||
*
|
||||
* @param regID The ID of the status register. Can only be 1, 2 or 3.
|
||||
* @param status_byte A pointer to the variable to write the state into.
|
||||
* @return uint8_t Returns 1 if successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t readStatusRegister(uint8_t regID, uint8_t * status_byte);
|
||||
|
||||
/**
|
||||
* @brief Write into one of the chip's status registers.
|
||||
*
|
||||
* @param regID The ID of the status register. Can only be 1, 2 or 3.
|
||||
* @param status_byte The byte to write into the status register.
|
||||
* @param nonvolatile If set to true, this setting will be restored after power off.
|
||||
* @return uint8_t Returns 1 if successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t writeStatusRegister(uint8_t regID, uint8_t * status_byte, bool nonvolatile = false);
|
||||
|
||||
/**
|
||||
* @brief Checks if the flash is busy writing or erasing.
|
||||
*
|
||||
* @return bool Returns true if the flash is busy, false otherwise.
|
||||
*/
|
||||
bool isBusy();
|
||||
public:
|
||||
/*
|
||||
* Read / Write operations
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param addr
|
||||
* @param buffer
|
||||
* @param length
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t readData(uint32_t address, uint8_t * buffer, size_t length, bool fast = true);
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param addr
|
||||
* @param buffer
|
||||
* @param length
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t pageProgram(uint32_t address, uint8_t * buffer, size_t length);
|
||||
|
||||
|
||||
public:
|
||||
/*
|
||||
* Erase operations
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Sets all memory within a specified sector (4 KByte) to 1s.
|
||||
*
|
||||
* @remarks Afterwards, the device won't accept any instructions for a duration T_SE. This can be checked
|
||||
* by reading the busy bit.
|
||||
*
|
||||
* @param address The address of the sector to erase.
|
||||
* @return bool Returns 1 if the operation was successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t sectorErase(uint32_t address);
|
||||
|
||||
/**
|
||||
* @brief Sets all memory within a specified block (32/64 KByte) to 1s.
|
||||
*
|
||||
* @remarks Afterwards, the device won't accept any instructions for a duration T_SE. This can be checked
|
||||
* by reading the busy bit.
|
||||
*
|
||||
* @param address The address of the block to erase.
|
||||
* @param blockSize The size of the block (32KByte vs 64KByte)
|
||||
* @return uint8_t Returns 1 if the operation was successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t blockErase(uint32_t address, BlockSize blockSize);
|
||||
|
||||
/**
|
||||
* @brief Sets all memory on the chip to 1s.
|
||||
*
|
||||
* @return uint8_t Returns 1 if the operation was successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t chipErase();
|
||||
|
||||
/**
|
||||
* @brief Suspends an ongoing sector or block erase operation.
|
||||
*
|
||||
* @remarks Chip erase operations cannot be suspended.
|
||||
*
|
||||
* @return uin8t_t Returns 1 if the operation was successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t suspendErase();
|
||||
|
||||
/**
|
||||
* @brief Resumes a suspended sector or block erase operation.
|
||||
*
|
||||
* @return uint8_t Returns 1 if the operation was successful, 0 otherwise.
|
||||
*/
|
||||
uint8_t resumeErase();
|
||||
|
||||
// TODO: Read SUS bit
|
||||
public:
|
||||
// Erase security registers
|
||||
|
||||
// Program security registers
|
||||
|
||||
// Read security registers
|
||||
|
||||
// Indiv Block / Sector lock
|
||||
uint8_t lockBlock(uint32_t address);
|
||||
|
||||
// Indiv Block / Sector unlock
|
||||
uint8_t unlockBlock(uint32_t address);
|
||||
|
||||
// Indiv Block / Sector lock read
|
||||
|
||||
// Global Block / Sector lock
|
||||
|
||||
// Global Block / Sector unlock
|
||||
private:
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param instruction
|
||||
* @param data
|
||||
* @param length
|
||||
* @param arguments
|
||||
* @param arg_length
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t busWrite(uint8_t instruction, const uint8_t * data = nullptr, size_t length = 0, uint8_t * arguments = nullptr, size_t arg_length = 0);
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param instruction
|
||||
* @param data
|
||||
* @param length
|
||||
* @param arguments
|
||||
* @param arg_length
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint8_t busRead(uint8_t instruction, uint8_t * data, size_t length, uint8_t * arguments = nullptr, size_t arg_length = 0);
|
||||
|
||||
/**
|
||||
* @brief Checks if the flash is write enabled.
|
||||
*
|
||||
* @return bool Returns true if the flash is write enabled, false otherwise.
|
||||
*/
|
||||
bool isWriteEnabled();
|
||||
|
||||
uint8_t writeEnable();
|
||||
|
||||
uint8_t writeDisable();
|
||||
|
||||
uint8_t writeVolatileEnable();
|
||||
|
||||
private:
|
||||
SPIDevice * device_;
|
||||
ChipState state_;
|
||||
AddressMode addrMode_;
|
||||
};
|
||||
} // namespace sta
|
||||
|
||||
|
||||
#endif // STA_SENSORS_W25Q128_HPP
|
64
include/sta/drivers/w25qxx_defs.hpp
Normal file
64
include/sta/drivers/w25qxx_defs.hpp
Normal file
@@ -0,0 +1,64 @@
|
||||
#ifndef STA_SENSORS_W25QXX_DEFS_HPP
|
||||
#define STA_SENSORS_W25QXX_DEFS_HPP
|
||||
|
||||
// Enable 4 Byte address mode (for W25Q512)
|
||||
#define W25QXX_4_BYTE_ADDR_ENABLE 0xB7
|
||||
|
||||
// W25Qxx-specific instructions
|
||||
#define W25QXX_WRITE_ENABLE 0x06
|
||||
#define W25QXX_VOL_SR_WRITE_ENABLE 0x06
|
||||
#define W25QXX_WRITE_DISABLE 0x04
|
||||
|
||||
// Status register read/write instructions.
|
||||
#define W25QXX_STATUS_REG_1_READ 0x05
|
||||
#define W25QXX_STATUS_REG_1_WRITE 0x01
|
||||
#define W25QXX_STATUS_REG_2_READ 0x35
|
||||
#define W25QXX_STATUS_REG_2_WRITE 0x31
|
||||
#define W25QXX_STATUS_REG_3_READ 0x15
|
||||
#define W25QXX_STATUS_REG_3_WRITE 0x11
|
||||
|
||||
// Erase memory
|
||||
#define W25QXX_CHIP_ERASE 0xC7
|
||||
#define W25QXX_ERASE_SUSPEND_PROG 0x75
|
||||
#define W25QXX_ERASE_RESUME_PROG 0x7A
|
||||
|
||||
// Power management
|
||||
#define W25QXX_POWER_DOWN 0xB9
|
||||
#define W25QXX_RELEASE_POWER_DOWN 0xAB
|
||||
|
||||
// ID reading
|
||||
#define W25QXX_DEVICE_ID 0x90
|
||||
#define W25QXX_READ_UNIQUE_ID 0x4B
|
||||
|
||||
#define W25QXX_GLOBAL_BLOCK_LOCK 0x7E
|
||||
#define W25QXX_GLOBAL_BLOCK_UNLOCK 0x98
|
||||
#define W25QXX_QPI_MODE 0x38
|
||||
#define W25QXX_ENABLE_RESET 0x66
|
||||
#define W25QXX_RESET_DEVICE 0x99
|
||||
|
||||
#define W25QXX_PAGE_PROGAM 0x02
|
||||
#define W25QXX_QUAD_PAGE_PROGAM 0x32
|
||||
|
||||
#define W25QXX_SECTOR_ERASE 0x21
|
||||
#define W25QXX_BLOCK_ERASE_32_KB 0x52
|
||||
#define W25QXX_BLOCK_ERASE_64_KB 0xD8
|
||||
|
||||
#define W25QXX_READ 0x03
|
||||
#define W25QXX_FAST_READ 0x0B
|
||||
#define W25QXX_FAST_READ_DUAL_OUT 0x3B
|
||||
#define W25QXX_FAST_READ_QUAD_OUT 0x6B
|
||||
#define W25QXX_SFDP_REG 0x5A
|
||||
|
||||
#define W25QXX_ERASE_SEC_REG 0x44
|
||||
#define W25QXX_PROGRAM_SEC_REG 0x42
|
||||
|
||||
// Lock locking/unlocking/reading for individual blocks
|
||||
#define W25QXX_INDIV_BLOCK_LOCK 0x36
|
||||
#define W25QXX_INDIV_BLOCK_UNLOCK 0x39
|
||||
#define W25QXX_READ_BLOCK_LOCK 0x3D
|
||||
|
||||
|
||||
#define W25QXX_DEVICE_ID_RESULT 0xEF
|
||||
|
||||
|
||||
#endif // STA_SENSORS_W25QXX_DEFS_HPP
|
Reference in New Issue
Block a user