aboutsummaryrefslogtreecommitdiff
path: root/inc/platform/flash_device.h
diff options
context:
space:
mode:
Diffstat (limited to 'inc/platform/flash_device.h')
-rw-r--r--inc/platform/flash_device.h430
1 files changed, 430 insertions, 0 deletions
diff --git a/inc/platform/flash_device.h b/inc/platform/flash_device.h
new file mode 100644
index 0000000..a2e763a
--- /dev/null
+++ b/inc/platform/flash_device.h
@@ -0,0 +1,430 @@
+/**
+*********************************************************************************************************
+* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
+*********************************************************************************************************
+* @file flash_device.h
+* @brief This file contains structures the functions regarding flash device.
+* @author Brenda_li
+* @date 2016-11-9
+* @version v1.0
+
+ ******************************************************************************
+ * @attention
+ *
+ * This module is a confidential and proprietary property of RealTek and
+ * possession or use of this module requires written permission of RealTek.
+ *
+ * Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
+ ******************************************************************************
+ */
+
+/*****************************************************************************************
+* Introduction
+*****************************************************************************************
+* - Flash function would be split into two modules: flash_driver and flash_device
+* - flash_driver will handle flash_spic register to provide flash basic read/write function
+* - flash_device would provide flash layout or other functions.
+******************************************************************************************/
+#ifndef _FLASH_DEVICE_H
+#define _FLASH_DEVICE_H
+/*============================================================================*
+ * Header Files
+*============================================================================*/
+#include <stdbool.h>
+#include <stdint.h>
+
+/** @defgroup FLASH_DEVICE Flash Device
+ * @brief Flash image layout and APIs
+ * @{
+ */
+
+/*============================================================================*
+ * Macros
+ *============================================================================*/
+/** @defgroup FLASH_DEVICE_Exported_Macros Flash Device Exported Macros
+ * @brief
+ * @{
+ */
+#define FMC_PAGE_SIZE 0x1000
+#define FMC_SEC_SECTION_LEN (4 * 1024)
+#define FMC_BLK_SECTION_LEN (64 * 1024)
+#define FMC_ERASE_PATTERN (0xffffffff)
+
+#if (IC_TYPE == IC_TYPE_BEE3)
+#define FLASH_OFFSET_TO_NO_CACHE 0x01000000 /*!< memory offset between no cache and cache flash address */
+#elif (IC_TYPE == IC_TYPE_SBEE2)
+#define FLASH_OFFSET_TO_NO_CACHE 0x04000000
+#endif
+
+//leverage config signature from bee1
+#define SIGNATURE_CONFIG 0x8721bee2
+
+/******** bit definitions of hardfault configuration ********/
+#define BIT_ENABLE_SAVE_HARDFAULT 0x00000001 /* BIT0 */
+#define BIT_ENABLE_DUMP_HARDFAULT 0x00000004 /* BIT2 */
+#define BIT_CLEAR_HISTORY_AFTER_DUMP 0x00000008 /* BIT3 */
+#define BIT_CLEAR_HISTORY_BEFORE_SAVING 0x00000010 /* BIT4 */
+
+/** End of FLASH_DEVICE_Exported_Macros
+ * @}
+ */
+
+/*============================================================================*
+ * Types
+ *============================================================================*/
+/** @defgroup FLASH_DEVICE_Exported_Types Flash Device Exported Types
+ * @brief
+ * @{
+ */
+
+/******************** flash erase type *******************
+FLASH_ERASE_CHIP: erase whole chip
+FLASH_ERASE_SECTOR: erase specified sector(page, 4K always)
+FLASH_ERASE_BLOCK: erase specified block(16 sector always)
+****************************************************************/
+typedef enum
+{
+ FLASH_ERASE_CHIP = 1, /*!<erase whole chip*/
+ FLASH_ERASE_SECTOR = 2, /*!<erase specified sector(page, 4K always)*/
+ FLASH_ERASE_BLOCK = 4, /*!<erase specified block(16 sector always)*/
+} T_ERASE_TYPE;
+
+typedef enum
+{
+ FLASH_SUCCESS = 1,
+ FLASH_NOT_SUPPORT = 0,
+ FLASH_ERROR_NOT_DEF = -1,
+ FLASH_ERROR_INVALID_INPUT = -2,
+ FLASH_ERROR_OUT_OF_RANGE = -3,
+ FLASH_ERROR_TIMEOUT = -4,
+ FLASH_NOT_EXIST = -5,
+ FLASH_CONFIG_FAILED = -6,
+ FLASH_CAL_FAILED = -7
+} T_FLASH_RET;
+
+
+typedef enum
+{
+ FLASH_EXIST_NONE = 0,
+ FLASH_EXIST_BASIC_CFG = 0x01,
+ FLASH_EXIST_ADV_CFG = 0x02,
+ FLASH_EXIST_QUERY_INFO = 0x04,
+ FLASH_EXIST_ALL = 0x07
+} T_FLASH_EXIST_LV;
+
+/******************** Access mode of DR register in user mode *******************/
+typedef enum
+{
+ FLASH_MODE_1BIT = 0,
+ FLASH_MODE_2BIT = 1,
+ FLASH_MODE_4BIT = 2
+} T_FLASH_MODE;
+
+typedef enum
+{
+ FLASH_DMA_AUTO_F2R = 0,
+ FLASH_DMA_AUTO_R2F,
+ FLASH_DMA_USER_F2R,
+ FLASH_DMA_USER_R2F
+} T_FLASH_DMA_TYPE;
+
+typedef enum
+{
+ FLASH_SCCD,
+ FLASH_OCCD,
+ FLASH_OTA_BANK_0,
+ FLASH_OTA_BANK_1,
+ FLASH_OTA_TMP,
+ FLASH_BKP_DATA1,
+ FLASH_BKP_DATA2,
+ FLASH_FTL,
+ FLASH_HARDFAULT_RECORD,
+ FLASH_TOTAL,
+} T_FLASH_LAYOUT_NAME;
+
+typedef enum
+{
+ flash_ioctl_get_size_main = 0x03,
+ flash_ioctl_rsvd0 = 0xD,
+ flash_ioctl_set_seq_trans_enable = 0x1008,
+ flash_ioctl_exec_flash_sw_reset = 0x3005,
+ flash_ioctl_app_base = 0x5000,
+ //add more here
+ flash_ioctl_time_consuming_test_for_Byte_Program,
+} T_IOCTL_CODE;
+
+typedef void (*FlashCB)(void);
+
+/** End of FLASH_DEVICE_Exported_Types
+ * @}
+ */
+
+/*============================================================================*
+ * Variables
+ *============================================================================*/
+/** @defgroup FLASH_DEVICE_Exported_Variables Flash Device Exported Variables
+ * @brief
+ * @{
+ */
+
+extern void *flash_sem;
+
+/** End of FLASH_DEVICE_Exported_Variables
+ * @}
+ */
+
+/*============================================================================*
+ * Functions
+ *============================================================================*/
+/** @defgroup FLASH_DEVICE_Exported_Functions Flash Device Exported Functions
+ * @brief
+ * @{
+ */
+
+/**
+ * @brief dump spic register for debug purpose
+ * @param none
+ * @return none
+*/
+extern void flash_dump_flash_info(void);
+
+/**
+ * @brief calculate crc based on given algorism
+ * @param data_p data buffer to calculate
+ * @param length length of data buffer
+ * @return crc value.
+*/
+extern unsigned short crc16(const unsigned char *data_p, unsigned int length);
+
+
+/**
+ * @brief get ota bank start address by signature in flash
+ * @param name name to specify which image
+ * @return bank address in flash
+*/
+extern uint32_t flash_get_bank_addr(T_FLASH_LAYOUT_NAME name);
+
+
+/**
+ * @brief get specific image bank size
+ * @param name name to specify which image
+ * @return bank size of specified image
+*/
+extern uint32_t flash_get_bank_size(T_FLASH_LAYOUT_NAME name);
+
+
+/**
+ * @brief vendor command interface for flash related control
+ * @param cmd command id
+ * @param param_1 parameter 1
+ * @param param_2 parameter 2
+ * @retval 0 if any error
+ * @retval otherwise return value back via return value
+ * @note add more ctrl code here if necessary
+*/
+extern uint32_t flash_ioctl(uint32_t cmd, uint32_t param_1, uint32_t param_2);
+
+
+/**
+ * @brief get flash_exists status
+ * @param none
+ * @return flash_exists
+*/
+extern T_FLASH_EXIST_LV flash_get_flash_exist(void);
+
+
+/**
+ * @brief erase flash with semaphore locked, it could be used for concorrent usage with other flash task.
+ * @param type erase type
+ * @param addr address to erase when erase block or sector
+ * @return access flash successfully or not
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+ * @note not used in isr mode.
+*/
+extern bool flash_erase_locked(T_ERASE_TYPE type, uint32_t addr);
+
+/**
+ * @brief safe version of program bunch of data to flash via user mode
+ * @param start_addr start_addr address where is going to be flash in flash
+ * @param data_len data length to be program
+ * @param data data buffer to be program into
+ * @return access flash successfully or not
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+*/
+extern bool flash_write_locked(uint32_t start_addr, uint32_t data_len, uint8_t *data);
+
+/**
+ * @brief safe version of program data to flash via auto mode with lock
+ * @param start_addr start_addr address where is going to be flash in flash
+ * @param data data to be program into
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+ * @note
+ * 1. auto write is sync with auto read. so if your use auto read, this api is preferred
+ * 2. this API will not be interrupted by other flash operation
+ * 3. recommandate to use this other than flash_write
+*/
+extern bool flash_auto_write_locked(uint32_t start_addr, uint32_t data);
+
+/**
+ * @brief safe version of program bunch of data to flash via auto mode
+ * @param start_addr start_addr address where is going to be flash in flash
+ * @param data data to be program into
+ * @param len len of data buffer
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+ * @note start address should be 4 byte align
+*/
+extern bool flash_auto_write_buffer_locked(uint32_t start_addr, uint32_t *data, uint32_t len);
+
+/**
+ * @brief safe version of flash_read
+ * @param start_addr start_addr address where is going to be read in flash
+ * @param data_len data length to be read
+ * @param data data buffer to be read into
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+ * @note SPIC only supports SPIC_FIFO_SIZE FIFO, so max SPIC_FIFO_SIZE-4 bytes allowed to be written.
+ * auto mode performance is better than this function, and auto mode read is suggested.
+ * recommend to use auto read other than this api
+*/
+extern bool flash_read_locked(uint32_t start_addr, uint32_t data_len, uint8_t *data);
+
+/**
+ * @brief safe version of flash_auto_read
+ * @param addr address to read
+ * @param data data at addr
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+*/
+extern bool flash_auto_read_locked(uint32_t addr, uint32_t *data);
+
+/**
+ * @brief safe version of flash_split_read
+ * @param start_addr start_addr address where is going to be read in flash
+ * @param data_len data length to be read
+ * @param data data buffer to be read into
+ * @param counter split counter to info that how many split times occur
+ * return 0xFFFFFFFF if not align 4
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+ * @note In order to enhance throughput, only word align (4 bytes) is allowed to be written.
+ * auto mode performance is better than this function, and auto mode read is suggested.
+ * recommend to use auto read other than this api
+*/
+extern bool flash_split_read_locked(uint32_t start_addr, uint32_t data_len, uint8_t *data,
+ uint32_t *counter);
+
+/**
+ * @brief safe version of flash auto dma read
+ * @param dma_type identify user / auto mode and flash_2_ram / ram_2_flash
+ * @param flash_cb callback function after DMA transmit completed if need
+ * @param src_addr address where is going to be read in flash
+ * @param dst_addr address where is going to write data to
+ * @param data_len data length to be read
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+ * @note @ref FLASH_GDMA_HANDLER() will be executed after flash transmit by DMA complete.
+*/
+extern bool flash_auto_dma_read_locked(T_FLASH_DMA_TYPE dma_type, FlashCB flash_cb,
+ uint32_t src_addr, uint32_t dst_addr, uint32_t data_len);
+
+/**
+ * @brief safe version of flash auto seqential transition dma read
+ * @param dma_type identify user / auto mode and flash_2_ram / ram_2_flash
+ * @param flash_cb callback function after DMA transmit completed if need
+ * @param src_addr address where is going to be read in flash
+ * @param dst_addr address where is going to write data to
+ * @param data_len data length to be read
+ * @retval true succeed to access flash
+ * @retval false fail to access flash because other flash access is not finished
+ * @note FLASH_GDMA_HANDLER() will be executed after flash transmit by DMA complete.
+*/
+extern bool flash_auto_seq_trans_dma_read_locked(T_FLASH_DMA_TYPE dma_type, FlashCB flash_cb,
+ uint32_t src_addr, uint32_t dst_addr, uint32_t data_len);
+
+/**
+ * @brief setup user split read by DMA + HW HSK
+ * @param flash_cb flash callback using dma
+ * @param start_addr start address to read
+ * @param dst_addr destination address of the read data
+ * @param data_len data length to be read
+ * @return
+*/
+extern bool flash_split_read_by_dma_locked(FlashCB flash_cb, uint32_t start_addr, uint32_t dst_addr,
+ uint32_t data_len);
+
+/**
+ * @brief set specific bit to specific address with flash lock mechanism
+ * @param addr specific address, should not be flash address!
+ * @param bit bit position to write
+ * @return none
+*/
+extern void flash_set_bit(uint32_t *addr, uint32_t bit);
+
+/**
+ * @brief check if specific bit has been set with flash lock mechanism.
+ * @param flag value to be checked
+ * @param bit bit position to check
+ * @retval true if specified bit position of the flag has been set
+ * @retval false otherwise
+*/
+extern bool flash_get_bit(uint32_t flag, uint32_t bit);
+
+
+/**
+* @brief get block protect level
+* @param *bp_lv a set of BPx ~ BP0
+* @return success or not
+*/
+extern bool flash_get_block_protect_locked(uint8_t *bp_lv);
+
+/**
+* @brief set block protect by map
+* @param bp_lv a set of BPx ~ BP0
+* @return success or not
+*/
+extern bool flash_set_block_protect_locked(uint8_t bp_lv);
+
+/**
+* @brief only unlock prefer section by addres
+* @param unlock_addr address section to be unlocked
+* @param *old_bp_lv before unlock
+* @return success or not
+*/
+extern bool flash_sw_protect_unlock_by_addr_locked(uint32_t unlock_addr, uint8_t *old_bp_lv);
+
+/**
+ * @brief flash try to switch to high speed bit mode
+ * @note switch back to 1 bit mode, if flash switch to high speed bit mode fail
+ * @param bit_mode config bit mode @ref T_FLASH_MODE
+ * @retval FLASH_SUCCESS success
+ * @retval others1 fail
+ */
+extern T_FLASH_RET flash_try_high_speed(T_FLASH_MODE bit_mode);
+
+#if (IC_TYPE == IC_TYPE_SBEE2)
+extern bool flash_ds_erase(T_ERASE_TYPE type, uint32_t addr);
+
+extern bool flash_ds_auto_write(uint32_t addr, uint32_t data);
+
+extern bool flash_ds_auto_read(uint32_t addr, uint32_t *data);
+
+extern bool flash_ds_write(uint32_t addr, uint32_t data_len, uint8_t *data);
+
+extern bool flash_ds_read(uint32_t addr, uint32_t data_len, uint8_t *data);
+#endif
+
+/** @} */ /* End of group FLASH_DEVICE_Exported_Functions */
+
+
+/** @} */ /* End of group FLASH_DEVICE */
+
+
+#endif //_FLASH_DEVICE_H
+
+
+
+