diff options
Diffstat (limited to 'firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h')
-rw-r--r-- | firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h b/firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h new file mode 100644 index 0000000..940ed2b --- /dev/null +++ b/firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h @@ -0,0 +1,206 @@ +/* ---------------------------------------------------------------------------- + * 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 + |