209 lines
5.2 KiB
C
209 lines
5.2 KiB
C
//
|
|
// Created by lydxh on 24-11-27.
|
|
//
|
|
|
|
#ifndef HW_LIB_FLASH_H
|
|
#define HW_LIB_FLASH_H
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <flash_cfg.h>
|
|
#include "flash_def.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* debug print function. Must be implement by user. */
|
|
#ifdef FLASH_DEBUG_MODE
|
|
#ifndef FLASH_DEBUG
|
|
#define FLASH_DEBUG(...) flash_log_debug(__FILE__, __LINE__, __VA_ARGS__)
|
|
#endif /* FLASH_DEBUG */
|
|
#else
|
|
#define FLASH_DEBUG(...)
|
|
#endif /* FLASH_DEBUG_MODE */
|
|
|
|
#ifndef FLASH_INFO
|
|
#define FLASH_INFO(...) flash_log_info(__VA_ARGS__)
|
|
#endif
|
|
|
|
/* assert for developer. */
|
|
#ifdef FLASH_DEBUG_MODE
|
|
#define FLASH_ASSERT(EXPR) \
|
|
if (!(EXPR)) \
|
|
{ \
|
|
FLASH_DEBUG("(%s) has assert failed at %s.", #EXPR, __FUNCTION__); \
|
|
while (1); \
|
|
}
|
|
#else
|
|
#define FLASH_ASSERT(EXPR)
|
|
#endif
|
|
|
|
typedef struct FLASH_Dev FLASH_t;
|
|
|
|
struct FLASH_Dev {
|
|
char *name; /**< serial flash name */
|
|
size_t index; /**< index of flash device information table @see flash_table */
|
|
flash_chip chip; /**< flash chip information */
|
|
flash_spi spi; /**< SPI device */
|
|
bool init_ok; /**< initialize OK flag */
|
|
bool addr_in_4_byte; /**< flash is in 4-Byte addressing */
|
|
struct {
|
|
void (*delay)(void); /**< every retry's delay */
|
|
size_t times; /**< default times for error retry */
|
|
} retry;
|
|
|
|
void *user_data; /**< some user data */
|
|
|
|
#ifdef FLASH_USING_QSPI
|
|
flash_qspi_read_cmd_format read_cmd_format; /**< fast read cmd format */
|
|
#endif
|
|
|
|
#ifdef FLASH_USING_SFDP
|
|
flash_sfdp sfdp; /**< serial flash discoverable parameters by JEDEC standard */
|
|
#endif
|
|
};
|
|
|
|
|
|
/**
|
|
* FLASH library initialize.
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_init(void);
|
|
|
|
/**
|
|
* FLASH initialize by flash device
|
|
*
|
|
* @param flash flash device
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_device_init(FLASH_t *flash);
|
|
|
|
/**
|
|
* get flash device by its index which in the flash information table
|
|
*
|
|
* @param index the index which in the flash information table @see flash_table
|
|
*
|
|
* @return flash device
|
|
*/
|
|
FLASH_t *flash_get_device(size_t index);
|
|
|
|
/**
|
|
* get flash device total number on flash device information table @see flash_table
|
|
*
|
|
* @return flash device total number
|
|
*/
|
|
size_t flash_get_device_num(void);
|
|
|
|
/**
|
|
* get flash device information table @see flash_table
|
|
*
|
|
* @return flash device table pointer
|
|
*/
|
|
const FLASH_t *flash_get_device_table(void);
|
|
|
|
#ifdef FLASH_USING_QSPI
|
|
/**
|
|
* Enbale the fast read mode in QSPI flash mode. Default read mode is normal SPI mode.
|
|
*
|
|
* it will find the appropriate fast-read instruction to replace the read instruction(0x03)
|
|
* fast-read instruction @see FLASH_FLASH_EXT_INFO_TABLE
|
|
*
|
|
* @note When Flash is in QSPI mode, the method must be called after flash_device_init().
|
|
*
|
|
* @param flash flash device
|
|
* @param data_line_width the data lines max width which QSPI bus supported, such as 1, 2, 4
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_qspi_fast_read_enable(FLASH_t *flash, uint8_t data_line_width);
|
|
#endif /* FLASH_USING_QSPI */
|
|
|
|
/**
|
|
* read flash data
|
|
*
|
|
* @param flash flash device
|
|
* @param addr start address
|
|
* @param size read size
|
|
* @param data read data pointer
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_read(const FLASH_t *flash, uint32_t addr, size_t size, uint8_t *data);
|
|
|
|
/**
|
|
* erase flash data
|
|
*
|
|
* @note It will erase align by erase granularity.
|
|
*
|
|
* @param flash flash device
|
|
* @param addr start address
|
|
* @param size erase size
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_erase(const FLASH_t *flash, uint32_t addr, size_t size);
|
|
|
|
/**
|
|
* write flash data (no erase operate)
|
|
*
|
|
* @param flash flash device
|
|
* @param addr start address
|
|
* @param data write data
|
|
* @param size write size
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_write(const FLASH_t *flash, uint32_t addr, size_t size, const uint8_t *data);
|
|
|
|
/**
|
|
* erase and write flash data
|
|
*
|
|
* @param flash flash device
|
|
* @param addr start address
|
|
* @param size write size
|
|
* @param data write data
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_erase_write(const FLASH_t *flash, uint32_t addr, size_t size, const uint8_t *data);
|
|
|
|
/**
|
|
* erase all flash data
|
|
*
|
|
* @param flash flash device
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_chip_erase(const FLASH_t *flash);
|
|
|
|
/**
|
|
* read flash register status
|
|
*
|
|
* @param flash flash device
|
|
* @param status register status
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_read_status(const FLASH_t *flash, uint8_t *status);
|
|
|
|
/**
|
|
* write status register
|
|
*
|
|
* @param flash flash device
|
|
* @param is_volatile true: volatile mode, false: non-volatile mode
|
|
* @param status register status
|
|
*
|
|
* @return result
|
|
*/
|
|
flash_err flash_write_status(const FLASH_t *flash, bool is_volatile, uint8_t status);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif //HW_LIB_FLASH_H
|