|
-
-
-
-
-
-
-
-
- #if defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1052__)
-
- #include "core_pins.h"
- #include "usb_serial.h"
-
- #include "NXP_SDHC.h"
-
-
- #ifndef MPU_CESR_VLD_MASK
- #define MPU_CESR_VLD_MASK 0x1u
- #endif
-
-
-
- enum {
- SDHC_RESULT_OK = 0,
- SDHC_RESULT_ERROR,
- SDHC_RESULT_WRPRT,
- SDHC_RESULT_NOT_READY,
- SDHC_RESULT_PARERR,
- SDHC_RESULT_NO_RESPONSE
- };
-
-
-
-
- #define IO_SDHC_ATTRIBS (IO_DEV_ATTR_READ | IO_DEV_ATTR_REMOVE | IO_DEV_ATTR_SEEK | IO_DEV_ATTR_WRITE | IO_DEV_ATTR_BLOCK_MODE)
-
- #define SDHC_XFERTYP_RSPTYP_NO (0x00)
- #define SDHC_XFERTYP_RSPTYP_136 (0x01)
- #define SDHC_XFERTYP_RSPTYP_48 (0x02)
- #define SDHC_XFERTYP_RSPTYP_48BUSY (0x03)
-
- #define SDHC_XFERTYP_CMDTYP_ABORT (0x03)
-
- #define SDHC_PROCTL_EMODE_INVARIANT (0x02)
-
- #define SDHC_PROCTL_DTW_1BIT (0x00)
- #define SDHC_PROCTL_DTW_4BIT (0x01)
- #define SDHC_PROCTL_DTW_8BIT (0x10)
-
- #define SDHC_INITIALIZATION_MAX_CNT 100000
-
-
- #define SDHC_CMD0 (0)
- #define SDHC_CMD1 (1)
- #define SDHC_CMD2 (2)
- #define SDHC_CMD3 (3)
- #define SDHC_CMD4 (4)
- #define SDHC_CMD5 (5)
- #define SDHC_CMD6 (6)
- #define SDHC_CMD7 (7)
- #define SDHC_CMD8 (8)
- #define SDHC_CMD9 (9)
- #define SDHC_CMD10 (10)
- #define SDHC_CMD11 (11)
- #define SDHC_CMD12 (12)
- #define SDHC_CMD13 (13)
- #define SDHC_CMD15 (15)
- #define SDHC_CMD16 (16)
- #define SDHC_CMD17 (17)
- #define SDHC_CMD18 (18)
- #define SDHC_CMD20 (20)
- #define SDHC_CMD24 (24)
- #define SDHC_CMD25 (25)
- #define SDHC_CMD26 (26)
- #define SDHC_CMD27 (27)
- #define SDHC_CMD28 (28)
- #define SDHC_CMD29 (29)
- #define SDHC_CMD30 (30)
- #define SDHC_CMD32 (32)
- #define SDHC_CMD33 (33)
- #define SDHC_CMD34 (34)
- #define SDHC_CMD35 (35)
- #define SDHC_CMD36 (36)
- #define SDHC_CMD37 (37)
- #define SDHC_CMD38 (38)
- #define SDHC_CMD39 (39)
- #define SDHC_CMD40 (40)
- #define SDHC_CMD42 (42)
- #define SDHC_CMD52 (52)
- #define SDHC_CMD53 (53)
- #define SDHC_CMD55 (55)
- #define SDHC_CMD56 (56)
- #define SDHC_CMD59 (59)
- #define SDHC_CMD60 (60)
- #define SDHC_CMD61 (61)
- #define SDHC_ACMD6 (0x40 + 6)
- #define SDHC_ACMD13 (0x40 + 13)
- #define SDHC_ACMD22 (0x40 + 22)
- #define SDHC_ACMD23 (0x40 + 23)
- #define SDHC_ACMD41 (0x40 + 41)
- #define SDHC_ACMD42 (0x40 + 42)
- #define SDHC_ACMD51 (0x40 + 51)
-
- #define SDHC_FIFO_BUFFER_SIZE 16
- #define SDHC_BLOCK_SIZE 512
-
- #if defined(__IMXRT1052__)
- #define MAKE_REG_MASK(m,s) (((uint32_t)(((uint32_t)(m) << s))))
- #define MAKE_REG_GET(x,m,s) (((uint32_t)(((uint32_t)(x)>>s) & m)))
- #define MAKE_REG_SET(x,m,s) (((uint32_t)(((uint32_t)(x) & m) << s)))
-
- #define SDHC_BLKATTR_BLKSIZE_MASK MAKE_REG_MASK(0x1FFF,0)
- #define SDHC_BLKATTR_BLKSIZE(n) MAKE_REG_SET(n,0x1FFF,0)
- #define SDHC_BLKATTR_BLKCNT_MASK MAKE_REG_MASK(0x1FFF,16)
- #define SDHC_BLKATTR_BLKCNT(n) MAKE_REG_SET(n,0x1FFF,16)
-
- #define SDHC_XFERTYP_CMDINX(n) MAKE_REG_SET(n,0x3F,24)
- #define SDHC_XFERTYP_CMDTYP(n) MAKE_REG_SET(n,0x3,22)
- #define SDHC_XFERTYP_DPSEL MAKE_REG_MASK(0x1,21)
- #define SDHC_XFERTYP_CICEN MAKE_REG_MASK(0x1,20)
- #define SDHC_XFERTYP_CCCEN MAKE_REG_MASK(0x1,19)
- #define SDHC_XFERTYP_RSPTYP(n) MAKE_REG_SET(n,0x3,16)
- #define SDHC_XFERTYP_MSBSEL MAKE_REG_MASK(0x1,5)
- #define SDHC_XFERTYP_DTDSEL MAKE_REG_MASK(0x1,4)
- #define SDHC_XFERTYP_AC12EN MAKE_REG_MASK(0x1,2)
- #define SDHC_XFERTYP_BCEN MAKE_REG_MASK(0x1,1)
- #define SDHC_XFERTYP_DMAEN MAKE_REG_MASK(0x3,0)
-
- #define SDHC_PRSSTAT_DLSL_MASK MAKE_REG_MASK(0xFF,24)
- #define SDHC_PRSSTAT_CLSL MAKE_REG_MASK(0x1,23)
- #define SDHC_PRSSTAT_WPSPL MAKE_REG_MASK(0x1,19)
- #define SDHC_PRSSTAT_CDPL MAKE_REG_MASK(0x1,18)
- #define SDHC_PRSSTAT_CINS MAKE_REG_MASK(0x1,16)
- #define SDHC_PRSSTAT_TSCD MAKE_REG_MASK(0x1,15)
- #define SDHC_PRSSTAT_RTR MAKE_REG_MASK(0x1,12)
- #define SDHC_PRSSTAT_BREN MAKE_REG_MASK(0x1,11)
- #define SDHC_PRSSTAT_BWEN MAKE_REG_MASK(0x1,10)
- #define SDHC_PRSSTAT_RTA MAKE_REG_MASK(0x1,9)
- #define SDHC_PRSSTAT_WTA MAKE_REG_MASK(0x1,8)
- #define SDHC_PRSSTAT_SDOFF MAKE_REG_MASK(0x1,7)
- #define SDHC_PRSSTAT_PEROFF MAKE_REG_MASK(0x1,6)
- #define SDHC_PRSSTAT_HCKOFF MAKE_REG_MASK(0x1,5)
- #define SDHC_PRSSTAT_IPGOFF MAKE_REG_MASK(0x1,4)
- #define SDHC_PRSSTAT_SDSTB MAKE_REG_MASK(0x1,3)
- #define SDHC_PRSSTAT_DLA MAKE_REG_MASK(0x1,2)
- #define SDHC_PRSSTAT_CDIHB MAKE_REG_MASK(0x1,1)
- #define SDHC_PRSSTAT_CIHB MAKE_REG_MASK(0x1,0)
-
- #define SDHC_PROTCT_NONEXACT_BLKRD MAKE_REG_MASK(0x1,30)
- #define SDHC_PROTCT_BURST_LENEN(n) MAKE_REG_SET(n,0x7,12)
- #define SDHC_PROCTL_WECRM MAKE_REG_MASK(0x1,26)
- #define SDHC_PROCTL_WECINS MAKE_REG_MASK(0x1,25)
- #define SDHC_PROCTL_WECINT MAKE_REG_MASK(0x1,24)
- #define SDHC_PROCTL_RD_DONE_NOBLK MAKE_REG_MASK(0x1,20)
- #define SDHC_PROCTL_IABG MAKE_REG_MASK(0x1,19)
- #define SDHC_PROCTL_RWCTL MAKE_REG_MASK(0x1,18)
- #define SDHC_PROCTL_CREQ MAKE_REG_MASK(0x1,17)
- #define SDHC_PROCTL_SABGREQ MAKE_REG_MASK(0x1,16)
- #define SDHC_PROCTL_DMAS(n) MAKE_REG_SET(n,0x3,8)
- #define SDHC_PROCTL_CDSS MAKE_REG_MASK(0x1,7)
- #define SDHC_PROCTL_CDTL MAKE_REG_MASK(0x1,6)
- #define SDHC_PROCTL_EMODE(n) MAKE_REG_SET(n,0x3,4)
- #define SDHC_PROCTL_EMODE_MASK MAKE_REG_MASK(0x3,4)
- #define SDHC_PROCTL_D3CD MAKE_REG_MASK(0x1,3)
- #define SDHC_PROCTL_DTW(n) MAKE_REG_SET(n,0x3,1)
- #define SDHC_PROCTL_DTW_MASK MAKE_REG_MASK(0x3,1)
- #define SDHC_PROCTL_LCTL MAKE_REG_MASK(0x1,0)
-
- #define SDHC_SYSCTL_RSTT MAKE_REG_MASK(0x1,28)
- #define SDHC_SYSCTL_INITA MAKE_REG_MASK(0x1,27)
- #define SDHC_SYSCTL_RSTD MAKE_REG_MASK(0x1,26)
- #define SDHC_SYSCTL_RSTC MAKE_REG_MASK(0x1,25)
- #define SDHC_SYSCTL_RSTA MAKE_REG_MASK(0x1,24)
- #define SDHC_SYSCTL_DTOCV(n) MAKE_REG_SET(n,0xF,16)
- #define SDHC_SYSCTL_DTOCV_MASK MAKE_REG_MASK(0xF,16)
- #define SDHC_SYSCTL_SDCLKFS(n) MAKE_REG_SET(n,0xFF,8)
- #define SDHC_SYSCTL_SDCLKFS_MASK MAKE_REG_MASK(0xFF,8)
- #define SDHC_SYSCTL_DVS(n) MAKE_REG_SET(n,0xF,4)
- #define SDHC_SYSCTL_DVS_MASK MAKE_REG_MASK(0xF,4)
-
- #define SDHC_SYSCTL_SDCLKEN ((uint32_t)0x00000008)
- #define SDHC_SYSCTL_PEREN ((uint32_t)0x00000004)
- #define SDHC_SYSCTL_HCKEN ((uint32_t)0x00000002)
- #define SDHC_SYSCTL_IPGEN ((uint32_t)0x00000001)
-
- #define SDHC_IRQSTAT_DMAE MAKE_REG_MASK(0x1,28)
- #define SDHC_IRQSTAT_TNE MAKE_REG_MASK(0x1,26)
- #define SDHC_IRQSTAT_AC12E MAKE_REG_MASK(0x1,24)
- #define SDHC_IRQSTAT_DEBE MAKE_REG_MASK(0x1,22)
- #define SDHC_IRQSTAT_DCE MAKE_REG_MASK(0x1,21)
- #define SDHC_IRQSTAT_DTOE MAKE_REG_MASK(0x1,20)
- #define SDHC_IRQSTAT_CIE MAKE_REG_MASK(0x1,19)
- #define SDHC_IRQSTAT_CEBE MAKE_REG_MASK(0x1,18)
- #define SDHC_IRQSTAT_CCE MAKE_REG_MASK(0x1,17)
- #define SDHC_IRQSTAT_CTOE MAKE_REG_MASK(0x1,16)
- #define SDHC_IRQSTAT_TP MAKE_REG_MASK(0x1,14)
- #define SDHC_IRQSTAT_RTE MAKE_REG_MASK(0x1,12)
- #define SDHC_IRQSTAT_CINT MAKE_REG_MASK(0x1,8)
- #define SDHC_IRQSTAT_CRM MAKE_REG_MASK(0x1,7)
- #define SDHC_IRQSTAT_CINS MAKE_REG_MASK(0x1,6)
- #define SDHC_IRQSTAT_BRR MAKE_REG_MASK(0x1,5)
- #define SDHC_IRQSTAT_BWR MAKE_REG_MASK(0x1,4)
- #define SDHC_IRQSTAT_DINT MAKE_REG_MASK(0x1,3)
- #define SDHC_IRQSTAT_BGE MAKE_REG_MASK(0x1,2)
- #define SDHC_IRQSTAT_TC MAKE_REG_MASK(0x1,1)
- #define SDHC_IRQSTAT_CC MAKE_REG_MASK(0x1,0)
-
- #define SDHC_IRQSTATEN_DMAESEN MAKE_REG_MASK(0x1,28)
- #define SDHC_IRQSTATEN_TNESEN MAKE_REG_MASK(0x1,26)
- #define SDHC_IRQSTATEN_AC12ESEN MAKE_REG_MASK(0x1,24)
- #define SDHC_IRQSTATEN_DEBESEN MAKE_REG_MASK(0x1,22)
- #define SDHC_IRQSTATEN_DCESEN MAKE_REG_MASK(0x1,21)
- #define SDHC_IRQSTATEN_DTOESEN MAKE_REG_MASK(0x1,20)
- #define SDHC_IRQSTATEN_CIESEN MAKE_REG_MASK(0x1,19)
- #define SDHC_IRQSTATEN_CEBESEN MAKE_REG_MASK(0x1,18)
- #define SDHC_IRQSTATEN_CCESEN MAKE_REG_MASK(0x1,17)
- #define SDHC_IRQSTATEN_CTOESEN MAKE_REG_MASK(0x1,16)
- #define SDHC_IRQSTATEN_TPSEN MAKE_REG_MASK(0x1,14)
- #define SDHC_IRQSTATEN_RTESEN MAKE_REG_MASK(0x1,12)
- #define SDHC_IRQSTATEN_CINTSEN MAKE_REG_MASK(0x1,8)
- #define SDHC_IRQSTATEN_CRMSEN MAKE_REG_MASK(0x1,7)
- #define SDHC_IRQSTATEN_CINSEN MAKE_REG_MASK(0x1,6)
- #define SDHC_IRQSTATEN_BRRSEN MAKE_REG_MASK(0x1,5)
- #define SDHC_IRQSTATEN_BWRSEN MAKE_REG_MASK(0x1,4)
- #define SDHC_IRQSTATEN_DINTSEN MAKE_REG_MASK(0x1,3)
- #define SDHC_IRQSTATEN_BGESEN MAKE_REG_MASK(0x1,2)
- #define SDHC_IRQSTATEN_TCSEN MAKE_REG_MASK(0x1,1)
- #define SDHC_IRQSTATEN_CCSEN MAKE_REG_MASK(0x1,0)
-
- #define SDHC_IRQSIGEN_DMAEIEN MAKE_REG_MASK(0x1,28)
- #define SDHC_IRQSIGEN_TNEIEN MAKE_REG_MASK(0x1,26)
- #define SDHC_IRQSIGEN_AC12EIEN MAKE_REG_MASK(0x1,24)
- #define SDHC_IRQSIGEN_DEBEIEN MAKE_REG_MASK(0x1,22)
- #define SDHC_IRQSIGEN_DCEIEN MAKE_REG_MASK(0x1,21)
- #define SDHC_IRQSIGEN_DTOEIEN MAKE_REG_MASK(0x1,20)
- #define SDHC_IRQSIGEN_CIEIEN MAKE_REG_MASK(0x1,19)
- #define SDHC_IRQSIGEN_CEBEIEN MAKE_REG_MASK(0x1,18)
- #define SDHC_IRQSIGEN_CCEIEN MAKE_REG_MASK(0x1,17)
- #define SDHC_IRQSIGEN_CTOEIEN MAKE_REG_MASK(0x1,16)
- #define SDHC_IRQSIGEN_TPIEN MAKE_REG_MASK(0x1,14)
- #define SDHC_IRQSIGEN_RTEIEN MAKE_REG_MASK(0x1,12)
- #define SDHC_IRQSIGEN_CINTIEN MAKE_REG_MASK(0x1,8)
- #define SDHC_IRQSIGEN_CRMIEN MAKE_REG_MASK(0x1,7)
- #define SDHC_IRQSIGEN_CINSIEN MAKE_REG_MASK(0x1,6)
- #define SDHC_IRQSIGEN_BRRIEN MAKE_REG_MASK(0x1,5)
- #define SDHC_IRQSIGEN_BWRIEN MAKE_REG_MASK(0x1,4)
- #define SDHC_IRQSIGEN_DINTIEN MAKE_REG_MASK(0x1,3)
- #define SDHC_IRQSIGEN_BGEIEN MAKE_REG_MASK(0x1,2)
- #define SDHC_IRQSIGEN_TCIEN MAKE_REG_MASK(0x1,1)
- #define SDHC_IRQSIGEN_CCIEN MAKE_REG_MASK(0x1,0)
-
- #define SDHC_AC12ERR_SMPLCLK_SEL MAKE_REG_MASK(0x1,23)
- #define SDHC_AC12ERR_EXEC_TUNING MAKE_REG_MASK(0x1,22)
- #define SDHC_AC12ERR_CNIBAC12E MAKE_REG_MASK(0x1,7)
- #define SDHC_AC12ERR_AC12IE MAKE_REG_MASK(0x1,4)
- #define SDHC_AC12ERR_AC12CE MAKE_REG_MASK(0x1,3)
- #define SDHC_AC12ERR_AC12EBE MAKE_REG_MASK(0x1,2)
- #define SDHC_AC12ERR_AC12TOE MAKE_REG_MASK(0x1,1)
- #define SDHC_AC12ERR_AC12NE MAKE_REG_MASK(0x1,0)
-
- #define SDHC_HTCAPBLT_VS18 MAKE_REG_MASK(0x1,26)
- #define SDHC_HTCAPBLT_VS30 MAKE_REG_MASK(0x1,25)
- #define SDHC_HTCAPBLT_VS33 MAKE_REG_MASK(0x1,24)
- #define SDHC_HTCAPBLT_SRS MAKE_REG_MASK(0x1,23)
- #define SDHC_HTCAPBLT_DMAS MAKE_REG_MASK(0x1,22)
- #define SDHC_HTCAPBLT_HSS MAKE_REG_MASK(0x1,21)
- #define SDHC_HTCAPBLT_ADMAS MAKE_REG_MASK(0x1,20)
- #define SDHC_HTCAPBLT_MBL_VAL MAKE_REG_GET((USDHC1_HOST_CTRL_CAP),0x7,16)
- #define SDHC_HTCAPBLT_RETUN_MODE MAKE_REG_GET((USDHC1_HOST_CTRL_CAP),0x3,14)
- #define SDHC_HTCAPBLT_TUNE_SDR50 MAKE_REG_MASK(0x1,13)
- #define SDHC_HTCAPBLT_TIME_RETUN(n) MAKE_REG_SET(n,0xF,8)
-
- #define SDHC_WML_WR_BRSTLEN_MASK MAKE_REG_MASK(0x1F,24)
- #define SDHC_WML_RD_BRSTLEN_MASK MAKE_REG_MASK(0x1F,8)
- #define SDHC_WML_WR_WML_MASK MAKE_REG_MASK(0xFF,16)
- #define SDHC_WML_RD_WML_MASK MAKE_REG_MASK(0xFF,0)
- #define SDHC_WML_WR_BRSTLEN(n) MAKE_REG_SET(n,0x1F,24)
- #define SDHC_WML_RD_BRSTLEN(n) MAKE_REG_SET(n,0x1F,8)
- #define SDHC_WML_WR_WML(n) MAKE_REG_SET(n,0xFF,16)
- #define SDHC_WML_RD_WML(n) MAKE_REG_SET(n,0xFF,0)
- #define SDHC_WML_WRWML(n) MAKE_REG_SET(n,0xFF,16)
- #define SDHC_WML_RDWML(n) MAKE_REG_SET(n,0xFF,0)
-
- #define SDHC_MIX_CTRL_DMAEN MAKE_REG_MASK(0x1,0)
- #define SDHC_MIX_CTRL_BCEN MAKE_REG_MASK(0x1,1)
- #define SDHC_MIX_CTRL_AC12EN MAKE_REG_MASK(0x1,2)
- #define SDHC_MIX_CTRL_DDR_EN MAKE_REG_MASK(0x1,3)
- #define SDHC_MIX_CTRL_DTDSEL MAKE_REG_MASK(0x1,4)
- #define SDHC_MIX_CTRL_MSBSEL MAKE_REG_MASK(0x1,5)
- #define SDHC_MIX_CTRL_NIBBLE_POS MAKE_REG_MASK(0x1,6)
- #define SDHC_MIX_CTRL_AC23EN MAKE_REG_MASK(0x1,7)
-
- #define SDHC_FEVT_CINT MAKE_REG_MASK(0x1,31)
- #define SDHC_FEVT_DMAE MAKE_REG_MASK(0x1,28)
- #define SDHC_FEVT_AC12E MAKE_REG_MASK(0x1,24)
- #define SDHC_FEVT_DEBE MAKE_REG_MASK(0x1,22)
- #define SDHC_FEVT_DCE MAKE_REG_MASK(0x1,21)
- #define SDHC_FEVT_DTOE MAKE_REG_MASK(0x1,20)
- #define SDHC_FEVT_CIE MAKE_REG_MASK(0x1,19)
- #define SDHC_FEVT_CEBE MAKE_REG_MASK(0x1,18)
- #define SDHC_FEVT_CCE MAKE_REG_MASK(0x1,17)
- #define SDHC_FEVT_CTOE MAKE_REG_MASK(0x1,16)
- #define SDHC_FEVT_CNIBAC12E MAKE_REG_MASK(0x1,7)
- #define SDHC_FEVT_AC12IE MAKE_REG_MASK(0x1,4)
- #define SDHC_FEVT_AC12EBE MAKE_REG_MASK(0x1,3)
- #define SDHC_FEVT_AC12CE MAKE_REG_MASK(0x1,2)
- #define SDHC_FEVT_AC12TOE MAKE_REG_MASK(0x1,1)
- #define SDHC_FEVT_AC12NE MAKE_REG_MASK(0x1,0)
-
- #define SDHC_ADMAES_ADMADCE MAKE_REG_MASK(0x1,3)
- #define SDHC_ADMAES_ADMALME MAKE_REG_MASK(0x1,2)
- #define SDHC_ADMAES_ADMAES_MASK MAKE_REG_MASK(0x3,0)
-
- #define SDHC_MMCBOOT_BOOTBLKCNT(n) MAKE_REG_MASK(0xFF,16)
- #define SDHC_MMCBOOT_AUTOSABGEN MAKE_REG_MASK(0x1,7)
- #define SDHC_MMCBOOT_BOOTEN MAKE_REG_MASK(0x1,6)
- #define SDHC_MMCBOOT_BOOTMODE MAKE_REG_MASK(0x1,5)
- #define SDHC_MMCBOOT_BOOTACK MAKE_REG_MASK(0x1,4)
- #define SDHC_MMCBOOT_DTOCVACK(n) MAKE_REG_MASK(0xF,0)
-
-
- #define CCM_ANALOG_PFD_528_PFD0_FRAC_MASK 0x3f
- #define CCM_ANALOG_PFD_528_PFD0_FRAC(n) ((n) & CCM_ANALOG_PFD_528_PFD0_FRAC_MASK)
- #define CCM_ANALOG_PFD_528_PFD1_FRAC_MASK (0x3f<<8)
- #define CCM_ANALOG_PFD_528_PFD1_FRAC(n) (((n)<<8) & CCM_ANALOG_PFD_528_PFD1_FRAC_MASK)
- #define CCM_ANALOG_PFD_528_PFD2_FRAC_MASK (0x3f<<16)
- #define CCM_ANALOG_PFD_528_PFD2_FRAC(n) (((n)<<16) & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK)
- #define CCM_ANALOG_PFD_528_PFD3_FRAC_MASK ((0x3f<<24)
- #define CCM_ANALOG_PFD_528_PFD3_FRAC(n) (((n)<<24) & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK)
-
- #define SDHC_DSADDR (USDHC1_DS_ADDR )
- #define SDHC_BLKATTR (USDHC1_BLK_ATT)
- #define SDHC_CMDARG (USDHC1_CMD_ARG)
- #define SDHC_XFERTYP (USDHC1_CMD_XFR_TYP)
- #define SDHC_CMDRSP0 (USDHC1_CMD_RSP0)
- #define SDHC_CMDRSP1 (USDHC1_CMD_RSP1)
- #define SDHC_CMDRSP2 (USDHC1_CMD_RSP2)
- #define SDHC_CMDRSP3 (USDHC1_CMD_RSP3)
- #define SDHC_DATPORT (USDHC1_DATA_BUFF_ACC_PORT)
- #define SDHC_PRSSTAT (USDHC1_PRES_STATE)
- #define SDHC_PROCTL (USDHC1_PROT_CTRL)
- #define SDHC_SYSCTL (USDHC1_SYS_CTRL)
- #define SDHC_IRQSTAT (USDHC1_INT_STATUS)
- #define SDHC_IRQSTATEN (USDHC1_INT_STATUS_EN)
- #define SDHC_IRQSIGEN (USDHC1_INT_SIGNAL_EN)
- #define SDHC_AC12ERR (USDHC1_AUTOCMD12_ERR_STATUS)
- #define SDHC_HTCAPBLT (USDHC1_HOST_CTRL_CAP)
- #define SDHC_WML (USDHC1_WTMK_LVL)
- #define SDHC_MIX_CTRL (USDHC1_MIX_CTRL)
- #define SDHC_FEVT (USDHC1_FORCE_EVENT)
- #define SDHC_ADMAES (USDHC1_ADMA_ERR_STATUS)
- #define SDHC_ADSADDR (USDHC1_ADMA_SYS_ADDR)
- #define SDHC_VENDOR (USDHC1_VEND_SPEC)
- #define SDHC_MMCBOOT (USDHC1_MMC_BOOT)
- #define SDHC_VENDOR2 (USDHC2_VEND_SPEC2)
-
- #define IRQ_SDHC IRQ_SDHC1
-
- #define SDHC_MAX_DVS (0xF + 1U)
- #define SDHC_MAX_CLKFS (0xFF + 1U)
- #define SDHC_PREV_DVS(x) ((x) -= 1U)
- #define SDHC_PREV_CLKFS(x, y) ((x) >>= (y))
-
- #define CCM_CSCDR1_USDHC1_CLK_PODF_MASK (0x7<<11)
- #define CCM_CSCDR1_USDHC1_CLK_PODF(n) (((n)&0x7)<<11)
-
- #define IOMUXC_SW_PAD_CTL_PAD_SRE ((0x1<)<0)
- #define IOMUXC_SW_PAD_CTL_PAD_PKE ((0x1)<<12)
- #define IOMUXC_SW_PAD_CTL_PAD_PUE ((0x1)<<13)
- #define IOMUXC_SW_PAD_CTL_PAD_HYS ((0x1)<<16)
- #define IOMUXC_SW_PAD_CTL_PAD_SPEED(n) (((n)&0x3)<<6)
- #define IOMUXC_SW_PAD_CTL_PAD_PUS(n) (((n)&0x3)<<14)
- #define IOMUXC_SW_PAD_CTL_PAD_PUS_MASK ((0x3)<<14)
- #define IOMUXC_SW_PAD_CTL_PAD_DSE(n) (((n)&0x7)<<3)
- #define IOMUXC_SW_PAD_CTL_PAD_DSE_MASK ((0x7)<<3)
-
- #endif
-
- #define SDHC_IRQSIGEN_DMA_MASK (SDHC_IRQSIGEN_TCIEN | SDHC_IRQSIGEN_DINTIEN | SDHC_IRQSIGEN_DMAEIEN)
- #define CARD_STATUS_READY_FOR_DATA (1UL << 8)
-
-
- typedef struct {
- uint8_t status;
- uint8_t highCapacity;
- uint8_t version2;
- uint8_t tranSpeed;
- uint32_t address;
- uint32_t numBlocks;
- uint32_t lastCardStatus;
- } SD_CARD_DESCRIPTOR;
-
-
-
-
-
- static SD_CARD_DESCRIPTOR sdCardDesc;
- static volatile uint32_t dmaDone=0;
-
-
-
- static void sdhc_setSdclk(uint32_t kHzMax);
-
- static uint8_t SDHC_Init(void);
- static void SDHC_InitGPIO(void);
- static void SDHC_ReleaseGPIO(void);
- static void SDHC_SetClock(uint32_t sysctl);
- static uint32_t SDHC_WaitStatus(uint32_t mask);
- static int SDHC_ReadBlock(uint32_t* pData);
- static int SDHC_WriteBlock(const uint32_t* pData);
- static int SDHC_CMD_Do(uint32_t xfertyp);
- static int SDHC_CMD0_GoToIdle(void);
- static int SDHC_CMD2_Identify(void);
- static int SDHC_CMD3_GetAddress(void);
- static int SDHC_ACMD6_SetBusWidth(uint32_t address, uint32_t width);
- static int SDHC_CMD7_SelectCard(uint32_t address);
- static int SDHC_CMD8_SetInterface(uint32_t cond);
- static int SDHC_CMD9_GetParameters(uint32_t address);
- static int SDHC_CMD12_StopTransfer(void);
- static int SDHC_CMD12_StopTransferWaitForBusy(void);
- static int SDHC_CMD16_SetBlockSize(uint32_t block_size);
- static int SDHC_CMD17_ReadBlock(uint32_t sector);
- static int SDHC_CMD24_WriteBlock(uint32_t sector);
- static int SDHC_ACMD41_SendOperationCond(uint32_t cond);
-
-
- uint8_t SDHC_CardGetType(void)
- {
- if (sdCardDesc.status) return 0;
- if (sdCardDesc.version2 == 0) return 1;
- if (sdCardDesc.highCapacity == 0) return 2;
- return 3;
- }
-
-
-
-
- uint8_t SDHC_CardInit(void)
- {
- uint8_t resS;
- int resR;
-
- resS = SDHC_Init();
-
- sdCardDesc.status = resS;
- sdCardDesc.address = 0;
- sdCardDesc.highCapacity = 0;
- sdCardDesc.version2 = 0;
- sdCardDesc.numBlocks = 0;
-
- if (resS) return resS;
- SDHC_IRQSIGEN = 0;
-
- resR = SDHC_CMD0_GoToIdle();
- if (resR) { return sdCardDesc.status = SDHC_STATUS_NOINIT;}
-
- resR = SDHC_CMD8_SetInterface(0x000001AA);
- if (resR == SDHC_RESULT_OK)
- { if (SDHC_CMDRSP0 != 0x000001AA) return sdCardDesc.status = SDHC_STATUS_NOINIT;
- sdCardDesc.highCapacity = 1;
- }
- else if (resR == SDHC_RESULT_NO_RESPONSE)
- {
- }
- else return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
- if (SDHC_ACMD41_SendOperationCond(0)) return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
- if (SDHC_CMDRSP0 & 0x300000) {
- uint32_t condition = 0x00300000;
- if (sdCardDesc.highCapacity) condition |= 0x40000000;
-
- uint32_t ii = 0;
- do {
- ii++;
- if (SDHC_ACMD41_SendOperationCond(condition)) {
- resS = SDHC_STATUS_NOINIT;
- break;
- }
- } while ((!(SDHC_CMDRSP0 & 0x80000000)) && (ii < SDHC_INITIALIZATION_MAX_CNT));
-
- if (resS) return resS;
-
- if ((ii >= SDHC_INITIALIZATION_MAX_CNT) || (!(SDHC_CMDRSP0 & 0x40000000)))
- sdCardDesc.highCapacity = 0;
- }
-
-
- if (SDHC_CMD2_Identify()) return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
-
- if (SDHC_CMD3_GetAddress()) return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
- sdCardDesc.address = SDHC_CMDRSP0 & 0xFFFF0000;
-
-
- if (SDHC_CMD9_GetParameters(sdCardDesc.address)) return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
- if (!(SDHC_CMDRSP3 & 0x00C00000)) {
- uint32_t read_bl_len, c_size, c_size_mult;
-
- read_bl_len = (SDHC_CMDRSP2 >> 8) & 0x0F;
- c_size = SDHC_CMDRSP2 & 0x03;
- c_size = (c_size << 10) | (SDHC_CMDRSP1 >> 22);
- c_size_mult = (SDHC_CMDRSP1 >> 7) & 0x07;
- sdCardDesc.numBlocks = (c_size + 1) * (1 << (c_size_mult + 2)) * (1 << (read_bl_len - 9));
- } else {
- uint32_t c_size;
- sdCardDesc.version2 = 1;
- c_size = (SDHC_CMDRSP1 >> 8) & 0x003FFFFF;
- sdCardDesc.numBlocks = (c_size + 1) << 10;
- }
-
-
- if (SDHC_CMD7_SelectCard(sdCardDesc.address)) return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
-
-
-
- if (SDHC_CMD16_SetBlockSize(SDHC_BLOCK_SIZE)) return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
-
- if (SDHC_ACMD6_SetBusWidth(sdCardDesc.address, 2)) return sdCardDesc.status = SDHC_STATUS_NOINIT;
-
-
- SDHC_PROCTL &= ~SDHC_PROCTL_DTW_MASK;
- SDHC_PROCTL |= SDHC_PROCTL_DTW(SDHC_PROCTL_DTW_4BIT);
-
-
- SDHC_ReleaseGPIO();
-
-
- sdhc_setSdclk(25000);
-
-
-
-
-
-
- SDHC_InitGPIO();
-
- return sdCardDesc.status;
- }
-
-
-
-
-
-
-
-
-
-
-
- int SDHC_CardReadBlock(void * buff, uint32_t sector)
- {
- int result=0;
- uint32_t* pData = (uint32_t*)buff;
-
- if (reinterpret_cast<uintptr_t>(static_cast<const void*>(buff)) % 4) {
- return -1;
- }
-
-
- if (sdCardDesc.status != 0) return SDHC_RESULT_NOT_READY;
-
- while ((SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB) || (SDHC_PRSSTAT & SDHC_PRSSTAT_CDIHB));
-
-
- if (!sdCardDesc.highCapacity) sector *= 512;
-
-
- SDHC_IRQSTAT = SDHC_IRQSTAT;
-
-
- uint32_t irqstat = SDHC_IRQSTATEN;
- irqstat &= ~(SDHC_IRQSTATEN_BRRSEN | SDHC_IRQSTATEN_BWRSEN | SDHC_IRQSTATEN_CCSEN) ;
- irqstat &= ~(SDHC_IRQSTATEN_DCESEN | SDHC_IRQSTATEN_CCESEN) ;
-
- irqstat |= SDHC_IRQSTATEN_DMAESEN | SDHC_IRQSTATEN_DINTSEN | SDHC_IRQSTATEN_TCSEN ;
- SDHC_IRQSTATEN = irqstat;
-
- uint32_t sigen = SDHC_IRQSIGEN;
- sigen |= SDHC_IRQSIGEN_DMA_MASK ;
-
- SDHC_SYSCTL |= SDHC_SYSCTL_HCKEN;
- #if defined(__IMXRT1052__)
- SDHC_MIX_CTRL |= SDHC_MIX_CTRL_DTDSEL ;
- SDHC_MIX_CTRL |= SDHC_MIX_CTRL_DMAEN ;
- #endif
-
- uint32_t xfertyp = SDHC_XFERTYP_CMDINX(SDHC_CMD17) | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48) | SDHC_XFERTYP_DPSEL
- | SDHC_XFERTYP_DTDSEL | SDHC_XFERTYP_DMAEN;
-
- dmaDone=0;
- SDHC_DSADDR = (uint32_t)buff;
- SDHC_CMDARG = sector;
- SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(512);
- SDHC_IRQSIGEN = sigen;
- SDHC_XFERTYP = xfertyp;
-
- while(!dmaDone);
- SDHC_IRQSTAT &= (SDHC_IRQSTAT_CC | SDHC_IRQSTAT_TC);
-
- return result;
- }
-
-
-
-
-
-
-
-
-
-
-
- int SDHC_CardWriteBlock(const void * buff, uint32_t sector)
- {
- int result=0;
- const uint32_t *pData = (const uint32_t *)buff;
-
- if (reinterpret_cast<uintptr_t>(static_cast<const void*>(buff)) % 4) {
- return -1;
- }
-
-
- if (sdCardDesc.status != 0) return SDHC_RESULT_NOT_READY;
-
- while ((SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB) || (SDHC_PRSSTAT & SDHC_PRSSTAT_CDIHB)) ;
-
-
- if (!sdCardDesc.highCapacity) sector *= 512;
-
-
- SDHC_IRQSTAT = SDHC_IRQSTAT;
-
- uint32_t irqstat = SDHC_IRQSTATEN;
-
- irqstat &= ~(SDHC_IRQSTATEN_BRRSEN | SDHC_IRQSTATEN_BWRSEN | SDHC_IRQSTATEN_CCSEN) ;
- irqstat &= ~(SDHC_IRQSTATEN_DCESEN | SDHC_IRQSTATEN_CCESEN) ;
-
- irqstat |= SDHC_IRQSTATEN_DMAESEN ;
- irqstat |= SDHC_IRQSTATEN_DINTSEN | SDHC_IRQSTATEN_TCSEN ;
- SDHC_IRQSTATEN = irqstat;
-
- uint32_t sigen = SDHC_IRQSIGEN;
- sigen |= SDHC_IRQSIGEN_DMA_MASK ;
-
- SDHC_SYSCTL |= SDHC_SYSCTL_HCKEN;
-
- #if defined(__IMXRT1052__)
- SDHC_MIX_CTRL &= ~ SDHC_MIX_CTRL_DTDSEL;
- SDHC_MIX_CTRL |= SDHC_MIX_CTRL_DMAEN ;
- #endif
-
- uint32_t xfertyp = SDHC_XFERTYP_CMDINX(SDHC_CMD24) | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48) | SDHC_XFERTYP_DPSEL
- | SDHC_XFERTYP_DMAEN;
-
- dmaDone=0;
- SDHC_DSADDR = (uint32_t)buff;
- SDHC_CMDARG = sector;
- SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(512);
- SDHC_IRQSIGEN = sigen;
- SDHC_XFERTYP = xfertyp;
-
- while(!dmaDone);
- SDHC_IRQSTAT &= (SDHC_IRQSTAT_CC | SDHC_IRQSTAT_TC);
-
- while(SDHC_PRSSTAT & SDHC_PRSSTAT_DLA);
-
-
- do
- { while ((SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB) || (SDHC_PRSSTAT & SDHC_PRSSTAT_CDIHB)) ;
- SDHC_IRQSTATEN |= SDHC_IRQSTATEN_CCSEN;
- SDHC_IRQSTAT=SDHC_IRQSTAT;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD13) | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
-
- SDHC_CMDARG = sdCardDesc.address;
- SDHC_XFERTYP = xfertyp;
- while(!(SDHC_IRQSTAT & SDHC_IRQSTAT_CC)); SDHC_IRQSTAT &= SDHC_IRQSTAT_CC;
- } while(SDHC_CMDRSP0 & 0x200);
-
-
- return result;
- }
-
-
- #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
-
- static void SDHC_InitGPIO(void)
- {
- PORTE_PCR0 = PORT_PCR_MUX(4) | PORT_PCR_PS | PORT_PCR_PE | PORT_PCR_DSE;
- PORTE_PCR1 = PORT_PCR_MUX(4) | PORT_PCR_PS | PORT_PCR_PE | PORT_PCR_DSE;
- PORTE_PCR2 = PORT_PCR_MUX(4) | PORT_PCR_DSE;
- PORTE_PCR3 = PORT_PCR_MUX(4) | PORT_PCR_PS | PORT_PCR_PE | PORT_PCR_DSE;
- PORTE_PCR4 = PORT_PCR_MUX(4) | PORT_PCR_PS | PORT_PCR_PE | PORT_PCR_DSE;
- PORTE_PCR5 = PORT_PCR_MUX(4) | PORT_PCR_PS | PORT_PCR_PE | PORT_PCR_DSE;
- }
-
-
- static void SDHC_ReleaseGPIO(void)
- {
- PORTE_PCR0 = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS;
- PORTE_PCR1 = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS;
- PORTE_PCR2 = 0;
- PORTE_PCR3 = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS;
- PORTE_PCR4 = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS;
- PORTE_PCR5 = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS;
- }
-
- void initClock()
- {
- #ifdef HAS_KINETIS_MPU
-
- MPU_RGDAAC0 |= 0x0C000000;
- #endif
-
- SIM_SCGC3 |= SIM_SCGC3_SDHC;
- }
-
- uint32_t sdhcClock()
- { return F_CPU;
- }
-
- #else
-
- static void SDHC_InitGPIO(void)
- {
- {
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = 0;
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = 0;
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00 = 0;
-
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01 = 0;
-
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02 = 0;
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03 = 0;
-
- const uint32_t CLOCK_MASK = IOMUXC_SW_PAD_CTL_PAD_PKE |
- IOMUXC_SW_PAD_CTL_PAD_DSE(1) |
- IOMUXC_SW_PAD_CTL_PAD_SPEED(2);
-
- const uint32_t DATA_MASK = CLOCK_MASK |
- (IOMUXC_SW_PAD_CTL_PAD_PUE | IOMUXC_SW_PAD_CTL_PAD_PUS(1));
-
- IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = DATA_MASK;
- IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_05 = DATA_MASK;
- IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_00 = DATA_MASK;
- IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_01 = CLOCK_MASK;
- IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_02 = DATA_MASK;
- IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_03 = DATA_MASK;
- }
- }
-
- static void SDHC_ReleaseGPIO(void)
- {
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = 5;
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = 5;
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00 = 5;
-
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01 = 5;
-
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02 = 5;
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03 = 5;
- }
-
- void initClock()
- {
-
- CCM_ANALOG_PFD_528 |= (1 << 7);
- CCM_ANALOG_PFD_528 &= ~(0x3F << 0);
- CCM_ANALOG_PFD_528 |= ((24) & 0x3F << 0);
- CCM_ANALOG_PFD_528 &= ~(1 << 7);
-
-
- CCM_CCGR6 |= CCM_CCGR6_USDHC1(CCM_CCGR_ON);
- CCM_CSCDR1 &= ~(CCM_CSCDR1_USDHC1_CLK_PODF_MASK);
-
-
- CCM_CSCMR1 |= CCM_CSCMR1_USDHC1_CLK_SEL;
- CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((7));
-
-
- CCM_CCOSR = CCM_CCOSR_CLKO1_EN | CCM_CCOSR_CLKO1_DIV(7) | CCM_CCOSR_CLKO1_SEL(1);
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04 = 6;
-
- CCM_CCOSR |= (CCM_CCOSR_CLKO2_EN | CCM_CCOSR_CLKO2_DIV(7) | CCM_CCOSR_CLKO2_SEL(3));
- IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05 = 6;
- }
-
- uint32_t sdhcClock()
- {
- uint32_t divider = ((CCM_CSCDR1 >> 11) & 0x7) + 1;
- uint32_t PLL2PFD0 = (528000000U * 3) / ((CCM_ANALOG_PFD_528 & 0x3F) / 6) / divider;
- return PLL2PFD0;
- }
-
- #endif
-
-
- static void sdhc_setSdclk(uint32_t kHzMax) {
- const uint32_t DVS_LIMIT = 0X10;
- const uint32_t SDCLKFS_LIMIT = 0X100;
- uint32_t dvs = 1;
- uint32_t sdclkfs = 1;
- uint32_t maxSdclk = 1000 * kHzMax;
-
-
- uint32_t f_pll = sdhcClock();
-
- while ((f_pll / (sdclkfs * DVS_LIMIT) > maxSdclk) && (sdclkfs < SDCLKFS_LIMIT)) {
- sdclkfs <<= 1;
- }
- while ((f_pll / (sdclkfs * dvs) > maxSdclk) && (dvs < DVS_LIMIT)) {
- dvs++;
- }
- uint32_t m_sdClkKhz = f_pll / (1000 * sdclkfs * dvs);
-
- sdclkfs >>= 1;
- dvs--;
-
- #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
-
- SDHC_SYSCTL &= ~SDHC_SYSCTL_SDCLKEN;
- #endif
-
-
- uint32_t sysctl = SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK
- | SDHC_SYSCTL_DVS_MASK | SDHC_SYSCTL_SDCLKFS_MASK);
-
- SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs)
- | SDHC_SYSCTL_SDCLKFS(sdclkfs);
-
-
- while (!(SDHC_PRSSTAT & SDHC_PRSSTAT_SDSTB)) { }
-
- #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
-
- SDHC_SYSCTL |= SDHC_SYSCTL_SDCLKEN;
- #endif
-
-
- }
-
-
- void sdhc_isr(void)
- { SDHC_IRQSIGEN &= ~SDHC_IRQSIGEN_DMA_MASK;
-
-
- while(!(SDHC_IRQSTAT & SDHC_IRQSTAT_TC));
-
- #if defined(__IMXRT1052__)
- SDHC_MIX_CTRL &= ~(SDHC_MIX_CTRL_AC23EN | SDHC_MIX_CTRL_DMAEN) ;
- #endif
-
- if(SDHC_SYSCTL & SDHC_SYSCTL_HCKEN) SDHC_SYSCTL &= ~SDHC_SYSCTL_HCKEN;
- SDHC_PROCTL &= ~SDHC_PROCTL_D3CD; SDHC_PROCTL |= SDHC_PROCTL_D3CD;
-
- dmaDone=1;
- }
-
-
-
- static uint8_t SDHC_Init(void)
- {
- initClock();
-
-
- SDHC_ReleaseGPIO();
-
- #if defined (__IMXRT1052__)
- SDHC_SYSCTL |= 0xF;
- SDHC_MIX_CTRL |= 0x80000000;
- #endif
-
-
- SDHC_SYSCTL |= SDHC_SYSCTL_RSTA | SDHC_SYSCTL_SDCLKFS(0x80);
- while (SDHC_SYSCTL & SDHC_SYSCTL_RSTA) ;
-
-
- sdhc_setSdclk(400);
-
-
- while (SDHC_PRSSTAT & (SDHC_PRSSTAT_CIHB | SDHC_PRSSTAT_CDIHB)) ;
-
-
- SDHC_InitGPIO();
-
-
- SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(512);
- SDHC_PROCTL &= ~SDHC_PROCTL_DMAS(3);
-
- SDHC_PROCTL |= SDHC_PROCTL_D3CD;
-
-
-
- #if defined(__IMXRT1052__)
- SDHC_VENDOR = 0x2000F801;
- SDHC_VENDOR2 &= ~(1<<12);
- #endif
-
-
-
- SDHC_IRQSTAT = SDHC_IRQSTAT;
-
- SDHC_IRQSTATEN =
- SDHC_IRQSTATEN_TCSEN | SDHC_IRQSTATEN_CCSEN;
-
- attachInterruptVector(IRQ_SDHC, sdhc_isr);
- NVIC_SET_PRIORITY(IRQ_SDHC, 6 * 16);
- NVIC_ENABLE_IRQ(IRQ_SDHC);
-
-
-
-
- for (int ii = 0; ii < 500; ii++) {
- SDHC_SYSCTL |= SDHC_SYSCTL_INITA;
- while (SDHC_SYSCTL & SDHC_SYSCTL_INITA) ;
- }
-
-
- SDHC_IRQSTAT |= SDHC_IRQSTAT_CRM;
-
- if (SDHC_PRSSTAT & SDHC_PRSSTAT_CINS) {
- return 0;
- } else {
- return SDHC_STATUS_NODISK;
- }
- }
-
-
-
-
- static uint32_t SDHC_WaitStatus(uint32_t mask)
- {
- uint32_t result;
- uint32_t timeout = 1 << 24;
- do
- { result = SDHC_IRQSTAT & mask;
- timeout--;
- } while (!result && (timeout));
- if (timeout) return result;
- return 0;
- }
-
-
-
- static int SDHC_CMD_Do(uint32_t xfertyp)
- {
-
- SDHC_IRQSTAT |= SDHC_IRQSTAT_CRM;
-
-
- while ((SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB) || (SDHC_PRSSTAT & SDHC_PRSSTAT_CDIHB)) { };
- SDHC_XFERTYP = xfertyp;
-
-
- const uint32_t mask = SDHC_IRQSTAT_CIE | SDHC_IRQSTAT_CEBE | SDHC_IRQSTAT_CCE | SDHC_IRQSTAT_CC;
- if (SDHC_WaitStatus(mask) != SDHC_IRQSTAT_CC)
- { SDHC_IRQSTAT |= mask;
- return SDHC_RESULT_ERROR;
- }
-
- if (SDHC_IRQSTAT & SDHC_IRQSTAT_CRM) {
- SDHC_IRQSTAT |= SDHC_IRQSTAT_CTOE | SDHC_IRQSTAT_CC;
- return SDHC_RESULT_NOT_READY;
- }
-
-
- if (SDHC_IRQSTAT & SDHC_IRQSTAT_CTOE)
- { SDHC_IRQSTAT |= SDHC_IRQSTAT_CTOE | SDHC_IRQSTAT_CC;
- return SDHC_RESULT_NO_RESPONSE;
- }
- SDHC_IRQSTAT |= SDHC_IRQSTAT_CC;
-
- return SDHC_RESULT_OK;
- }
-
-
- static int SDHC_CMD0_GoToIdle(void)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = 0;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD0) | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_NO));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
- return result;
- }
-
-
- static int SDHC_CMD2_Identify(void)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = 0;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD2) | SDHC_XFERTYP_CCCEN
- | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_136));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
-
- return result;
- }
-
-
- static int SDHC_CMD3_GetAddress(void)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = 0;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD3) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
- return result;
- }
-
-
- static int SDHC_ACMD6_SetBusWidth(uint32_t address, uint32_t width)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = address;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD55) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
-
- result = SDHC_CMD_Do(xfertyp);
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0;} else { return result; }
- SDHC_CMDARG = width;
-
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD6) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
- return result;
- }
-
-
-
- static int SDHC_CMD7_SelectCard(uint32_t address)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = address;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD7) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48BUSY));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) {(void)SDHC_CMDRSP0; }
- return result;
- }
-
-
- static int SDHC_CMD8_SetInterface(uint32_t cond)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = cond;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD8) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
- return result;
- }
-
-
- static int SDHC_CMD9_GetParameters(uint32_t address)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = address;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD9) | SDHC_XFERTYP_CCCEN |
- SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_136));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) {
-
- sdCardDesc.tranSpeed = SDHC_CMDRSP2 >> 24;
- }
-
- return result;
- }
-
-
- static int SDHC_CMD12_StopTransfer(void)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = 0;
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD12) | SDHC_XFERTYP_CMDTYP(SDHC_XFERTYP_CMDTYP_ABORT) |
- SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48BUSY));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { }
- return result;
- }
-
-
- static int SDHC_CMD12_StopTransferWaitForBusy(void)
- {
- uint32_t timeOut = 1000;
- int result;
- do {
- result = SDHC_CMD12_StopTransfer();
- timeOut--;
- } while (timeOut && (SDHC_PRSSTAT & SDHC_PRSSTAT_DLA) && result == SDHC_RESULT_OK);
-
- if (result != SDHC_RESULT_OK) return result;
- if (!timeOut) return SDHC_RESULT_NO_RESPONSE;
-
- return SDHC_RESULT_OK;
- }
-
-
- static int SDHC_CMD16_SetBlockSize(uint32_t block_size)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = block_size;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD16) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
-
- return result;
- }
-
-
- static int SDHC_CMD17_ReadBlock(uint32_t sector)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = sector;
-
- SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | 512;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD17) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48) |
- SDHC_XFERTYP_DTDSEL | SDHC_XFERTYP_DPSEL);
-
- result = SDHC_CMD_Do(xfertyp);
- if (result == SDHC_RESULT_OK) { ( void)SDHC_CMDRSP0; }
-
- return result;
- }
-
-
- static int SDHC_CMD24_WriteBlock(uint32_t sector)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = sector;
- SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | 512;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD24) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48) |
- SDHC_XFERTYP_DPSEL);
-
- result = SDHC_CMD_Do(xfertyp);
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
-
- return result;
- }
-
-
- static int SDHC_ACMD41_SendOperationCond(uint32_t cond)
- {
- uint32_t xfertyp;
- int result;
-
- SDHC_CMDARG = 0;
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_CMD55) | SDHC_XFERTYP_CICEN |
- SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
-
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; } else { return result; }
-
- SDHC_CMDARG = cond;
-
-
- xfertyp = (SDHC_XFERTYP_CMDINX(SDHC_ACMD41) | SDHC_XFERTYP_RSPTYP(SDHC_XFERTYP_RSPTYP_48));
- result = SDHC_CMD_Do(xfertyp);
-
- if (result == SDHC_RESULT_OK) { (void)SDHC_CMDRSP0; }
-
- return result;
- }
- #endif
|