esp32-s2_dfu/hw/mcu/nxp/lpc43xx/CMSIS_LPC43xx_DriverLib/inc/lpc43xx_sdif.h

302 lines
12 KiB
C

/**********************************************************************
* $Id$ lpc43xx_sdif.h 2012-Aug-15
*//**
* @file lpc43xx_sdif.h
* @brief Contains all macro definitions and function prototypes
* support for SDIO firmware library on LPC43xx
* @version 1.0
* @date 15. Aug. 2012
* @author NXP MCU SW Application Team
*
* Copyright(C) 2011, NXP Semiconductor
* All rights reserved.
*
***********************************************************************
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* NXP Semiconductors assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. NXP Semiconductors
* reserves the right to make changes in the software without
* notification. NXP Semiconductors also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, under NXP Semiconductors'
* relevant copyright in the software, without fee, provided that it
* is used in conjunction with NXP Semiconductors microcontrollers. This
* copyright, permission, and disclaimer notice must appear in all copies of
* this code.
**********************************************************************/
/* Peripheral group ----------------------------------------------------------- */
/** @defgroup SDIF SDIF (SD Card Interface)
* @ingroup LPC4300CMSIS_FwLib_Drivers
* @{
*/
#ifndef LPC43XX_SDIF_H
#define LPC43XX_SDIF_H
#include "LPC43xx.h"
#include "lpc_types.h"
#ifdef __cplusplus
extern "C"
{
#endif
/* Private Macros ------------------------------------------------------------- */
/** @defgroup SDIF_Private_Macros SDIF Private Macros
* @{
*/
/** \brief SDIO chained DMA descriptor
*/
typedef struct {
volatile uint32_t des0; /*!< Control and status */
volatile uint32_t des1; /*!< Buffer size(s) */
volatile uint32_t des2; /*!< Buffer address pointer 1 */
volatile uint32_t des3; /*!< Buffer address pointer 2 */
} LPC_SDMMC_DMA_Type;
/** \brief SDIO DMA descriptor control (des0) register defines
*/
#define MCI_DMADES0_OWN (1UL << 31) /*!< DMA owns descriptor bit */
#define MCI_DMADES0_CES (1 << 30) /*!< Card Error Summary bit */
#define MCI_DMADES0_ER (1 << 5) /*!< End of descriptopr ring bit */
#define MCI_DMADES0_CH (1 << 4) /*!< Second address chained bit */
#define MCI_DMADES0_FS (1 << 3) /*!< First descriptor bit */
#define MCI_DMADES0_LD (1 << 2) /*!< Last descriptor bit */
#define MCI_DMADES0_DIC (1 << 1) /*!< Disable interrupt on completion bit */
/** \brief SDIO DMA descriptor size (des1) register defines
*/
#define MCI_DMADES1_BS1(x) (x) /*!< Size of buffer 1 */
#define MCI_DMADES1_BS2(x) ((x) << 13) /*!< Size of buffer 2 */
#define MCI_DMADES1_MAXTR 4096 /*!< Max transfer size per buffer */
/** \brief SDIO control register defines
*/
#define MCI_CTRL_USE_INT_DMAC (1 << 25) /*!< Use internal DMA */
#define MCI_CTRL_CARDV_MASK (0x7 << 16) /*!< SD_VOLT[2:0} pins output state mask */
#define MCI_CTRL_CEATA_INT_EN (1 << 11) /*!< Enable CE-ATA interrupts */
#define MCI_CTRL_SEND_AS_CCSD (1 << 10) /*!< Send auto-stop */
#define MCI_CTRL_SEND_CCSD (1 << 9) /*!< Send CCSD */
#define MCI_CTRL_ABRT_READ_DATA (1 << 8) /*!< Abort read data */
#define MCI_CTRL_SEND_IRQ_RESP (1 << 7) /*!< Send auto-IRQ response */
#define MCI_CTRL_READ_WAIT (1 << 6) /*!< Assert read-wait for SDIO */
#define MCI_CTRL_INT_ENABLE (1 << 4) /*!< Global interrupt enable */
#define MCI_CTRL_DMA_RESET (1 << 2) /*!< Reset internal DMA */
#define MCI_CTRL_FIFO_RESET (1 << 1) /*!< Reset data FIFO pointers */
#define MCI_CTRL_RESET (1 << 0) /*!< Reset controller */
/** \brief SDIO Power Enable register defines
*/
#define MCI_POWER_ENABLE 0x1 /*!< Enable slot power signal (SD_POW) */
/** \brief SDIO Clock divider register defines
*/
#define MCI_CLOCK_DIVIDER(dn, d2) ((d2) << ((dn) * 8)) /*!< Set cklock divider */
/** \brief SDIO Clock source register defines
*/
#define MCI_CLKSRC_CLKDIV0 0
#define MCI_CLKSRC_CLKDIV1 1
#define MCI_CLKSRC_CLKDIV2 2
#define MCI_CLKSRC_CLKDIV3 3
#define MCI_CLK_SOURCE(clksrc) (clksrc) /*!< Set cklock divider source */
/** \brief SDIO Clock Enable register defines
*/
#define MCI_CLKEN_LOW_PWR (1 << 16) /*!< Enable clock idle for slot */
#define MCI_CLKEN_ENABLE (1 << 0) /*!< Enable slot clock */
/** \brief SDIO time-out register defines
*/
#define MCI_TMOUT_DATA(clks) ((clks) << 8) /*!< Data timeout clocks */
#define MCI_TMOUT_DATA_MSK 0xFFFFFF00
#define MCI_TMOUT_RESP(clks) ((clks) & 0xFF) /*!< Response timeout clocks */
#define MCI_TMOUT_RESP_MSK 0xFF
/** \brief SDIO card-type register defines
*/
#define MCI_CTYPE_8BIT (1 << 16) /*!< Enable 4-bit mode */
#define MCI_CTYPE_4BIT (1 << 0) /*!< Enable 8-bit mode */
/** \brief SDIO Interrupt status & mask register defines
*/
#define MCI_INT_SDIO (1 << 16) /*!< SDIO interrupt */
#define MCI_INT_EBE (1 << 15) /*!< End-bit error */
#define MCI_INT_ACD (1 << 14) /*!< Auto command done */
#define MCI_INT_SBE (1 << 13) /*!< Start bit error */
#define MCI_INT_HLE (1 << 12) /*!< Hardware locked error */
#define MCI_INT_FRUN (1 << 11) /*!< FIFO overrun/underrun error */
#define MCI_INT_HTO (1 << 10) /*!< Host data starvation error */
#define MCI_INT_DTO (1 << 9) /*!< Data timeout error */
#define MCI_INT_RTO (1 << 8) /*!< Response timeout error */
#define MCI_INT_DCRC (1 << 7) /*!< Data CRC error */
#define MCI_INT_RCRC (1 << 6) /*!< Response CRC error */
#define MCI_INT_RXDR (1 << 5) /*!< RX data ready */
#define MCI_INT_TXDR (1 << 4) /*!< TX data needed */
#define MCI_INT_DATA_OVER (1 << 3) /*!< Data transfer over */
#define MCI_INT_CMD_DONE (1 << 2) /*!< Command done */
#define MCI_INT_RESP_ERR (1 << 1) /*!< Command response error */
#define MCI_INT_CD (1 << 0) /*!< Card detect */
/** \brief SDIO Command register defines
*/
#define MCI_CMD_START (1UL << 31) /*!< Start command */
#define MCI_CMD_VOLT_SWITCH (1 << 28) /*!< Voltage switch bit */
#define MCI_CMD_BOOT_MODE (1 << 27) /*!< Boot mode */
#define MCI_CMD_DISABLE_BOOT (1 << 26) /*!< Disable boot */
#define MCI_CMD_EXPECT_BOOT_ACK (1 << 25) /*!< Expect boot ack */
#define MCI_CMD_ENABLE_BOOT (1 << 24) /*!< Enable boot */
#define MCI_CMD_CCS_EXP (1 << 23) /*!< CCS expected */
#define MCI_CMD_CEATA_RD (1 << 22) /*!< CE-ATA read in progress */
#define MCI_CMD_UPD_CLK (1 << 21) /*!< Update clock register only */
#define MCI_CMD_INIT (1 << 15) /*!< Send init sequence */
#define MCI_CMD_STOP (1 << 14) /*!< Stop/abort command */
#define MCI_CMD_PRV_DAT_WAIT (1 << 13) /*!< Wait before send */
#define MCI_CMD_SEND_STOP (1 << 12) /*!< Send auto-stop */
#define MCI_CMD_STRM_MODE (1 << 11) /*!< Stream transfer mode */
#define MCI_CMD_DAT_WR (1 << 10) /*!< Read(0)/Write(1) selection */
#define MCI_CMD_DAT_EXP (1 << 9) /*!< Data expected */
#define MCI_CMD_RESP_CRC (1 << 8) /*!< Check response CRC */
#define MCI_CMD_RESP_LONG (1 << 7) /*!< Response length */
#define MCI_CMD_RESP_EXP (1 << 6) /*!< Response expected */
#define MCI_CMD_INDX(n) ((n) & 0x1F)
/** \brief SDIO status register definess
*/
#define MCI_STS_GET_FCNT(x) (((x) >> 17) & 0x1FF)
/** \brief SDIO FIFO threshold defines
*/
#define MCI_FIFOTH_TX_WM(x) ((x) & 0xFFF)
#define MCI_FIFOTH_RX_WM(x) (((x) & 0xFFF) << 16)
#define MCI_FIFOTH_DMA_MTS_1 (0UL << 28)
#define MCI_FIFOTH_DMA_MTS_4 (1UL << 28)
#define MCI_FIFOTH_DMA_MTS_8 (2UL << 28)
#define MCI_FIFOTH_DMA_MTS_16 (3UL << 28)
#define MCI_FIFOTH_DMA_MTS_32 (4UL << 28)
#define MCI_FIFOTH_DMA_MTS_64 (5UL << 28)
#define MCI_FIFOTH_DMA_MTS_128 (6UL << 28)
#define MCI_FIFOTH_DMA_MTS_256 (7UL << 28)
/** \brief Bus mode register defines
*/
#define MCI_BMOD_PBL1 (0 << 8) /*!< Burst length = 1 */
#define MCI_BMOD_PBL4 (1 << 8) /*!< Burst length = 4 */
#define MCI_BMOD_PBL8 (2 << 8) /*!< Burst length = 8 */
#define MCI_BMOD_PBL16 (3 << 8) /*!< Burst length = 16 */
#define MCI_BMOD_PBL32 (4 << 8) /*!< Burst length = 32 */
#define MCI_BMOD_PBL64 (5 << 8) /*!< Burst length = 64 */
#define MCI_BMOD_PBL128 (6 << 8) /*!< Burst length = 128 */
#define MCI_BMOD_PBL256 (7 << 8) /*!< Burst length = 256 */
#define MCI_BMOD_DE (1 << 7) /*!< Enable internal DMAC */
#define MCI_BMOD_DSL(len) ((len) << 2) /*!< Descriptor skip length */
#define MCI_BMOD_FB (1 << 1) /*!< Fixed bursts */
#define MCI_BMOD_SWR (1 << 0) /*!< Software reset of internal registers */
/** \brief Commonly used definitions
*/
#define SD_FIFO_SZ 32 /*!< Size of SDIO FIFOs (32-bit wide) */
/***********************************************************************
* MCI device structure and it defines
**********************************************************************/
/* Function prototype for SD interface IRQ callback */
typedef uint32_t (*MCI_IRQ_CB_FUNC_T)(uint32_t);
/* Function prototype for SD detect and write protect status check */
typedef int32_t (*PSCHECK_FUNC_T) (void);
/* Function prototype for SD slot power enable or slot reset */
typedef void (*PS_POWER_FUNC_T) (int32_t enable);
/* Card specific setup data */
struct _mci_card_struct
{
uint32_t response[4]; /*!< Most recent response */
uint32_t cid[4]; /*!< CID of acquired card */
uint32_t csd[4]; /*!< CSD of acquired card */
uint32_t ext_csd[512 / 4];
uint32_t card_type;
uint32_t rca; /*!< Relative address assigned to card */
uint32_t speed;
uint32_t block_len;
uint32_t device_size;
uint32_t blocknr;
PSCHECK_FUNC_T sdck_det;
PSCHECK_FUNC_T sdck_wp;
PS_POWER_FUNC_T sd_setpow;
PS_POWER_FUNC_T sd_setrst;
};
/**
* @}
*/
/* Public Functions ----------------------------------------------------------- */
/** @defgroup SDIO_Public_Functions SDIO Public Functions
* @{
*/
/* Setup DMA descriptors */
void sdif_dma_setup(uint32_t addr, uint32_t size);
/* Send a command on the SD bus */
int32_t sdif_send_cmd(uint32_t cmd, uint32_t arg);
/* Read the response from the last command */
void sdif_get_response(uint32_t *resp);
/* Sets the SD bus clock speed */
void sdif_set_clock(uint32_t speed);
/* Detect if an SD card is inserted
(uses SD_CD pin, returns 0 on card detect) */
int32_t sdif_card_ndetect(void);
/* Detect if write protect is enabled
(uses SD_WP pin, returns 1 if card is write protected) */
int32_t sdif_card_wp_on(void);
/* Enable or disable slot power, !0 = enable slot power
(Uses SD_POW pin, set to high or low based on enable parameter state) */
void sdif_power_onoff(int32_t enable);
/* Reset card in slot, must manually de-assert reset after assertion
(Uses SD_RST pin, set per reset parameter state) */
void sdif_reset(int32_t reset);
/* Set block size for transfer */
void sdif_set_blksize(uint32_t bytes);
/* Enter or exit low power mode. */
void sdif_set_lowpower_mode(int32_t lpmode);
/* Initialize the SD controller */
void sdif_init(uint32_t sdio_clock, MCI_IRQ_CB_FUNC_T irq_callback);
/* Close the SD controller */
void sdif_deinit(void);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* end LPC43XX_SDIF_H */
/**
* @}
*/
/* --------------------------------- End Of File ------------------------------ */