/*
*********************************************************************************************************
*                                       IAR Development Kits
*                                              on the
*
*                                    M451
*
* Filename      : spi_flash.h
* Version       : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/

#ifndef  USER_SPI_FLASH_PRESENT
#define  USER_SPI_FLASH_PRESENT

#include "type.h"

// Flash存储规划如下：
// 0~7K: boot-loader，解压程序，由LDROM调入内存执行
// 8~11K: 配置数据（2K+2K，双份存储）
// 12~14K：保留
// 15K: SFLASH和FRAM一致性标识记录（含标志位、CRC等）
// 16~255K: 保留（以后可能用于存放16点阵的字库，现为了烧录方便，是放在程序里面）
// 256~511K：升级包
// 512K~8189K:   历史记录	(64 x (122847 + 1) = 7678K 
// 8190K~8191K: 保留（2K)

// 配置数据起始地址：8K（大小为4K）
#define SFLASH_CONFIG_BASE		0x2000

#define SFLASH_FRAM_VALID_INFO_BASE	0x3C00

// 升级包起始地址：256K（大小为256K）
#define SFLASH_UPGRADE_BASE 	0x40000ul
// 历史数据起始地址：512K
#define SFLASH_DATA_BASE		0x80000ul

// 数据记录条数（最多可122847+1条）
#define SFLASH_DATA_COUNT	122847ul

// Flash存储容量: 8M bytes
#define SFLASH_SIZE			0x800000ul
#define SFLASH_PAGE_SIZE	256
#define SFLASH_ERASE_SIZE	256	// Page erase size

// 初始化引脚

// 打开设备和允许中断
void SFlash_Open();

void SFlash_ReadID();
uint8_t SFlash_UnlockBPR();
uint8_t SFlash_WriteEN();
void SFlash_ChipErase();
void SFlash_SectorErase(uint32_t Addr);
void SFlash_PageErase(uint32_t Addr);
uint32_t SFlash_BufferWrite(uint32_t Addr, uint8_t *buf, uint32_t nbytes);
uint32_t SFlash_BufferRead(uint32_t Addr, uint8_t *buf, uint32_t nbytes);
uint32_t SFlash_BufferVerify(uint32_t Addr, uint8_t *buf, uint32_t nbytes);

uint16_t do_sflash_crc(unsigned long base_addr, long len);

#endif
