blob: b933512624d65cb6c444d2398c3b34fa2a24f426 [file] [log] [blame]
/*
* Copyright (c) 2016, Texas Instruments Incorporated
* 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 following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS 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.
*/
/** ============================================================================
* @file SDHostCC32XX.h
*
* @brief SDHost driver implementation for CC32XX devices.
*
* The SDHost header file should be included in an application as follows:
* @code
* #include <ti/drivers/SD.h>
* #include <ti/drivers/sd/SDHostCC32XX.h>
* @endcode
*
* Refer to @ref SD.h for a complete description of APIs & example of use.
*
* This SDHost driver implementation is designed to operate on a CC32XX
* SD Host controller using a micro DMA controller.
*
* Note: The driver API's are not thread safe and must not be accessed through
* multiple threads without the use of mutexes.
*
* ## DMA buffer alignment #
*
* When performing disk operations with a word aligned buffer the driver will
* make transfers using the DMA controller. Alternatively, if the buffer is
* not aligned, the data will be copied to the internal SD Host controller
* buffer using a polling method.
*
* ## DMA Interrupts #
*
* When DMA is used, the micro DMA controller generates and IRQ on the
* perpheral's interrupt vector. This implementation automatically installs
* a DMA interrupt to service the assigned micro DMA channels.
*
* ## DMA accessible memory #
*
* When DMA is used, it is the responsibility of the application to ensure
* that read/write buffers reside in memory that is accessible by the DMA.
*
* ============================================================================
*/
#ifndef ti_drivers_sd_SDHostCC32XX__include
#define ti_drivers_sd_SDHostCC32XX__include
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <ti/drivers/SD.h>
#include <ti/drivers/dpl/HwiP.h>
#include <ti/drivers/dpl/SemaphoreP.h>
#include <ti/drivers/Power.h>
#include <ti/drivers/dma/UDMACC32XX.h>
#define SDHostCC32XX_PIN_06_SDCARD_DATA 0x0805
#define SDHostCC32XX_PIN_07_SDCARD_CLK 0x0806
#define SDHostCC32XX_PIN_08_SDCARD_CMD 0x0807
#define SDHostCC32XX_PIN_01_SDCARD_CLK 0x0600
#define SDHostCC32XX_PIN_02_SDCARD_CMD 0x0601
#define SDHostCC32XX_PIN_64_SDCARD_DATA 0x063f
/* SDHost function table */
extern const SD_FxnTable sdHostCC32XX_fxnTable;
/*!
* @brief SDHostCC32XX Hardware attributes
*
* The SDHostCC32XX configuration structure is passed to the SDHostCC32XX
* driver implementation with hardware specifics regarding GPIO Pins and Ports
* to be used.
*
* The SDHostCC32XX driver uses this information to:
* - Configure and reconfigure specific ports/pins to initialize the SD Card
* for SD mode
* - Identify which GPIO port and pin is used for the SDHost clock, data and
* command lines
*
* These fields are used by driverlib APIs and therefore must be populated by
* driverlib macro definitions. For CC32xxWare these definitions are found in:
* - inc/hw_memmap.h
* - driverlib/pin.h
*
* @struct SDHostCC32XX_HWAttrs
* An example configuration structure could look as the following:
* @code
* const SDHostCC32XX_HWAttrsV1 sdhostCC32XXHWattrs[] = {
* {
* .clkRate = 8000000,
* .intPriority = ~0,
* .baseAddr = SDHOST_BASE,
* .rxChIdx = UDMA_CH23_SDHOST_RX,
* .txChIdx = UDMA_CH24_SDHOST_TX,
* .dataPin = SDHostCC32XX_PIN_06_SDCARD_DATA,
* .cmdPin = SDHostCC32XX_PIN_08_SDCARD_CMD,
* .clkPin = SDHostCC32XX_PIN_07_SDCARD_CLK,
* }
* };
* @endcode
*/
typedef struct SDHostCC32XX_HWAttrsV1 {
/*!< SD interface clock rate */
uint_fast32_t clkRate;
/*!< Internal SDHost ISR command/transfer priorty */
int_fast32_t intPriority;
/*!< SDHost Peripheral base address */
uint_fast32_t baseAddr;
/*!< uDMA controlTable receive channel index */
unsigned long rxChIdx;
/*!< uDMA controlTable transmit channel index */
unsigned long txChIdx;
/*!< SD Host Data pin */
uint32_t dataPin;
/*!< SD Host CMD pin */
uint32_t cmdPin;
/*!< SD Host CLK pin */
uint32_t clkPin;
} SDHostCC32XX_HWAttrsV1;
/*!
* @brief SDHostCC32XX Object
*
* The application must not access any member variables of this structure!
*/
typedef struct SDHostCC32XX_Object {
/* Relative Card Address */
uint_fast32_t rca;
/* Write data pointer */
const uint_fast32_t *writeBuf;
/* Number of sectors written */
volatile uint_fast32_t writeSecCount;
/* Read data pointer */
uint_fast32_t *readBuf;
/* Number of sectors read */
volatile uint_fast32_t readSecCount;
/*
* Semaphore to suspend thread execution when waiting for SD Commands
* or data transfers to complete.
*/
SemaphoreP_Handle cmdSem;
/*
* SD Card interrupt handle.
*/
HwiP_Handle hwiHandle;
/* Determined from base address */
unsigned int powerMgrId;
/* LPDS wake-up notify object */
Power_NotifyObj postNotify;
/* UDMA Handle */
UDMACC32XX_Handle dmaHandle;
/* SD Card command state */
volatile int_fast8_t stat;
/* State of the driver (open or closed) */
bool isOpen;
/* SDCard Card Command Class(CCC) */
SD_CardType cardType;
} SDHostCC32XX_Object;
#ifdef __cplusplus
}
#endif
#endif /* ti_drivers_sd_SDHostCC32XX__include */