/* ----------------------------------------------------------------------------
 *         SAM Software Package License 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2011, 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
 *
 *  Definitions and function prototype for SDRAMC.
 */

// ---------------------------------------------------------------------------
// SDRAM
// ---------------------------------------------------------------------------
/**  SDRAMC Configuration */
#define EBI_SDRAMC_ADDR (0x70000000u)

/**  SDRAM bus width */
#define BOARD_SDRAM_BUSWIDTH    16


typedef struct _SSdramc_config
{
  uint32_t dwColumnBits ;                     // Number of Column Bits
  uint32_t dwRowBits ;                        // Number of Row Bits
  uint32_t dwBanks ;                          // Number of Banks
  uint32_t dwCAS ;                            // CAS Latency
  uint32_t dwDataBusWidth ;                   // Data Bus Width
  uint32_t dwWriteRecoveryDelay ;             // Write Recovery Delay
  uint32_t dwRowCycleDelay_RowRefreshCycle ;  // Row Cycle Delay and Row Refresh Cycle
  uint32_t dwRowPrechargeDelay ;              // Row Precharge Delay
  uint32_t dwRowColumnDelay ;                 // Row to Column Delay
  uint32_t dwActivePrechargeDelay ;           // Active to Precharge Delay
  uint32_t dwExitSelfRefreshActiveDelay ;     // Exit Self Refresh to Active Delay
  uint32_t dwBK1 ;                            // bk1 addr

} SSdramc_config ;

typedef struct _SSdramc_Memory
{
  SSdramc_config cfg ;

} SSdramc_Memory ;

extern void SDRAMC_Configure( SSdramc_Memory* pMemory, 
		uint32_t dwClockFrequency ) ;
