/* ----------------------------------------------------------------------------
 *         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_ */

