| /* ---------------------------------------------------------------------------- | |
| * 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. | |
| * ---------------------------------------------------------------------------- | |
| */ | |
| //------------------------------------------------------------------------------ | |
| /// \page "mci" | |
| /// | |
| /// !Purpose | |
| /// | |
| /// mci-interface driver | |
| /// | |
| /// !Usage | |
| /// | |
| /// -# MCI_Init: Initializes a MCI driver instance and the underlying peripheral. | |
| /// -# MCI_SetSpeed : Configure the MCI CLKDIV in the MCI_MR register. | |
| /// -# MCI_SendCommand: Starts a MCI transfer. | |
| /// -# MCI_Handler : Interrupt handler which is called by ISR handler. | |
| /// -# MCI_SetBusWidth : Configure the MCI SDCBUS in the MCI_SDCR register. | |
| //------------------------------------------------------------------------------ | |
| #ifndef MCI_HS_H | |
| #define MCI_HS_H | |
| //------------------------------------------------------------------------------ | |
| // Headers | |
| //------------------------------------------------------------------------------ | |
| #include <board.h> | |
| //------------------------------------------------------------------------------ | |
| // Constants | |
| //------------------------------------------------------------------------------ | |
| /// Transfer is pending. | |
| #define MCI_STATUS_PENDING 1 | |
| /// Transfer has been aborted because an error occured. | |
| #define MCI_STATUS_ERROR 2 | |
| /// Card did not answer command. | |
| #define MCI_STATUS_NORESPONSE 3 | |
| /// MCI driver is currently in use. | |
| #define MCI_ERROR_LOCK 1 | |
| /// MCI configuration with 1-bit data bus on slot A (for MMC cards). | |
| #define MCI_MMC_SLOTA (AT91C_MCI_SCDSEL_SLOTA | AT91C_MCI_SCDBUS_1BIT) | |
| /// MCI configuration with 4-bit data bus on slot A (for SD cards). | |
| #define MCI_SD_SLOTA (AT91C_MCI_SCDSEL_SLOTA | AT91C_MCI_SCDBUS_4BITS) | |
| #ifdef AT91C_MCI_SCDBUS_8BITS | |
| /// MCI configuration with 1-bit data bus on slot A (for MMC cards). | |
| #define MCI_MMC4_SLOTA (AT91C_MCI_SCDSEL_SLOTA | AT91C_MCI_SCDBUS_8BITS) | |
| #endif | |
| #ifdef AT91C_MCI_SCDSEL_SLOTB | |
| /// MCI configuration with 1-bit data bus on slot B (for MMC cards). | |
| #define MCI_MMC_SLOTB (AT91C_MCI_SCDSEL_SLOTB | AT91C_MCI_SCDBUS_1BIT) | |
| /// MCI configuration with 4-bit data bus on slot B (for SD cards). | |
| #define MCI_SD_SLOTB (AT91C_MCI_SCDSEL_SLOTB | AT91C_MCI_SCDBUS_4BITS) | |
| #ifdef AT91C_MCI_SCDBUS_8BITS | |
| /// MCI configuration with 1-bit data bus on slot A (for MMC cards). | |
| #define MCI_MMC4_SLOTB (AT91C_MCI_SCDSEL_SLOTB | AT91C_MCI_SCDBUS_8BITS) | |
| #endif | |
| #else | |
| #define MCI_MMC_SLOTB MCI_MMC_SLOTA | |
| #define MCI_SD_SLOTB MCI_SD_SLOTA | |
| #endif | |
| /// Start new data transfer | |
| #define MCI_NEW_TRANSFER 0 | |
| /// Continue data transfer | |
| #define MCI_CONTINUE_TRANSFER 1 | |
| /// Stop data transfer | |
| #define MCI_STOP_TRANSFER 2 | |
| /// MCI SD Bus Width 1-bit | |
| #define MCI_SDCBUS_1BIT (0 << 7) | |
| /// MCI SD Bus Width 4-bit | |
| #define MCI_SDCBUS_4BIT (1 << 7) | |
| /// MCI SD Bus Width 8-bit | |
| #define MCI_SDCBUS_8BIT (3 << 6) | |
| /// The MCI Clock Speed after initialize (400K) | |
| #define MCI_INITIAL_SPEED 400000 | |
| /// MCI using DMA? | |
| #define MCI_DMA_ENABLE 1 | |
| //------------------------------------------------------------------------------ | |
| // Types | |
| //------------------------------------------------------------------------------ | |
| /// MCI end-of-transfer callback function. | |
| typedef void (*MciCallback)(unsigned char status, void *pCommand); | |
| //------------------------------------------------------------------------------ | |
| /// MCI Transfer Request prepared by the application upper layer. This structure | |
| /// is sent to the MCI_SendCommand function to start the transfer. At the end of | |
| /// the transfer, the callback is invoked by the interrupt handler. | |
| //------------------------------------------------------------------------------ | |
| typedef struct _MciCmd { | |
| /// Command code. | |
| unsigned int cmd; | |
| /// Command argument. | |
| unsigned int arg; | |
| /// Data buffer. | |
| unsigned char *pData; | |
| /// Size of data block in bytes. | |
| unsigned short blockSize; | |
| /// Number of blocks to be transfered | |
| unsigned short nbBlock; | |
| /// Response buffer. | |
| unsigned int *pResp; | |
| /// Optional user-provided callback function. | |
| MciCallback callback; | |
| /// Optional argument to the callback function. | |
| void *pArg; | |
| /// SD card response type. | |
| unsigned char resType; | |
| /// Indicate if there is data transfer | |
| unsigned char dataTran; | |
| /// Indicate if continue to transfer data | |
| unsigned char tranType; | |
| /// Indicates if the command is a read operation. | |
| unsigned char isRead; | |
| /// Command status. | |
| volatile int status; | |
| } MciCmd; | |
| //------------------------------------------------------------------------------ | |
| /// MCI driver structure. Holds the internal state of the MCI driver and | |
| /// prevents parallel access to a MCI peripheral. | |
| //------------------------------------------------------------------------------ | |
| typedef struct { | |
| /// Pointer to a MCI peripheral. | |
| AT91S_MCI *pMciHw; | |
| /// Pointer to currently executing command. | |
| MciCmd *pCommand; | |
| /// MCI peripheral identifier. | |
| unsigned char mciId; | |
| /// MCI HW mode | |
| unsigned char mciMode; | |
| /// Mutex. | |
| volatile char semaphore; | |
| } Mci; | |
| //------------------------------------------------------------------------------ | |
| // Global functions | |
| //------------------------------------------------------------------------------ | |
| extern void MCI_Init( | |
| Mci *pMci, | |
| AT91PS_MCI pMciHw, | |
| unsigned char mciId, | |
| unsigned int mode); | |
| extern unsigned int MCI_GetSpeed(Mci *pMci, unsigned int *mciDiv); | |
| extern unsigned int MCI_SetSpeed(Mci *pMci, | |
| unsigned int mciSpeed, | |
| unsigned int mciLimit); | |
| extern unsigned char MCI_SendCommand(Mci *pMci, MciCmd *pMciCmd); | |
| extern void MCI_Handler(Mci *pMci); | |
| extern unsigned char MCI_IsTxComplete(MciCmd *pMciCmd); | |
| extern unsigned char MCI_CheckBusy(Mci *pMci); | |
| extern void MCI_Close(Mci *pMci); | |
| extern void MCI_EnableHsMode(Mci * pMci, unsigned char hsEnable); | |
| extern void MCI_SetBusWidth(Mci *pMci, unsigned char busWidth); | |
| extern unsigned int MCI_FifoTransfer(Mci * pMci, MciCmd * pCommand); | |
| #endif //#ifndef MCI_HS_H | |