228 lines
8.7 KiB
C
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 */
|
|
/** @}*/
|