356 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			356 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /****************************************************************************
 | ||
|  | 
 | ||
|  | Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. | ||
|  | 
 | ||
|  | This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT | ||
|  | be copied by any method or incorporated into another program without | ||
|  | the express written consent of Aerospace C.Power. This Information or any portion | ||
|  | thereof remains the property of Aerospace C.Power. The Information contained herein | ||
|  | is believed to be accurate and Aerospace C.Power assumes no responsibility or | ||
|  | liability for its use in any way and conveys no license or title under | ||
|  | any patent or copyright and makes no representation or warranty that this | ||
|  | Information is free from patent or copyright infringement. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | #ifndef IOT_MTD_H
 | ||
|  | #define IOT_MTD_H
 | ||
|  | 
 | ||
|  | #include "iot_flash_api.h"
 | ||
|  | #include "iot_flash_layout.h"
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define PARAM_NAME_LEN_MAX  11
 | ||
|  | #define PARAM_VAL_LEN_MAX   19
 | ||
|  | #define PARAM_END_CHAR      0x0A
 | ||
|  | #define PARAM_EMPTY_CHAR    0x20
 | ||
|  | #define PARAM_EQUAL_CHAR    0x3D
 | ||
|  | #define PARAM_MAX_LENGTH    0x20
 | ||
|  | 
 | ||
|  | #define PARAM_STRING_LAST_PART      "last_part"
 | ||
|  | #define PARAM_STRING_BOOT_PART      "boot_part"
 | ||
|  | #define PARAM_STRING_START_PART     "start_part"
 | ||
|  | #define PARAM_STRING_BOOT_CNT       "boot_cnt"
 | ||
|  | #define PARAM_STRING_UPGRADE_STS    "upgd_sts"
 | ||
|  | #define PARAM_STRING_FW_UNCP        "fw_uncp"
 | ||
|  | #define PARAM_STRING_FIRST_RUN      "first_run"
 | ||
|  | #define PARAM_STRING_FW_CRC1        "fw_crc1"
 | ||
|  | #define PARAM_STRING_FW_SIZE1       "fw_size1"
 | ||
|  | #define PARAM_STRING_FW_STS1        "fw_sts1"
 | ||
|  | #define PARAM_STRING_FW_CRC2        "fw_crc2"
 | ||
|  | #define PARAM_STRING_FW_SIZE2       "fw_size2"
 | ||
|  | #define PARAM_STRING_FW_STS2        "fw_sts2"
 | ||
|  | #define PARAM_STRING_FW_PERIOD1     "fw_period1"
 | ||
|  | #define PARAM_STRING_FW_PERIOD2     "fw_period2"
 | ||
|  | #define PARAM_STRING_FW_BLOCK1      "fw_block1"
 | ||
|  | #define PARAM_STRING_FW_BLOCK2      "fw_block2"
 | ||
|  | #define PARAM_STRING_REINFORCE      "reinforce"
 | ||
|  | /* Partition switchover reason and partition before partition switchover.
 | ||
|  |  * the quotient divided by 2 indicates the reason for switching partitions, | ||
|  |  * see dev_switch_part_cause_t. the remainder of 2 indicates the partition number. | ||
|  |  */ | ||
|  | #define PARAM_STRING_SWITCH_INFO    "sw_info"
 | ||
|  | 
 | ||
|  | #define MTD_LOG_HEAD_SIZE   0x40
 | ||
|  | 
 | ||
|  | typedef enum { | ||
|  |     DEV_SWITCH_PART_CAUSE_UPGRADE = 0, | ||
|  |     DEV_SWITCH_PART_CAUSE_CRASH,    //only record 5 minute crash
 | ||
|  |     DEV_SWITCH_PART_CAUSE_OTHER, | ||
|  |     DEV_SWITCH_PART_CAUSE_MAX, | ||
|  | } dev_switch_part_cause_t; | ||
|  | 
 | ||
|  | typedef struct { | ||
|  |     char name[PARAM_NAME_LEN_MAX]; | ||
|  |     char equal; | ||
|  |     char value[PARAM_VAL_LEN_MAX]; | ||
|  |     char end; | ||
|  | } dev_param_t; | ||
|  | 
 | ||
