28#ifndef HAL_XSNOR_BASE_H
29#define HAL_XSNOR_BASE_H
31#include "oop_base_object.h"
32#include "oop_base_interface.h"
43#define XSNOR_BUS_MODE_SPI 0U
44#define XSNOR_BUS_MODE_WSPI_1LINE 1U
45#define XSNOR_BUS_MODE_WSPI_2LINES 2U
46#define XSNOR_BUS_MODE_WSPI_4LINES 3U
47#define XSNOR_BUS_MODE_WSPI_8LINES 4U
54#define FLASH_ATTR_SPI_4BYTES_ADDR_HINT 0x00008000U
67#if !defined(XSNOR_BUFFER_SIZE) || defined(__DOXYGEN__)
68#define XSNOR_BUFFER_SIZE 32
74#if !defined(XSNOR_USE_SPI) || defined(__DOXYGEN__)
75#define XSNOR_USE_SPI TRUE
81#if !defined(XSNOR_USE_WSPI) || defined(__DOXYGEN__)
82#define XSNOR_USE_WSPI TRUE
88#if !defined(XSNOR_SHARED_BUS) || defined(__DOXYGEN__)
89#define XSNOR_SHARED_BUS TRUE
98#if XSNOR_BUFFER_SIZE < 32
99#error "XSNOR_BUFFER_SIZE minimum is 32"
102#if (XSNOR_BUFFER_SIZE & (XSNOR_BUFFER_SIZE - 1)) != 0
103#error "XSNOR_BUFFER_SIZE must be a power of 2"
107#if (XSNOR_USE_SPI != FALSE) && (XSNOR_USE_SPI != TRUE)
108#error "XSNOR_USE_SPI invalid value"
112#if (XSNOR_USE_WSPI != FALSE) && (XSNOR_USE_WSPI != TRUE)
113#error "XSNOR_USE_WSPI invalid value"
117#if (XSNOR_SHARED_BUS != FALSE) && (XSNOR_SHARED_BUS != TRUE)
118#error "XSNOR_SHARED_BUS invalid value"
122#if (XSNOR_USE_SPI == FALSE) && (XSNOR_USE_WSPI == FALSE)
123#error "XSNOR_USE_SPI or XSNOR_USE_WSPI must be enabled"
125#if (XSNOR_USE_SPI == TRUE) && (HAL_USE_SPI == FALSE)
126#error "XSNOR_USE_SPI requires HAL_USE_SPI"
128#if (XSNOR_USE_WSPI == TRUE) && (HAL_USE_WSPI == FALSE)
129#error "XSNOR_USE_WSPI requires HAL_USE_WSPI"
135#define XSNOR_USE_BOTH ((XSNOR_USE_SPI == TRUE) && (XSNOR_USE_WSPI == TRUE))
141#if (XSNOR_SHARED_BUS == FALSE) || defined (__DOXYGEN__)
146#define __xsnor_bus_acquire(self)
147#define __xsnor_bus_release(self)
178#if (XSNOR_USE_WSPI == TRUE) || defined (__DOXYGEN__)
184#if (XSNOR_USE_SPI == TRUE) || defined (__DOXYGEN__)
214#if (XSNOR_USE_WSPI == TRUE) || defined (__DOXYGEN__)
230#if (XSNOR_USE_SPI == TRUE) || defined (__DOXYGEN__)
250#if (XSNOR_USE_WSPI == TRUE) || defined (__DOXYGEN__)
253#if (XSNOR_USE_SPI == TRUE) || defined (__DOXYGEN__)
334#if (XSNOR_USE_WSPI == TRUE) || defined (__DOXYGEN__)
365#if (XSNOR_USE_SPI == TRUE) || defined (__DOXYGEN__)
368#if (XSNOR_SHARED_BUS == TRUE) || defined (__DOXYGEN__)
377 size_t n,
const uint8_t *p);
382 size_t n, uint8_t *p);
385 uint32_t dummy,
size_t n, uint8_t *p);
388#if (WSPI_SUPPORTS_MEMMAP == TRUE) || defined (__DOXYGEN__)
409 return self->vmt->init(ip);
428 size_t n, uint8_t *rp) {
431 return self->vmt->read(ip, offset, n, rp);
451 size_t n,
const uint8_t *pp) {
454 return self->vmt->program(ip, offset, n, pp);
471 return self->vmt->start_erase_all(ip);
490 return self->vmt->start_erase_sector(ip, sector);
510 return self->vmt->query_erase(ip, msec);
530 return self->vmt->verify_erase(ip, sector);
537 return self->vmt->mmap_on(ip, addrp);
544 self->vmt->mmap_off(ip);
Base class of all SNOR drivers.
#define CC_FORCE_INLINE
Enforces a function inline.
static const struct EFlashDriverVMT vmt
uint32_t flash_sector_t
Type of a flash sector number.
flash_state_t
Driver state machine possible states.
uint32_t flash_offset_t
Type of a flash offset.
flash_error_t
Type of a flash error code.
struct xsnor_buffers xsnor_buffers_t
Type of a non-cacheable buffer.
void __xsnor_dispose_impl(void *ip)
Implementation of object finalization.
void __xsnor_bus_cmd_send(void *ip, uint32_t cmd, size_t n, const uint8_t *p)
Sends a command followed by a data transmit phase.
#define XSNOR_BUFFER_SIZE
Non-cacheable operations buffer.
void __xsnor_spi_cmd_addr(void *ip, uint32_t cmd, flash_offset_t offset)
Sends command and address over SPI.
#define __xsnor_bus_release(self)
static CC_FORCE_INLINE void xsnor_device_mmap_off(void *ip)
void * __xsnor_objinit_impl(void *ip, const void *vmt)
Implementation of object creation.
static CC_FORCE_INLINE flash_error_t xsnor_device_mmap_on(void *ip, uint8_t **addrp)
void __xsnor_bus_cmd_addr_send(void *ip, uint32_t cmd, flash_offset_t offset, size_t n, const uint8_t *p)
Sends a command followed by a flash address and a data transmit phase.
static CC_FORCE_INLINE flash_error_t xsnor_device_start_erase_sector(void *ip, flash_sector_t sector)
Starts an sector erase operation.
static CC_FORCE_INLINE flash_error_t xsnor_device_read(void *ip, flash_offset_t offset, size_t n, uint8_t *rp)
Read operation.
void __xsnor_bus_cmd_addr(void *ip, uint32_t cmd, flash_offset_t offset)
Sends a command followed by a flash address.
void xsnorMemoryUnmap(void *ip)
Leaves the memory mapped mode.
void __xsnor_bus_cmd(void *ip, uint32_t cmd)
Sends a naked command.
flash_error_t xsnorStart(void *ip, const xsnor_config_t *config)
Configures and activates a SNOR driver.
struct xsnor_config xsnor_config_t
Type of a SNOR configuration structure.
void __xsnor_bus_cmd_addr_dummy_receive(void *ip, uint32_t cmd, flash_offset_t offset, uint32_t dummy, size_t n, uint8_t *p)
Sends a complete header followed by a data receive phase.
static CC_FORCE_INLINE flash_error_t xsnor_device_query_erase(void *ip, unsigned *msec)
Queries the driver for erase operation progress.
void __xsnor_bus_cmd_dummy_receive(void *ip, uint32_t cmd, uint32_t dummy, size_t n, uint8_t *p)
Sends a command followed by dummy cycles and a data receive phase.
static CC_FORCE_INLINE flash_error_t xsnor_device_init(void *ip)
static CC_FORCE_INLINE flash_error_t xsnor_device_program(void *ip, flash_offset_t offset, size_t n, const uint8_t *pp)
Program operation.
void __xsnor_bus_cmd_receive(void *ip, uint32_t cmd, size_t n, uint8_t *p)
Sends a command followed by a data receive phase.
struct xsnor_commands xsnor_commands_t
Type of a commands configuration structure.
void __xsnor_bus_cmd_addr_receive(void *ip, uint32_t cmd, flash_offset_t offset, size_t n, uint8_t *p)
Sends a command followed by a flash address and a data receive phase.
void xsnorStop(void *ip)
Deactivates a SNOR driver.
#define __xsnor_bus_acquire(self)
static CC_FORCE_INLINE flash_error_t xsnor_device_verify_erase(void *ip, flash_sector_t sector)
Returns the erase state of a sector.
flash_error_t xsnorMemoryMap(void *ip, uint8_t **addrp)
Enters the memory mapped mode.
static CC_FORCE_INLINE flash_error_t xsnor_device_start_erase_all(void *ip)
Starts a whole-device erase operation.
uint32_t mutex_t
Type of a mutex.
struct hal_spi_config SPIConfig
Type of a SPI driver configuration structure.
struct hal_spi_driver SPIDriver
Type of a structure representing an SPI driver.
struct hal_wspi_driver WSPIDriver
Type of a structure representing an WSPI driver.
struct hal_wspi_config WSPIConfig
Type of a structure representing an WSPI driver configuration.
Generated Flash Interface header.
Type of a flash device descriptor.
Class hal_xsnor_base_c virtual methods table.
flash_error_t(* init)(void *ip)
flash_error_t(* program)(void *ip, flash_offset_t offset, size_t n, const uint8_t *pp)
flash_error_t(* verify_erase)(void *ip, flash_sector_t sector)
flash_error_t(* mmap_on)(void *ip, uint8_t **addrp)
void(* dispose)(void *ip)
void(* mmap_off)(void *ip)
flash_error_t(* query_erase)(void *ip, unsigned *msec)
flash_error_t(* start_erase_sector)(void *ip, flash_sector_t sector)
flash_error_t(* start_erase_all)(void *ip)
flash_error_t(* read)(void *ip, flash_offset_t offset, size_t n, uint8_t *rp)
Structure representing a XSNOR base driver class.
flash_state_t state
Driver state.
flash_interface_i fls
Implemented interface flash_interface_i.
const struct hal_xsnor_base_vmt * vmt
Virtual Methods Table.
const xsnor_commands_t * commands
Current commands configuration.
flash_descriptor_t descriptor
Flash descriptor.
mutex_t mutex
Flash access mutex.
const xsnor_config_t * config
Driver configuration.
Type of a WSPI command descriptor.
SNOR driver configuration.
uint8_t spibuf[8]
Non-cacheable SPI buffer.
uint8_t databuf[XSNOR_BUFFER_SIZE]
Non-cacheable data buffer.
wspi_command_t cmdbuf
Non-cacheable WSPI command buffer.
SPI-specific configuration fields.
SPIDriver * drv
SPI driver to be used for physical communication.
const SPIConfig * cfg
SPI driver configuration.
WSPI-specific configuration fields.
const WSPIConfig * cfg
WSPI driver configuration.
WSPIDriver * drv
WSPI driver to be used for physical communication.
SNOR command configuration structure.
uint32_t cmd_data
Command and data.
uint32_t cmd_addr
Command and address.
uint32_t cmd
Command only.
uint32_t cmd_addr_data
Command, address and data.
SNOR driver configuration.
int bus_type
Bus type selection switch.
int options
Device-dependent options, used by subclasses only.
union xsnor_bus_configs bus
WSPI driver configuration.
xsnor_buffers_t * buffers
Pointer to the non-cacheable buffers.
Union of possible bus configurations.
struct xsnor_bus_wspi wspi