mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
446038fd36
update setting for all project file respectively
292 lines
12 KiB
C
292 lines
12 KiB
C
/****************************************************************************************************//**
|
||
* @file sdio.h
|
||
*
|
||
* @status EXPERIMENTAL
|
||
*
|
||
* @brief Header file for NXP LPC18xx/43xx SDIO driver
|
||
*
|
||
* @version V1.0
|
||
* @date 02. November 2011
|
||
*
|
||
* 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<72>
|
||
* 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.
|
||
*
|
||
*******************************************************************************************************/
|
||
|
||
#ifndef __SDIO_H
|
||
#define __SDIO_H
|
||
|
||
/** \defgroup LPCSDMMC_Definitions LPC18xx_43xx SDIO definitions
|
||
This file defines common definitions and values used for SDMMC:
|
||
- Registers, bitfields, and structures
|
||
- Commands and statuses
|
||
- States
|
||
@{
|
||
*/
|
||
|
||
/** \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 SD/SDIO/MMC control register defines
|
||
*/
|
||
#define MCI_CTRL_USE_INT_DMAC (1<<25) /*!< Use internal DMA */
|
||
#define MCI_CTRL_ENABLE_OD_PUP (1<<24) /*!< Enable external open-drain pullup */
|
||
#define MCI_CTRL_CARDV_B_MASK 0xF00000 /*!< Card regulator-B voltage setting; */
|
||
#define MCI_CTRL_CARDV_A_MASK 0xF0000 /*!< Card regulator-A voltage setting; */
|
||
#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_DMA_ENABLE (1<<5) /*!< Enable DMA transfer mode */
|
||
#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 Power Enable register defines
|
||
*/
|
||
#define MCI_POWER_ENABLE(slot) (1<<(slot)) /*!< Enable slot power signal */
|
||
|
||
/** \brief Clock divider register defines
|
||
*/
|
||
#define MCI_CLOCK_DIVIDER(divnum, divby2) ((divby2)<<((divnum) * 8)) /*!< Set slot cklock divider */
|
||
|
||
/** \brief 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(slot, clksrc) ((clksrc)<<((slot) * 2)) /*!< Set slot cklock divider source */
|
||
|
||
/** \brief Clock Enable register defines
|
||
*/
|
||
#define MCI_CLKEN_LOW_PWR(slot) (1<<((slot) + 16)) /*!< Enable clock idle for slot */
|
||
#define MCI_CLKEN_ENABLE(slot) (1<<(slot)) /*!< Enable slot clock */
|
||
|
||
/** \brief 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 card-type register defines
|
||
*/
|
||
#define MCI_CTYPE_8BIT(slot) (1<<((slot) + 16)) /*!< Enable 4-bit mode */
|
||
#define MCI_CTYPE_4BIT(slot) (1<<(slot)) /*!< Enable 8-bit mode */
|
||
|
||
/** \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 Interrupt status & mask register defines
|
||
*/
|
||
#define MCI_INT_SDIO(slot) (1<<(slot)) /*!< Slot specific interrupt enable */
|
||
#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 */
|
||
#define MCI_INT_ERROR 0xbfc2
|
||
|
||
/** \brief 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_CARDNUM 0x1F0000
|
||
#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 status register definess
|
||
*/
|
||
#define MCI_STS_GET_FCNT(x) (((x)>>17) & 0x1FF)
|
||
|
||
/** \brief card type defines
|
||
*/
|
||
#define CARD_TYPE_SD (1 << 0)
|
||
#define CARD_TYPE_4BIT (1 << 1)
|
||
#define CARD_TYPE_8BIT (1 << 2)
|
||
#define CARD_TYPE_HC (OCR_HC_CCS) /*!< high capacity card > 2GB */
|
||
|
||
/** \brief Commonly used definitions
|
||
*/
|
||
|
||
#define MMC_SECTOR_SIZE 512
|
||
#define MCI_FIFO_SZ 32 /*!< Size of SDIO FIFO (32-bit wide) */
|
||
|
||
/** \brief Setup options for the SDIO driver
|
||
*/
|
||
#define US_TIMEOUT 1000000 /*!< give 1 atleast 1 sec for the card to respond */
|
||
#define MS_ACQUIRE_DELAY (10) /*!< inter-command acquire oper condition delay in msec*/
|
||
#define INIT_OP_RETRIES 10 /*!< initial OP_COND retries */
|
||
#define SET_OP_RETRIES 200 /*!< set OP_COND retries */
|
||
#define SDIO_BUS_WIDTH 4 /*!< Max bus width supported */
|
||
#define SD_MMC_ENUM_CLOCK 400000 /*!< Typical enumeration clock rate */
|
||
#define MMC_MAX_CLOCK 20000000 /*!< Max MMC clock rate */
|
||
#define MMC_LOW_BUS_MAX_CLOCK 26000000 /*!< Type 0 MMC card max clock rate */
|
||
#define MMC_HIGH_BUS_MAX_CLOCK 52000000 /*!< Type 1 MMC card max clock rate */
|
||
#define SD_MAX_CLOCK 25000000 /*!< Max SD clock rate */
|
||
#define SYS_REG_SD_CARD_DELAY 0x1B /*!< SD card delay (register) */
|
||
#define SYS_REG_MMC_CARD_DELAY 0x16 /*!< MMC card delay (register) */
|
||
|
||
/* The SDIO driver can be used in polled or IRQ based modes. In polling
|
||
mode, the driver functions block until complete. In IRQ mode, the
|
||
functions won't block and the status must be checked elsewhere. */
|
||
#define SDIO_USE_POLLING /* non-polling mode does not work yet */
|
||
|
||
/* If the following define is enabled, 'double buffer' type DMA descriptors
|
||
will be used instead of chained descriptors. */
|
||
/* Note: Avoid using double buffer mode - is isn't working yet. */
|
||
//#define USE_DMADESC_DBUFF
|
||
|
||
/***********************************************************************
|
||
* MCI device structure and it defines
|
||
**********************************************************************/
|
||
typedef struct _mci_card_struct MCI_CARD_INFO_T;
|
||
typedef uint32_t (*MCI_CMD_WAIT_FUNC_T)(MCI_CARD_INFO_T* , uint32_t);
|
||
typedef void (*MCI_IRQ_CB_FUNC_T)(MCI_CARD_INFO_T* , uint32_t);
|
||
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[MMC_SECTOR_SIZE/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;
|
||
MCI_CMD_WAIT_FUNC_T wait_func;
|
||
MCI_IRQ_CB_FUNC_T irq_callback;
|
||
};
|
||
|
||
/** \brief MCI driver API functions
|
||
*/
|
||
|
||
/* Initialize the SDIO controller */
|
||
void sdio_init(MCI_CMD_WAIT_FUNC_T waitfunc,
|
||
MCI_IRQ_CB_FUNC_T irqfunc);
|
||
|
||
/* Detect if an SD card is inserted */
|
||
int sdio_card_detect(void);
|
||
|
||
/* Detect if write protect is enabled */
|
||
int sdio_card_wp_on(void);
|
||
|
||
/* Enable or disable slot power */
|
||
void sdio_power_onoff(int enable);
|
||
void sdio_power_on(void);
|
||
void sdio_power_off(void);
|
||
|
||
/* Function to enumerate the SD/MMC/SDHC/MMC+ cards */
|
||
int sdio_acquire(void);
|
||
|
||
/* Close the SDIO controller */
|
||
void sdio_deinit(void);
|
||
|
||
/* SDIO read function - reads data from a card */
|
||
int sdio_read_blocks(void *buffer,
|
||
int start_block,
|
||
int end_block);
|
||
|
||
/* SDIO write function - writes data to a card. After calling this
|
||
function, do not use read or write until the card state has
|
||
left the program state. */
|
||
int sdio_write_blocks(void *buffer,
|
||
int start_block,
|
||
int end_block);
|
||
|
||
/* Get card's current state (idle, transfer, program, etc.) */
|
||
int sdio_get_state(void);
|
||
|
||
int sdio_get_device_size(void);
|
||
|
||
extern uint32_t sdio_clk_rate;
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* end __SDIO_H */
|
||
/*****************************************************************************
|
||
** End Of File
|
||
******************************************************************************/
|