|  | typedef enum { | ||
|  |     DEV_ERASE_TYPE_SECTOR = 0, | ||
|  |     DEV_ERASE_TYPE_PAGE = 1, | ||
|  |     DEV_ERASE_TYPE_BLOCK64 = 2, | ||
|  |     DEV_ERASE_TYPE_FULL_PART = 3, | ||
|  | } dev_erase_type_t; | ||
|  | 
 | ||
|  | /* log partition head */ | ||
|  | typedef struct _mtd_log_head { | ||
|  |     uint32_t log_size; | ||
|  |     uint32_t write_pos; | ||
|  | } mtd_log_head_t; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_device_init() function used to initiate mtd device | ||
|  |  * | ||
|  |  * @return              HAL_OK - succeed | ||
|  |  * @return              HAL_ERROR - fail | ||
|  |  */ | ||
|  | uint32_t mtd_device_init(int mode); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_set_flash_size() function used to set mtd device's flash size | ||
|  |  * | ||
|  |  * @return              void | ||
|  |  */ | ||
|  | void mtd_set_flash_size(uint8_t size); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_get_flash_size() function used to get mtd device's flash size | ||
|  |  * | ||
|  |  * @return              flash size enum, see flash_size_t. | ||
|  |  */ | ||
|  | uint32_t mtd_get_flash_size(void); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_get_psram_state() function used to get mtd device's psram state | ||
|  |  * | ||
|  |  * @return              0 psram not enabled. otherwise, psram enabled. | ||
|  |  */ | ||
|  | uint8_t mtd_get_psram_state(); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_set_psram() function used to set mtd device's psram state | ||
|  |  * | ||
|  |  * @return              void | ||
|  |  */ | ||
|  | void mtd_set_psram_state(uint8_t en); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_open() - function used to open a device part | ||
|  |  * @param num:          mtd partition number | ||
|  |  * @param flags:        if flags=1, means open the device directly. | ||
|  |  *                      There will be some risk. | ||
|  |  * | ||
|  |  * @return              -1 - failed to open device | ||
|  |  * @return              otherwise - return virtual file pointer | ||
|  |  * | ||
|  |  */ | ||
|  | int dev_open(int num, uint32_t flags); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_close() - function used to close a device part | ||
|  |  * @param fd:           the virtual file pointer | ||
|  |  * | ||
|  |  * @return              -1 - failed to close device | ||
|  |  * @return              0 - succeed to close device | ||
|  |  * | ||
|  |  */ | ||
|  | int dev_close(int fd); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_seek() - function used to set the file position indicator | ||
|  |  * @param fd:           the virtual file pointer | ||
|  |  * @param offset:       the offset position to be set, and uint is byte | ||
|  |  * @param fromwhere:    the start position, the value is | ||
|  |  *                      DEV_SEEK_SET: the begin of device partition | ||
|  |  *                      DEV_SEEK_CUR: current position of device partition | ||
|  |  *                      DEV_SEEK_END: the end of device partition | ||
|  |  * | ||
|  |  * @return              -1 - failed to seek device | ||
|  |  * @return              otherwise - the newest position | ||
|  |  * | ||
|  |  */ | ||
|  | int dev_seek(int fd, uint32_t offset, uint8_t fromwhere); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_read() - function used to read data from device partition | ||
|  |  * @param fd:           the virtual file pointer | ||
|  |  * @param buf:          the read value will be saved in this pointer | ||
|  |  * @param count:        the data length(flash page size,unit is byte) | ||
|  |  * | ||
|  |  * @return              -1 - failed to read data | ||
|  |  * @return              otherwise - the read data number | ||
|  |  * | ||
|  |  */ | ||
|  | int dev_read(int fd, void* buf, size_t count); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_write() - function used to write data in device partition | ||
|  |  * @param fd:           the virtual file pointer | ||
|  |  * @param buf:          the read value will be saved in this pointer | ||
|  |  * | ||
|  |  * @return              -1 - failed to write data | ||
|  |  * @return              otherwise - the written data size | ||
|  |  * | ||
|  |  */ | ||
|  | int dev_write(int fd, void*buf, size_t count); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_write_ext() - function used to write data in device partition | ||
|  |  * @param fd:           the virtual file pointer | ||
|  |  * @param buf:          the data value needs to be written to the partition | ||
|  |  * @param count         the write data lenght | ||
|  |  * @param is_erase      the partion need to be erased before write | ||
|  |  * | ||
|  |  * @return              -1 - failed to write data | ||
|  |  * @return              otherwise - the written data size | ||
|  |  * | ||
|  |  */ | ||
|  | int dev_write_ext(int fd, void *buf, size_t count, uint8_t is_erase); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_get_size_of_erase_once() - function used to get flash write used size | ||
|  |  * @param part:           partion | ||
|  |  * @return              0 failed | ||
|  |  * @return              otherwise - size | ||
|  |  * | ||
|  |  */ | ||
|  | int mtd_get_size_of_erase_once(int part); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_erase() - function used to erease data | ||
|  |  * @param fd:           the virtual file pointer | ||
|  |  * @param addr:         the offset of partition | ||
|  |  * @param mode:         the mode of erasing | ||
|  |  * | ||
|  |  * @return              -1 - failed to erase data | ||
|  |  * @return              0 - succeed to erase data | ||
|  |  * | ||
|  |  */ | ||
|  | int dev_erase(int fd, uint32_t addr, uint8_t mode); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_device_get_info() - function used to get device ID | ||
|  |  * @param buf:          the read id will be saved in this pointer | ||
|  |  * @param type:         the device type | ||
|  |  * | ||
|  |  * @return              -1 - failed to get device ID | ||
|  |  * @return              0 - succeed to get device ID | ||
|  |  * | ||
|  |  */ | ||
|  | int mtd_device_get_info(void* buf, uint32_t type); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief iot_log_save_done() - flash log exception done | ||
|  |  * @param lock:         1: means os lock opened, 0: means os lock closed | ||
|  |  * | ||
|  |  * @return              -1 -- initial flash log failed | ||
|  |  * @return              0 -- initial flash log successful | ||
|  |  * | ||
|  |  */ | ||
|  | int32_t iot_log_save_done(uint8_t lock); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_copy_part() - copy partition | ||
|  |  * @param src_part:  source part number in flash block. | ||
|  |  * @param dest_part:  destination part number in flash block. | ||
|  |  * | ||
|  |  * @return              other value -- failed reason | ||
|  |  * @return              0 -- copy succeed | ||
|  |  * | ||
|  |  */ | ||
|  | uint32_t mtd_copy_part(uint8_t src_part, uint8_t dest_part); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_get_hdr_img_size(uint8_t part) - get img size in hdr | ||
|  |  * @param part:  part number in flash block. | ||
|  |  * | ||
|  |  * @return img_size | ||
|  |  * | ||
|  |  */ | ||
|  | uint32_t mtd_get_hdr_img_size(uint8_t part); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_get_hdr_img_crc(uint8_t part) - get img crc in hdr | ||
|  |  * @param part:  part number in flash block. | ||
|  |  * | ||
|  |  * @return img_crc | ||
|  |  * | ||
|  |  */ | ||
|  | uint32_t mtd_get_hdr_img_crc(uint8_t part); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_calc_hdr_img_part_crc(uint8_t part) - calculate img crc in hdr | ||
|  |  * @param part:  part number in flash block. | ||
|  |  * | ||
|  |  * @return img_crc | ||
|  |  * | ||
|  |  */ | ||
|  | uint32_t mtd_calc_hdr_img_part_crc(uint8_t part); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_fw_hdr_img_crc_compare(uint8_t part) - compare img crc | ||
|  |  * @param none. | ||
|  |  * | ||
|  |  * @return crc_compare_results: 0=match, 1=mismatch | ||
|  |  * | ||
|  |  */ | ||
|  | uint8_t mtd_fw_hdr_img_crc_compare(); | ||
|  | uint8_t dev_get_first_boot_val(); | ||
|  | uint8_t dev_get_first_run_val(); | ||
|  | uint8_t dev_get_boot_cnt(); | ||
|  | uint32_t dev_param_get_value(const char *name, char *value, int *pos); | ||
|  | uint32_t dev_param_save_value(const char *name, char *value); | ||
|  | uint32_t dev_param_get_start_flag(uint32_t *flag); | ||
|  | uint32_t dev_param_get_uncp_flag(uint32_t *flag); | ||
|  | uint32_t dev_param_get_last_flag(uint32_t *flag); | ||
|  | uint32_t dev_param_get_boot_flag(uint32_t *flag); | ||
|  | /**
 | ||
|  |  * @brief dev_switch_part_flag() - switch the start flag(start_part\boot_part). | ||
|  |  * @param cause - see dev_switch_part_cause_t. | ||
|  |  */ | ||
|  | void dev_switch_part_flag(uint8_t cause); | ||
|  | void dev_switch_part(); | ||
|  | uint32_t dev_get_boot_fw_part_num(uint8_t *part); | ||
|  | uint32_t dev_get_boot_pib_part_num(uint8_t *part); | ||
|  | uint32_t dev_get_boot_cus_part_num(uint8_t *part); | ||
|  | uint32_t dev_get_upgrade_fw_part_num(uint8_t *part); | ||
|  | uint32_t dev_get_upgrade_pib_part_num(uint8_t *part); | ||
|  | uint32_t dev_get_upgrade_cus_part_num(uint8_t *part); | ||
|  | uint32_t dev_startup_param_value_check(bool_t sync); | ||
|  | bool_t dev_get_upgrade_flag(void); | ||
|  | uint32_t dev_get_oem_part_num(uint8_t * num); | ||
|  | uint32_t dev_get_cal_data_part_num(uint8_t * num); | ||
|  | uint8_t dev_get_pib_ext_part_num(uint8_t part); | ||
|  | uint32_t dev_get_part_size(uint8_t part); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_param_get_boot_after_burn() - Get the flag to tell if this | ||
|  |  * is the first boot after flash-burn burns images. | ||
|  |  * @param p_flag: Pointer to return the flag. 1 - first boot, 0 - not. | ||
|  |  * @return ERR_OK - Get flag successfully, ERR_FAIL - Fail to fetch flag. | ||
|  |  * | ||
|  |  */ | ||
|  | uint32_t dev_param_get_boot_after_burn(uint32_t *p_flag); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_param_clear_boot_after_burn() - Clear the flag to tell if this | ||
|  |  * is the first boot after flash-burn burns images. | ||
|  |  * @return ERR_OK - Clear flag successfully, ERR_FAIL - Fail to clear flag. | ||
|  |  * | ||
|  |  */ | ||
|  | uint32_t dev_param_clear_boot_after_burn(void); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief dev_get_upgrade_result() - get the last upgrade result | ||
|  |  * @param cause - cause of partition switchover, see dev_switch_part_cause_t. | ||
|  |  * @param upgrade_flag - 1 - upgrade succeeded(old version default), 0 - upgrade failed | ||
|  |  */ | ||
|  | void dev_get_switch_part_info(uint8_t *cause, uint8_t *upgrade_flag); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_running_fw_get_size() - get the firmware size currently executed. | ||
|  |  * @return fw size. | ||
|  |  */ | ||
|  | uint32_t mtd_running_fw_get_size(void); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief mtd_running_fw_read() - get the firmware data currently executed. | ||
|  |  * @param offset - offset position, ranging from 0 ~ fw size. | ||
|  |  * @param buffer - buffer to store FW data. | ||
|  |  * @param length - length to read data. | ||
|  |  * @return number of bytes read successfully. | ||
|  |  */ | ||
|  | uint32_t mtd_running_fw_read(uint32_t offset, uint8_t *buffer, | ||
|  |     uint32_t length); | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif //IOT_MTD_H
 | ||
|  | 
 |