aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h')
-rw-r--r--firmware/atmel_softpack_libraries/libchip_sam3s/include/hsmci.h206
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
+