/* ----------------------------------------------------------------------------
 *         SAM Software Package License
 * ----------------------------------------------------------------------------
 * Copyright (c) 2012, 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
 *
 * \section Purpose
 *
 * Interface for configuration the Enhanced Embedded Flash Controller (EEFC) 
 * peripheral.
 *
 * \section Usage
 *
 * -# Enable/disable %flash ready interrupt sources using EFC_EnableFrdyIt()
 *    and EFC_DisableFrdyIt().
 * -# Translates the given address into which EEFC, page and offset values
 *    for difference density %flash memory using EFC_TranslateAddress().
 * -# Computes the address of a %flash access given the EFC, page and offset
 *    for difference density %flash memory using EFC_ComputeAddress().
 * -# Start the executing command with EFC_PerformCommand()
 * -# Retrieve the current status of the EFC using EFC_GetStatus().
 * -# Retrieve the result of the last executed command with EFC_GetResult().
 */

#ifndef _EEFC_
#define _EEFC_

/*----------------------------------------------------------------------------
 *        Headers
 *----------------------------------------------------------------------------*/
#include "chip.h"

#include <stdint.h>

/*----------------------------------------------------------------------------
 *        Definitions
 *----------------------------------------------------------------------------*/
/* TODO: Temporary definition for missing symbol in header file */
#define IFLASH_SECTOR_SIZE      65536u


/* EFC command */
#define EFC_FCMD_GETD    0x00 /* Get Flash Descriptor */
#define EFC_FCMD_WP      0x01 /* Write page */
#define EFC_FCMD_WPL     0x02 /* Write page and lock */
#define EFC_FCMD_EWP     0x03 /* Erase page and write page */
#define EFC_FCMD_EWPL    0x04 /* Erase page and write page then lock */
#define EFC_FCMD_EA      0x05 /* Erase all */
#define EFC_FCMD_EPA     0x07 /* Erase pages */
#define EFC_FCMD_SLB     0x08 /* Set Lock Bit */
#define EFC_FCMD_CLB     0x09 /* Clear Lock Bit */
#define EFC_FCMD_GLB     0x0A /* Get Lock Bit */
#define EFC_FCMD_SFB     0x0B /* Set GPNVM Bit */
#define EFC_FCMD_CFB     0x0C /* Clear GPNVM Bit */
#define EFC_FCMD_GFB     0x0D /* Get GPNVM Bit */
#define EFC_FCMD_STUI    0x0E /* Start unique ID */
#define EFC_FCMD_SPUI    0x0F /* Stop unique ID */
#define EFC_FCMD_GCALB   0x10 /* Get CALIB Bit */
#define EFC_FCMD_ES      0x11 /* Erase Sector */
#define EFC_FCMD_WUS     0x12 /* Write User Signature */
#define EFC_FCMD_EUS     0x13 /* Erase User Signature */
#define EFC_FCMD_STUS    0x14 /* Start Read User Signature */
#define EFC_FCMD_SPUS    0x15 /* Stop Read User Signature */

/* The IAP function entry address */
#define CHIP_FLASH_IAP_ADDRESS  (0x00800008)

#ifdef __cplusplus
 extern "C" {
#endif

/*----------------------------------------------------------------------------
 *        Exported functions
 *----------------------------------------------------------------------------*/

extern void EFC_EnableFrdyIt( Efc* efc ) ;

extern void EFC_DisableFrdyIt( Efc* efc ) ;

extern void EFC_SetWaitState( Efc* efc, uint8_t cycles ) ;

extern void EFC_TranslateAddress( Efc** pEfc, uint32_t dwAddress, 
        uint16_t *pwPage, uint16_t *pwOffset ) ;

extern void EFC_ComputeAddress( Efc* efc, uint16_t wPage, uint16_t wOffset, 
        uint32_t *pdwAddress ) ;

extern uint32_t EFC_PerformCommand( Efc* efc, uint32_t dwCommand, 
       uint32_t dwArgument, uint32_t dwUseIAP ) ;

extern uint32_t EFC_GetStatus( Efc* efc ) ;

extern uint32_t EFC_GetResult( Efc* efc ) ;

extern void EFC_SetFlashAccessMode(Efc* efc, uint32_t dwMode) ;

#ifdef __cplusplus
}
#endif

#endif /* #ifndef _EEFC_ */

