mirror of https://gerrit.osmocom.org/simtrace2
207 lines
7.0 KiB
C
207 lines
7.0 KiB
C
/* ----------------------------------------------------------------------------
|
|
* ATMEL Microcontroller Software Support
|
|
* ----------------------------------------------------------------------------
|
|
* Copyright (c) 2008, 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.
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
/** \addtogroup hsmci_module Working with HSMCI
|
|
* The HSMCI driver provides the interface to configure and use the HSMCI
|
|
* peripheral.
|
|
*
|
|
* The user needs to set the number of wait states depending on the frequency used.\n
|
|
* Configure number of cycles for flash read/write operations in the FWS field of HSMCI_FMR.
|
|
*
|
|
* It offers a function to send flash command to HSMCI and waits for the
|
|
* flash to be ready.
|
|
*
|
|
* To send flash command, the user could do in either of following way:
|
|
* <ul>
|
|
* <li>Write a correct key, command and argument in HSMCI_FCR. </li>
|
|
* <li>Or, Use IAP (In Application Programming) function which is executed from
|
|
* ROM directly, this allows flash programming to be done by code running in flash.</li>
|
|
* <li>Once the command is achieved, it can be detected even by polling EEFC_FSR or interrupt.
|
|
* </ul>
|
|
*
|
|
* The command argument could be a page number,GPNVM number or nothing, it depends on
|
|
* the command itself. Some useful functions in this driver could help user tranlate physical
|
|
* flash address into a page number and vice verse.
|
|
*
|
|
* For more accurate information, please look at the EEFC section of the
|
|
* Datasheet.
|
|
*
|
|
* Related files :\n
|
|
* \ref hsmci_pdc.c\n
|
|
* \ref hsmci.h.\n
|
|
*/
|
|
/*@{*/
|
|
/*@}*/
|
|
|
|
/**
|
|
* \file
|
|
*/
|
|
|
|
/**
|
|
*
|
|
* \section Purpose
|
|
*
|
|
* Implement MultiMediaCard(MCI) Interface Driver
|
|
*
|
|
* \section Usage
|
|
*
|
|
* -# MCI_Init(): Initializes a MCI driver instance and the underlying
|
|
* peripheral.
|
|
* -# MCI_Handler() : Interrupt handler which is called by ISR handler.
|
|
* -# MCI_SetSpeed() : Configure the MCI CLKDIV in the _MR register
|
|
* (\ref Hsmci::HSMCI_MR).
|
|
* -# MCI_SetBusWidth() : Configure the MCI SDCBUS in the _SDCR register
|
|
* (\ref Hsmci::HSMCI_SDCR).
|
|
* -# MCI_EnableHsMode() : Configure the MCI HSMODE in the _CFG register
|
|
* (\ref Hsmci::HSMCI_CFG).
|
|
*/
|
|
|
|
#ifndef HSMCID_H
|
|
#define HSMCID_H
|
|
/** \addtogroup sdmmc_hal
|
|
*@{
|
|
*/
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Headers
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
#include "chip.h"
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
//#include <memories/sdmmc/sdmmc_cmd.h>
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Constants
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
/* Transfer type */
|
|
|
|
/** MultiMedia Transfer type: no data */
|
|
#define MCI_NO_TRANSFER 0
|
|
/** MultiMedia Transfer type: Device to Host (read) */
|
|
#define MCI_START_READ 1
|
|
/** MultiMedia Transfer type: Host to Device (write) & check BUSY */
|
|
#define MCI_START_WRITE 2
|
|
/** Device to Host (read) without command */
|
|
#define MCI_READ 3
|
|
/** Host to Device (write) without command & check BUSY */
|
|
#define MCI_WRITE 4
|
|
/** MultiMedia Transfer type: STOP transfer */
|
|
#define MCI_STOP_TRANSFER 5
|
|
|
|
/** MCI Initialize clock 400K Hz */
|
|
#define MCI_INITIAL_SPEED 400000
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Types
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* \brief MCI Transfer Request prepared by the application upper layer.
|
|
*
|
|
* This structure is sent to the Sdmmc_SendCommand function to start the transfer.
|
|
* At the end of the transfer, the callback is invoked.
|
|
*/
|
|
typedef struct _MciCmd {
|
|
|
|
/** Command code. */
|
|
uint32_t cmd;
|
|
/** Command argument. */
|
|
uint32_t arg;
|
|
/** Data buffer, with MCI_DMA_ENABLE defined 1, the buffer can be
|
|
* 1, 2 or 4 bytes aligned. It has to be 4 byte aligned if no DMA.
|
|
*/
|
|
uint8_t *pData;
|
|
/** Size of data block in bytes. */
|
|
uint16_t blockSize;
|
|
/** Number of blocks to be transfered */
|
|
uint16_t nbBlock;
|
|
/** Response buffer. */
|
|
uint32_t *pResp;
|
|
/** Optional user-provided callback function. */
|
|
void (*callback)( uint8_t status, void *pArg ) ;
|
|
/** Optional argument to the callback function. */
|
|
void *pArg;
|
|
/** SD card command option. */
|
|
uint8_t resType:7, /** Response */
|
|
busyCheck:1; /** Check busy as end of command */
|
|
/** Indicate transfer type */
|
|
uint8_t tranType;
|
|
|
|
/** Indicate end of transfer status */
|
|
uint8_t status;
|
|
|
|
/** Command state. */
|
|
volatile uint8_t state;
|
|
} MciCmd;
|
|
|
|
/**
|
|
* \brief MCI Driver
|
|
*/
|
|
typedef struct
|
|
{
|
|
/** Pointer to a MCI peripheral. */
|
|
Hsmci *pMciHw;
|
|
/** Pointer to currently executing command. */
|
|
MciCmd *pCommand;
|
|
/** MCI peripheral identifier. */
|
|
uint8_t mciId;
|
|
/** Mutex. */
|
|
volatile uint8_t semaphore;
|
|
} Mcid;
|
|
|
|
/*----------------------------------------------------------------------------
|
|
* Exported functions
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
extern void MCI_Disable(Hsmci *pMciHw);
|
|
extern void MCI_Enable(Hsmci *pMciHw);
|
|
extern uint8_t MCI_EnableHsMode(Mcid * pMci, uint8_t hsEnable);
|
|
extern void MCI_Init( Mcid *pMci, Hsmci *pMciHw, uint8_t mciId, uint32_t dwMCk ) ;
|
|
extern uint32_t MCI_SetBusWidth(Mcid *pMci, uint32_t busWidth);
|
|
extern uint32_t MCI_SetSpeed(Mcid *pMci, uint32_t mciSpeed, uint32_t mck);
|
|
|
|
/* pdc if used */
|
|
extern void MCI_Reset(Mcid *pMci, uint8_t keepSettings);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/**@}*/
|
|
#endif //#ifndef HSMCID_H
|
|
|