blob: 28b7d7b3525f9d01a9dfeef250311c5ab9b74b87 [file] [log] [blame]
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2009, 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
*
* Include Defines & macros for the nor flash Common Flash Interface layer.
*/
#ifndef _NORFLASHCFI_
#define _NORFLASHCFI_
#include <stdint.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
#define CFI_MAX_ERASE_REGION 4
/** Common flash interface query command. */
#define CFI_QUERY_COMMAND 0x98
#define CFI_QUERY_ADDRESS 0x55
#define CFI_QUERY_OFFSET 0x10
/** Vendor command set control interface ID code . */
#define CMD_SET_NULL 0x0000
#define CMD_SET_INTEL_EXT 0x0001
#define CMD_SET_AMD 0x0002
#define CMD_SET_INTEL 0x0003
#define CMD_SET_AMD_EXT 0x0004
#define CMD_SET_MISUBISHI 0x0100
#define CMD_SET_MISUBISHI_EXT 0x0101
#define CMD_SET_SST 0x0102
/** Indicates the maximum region for norflash device. */
#define NORFLASH_MAXNUMRIGONS 4
/** Indicates the NorFlash uses an 8-bit address bus. */
#define FLASH_CHIP_WIDTH_8BITS 0x01
/** Indicates the NorFlash uses an 16-bit address bus. */
#define FLASH_CHIP_WIDTH_16BITS 0x02
/** Indicates the NorFlash uses an 32-bit address bus. */
#define FLASH_CHIP_WIDTH_32BITS 0x04
/** Indicates the NorFlash uses an 64-bit address bus. */
#define FLASH_CHIP_WIDTH_64BITS 0x08
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
/** \brief Describes a Norflash CFI query system interface information. */
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
typedef struct _NorFlashCfiQueryInfo
{
/** Query Unique String "QRY". */
uint8_t queryUniqueString[3];
/** Primary vendor command set and control interface ID . */
uint16_t primaryCode;
/** Address for primary extended query table. */
uint16_t primaryAddr;
/** Alternate vendor command set and control interface ID . */
uint16_t alternateCode;
/** Address for alternate extended query table. */
uint16_t alternateAddr;
/** Vcc logic supply minimum write/erase voltage. */
uint8_t minVcc;
/** Vcc logic supply maximum write/erase voltage. */
uint8_t maxVcc;
/** Vpp logic supply minimum write/erase voltage. */
uint8_t minVpp;
/** Vpp logic supply maximum write/erase voltage. */
uint8_t maxVpp;
/** Timeout per single write (2<<n) in microsecond. */
uint8_t minTimeOutWrite;
/** Timeout for minimum-size buffer write (2<<n) in microsecond. */
uint8_t minTimeOutBuffer;
/** Timeout for block erase (2<<n) in microsecond. */
uint8_t minTimeOutBlockErase;
/** Timeout for chip erase (2<<n) in microsecond. */
uint8_t minTimeOutChipErase;
/** Maximum timeout per write (2<<n) in microsecond. */
uint8_t maxTimeOutWrite;
/** Maximum timeout for buffer write (2<<n) in microsecond. */
uint8_t maxTimeOutBuffer;
/** Maximum timeout for block erase (2<<n) in microsecond. */
uint8_t maxTimeOutBlockErase;
/** Maximum timeout for chip erase (2<<n) in microsecond. */
uint8_t maxTimeOutChipErase;
} __attribute__ ((packed)) NorFlashCfiQueryInfo;
/** \brief Describes a Norflash CFI Erase block Region information. */
typedef struct _EraseRegionInfo
{
/** Number of erase blocks within the region. */
uint16_t Y;
/** Size within the region. */
uint16_t Z;
} __attribute__ ((packed)) EraseRegionInfo;
/**\brief Describes a Norflash CFI critical details of device geometry. */
typedef struct _NorFlashCfiDeviceGeometry
{
/** Size of Device (2<<n) in number of bytes. */
uint8_t deviceSize;
/** Flash device interface description. */
uint16_t deviceInterface;
/** Maximum number of bytes in multi-byte write (2<<n). */
uint16_t numMultiWrite;
/** Number of erase block regions. */
uint8_t numEraseRegion;
/** Erase block Region information. */
EraseRegionInfo eraseRegionInfo[16];
} __attribute__ ((packed)) NorFlashCfiDeviceGeometry;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/** \brief Describes a Norflash Common Flash Interface information. */
typedef struct _NorFlashCFI
{
/**CFI query system interface information. */
NorFlashCfiQueryInfo norFlashCfiQueryInfo;
/** CFI critical details of device geometry. */
NorFlashCfiDeviceGeometry norFlashCfiDeviceGeometry;
} NorFlashCFI ;
/** \brief Describes a particular model of NandFlash device. */
typedef struct _NorFlashInfo
{
/** Base address. */
uint32_t baseAddress;
/** Address bus using giving by CFI detection. */
/** It can not retrieve info directly from the NorFlashCFI, it depend on hardware connection. */
uint8_t deviceChipWidth;
/** Indicate the decive CFI is compatible */
uint8_t cfiCompatible;
/** Norflash Common Flash Interface information. */
NorFlashCFI cfiDescription;
} NorFlashInfo ;
///** Reset or exit CFI query mode function. */
//typedef void (*fReset) ( NorFlashInfo *, uint32_t ) ;
///** Write buffer to pNorFlash function. */
//typedef uint8_t (*fWriteData)( NorFlashInfo *, uint32_t , uint8_t *, uint32_t ) ;
///** Read manufactory function. */
//typedef uint32_t (*fReadManufactoryID)( NorFlashInfo * ) ;
///** Read device ID code function. */
//typedef uint32_t (*fReadDeviceID)( NorFlashInfo * ) ;
///** Full erase chip function. */
//typedef uint8_t (*fEraseChip) ( NorFlashInfo * ) ;
///** Erase single sector function. */
//typedef uint8_t (*fEraseSector)( NorFlashInfo *, uint32_t ) ;
//
typedef struct _NorFlashOperations
{
/** Reset or exit CFI query mode function. */
void (*_fReset)( NorFlashInfo *pNorFlashInfo, uint32_t address ) ;
/** Write buffer to norflash function. */
uint8_t (*_fWriteData)( NorFlashInfo *pNorFlashInfo, uint32_t address, uint8_t *buffer, uint32_t size ) ;
/** Read manufactory function. */
uint32_t (*_fReadManufactoryID)( NorFlashInfo *pNorFlashInfo ) ;
/** Read device ID code function. */
uint32_t (*_fReadDeviceID)( NorFlashInfo *pNorFlashInfo ) ;
/** Full erase chip function. */
uint8_t (*_fEraseChip) ( NorFlashInfo *pNorFlashInfo ) ;
/** Erase single sector function. */
uint8_t (*_fEraseSector)( NorFlashInfo *pNorFlashInfo, uint32_t address ) ;
/** Unlock single sector function. */
void (*_fUnlockSector)( NorFlashInfo *pNorFlashInfo, uint32_t address ) ;
} NorFlashOperations ;
/** \brief Describes a particular model of NandFlash device. */
typedef struct _NorFlash
{
const NorFlashOperations *pOperations;
NorFlashInfo norFlashInfo;
} NorFlash ;
/*----------------------------------------------------------------------------
* Exported functions
*----------------------------------------------------------------------------*/
extern uint8_t NorFlash_CFI_Detect( NorFlash *norFlash, uint8_t hardwareBusWidth ) ;
extern uint32_t NorFlash_GetDeviceNumOfBlocks( NorFlashInfo *pNorFlashInfo);
extern uint32_t NorFlash_GetDeviceMinBlockSize(NorFlashInfo *pNorFlashInfo);
extern uint32_t NorFlash_GetDeviceMaxBlockSize( NorFlashInfo *pNorFlashInfo ) ;
extern uint32_t NorFlash_GetDeviceBlockSize( NorFlashInfo *pNorFlashInfo, uint32_t sector ) ;
extern uint16_t NorFlash_GetDeviceSectorInRegion( NorFlashInfo *pNorFlashInfo, uint32_t memoryOffset ) ;
extern uint32_t NorFlash_GetDeviceSectorAddress( NorFlashInfo *pNorFlashInfo, uint32_t sector ) ;
extern uint32_t NorFlash_GetByteAddress( NorFlashInfo *pNorFlashInfo, uint32_t offset ) ;
extern uint32_t NorFlash_GetByteAddressInChip( NorFlashInfo *pNorFlashInfo, uint32_t offset ) ;
extern uint32_t NorFlash_GetAddressInChip( NorFlashInfo *pNorFlashInfo, uint32_t offset ) ;
extern uint8_t NorFlash_GetDataBusWidth( NorFlashInfo *pNorFlashInfo ) ;
extern uint32_t NorFlash_GetDeviceSizeInBytes( NorFlashInfo *pNorFlashInfo ) ;
#endif /* #ifndef _NORFLASHCFI_ */