/* ---------------------------------------------------------------------------- | |
* SAM Software Package License | |
* ---------------------------------------------------------------------------- | |
* Copyright (c) 2013, Atmel Corporation | |
* | |
* All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions are met: | |
* | |
* - Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the disclaimer below. | |
* | |
* Atmel's name may not be used to endorse or promote products derived from | |
* this software without specific prior written permission. | |
* | |
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR | |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE | |
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, | |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | |
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | |
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* ---------------------------------------------------------------------------- | |
*/ | |
/** | |
* \file | |
* | |
* Interface for the S25fl1 Serial Flash driver. | |
* | |
*/ | |
#ifndef S25FL1_H | |
#define S25FL1_H | |
#define USE_QSPI_DMA | |
/*---------------------------------------------------------------------------- | |
* Macros | |
*----------------------------------------------------------------------------*/ | |
#define Size(pAt25) ((pAt25)->pDesc->size) | |
#define PageSize(pAt25) ((pAt25)->pDesc->pageSize) | |
#define BlockSize(pAt25) ((pAt25)->pDesc->blockSize) | |
#define Name(pAt25) ((pAt25)->pDesc->name) | |
#define ManId(pAt25) (((pAt25)->pDesc->jedecId) & 0xFF) | |
#define PageNumber(pAt25) (Size(pAt25) / PageSize(pAt25)) | |
#define BlockNumber(pAt25) (Size(pAt25) / BlockSize(pAt25)) | |
#define PagePerBlock(pAt25) (BlockSize(pAt25) / PageSize(pAt25)) | |
#define BlockEraseCmd(pAt25) ((pAt25)->pDesc->blockEraseCmd) | |
/*---------------------------------------------------------------------------- | |
* Local definitions | |
*----------------------------------------------------------------------------*/ | |
/** Device is protected, operation cannot be carried out. */ | |
#define ERROR_PROTECTED 1 | |
/** Device is busy executing a command. */ | |
#define ERROR_BUSY 2 | |
/** There was a problem while trying to program page data. */ | |
#define ERROR_PROGRAM 3 | |
/** There was an SPI communication error. */ | |
#define ERROR_SPI 4 | |
/** Device ready/busy status bit. */ | |
#define STATUS_RDYBSY (1 << 0) | |
/** Device is ready. */ | |
#define STATUS_RDYBSY_READY (0 << 0) | |
/** Device is busy with internal operations. */ | |
#define STATUS_RDYBSY_BUSY (1 << 0) | |
/** Write enable latch status bit. */ | |
#define STATUS_WEL (1 << 1) | |
/** Device is not write enabled. */ | |
#define STATUS_WEL_DISABLED (0 << 1) | |
/** Device is write enabled. */ | |
#define STATUS_WEL_ENABLED (1 << 1) | |
/** Software protection status bit-field. */ | |
#define STATUS_SWP (3 << 2) | |
/** All sectors are software protected. */ | |
#define STATUS_SWP_PROTALL (3 << 2) | |
/** Some sectors are software protected. */ | |
#define STATUS_SWP_PROTSOME (1 << 2) | |
/** No sector is software protected. */ | |
#define STATUS_SWP_PROTNONE (0 << 2) | |
/** Write protect pin status bit. */ | |
#define STATUS_WPP (1 << 4) | |
/** Write protect signal is not asserted. */ | |
#define STATUS_WPP_NOTASSERTED (0 << 4) | |
/** Write protect signal is asserted. */ | |
#define STATUS_WPP_ASSERTED (1 << 4) | |
/** Erase/program error bit. */ | |
#define STATUS_EPE (1 << 5) | |
/** Erase or program operation was successful. */ | |
#define STATUS_EPE_SUCCESS (0 << 5) | |
/** Erase or program error detected. */ | |
#define STATUS_EPE_ERROR (1 << 5) | |
/** Sector protection registers locked bit. */ | |
#define STATUS_SPRL (1 << 7) | |
/** Sector protection registers are unlocked. */ | |
#define STATUS_SPRL_UNLOCKED (0 << 7) | |
/** Sector protection registers are locked. */ | |
#define STATUS_SPRL_LOCKED (1 << 7) | |
/** Quad enable bit */ | |
#define STATUS_QUAD_ENABLE (1 << 1) | |
/** Quad enable bit */ | |
#define STATUS_WRAP_ENABLE (0 << 4) | |
/** Latency control bits */ | |
#define STATUS_LATENCY_CTRL (0xF << 0) | |
#define STATUS_WRAP_BYTE (1 << 5) | |
#define BLOCK_PROTECT_Msk (7 << 2) | |
#define TOP_BTM_PROTECT_Msk (1 << 5) | |
#define SEC_PROTECT_Msk (1 << 6) | |
#define CHIP_PROTECT_Msk (0x1F << 2) | |
/** Read array command code. */ | |
#define READ_ARRAY 0x0B | |
/** Read array (low frequency) command code. */ | |
#define READ_ARRAY_LF 0x03 | |
/** Fast Read array command code. */ | |
#define READ_ARRAY_DUAL 0x3B | |
/** Fast Read array command code. */ | |
#define READ_ARRAY_QUAD 0x6B | |
/** Fast Read array command code. */ | |
#define READ_ARRAY_DUAL_IO 0xBB | |
/** Fast Read array command code. */ | |
#define READ_ARRAY_QUAD_IO 0xEB | |
/** Block erase command code (4K block). */ | |
#define BLOCK_ERASE_4K 0x20 | |
/** Block erase command code (32K block). */ | |
#define BLOCK_ERASE_32K 0x52 | |
/** Block erase command code (64K block). */ | |
#define BLOCK_ERASE_64K 0xD8 | |
/** Chip erase command code 1. */ | |
#define CHIP_ERASE_1 0x60 | |
/** Chip erase command code 2. */ | |
#define CHIP_ERASE_2 0xC7 | |
/** Byte/page program command code. */ | |
#define BYTE_PAGE_PROGRAM 0x02 | |
/** Sequential program mode command code 1. */ | |
#define SEQUENTIAL_PROGRAM_1 0xAD | |
/** Sequential program mode command code 2. */ | |
#define SEQUENTIAL_PROGRAM_2 0xAF | |
/** Write enable command code. */ | |
#define WRITE_ENABLE 0x06 | |
/** Write disable command code. */ | |
#define WRITE_DISABLE 0x04 | |
/** Protect sector command code. */ | |
#define PROTECT_SECTOR 0x36 | |
/** Unprotected sector command code. */ | |
#define UNPROTECT_SECTOR 0x39 | |
/** Read sector protection registers command code. */ | |
#define READ_SECTOR_PROT 0x3C | |
/** Read status register command code. */ | |
#define READ_STATUS_1 0x05 | |
/** Read status register command code. */ | |
#define READ_STATUS_2 0x35 | |
/** Read status register command code. */ | |
#define READ_STATUS_3 0x33 | |
/** Write status register command code. */ | |
#define WRITE_STATUS 0x01 | |
/** Read manufacturer and device ID command code. */ | |
#define READ_JEDEC_ID 0x9F | |
/** Deep power-down command code. */ | |
#define DEEP_PDOWN 0xB9 | |
/** Resume from deep power-down command code. */ | |
#define RES_DEEP_PDOWN 0xAB | |
/** Resume from deep power-down command code. */ | |
#define SOFT_RESET_ENABLE 0x66 | |
/** Resume from deep power-down command code. */ | |
#define SOFT_RESET 0x99 | |
/** Resume from deep power-down command code. */ | |
#define WRAP_ENABLE 0x77 | |
/** SPI Flash Manufacturer JEDEC ID */ | |
#define ATMEL_SPI_FLASH 0x1F | |
#define ST_SPI_FLASH 0x20 | |
#define WINBOND_SPI_FLASH 0xEF | |
#define MACRONIX_SPI_FLASH 0xC2 | |
#define SST_SPI_FLASH 0xBF | |
/*---------------------------------------------------------------------------- | |
* Exported functions | |
*----------------------------------------------------------------------------*/ | |
uint32_t S25FL1D_ReadJedecId(void); | |
void S25FL1D_InitFlashInterface(uint8_t Mode); | |
void S25FL1D_SoftReset(void); | |
unsigned char S25FL1D_Unprotect(void); | |
unsigned char S25FL1D_Protect(uint32_t StartAddr, uint32_t Size); | |
void S25FL1D_QuadMode(uint8_t Enable); | |
void S25FL1D_EnableWrap(uint8_t ByetAlign); | |
void S25FL1D_SetReadLatencyControl(uint8_t Latency); | |
unsigned char S25FL1D_EraseChip(void); | |
unsigned char S25FL1D_EraseSector( unsigned int address); | |
unsigned char S25FL1D_Erase64KBlock( unsigned int address); | |
unsigned char S25FL1D_Write( | |
uint32_t *pData, | |
uint32_t size, | |
uint32_t address, | |
uint8_t Secure); | |
extern unsigned char S25FL1D_Read( | |
uint32_t *pData, | |
uint32_t size, | |
uint32_t address); | |
extern unsigned char S25FL1D_ReadDual( | |
uint32_t *pData, | |
uint32_t size, | |
uint32_t address); | |
extern unsigned char S25FL1D_ReadQuad( | |
uint32_t *pData, | |
uint32_t size, | |
uint32_t address); | |
extern unsigned char S25FL1D_ReadDualIO( | |
uint32_t *pData, | |
uint32_t size, | |
uint32_t address, | |
uint8_t ContMode, | |
uint8_t Secure); | |
extern unsigned char S25FL1D_ReadQuadIO( | |
uint32_t *pData, | |
uint32_t size, | |
uint32_t address, | |
uint8_t ContMode, | |
uint8_t Secure); | |
#endif // #ifndef S25FL1_H | |