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<EFBFBD> | |||
|  | * 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 | |||
|  | ******************************************************************************/ |