| /* ---------------------------------------------------------------------------- |
| * 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 |
| |