blob: 91d9889d08a0a9872fc89b3ee97073af3fa351e2 [file] [log] [blame]
/*
* Copyright (c) 2015-2017, 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 SDSPICC32XX.h
*
* @brief SDSPI driver implementation for a CC32XX SPI peripheral used
* with the SDSPI driver.
*
* The SDSPI header file should be included in an application as follows:
* @code
* #include <ti/drivers/SDSPI.h>
* #include <ti/drivers/sdspi/SDSPICC32XX.h>
* @endcode
*
* Refer to @ref SDSPI.h for a complete description of APIs & example of use.
*
* This SDSPI driver implementation is designed to operate on a CC32XX SPI
* controller using a polling method.
*
* ============================================================================
*/
#ifndef ti_drivers_sdspi_SDSPICC32XX__include
#define ti_drivers_sdspi_SDSPICC32XX__include
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <ti/drivers/SDSPI.h>
#include <ti/drivers/Power.h>
#include <third_party/fatfs/ff.h>
#include <third_party/fatfs/diskio.h>
#define SDSPICC32XX_GPIO0 (0x00 << 16)
#define SDSPICC32XX_GPIO1 (0x01 << 16)
#define SDSPICC32XX_GPIO2 (0x02 << 16)
#define SDSPICC32XX_GPIO3 (0x03 << 16)
#define SDSPICC32XX_GPIO4 (0x04 << 16)
#define SDSPICC32XX_GPIO5 (0x05 << 16)
#define SDSPICC32XX_GPIO6 (0x06 << 16)
#define SDSPICC32XX_GPIO7 (0x07 << 16)
#define SDSPICC32XX_GPIO8 (0x10 << 16)
#define SDSPICC32XX_GPIO9 (0x11 << 16)
#define SDSPICC32XX_GPIO10 (0x12 << 16)
#define SDSPICC32XX_GPIO11 (0x13 << 16)
#define SDSPICC32XX_GPIO12 (0x14 << 16)
#define SDSPICC32XX_GPIO13 (0x15 << 16)
#define SDSPICC32XX_GPIO14 (0x16 << 16)
#define SDSPICC32XX_GPIO15 (0x17 << 16)
#define SDSPICC32XX_GPIO16 (0x20 << 16)
#define SDSPICC32XX_GPIO17 (0x21 << 16)
#define SDSPICC32XX_GPIO22 (0x26 << 16)
#define SDSPICC32XX_GPIO23 (0x27 << 16)
#define SDSPICC32XX_GPIO24 (0x30 << 16)
#define SDSPICC32XX_GPIO25 (0x31 << 16)
#define SDSPICC32XX_GPIO28 (0x34 << 16)
#define SDSPICC32XX_GPIO29 (0x35 << 16)
#define SDSPICC32XX_GPIO30 (0x36 << 16)
#define SDSPICC32XX_GPIO31 (0x37 << 16)
#define SDSPICC32XX_GPIONONE (0xFF << 16)
/*
* We need to encode a pin's GPIO function along with the SPI function,
* since certain SPI functions need to be handled via manual programming
* of a GPIO pin.
* The lower 8 bits of the macro refer to the pin, offset by 1, to match
* driverlib pin defines. For example, SDSPICC32XX_PIN_05_CLK & 0xff = 4,
* which equals PIN_05 in driverlib pin.h. By matching the PIN_xx defines in
* driverlib pin.h, we can pass the pin directly to the driverlib functions.
* The upper 8 bits of the macro correspond to the pin mux confg mode
* value for the pin to operate in the SPI mode. For pins used as CS,
* the upper 16 bits correspond to the GPIO pin.
*
* PIN_62 is special for the SDSPI driver when using an SD Boosterpack,
* as PIN_62 doesn't have an assigned SPI function yet the SD Boosterpack
* has it tied to the CS signal.
*/
#define SDSPICC32XX_PIN_05_CLK 0x0704 /*!< PIN 5 is used for SPI CLK */
#define SDSPICC32XX_PIN_06_MISO 0x0705 /*!< PIN 6 is used for MISO */
#define SDSPICC32XX_PIN_07_MOSI 0x0706 /*!< PIN 7 is used for MOSI */
#define SDSPICC32XX_PIN_08_CS (SDSPICC32XX_GPIO17 | 0x0707) /*!< PIN 8 is used for CS */
#define SDSPICC32XX_PIN_62_GPIO (SDSPICC32XX_GPIO7 | 0x003d) /*!< PIN 62 is used for CS */
#define SDSPICC32XX_PIN_45_CLK 0x072c /*!< PIN 45 is used for SPI CLK */
#define SDSPICC32XX_PIN_50_CS (SDSPICC32XX_GPIO0 | 0x0931) /*!< PIN 50 is used for CS */
#define SDSPICC32XX_PIN_52_MOSI 0x0833 /*!< PIN 52 is used for MOSI */
#define SDSPICC32XX_PIN_53_MISO 0x0734 /*!< PIN 53 is used for MISO */
/**
* @addtogroup SDSPI_STATUS
* SDSPICC32XX_STATUS_* macros are command codes only defined in the
* SDSPICC32XX.h driver implementation and need to:
* @code
* #include <ti/drivers/sdspi/SDSPICC32XX.h>
* @endcode
* @{
*/
/* Add SDSPICC32XX_STATUS_* macros here */
/** @}*/
/**
* @addtogroup SDSPI_CMD
* SDSPICC32XX_CMD_* macros are command codes only defined in the
* SDSPICC32XX.h driver implementation and need to:
* @code
* #include <ti/drivers/sdspi/SDSPICC32XX.h>
* @endcode
* @{
*/
/* Add SDSPICC32XX_CMD_* macros here */
/** @}*/
typedef unsigned long SDSPIBaseAddrType;
typedef unsigned long SDSPIDataType;
/* SDSPI function table */
extern const SDSPI_FxnTable SDSPICC32XX_fxnTable;
/*!
* @brief SD Card type inserted
*/
typedef enum SDSPICC32XX_CardType {
SDSPICC32XX_NOCARD = 0, /*!< Unrecognized Card */
SDSPICC32XX_MMC = 1, /*!< Multi-media Memory Card (MMC) */
SDSPICC32XX_SDSC = 2, /*!< Standard SDCard (SDSC) */
SDSPICC32XX_SDHC = 3 /*!< High Capacity SDCard (SDHC) */
} SDSPICC32XX_CardType;
/*!
* @brief SDSPICC32XX Hardware attributes
*
* The SDSPICC32XX configuration structure describes to the SDSPICC32XX
* driver implementation hardware specifies on which SPI peripheral, GPIO Pins
* and Ports are to be used.
*
* The SDSPICC32XX driver uses this information to:
* - configure and reconfigure specific ports/pins to initialize the SD Card
* for SPI mode
* - identify which SPI peripheral is used for data communications
* - identify which GPIO port and pin is used for the SPI chip select
* mechanism
* - identify which GPIO port and pin is concurrently located on the SPI's MOSI
* (TX) pin.
*
* @remark
* To initialize the SD Card into SPI mode, the SDSPI driver changes the SPI's
* MOSI pin into a GPIO pin so it can kept driven HIGH while the SPI SCK pin
* can toggle. After the initialization, the TX pin is reverted back to the SPI
* MOSI mode.
*
* These fields are used by driverlib APIs and therefore must be populated by
* driverlib macro definitions. For CCWare these definitions are found in:
* - inc/hw_memmap.h
* - inc/hw_ints.h
* - driverlib/gpio.h
* - driverlib/pin.h
* - driverlib/prcm.h
*
* @struct SDSPICC32XX_HWAttrs
* An example configuration structure could look as the following:
* @code
* const SDSPICC32XX_HWAttrs sdspiCC32XXHWattrs = {
* {
* .baseAddr = GSPI_BASE, // SSI Peripheral's base address
* .spiPRCM = PRCM_GSPI, // SPI PRCM peripheral number
*
* .clkPin = SDSPICC32XX_PIN_05_CLK,
* .mosiPin = SDSPICC32XX_PIN_07_MOSI,
* .misoPin = SDSPICC32XX_PIN_06_MISO,
* .csPin = SDSPICC32XX_PIN_62_GPIO,
* }
* };
* @endcode
*/
typedef struct SDSPICC32XX_HWAttrsV1 {
/*!< SPI Peripheral base address */
uint32_t baseAddr;
/*! SPI PRCM peripheral number */
uint32_t spiPRCM;
/*!< GSPI CLK pin assignment */
uint32_t clkPin;
/*!< GSPI MOSI pin assignment & GPIO encoding when using MOSI as GPIO */
uint32_t mosiPin;
/*!< GSPI MISO pin assignment */
uint32_t misoPin;
/*!< CS pin assignment & GPIO encoding for pin use as GPIO */
uint32_t csPin;
} SDSPICC32XX_HWAttrsV1;
/*!
* @brief SDSPICC32XX Object
*
* The application must not access any member variables of this structure!
*/
typedef struct SDSPICC32XX_Object {
uint32_t driveNumber; /* Drive number used by FatFs */
DSTATUS diskState; /* Disk status */
SDSPICC32XX_CardType cardType; /* SDCard Card Command Class (CCC) */
uint32_t bitRate; /* SPI bus bit rate (Hz) */
FATFS filesystem; /* FATFS data object */
uint_fast16_t spiPowerMgrId; /* Determined from base address */
uint_fast16_t gpioCsPowerMgrId; /* Determined from base address */
Power_NotifyObj postNotify; /* LPDS wake-up notify object */
} SDSPICC32XX_Object, *SDSPICC32XX_Handle;
#ifdef __cplusplus
}
#endif
#endif /* ti_drivers_sdspi_SDSPICC32XX__include */