From 044ad7c3987460ede48ff27afd6bdb0ca05a0432 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 4 Jul 2011 20:52:54 +0200 Subject: import at91lib from at91lib_20100901_softpack_1_9_v_1_0_svn_v15011 it's sad to see that atmel doesn't publish their svn repo or has a centralized location or even puts proper version/release info into the library itself --- peripherals/mci/mci_hs.h | 236 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 peripherals/mci/mci_hs.h (limited to 'peripherals/mci/mci_hs.h') diff --git a/peripherals/mci/mci_hs.h b/peripherals/mci/mci_hs.h new file mode 100644 index 0000000..90e8385 --- /dev/null +++ b/peripherals/mci/mci_hs.h @@ -0,0 +1,236 @@ +/* ---------------------------------------------------------------------------- + * 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 + +//------------------------------------------------------------------------------ +// Compile Options +//------------------------------------------------------------------------------ + +/// MCI using DMA? +#define MCI_DMA_ENABLE 1 + +/// MCI BUSY Check Fix +#define MCI_BUSY_CHECK_FIX 0 + +/// MCI support SDIO +#define MCI_SDIO_ENABLE 1 + +//------------------------------------------------------------------------------ +// Headers +//------------------------------------------------------------------------------ + +#include +#if MCI_BUSY_CHECK_FIX +#include +#endif + +//------------------------------------------------------------------------------ +// 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 + +#define MCI_INTERRUPT_MODE 0 +#define MCI_POLLING_MODE 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, 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. + 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 { + +#if MCI_BUSY_CHECK_FIX + /// MCI DAT0 Pin (Assign it to enable PIO mode DAT0 check) + /// The pin is configured as peripheral + const Pin *pPinDAT0; +#endif + /// 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; + /// interrupt or polling mode + unsigned int bPolling; +} Mci; + +//------------------------------------------------------------------------------ +// Global functions +//------------------------------------------------------------------------------ + +extern void MCI_Init( + Mci *pMci, + AT91PS_MCI pMciHw, + unsigned char mciId, + unsigned int mode, + unsigned int bPolling); + +extern unsigned int MCI_GetSpeed(Mci *pMci, unsigned int *mciDiv); + +extern unsigned int MCI_SetSpeed(Mci *pMci, + unsigned int mciSpeed, + unsigned int mciLimit, + unsigned int mck); + +extern unsigned char MCI_SendCommand(Mci *pMci, MciCmd *pMciCmd); + +extern void MCI_Handler(Mci *pMci); + +extern unsigned char MCI_IsTxComplete(Mci *pMci); + +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); + +#if MCI_BUSY_CHECK_FIX +extern void MCI_SetBusyFix(Mci *pMci, const Pin * pDAT0); +#endif + +#endif //#ifndef MCI_HS_H + -- cgit v1.2.3