blob: bc36b229e97ade79e2a032931400d585b39e6208 [file] [log] [blame]
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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 AT25 SPI driver.
*
*/
#ifndef AT25_SPI_H
#define AT25_SPI_H
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include <board.h>
/*----------------------------------------------------------------------------
* Macros
*----------------------------------------------------------------------------*/
#define AT25_Size(pAt25) ((pAt25)->pDesc->size)
#define AT25_PageSize(pAt25) ((pAt25)->pDesc->pageSize)
#define AT25_BlockSize(pAt25) ((pAt25)->pDesc->blockSize)
#define AT25_Name(pAt25) ((pAt25)->pDesc->name)
#define AT25_ManId(pAt25) (((pAt25)->pDesc->jedecId) & 0xFF)
#define AT25_PageNumber(pAt25) (AT25_Size(pAt25) / AT25_PageSize(pAt25))
#define AT25_BlockNumber(pAt25) (AT25_Size(pAt25) / AT25_BlockSize(pAt25))
#define AT25_PagePerBlock(pAt25) (AT25_BlockSize(pAt25) / AT25_PageSize(pAt25))
#define AT25_BlockEraseCmd(pAt25) ((pAt25)->pDesc->blockEraseCmd)
/*----------------------------------------------------------------------------
* Local definitions
*----------------------------------------------------------------------------*/
/** Device is protected, operation cannot be carried out. */
#define AT25_ERROR_PROTECTED 1
/** Device is busy executing a command. */
#define AT25_ERROR_BUSY 2
/** There was a problem while trying to program page data. */
#define AT25_ERROR_PROGRAM 3
/** There was an SPI communication error. */
#define AT25_ERROR_SPI 4
/** Device ready/busy status bit. */
#define AT25_STATUS_RDYBSY (1 << 0)
/** Device is ready. */
#define AT25_STATUS_RDYBSY_READY (0 << 0)
/** Device is busy with internal operations. */
#define AT25_STATUS_RDYBSY_BUSY (1 << 0)
/** Write enable latch status bit. */
#define AT25_STATUS_WEL (1 << 1)
/** Device is not write enabled. */
#define AT25_STATUS_WEL_DISABLED (0 << 1)
/** Device is write enabled. */
#define AT25_STATUS_WEL_ENABLED (1 << 1)
/** Software protection status bitfield. */
#define AT25_STATUS_SWP (3 << 2)
/** All sectors are software protected. */
#define AT25_STATUS_SWP_PROTALL (3 << 2)
/** Some sectors are software protected. */
#define AT25_STATUS_SWP_PROTSOME (1 << 2)
/** No sector is software protected. */
#define AT25_STATUS_SWP_PROTNONE (0 << 2)
/** Write protect pin status bit. */
#define AT25_STATUS_WPP (1 << 4)
/** Write protect signal is not asserted. */
#define AT25_STATUS_WPP_NOTASSERTED (0 << 4)
/** Write protect signal is asserted. */
#define AT25_STATUS_WPP_ASSERTED (1 << 4)
/** Erase/program error bit. */
#define AT25_STATUS_EPE (1 << 5)
/** Erase or program operation was successful. */
#define AT25_STATUS_EPE_SUCCESS (0 << 5)
/** Erase or program error detected. */
#define AT25_STATUS_EPE_ERROR (1 << 5)
/** Sector protection registers locked bit. */
#define AT25_STATUS_SPRL (1 << 7)
/** Sector protection registers are unlocked. */
#define AT25_STATUS_SPRL_UNLOCKED (0 << 7)
/** Sector protection registers are locked. */
#define AT25_STATUS_SPRL_LOCKED (1 << 7)
/** Read array command code. */
#define AT25_READ_ARRAY 0x0B
/** Read array (low frequency) command code. */
#define AT25_READ_ARRAY_LF 0x03
/** Block erase command code (4K block). */
#define AT25_BLOCK_ERASE_4K 0x20
/** Block erase command code (32K block). */
#define AT25_BLOCK_ERASE_32K 0x52
/** Block erase command code (64K block). */
#define AT25_BLOCK_ERASE_64K 0xD8
/** Chip erase command code 1. */
#define AT25_CHIP_ERASE_1 0x60
/** Chip erase command code 2. */
#define AT25_CHIP_ERASE_2 0xC7
/** Byte/page program command code. */
#define AT25_BYTE_PAGE_PROGRAM 0x02
/** Sequential program mode command code 1. */
#define AT25_SEQUENTIAL_PROGRAM_1 0xAD
/** Sequential program mode command code 2. */
#define AT25_SEQUENTIAL_PROGRAM_2 0xAF
/** Write enable command code. */
#define AT25_WRITE_ENABLE 0x06
/** Write disable command code. */
#define AT25_WRITE_DISABLE 0x04
/** Protect sector command code. */
#define AT25_PROTECT_SECTOR 0x36
/** Unprotect sector command code. */
#define AT25_UNPROTECT_SECTOR 0x39
/** Read sector protection registers command code. */
#define AT25_READ_SECTOR_PROT 0x3C
/** Read status register command code. */
#define AT25_READ_STATUS 0x05
/** Write status register command code. */
#define AT25_WRITE_STATUS 0x01
/** Read manufacturer and device ID command code. */
#define AT25_READ_JEDEC_ID 0x9F
/** Deep power-down command code. */
#define AT25_DEEP_PDOWN 0xB9
/** Resume from deep power-down command code. */
#define AT25_RES_DEEP_PDOWN 0xAB
/** 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
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
/** Describes a serial firmware flash device parameters. */
typedef struct _At25Desc {
/** Device string name. */
const char *name;
/** JEDEC ID of device. */
unsigned int jedecId;
/** Size of device in bytes. */
unsigned int size;
/** Size of one page in bytes. */
unsigned int pageSize;
/** Block erase size in bytes. */
unsigned int blockSize;
/** Block erase command. */
unsigned int blockEraseCmd;
} At25Desc;
/**
* Serial flash driver structure. Holds the current state of the driver,
* including the current command and the descriptor for the underlying device.
*/
typedef struct _At25 {
/** Pointer to the underlying SPI driver. */
Spid *pSpid;
/** Current SPI command sent to the SPI driver. */
SpidCmd command;
/** Pointer to a descriptor for the serial firmware flash device. */
const At25Desc *pDesc;
/** Command buffer. */
unsigned int pCmdBuffer[2];
} At25;
/*----------------------------------------------------------------------------
* Exported functions
*----------------------------------------------------------------------------*/
extern void AT25_Configure(At25 *pAt25, Spid *pSpid, unsigned char cs);
extern unsigned char AT25_SendCommand(
At25 *pAt25,
unsigned char cmd,
unsigned char cmdSize,
unsigned char *pData,
unsigned int dataSize,
unsigned int address,
SpidCallback callback,
void *pArgument);
extern unsigned char AT25_IsBusy(At25 *pAt25);
extern const At25Desc * AT25_FindDevice(
At25 *pAt25,
unsigned int jedecId);
#endif /*#ifndef AT25_SPI_H */