/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : eflash.h
 * Description : eflash header file
 * Author(s)   : Mason
 * version     : V1.0
 * Modify date : 2022-08-04
 ***********************************************************************/
#ifndef __FLASH_H__
#define __FLASH_H__

#include  "um321xF.h"

#define EFlashMainBaseAddr			(0x00000000)
#define PAGE_SIZE                   512

#define EFC_RD_WAIT 			    (5<<3)                              //EFC_CTRL：等待6个系统时钟周期
#define EFC_WRITE_MODE			    (1<<0)                              //EFC_CTRL：Write模式设使能
#define EFC_PAGE_ERASE_MODE		    (1<<1)                              //EFC_CTRL：Sector Erase Mode模式设使能
#define EFC_CHIP_ERASE_MODE		    (1<<2)                              //EFC_CTRL：Chip Erase Mode模式设使能

#define eflash_read_word(addr)      (*(volatile uint32_t *)(addr))      //read by word
#define eflash_read_halfword(addr)  (*(volatile uint16_t *)(addr))      //read by half word
#define eflash_read_byte(addr)      (*(volatile uint8_t *)(addr))       //read by byte
    
/************************************************************************
 * Function     : eflash_init
 * Description  : eflash init function 
 * Input        : uint32_t cpu_hz：system clock, uint: hz
 * Output		: none
 * Return       : none
 ************************************************************************/
void eflash_init(uint32_t cpu_hz);

/************************************************************************
 * Function     : eflash_erase_page
 * Description  : erase the eflash memory of specific page
 * Input        : uint32_t page_addr：对应某一页的首地址
 * Output		: none
 * Return       : 1 : eflash_erase_page success
 *                0 : eflash_write_word fail
 ************************************************************************/
uint8_t eflash_erase_page(uint32_t page_addr);

/************************************************************************
 * Function     : eflash_rewrite_word
 * Description  : rewrite word to eflash memory
 * Input        : uint32_t addr 写入flash中的地址
 *                uint32_t value 写入的32位值
 * Output		: none
 * Return       : 1 : eflash_rewrite_word success
 *			      0 : eflash_rewrite_word fail
 ************************************************************************/
uint8_t eflash_rewrite_word(uint32_t addr, uint32_t value);

/************************************************************************
 * Function     : eflash_write_word
 * Description  : write word to eflash memory
 * Input        : uint32_t addr 写入flash中的地址
 *                uint32_t value 写入的32位值
 * Output		: none
 * Return       : 1 : eflash_write_word success
 *			      0 : eflash_write_word fail
 ************************************************************************/
uint8_t eflash_write_word(uint32_t addr,uint32_t value);

/************************************************************************
 * Function     : eflash_write_halfword
 * Description  : write halfword to eflash memory
 * Input        : uint32_t addr 写入flash中的地址
 *                uint16_t value 写入的16位值
 * Output		: none
 * Return       : 1 : eflash_write_halfword success
 *			      0 : eflash_write_halfword fail
 ************************************************************************/
uint8_t eflash_write_halfword(uint32_t addr,uint16_t value);

/************************************************************************
 * Function     : eflash_write_byte
 * Description  : write byte to eflash memory
 * Input        : uint32_t addr 写入flash中的地址
 *                uint8_t value 写入的8位值
 * Output		: none
 * Return       : 1 : eflash_write_byte success
 *			      0 : eflash_write_byte fail
 ************************************************************************/
uint8_t eflash_write_byte(uint32_t addr,uint8_t value);

/************************************************************************
 * Function     : read_sequence
 * Description  : read Chip SN（16bytes）
 * Input        : uint8_t * buff：Chip SN buff pointer
 * Output		: none
 * Return       : 0：CRC pass，
 *			      1：CRC fail
 ************************************************************************/
 uint16_t read_sequence(uint8_t *buff);
 
/************************************************************************
 * Function     : read_UID
 * Description  : read UID（8bytes）
 * Input        : uint8_t * buff：UID buff pointer
 * Output		: none
 * Return       : 0：CRC pass，
 *			      1：CRC fail
 ************************************************************************/
uint16_t read_UID(uint8_t *buff);

#endif
