2025-12-17 15:55:25 +08:00

228 lines
8.7 KiB
C

/* Copyright (c) 2020 Kneron, Inc. All Rights Reserved.
*
* The information contained herein is property of Kneron, Inc.
* Terms and conditions of usage are described in detail in Kneron
* STANDARD SOFTWARE LICENSE AGREEMENT.
*
* Licensees are granted free, non-transferable use of the information.
* NO WARRANTY of ANY KIND is provided. This heading must NOT be removed
* from the file.
*/
/* History:
* Version 2.00
* Renamed driver NOR -> Flash (more generic)
* Non-blocking operation
* Added Events, Status and Capabilities
* Linked Flash information (GetInfo)
* Version 1.11
* Changed prefix ARM_DRV -> ARM_DRIVER
* Version 1.10
* Namespace prefix ARM_ added
* Version 1.00
* Initial release
*/
/**@addtogroup KDEV_FLASH KDEV_FLASH
* @{
* @brief Kneron flash device
* @copyright Copyright (C) 2020 Kneron, Inc. All rights reserved.
*/
#ifndef __KDEV_FLASH_H
#define __KDEV_FLASH_H
#include "Driver_Common.h"
#include "kdrv_SPI020.h"
#include "kdev_status.h"
#include "project.h"
#if defined(FLASH_DRV) && (FLASH_DRV == FLASH_DRV_QUAD_OUTPUT_MODE)
#define FLASH_OP_MODE FLASH_QUAD_RW
#elif defined(FLASH_DRV) && (FLASH_DRV == FLASH_DRV_QUAD_IO_MODE)
#define FLASH_OP_MODE (FLASH_QUAD_RW|FLASH_IO_RW)
#elif defined(FLASH_DRV) && (FLASH_DRV == FLASH_DRV_DUAL_OUTPUT_MODE)
#define FLASH_OP_MODE FLASH_DUAL_READ
#elif defined(FLASH_DRV) && (FLASH_DRV == FLASH_DRV_DUAL_IO_MODE)
#define FLASH_OP_MODE (FLASH_DUAL_READ|FLASH_IO_RW)
#elif defined(FLASH_DRV) && (FLASH_DRV == FLASH_DRV_NORMAL_MODE)
#define FLASH_OP_MODE FLASH_NORMAL
#else
#error "FLASH_DRV doesn't defined in project.h"
#endif
#if defined (FLASH_SIZE) && (FLASH_SIZE < FLASH_SIZE_256MBIT)
#define FLASH_4BYTES_CMD_EN 0x00
#else
#define FLASH_4BYTES_CMD_EN 0x01
#endif
#define SPI020_SECTOR_SIZE 4096
#define SPI020_BLOCK_64SIZE 65536
#define FLASH_CODE_OPT (YES)
#define FLASH_CODING_GET_INFO_EN (YES)
/**
* @brief Flash Sector index struct
*/
typedef struct {
uint32_t start; /**< Sector Start address */
uint32_t end; /**< Sector End address (start+size-1) */
}kdev_flash_sector_t;
/**
* @brief Flash information struct
*/
typedef struct {
kdev_flash_sector_t *sector_info; /**< Sector layout information (NULL=Uniform sectors) */
uint32_t sector_count; /**< Number of sectors */
uint32_t sector_size; /**< Uniform sector size in bytes (0=sector_info used) */
uint32_t page_size; /**< Optimal programming page size in bytes */
uint32_t program_unit; /**< Smallest programmable unit in bytes */
uint8_t erased_value; /**< Contents of erased memory (usually 0xFF) */
uint32_t flash_size;
} kdev_flash_info_t;
typedef struct _flash_paramter
{
uint32_t signature; //0x00
uint8_t PTP; //0x0C
uint8_t ID; //0x10
uint8_t erase_4K_support; //0x00 => 0x30[1:0];
uint32_t flash_size_KByte; //0x04~0x07 => 0x34~0x37
uint16_t page_size_Bytes; //0x28 => 0x58[7:4]=0x8
uint16_t sector_size_Bytes;
uint32_t block_size_Bytes; //how many sectors in one block
uint16_t total_sector_numbers;
} kdev_spif_parameter_t;
/**
* @brief Flash Status struct
*/
typedef struct {
uint32_t busy : 1; /**< Flash busy flag */
uint32_t error : 1; /**< Read/Program/Erase error flag (cleared on start of next operation) */
} kdev_flash_status_t;
extern uint32_t kdev_flash_probe(spi_flash_t *flash);
// Function documentation
/**
* @fn kdev_status_t kdev_flash_initialize (void)
* @brief Initialize spi flash interface include hardware setting, get flash information and set to 4byte address
* if flash size is bigger than 16Mbytes
* @param[in] N/A
* @return @ref kdrv_status_t
*
* @note This API MUST be called before using the Read/write APIs for spi flash.
*/
kdev_status_t kdev_flash_initialize(void);//ARM_Flash_SignalEvent_t cb_event);
/**
* @fn kdrv_status_t kdev_flash_uninitialize(void)
* @brief Uinitialize the spi flash interface.
* @return @ref kdrv_status_t
*/
kdev_status_t kdev_flash_uninitialize(void);
/**
* @fn kdev_status_t kdev_flash_power_control(ARM_POWER_STATE state)
* @brief Power handling for spi flasg.
* @param[in] state Power state
* @return @ref kdev_status_t
*/
kdev_status_t kdev_flash_power_control(ARM_POWER_STATE state);
/**
* @fn kdev_status_t kdev_flash_readdata(uint32_t addr, void *data, uint32_t cnt)
* @brief Read data from specific index of spi flash.
* @param[in] addr Data address.
* @param[out] data Pointer to a buffer storing the data read from Flash.
* @param[in] cnt Number of data items to read.
* @return number of data items read or @ref kdev_status_t
*/
kdev_status_t kdev_flash_readdata(uint32_t addr, void *data, uint32_t cnt);
/**
* @fn void kdev_flash_read(uint8_t type, uint32_t offset, uint32_t len, void *buf)
* @brief Read data from specific index of spi flash.
* @param[in] type SPI operation type: standard/Dual/Quad mode.
* @param[in] offset Data address.
* @param[in] len Number of data items to read.
* @param[out] data Pointer to a buffer storing the data read from Flash.
* @return N/A
*/
uint32_t kdev_flash_read_compare(uint8_t type, uint32_t offset, uint32_t len, void *buf);
void kdev_flash_read(uint8_t type, uint32_t offset, uint32_t len, void *buf);
/**
* @fn kdev_status_t kdev_flash_programdata (uint32_t addr, const void *data, uint32_t cnt)
* @brief Program data to specific index in spi flash
* @param[in] addr Data address.
* @param[in] data Pointer to a buffer containing the data to be programmed to Flash.
* @param[in] cnt Number of data items to program.
* @return number of data items programmed or @ref kdev_status_t
*/
kdev_status_t kdev_flash_programdata (uint32_t addr, const void *data, uint32_t cnt);
void kdev_flash_write(uint8_t type, uint32_t offset, uint32_t len, void *buf, uint32_t buf_offset);
/**
* @fn kdev_status_t kdev_flash_programdata (uint32_t addr, const void *data, uint32_t cnt)
* @brief Program data to specific index in spi flash
* @param[in] addr Data address.
* @param[in] data Pointer to a buffer containing the data to be programmed to Flash.
* @param[in] cnt Number of data items to program.
* @return number of data items programmed or @ref kdev_status_t
*/
kdev_status_t kdev_flash_programdata_memxfer(uint32_t addr, const void *data, uint32_t cnt);
/**
* @fn kdev_status_t kdev_flash_erase_sector(uint32_t addr)
* @brief Erase Flash by Sector(4k bytes).
* @param[in] addr Sector address
* @return @ref kdev_status_t
*/
kdev_status_t kdev_flash_erase_sector(uint32_t addr);
/**
* @fn kdev_status_t kdev_flash_erase_multi_sector(uint32_t start_addr, uint32_t end_addr)
* @brief Erase multiple Flash Sectors(continuously).
* @param[in] addr Sector start address
* @param[in] addr Sector end address
* @return @ref kdev_status_t
*/
kdev_status_t kdev_flash_erase_multi_sector(uint32_t start_addr, uint32_t end_addr);
/**
* @fn kdev_status_t kdev_flash_erase_chip(void)
* @brief Erase whole Flash at once.
Optional function for faster full chip erase.
* @return @ref kdev_status_t
*/
kdev_status_t kdev_flash_erase_chip(void);
/**
* @fn kdev_flash_status_t kdev_flash_get_status(void)
* @brief Get Flash status.
* @return Flash status @ref kdev_flash_status_t
*/
kdev_flash_status_t kdev_flash_get_status(void);
/**
* @fn kdev_status_t kdev_flash_get_info(void)
* @brief Get Flash information.
* @return @ref kdev_status_t
*/
kdev_status_t kdev_flash_get_info(void);
/**
* @fn void kdev_flash_64kErase(uint32_t offset)
* @brief Block Erase to erase Flash 64K-bytes at once.
The Block Erase instruction sets all memory within a specified block (64K-bytes) to the erased state of all FFh..
* @param[in] offset Sector start address
* @return N/A
*/
void kdev_flash_64kErase(uint32_t offset);
/**
* @fn void kdev_flash_64kErase(uint32_t offset)
* @brief Sector Erase to erase Flash 4K-bytes at once.
The Sector Erase instruction sets all memory within a specified sector (4K-bytes) to the erased state of all FFh..
* @param[in] offset Sector start address
* @return N/A
*/
void kdev_flash_4kErase(uint32_t offset);
#if FLASH_4BYTES_CMD_EN
bool kdev_flash_is_4byte_address(uint32_t address);
#endif
#endif /* __KDEV_FLASH_H */
/** @}*/