Lines Matching refs:sdh
48 void SDH_CheckRB(SDH_T *sdh) in SDH_CheckRB() argument
56 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_CheckRB()
58 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_CheckRB()
66 if ((sdh->INTSTS & SDH_INTSTS_DAT0STS_Msk) == SDH_INTSTS_DAT0STS_Msk) in SDH_CheckRB()
79 uint32_t SDH_SDCommand(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg) in SDH_SDCommand() argument
87 if (sdh == SDH0) in SDH_SDCommand()
96 sdh->CMDARG = uArg; in SDH_SDCommand()
97 buf = (sdh->CTL&(~SDH_CTL_CMDCODE_Msk))|(ucCmd << 8ul)|(SDH_CTL_COEN_Msk); in SDH_SDCommand()
98 sdh->CTL = buf; in SDH_SDCommand()
100 while ((sdh->CTL & SDH_CTL_COEN_Msk) == SDH_CTL_COEN_Msk) in SDH_SDCommand()
116 uint32_t SDH_SDCmdAndRsp(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg, uint32_t ntickCount) in SDH_SDCmdAndRsp() argument
124 if (sdh == SDH0) in SDH_SDCmdAndRsp()
133 sdh->CMDARG = uArg; in SDH_SDCmdAndRsp()
134 …buf = (sdh->CTL & (~SDH_CTL_CMDCODE_Msk)) | (ucCmd << 8ul) | (SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk); in SDH_SDCmdAndRsp()
135 sdh->CTL = buf; in SDH_SDCmdAndRsp()
139 while ((sdh->CTL & SDH_CTL_RIEN_Msk) == SDH_CTL_RIEN_Msk) in SDH_SDCmdAndRsp()
143 sdh->CTL |= SDH_CTL_CTLRST_Msk; /* reset SD engine */ in SDH_SDCmdAndRsp()
154 while ((sdh->CTL & SDH_CTL_RIEN_Msk) == SDH_CTL_RIEN_Msk) in SDH_SDCmdAndRsp()
171 tmp1 = sdh->RESP1 & 0xfful; in SDH_SDCmdAndRsp()
172 tmp0 = sdh->RESP0 & 0xful; in SDH_SDCmdAndRsp()
182 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) == SDH_INTSTS_CRC7_Msk) /* check CRC7 */ in SDH_SDCmdAndRsp()
195 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_SDCmdAndRsp()
214 uint32_t SDH_SDCmdAndRsp2(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg, uint32_t puR2ptr[]) in SDH_SDCmdAndRsp2() argument
223 if (sdh == SDH0) in SDH_SDCmdAndRsp2()
232 sdh->CMDARG = uArg; in SDH_SDCmdAndRsp2()
233 buf = (sdh->CTL&(~SDH_CTL_CMDCODE_Msk))|(ucCmd << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_R2EN_Msk); in SDH_SDCmdAndRsp2()
234 sdh->CTL = buf; in SDH_SDCmdAndRsp2()
236 while ((sdh->CTL & SDH_CTL_R2EN_Msk) == SDH_CTL_R2EN_Msk) in SDH_SDCmdAndRsp2()
249 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) == SDH_INTSTS_CRC7_Msk) in SDH_SDCmdAndRsp2()
253 tmpBuf[i] = SDH_Swap32(sdh->FB[i]); in SDH_SDCmdAndRsp2()
268 uint32_t SDH_SDCmdAndRspDataIn(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg) in SDH_SDCmdAndRspDataIn() argument
276 if (sdh == SDH0) in SDH_SDCmdAndRspDataIn()
285 sdh->CMDARG = uArg; in SDH_SDCmdAndRspDataIn()
286 buf = (sdh->CTL & (~SDH_CTL_CMDCODE_Msk))|(ucCmd << 8ul)| in SDH_SDCmdAndRspDataIn()
289 sdh->CTL = buf; in SDH_SDCmdAndRspDataIn()
292 while ((sdh->CTL & SDH_CTL_RIEN_Msk) == SDH_CTL_RIEN_Msk) in SDH_SDCmdAndRspDataIn()
306 while ((sdh->CTL & SDH_CTL_DIEN_Msk) == SDH_CTL_DIEN_Msk) in SDH_SDCmdAndRspDataIn()
319 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) != SDH_INTSTS_CRC7_Msk) in SDH_SDCmdAndRspDataIn()
325 if ((sdh->INTSTS & SDH_INTSTS_CRC16_Msk) != SDH_INTSTS_CRC16_Msk) in SDH_SDCmdAndRspDataIn()
336 void SDH_Set_clock(SDH_T *sdh, uint32_t sd_clock_khz) in SDH_Set_clock() argument
356 if (sdh == SDH0) in SDH_Set_clock()
373 if (sdh == SDH0) in SDH_Set_clock()
419 if (sdh == SDH0) in SDH_Set_clock()
449 if (sdh == SDH0) in SDH_Set_clock()
468 uint32_t SDH_CardDetection(SDH_T *sdh) in SDH_CardDetection() argument
473 if (sdh == SDH0) in SDH_CardDetection()
483 if ((sdh->INTEN & SDH_INTEN_CDSRC_Msk) == SDH_INTEN_CDSRC_Msk) /* Card detect pin from GPIO */ in SDH_CardDetection()
485 if ((sdh->INTSTS & SDH_INTSTS_CDSTS_Msk) == SDH_INTSTS_CDSTS_Msk) /* Card remove */ in SDH_CardDetection()
495 else if ((sdh->INTEN & SDH_INTEN_CDSRC_Msk) != SDH_INTEN_CDSRC_Msk) in SDH_CardDetection()
497 sdh->CTL |= SDH_CTL_CLKKEEP_Msk; in SDH_CardDetection()
502 if ((sdh->INTSTS & SDH_INTSTS_CDSTS_Msk) == SDH_INTSTS_CDSTS_Msk) /* Card insert */ in SDH_CardDetection()
512 sdh->CTL &= ~SDH_CTL_CLKKEEP_Msk; in SDH_CardDetection()
518 uint32_t SDH_Init(SDH_T *sdh) in SDH_Init() argument
529 if (sdh == SDH0) in SDH_Init()
539 SDH_Set_clock(sdh, 300ul); in SDH_Init()
542 sdh->CTL |= SDH_CTL_CLK74OEN_Msk; in SDH_Init()
545 while ((sdh->CTL & SDH_CTL_CLK74OEN_Msk) == SDH_CTL_CLK74OEN_Msk) in SDH_Init()
558 SDH_SDCommand(sdh, 0ul, 0ul); /* reset all cards */ in SDH_Init()
567 i = SDH_SDCmdAndRsp(sdh, 8ul, 0x00000155ul, u32CmdTimeOut); in SDH_Init()
571 SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
573 SDH_SDCmdAndRsp(sdh, 41ul, 0x40ff8000ul, u32CmdTimeOut); /* 2.7v-3.6v */ in SDH_Init()
574 resp = sdh->RESP0; in SDH_Init()
579 SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
581 SDH_SDCmdAndRsp(sdh, 41ul, 0x40ff8000ul, u32CmdTimeOut); /* 3.0v-3.4v */ in SDH_Init()
582 resp = sdh->RESP0; in SDH_Init()
601 SDH_SDCommand(sdh, 0ul, 0ul); /* reset all cards */ in SDH_Init()
606 i = SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
610 SDH_SDCommand(sdh, 0ul, 0ul); /* reset */ in SDH_Init()
617 if (SDH_SDCmdAndRsp(sdh, 1ul, 0x40ff8000ul, u32CmdTimeOut) != 2ul) /* eMMC memory */ in SDH_Init()
619 resp = sdh->RESP0; in SDH_Init()
626 SDH_SDCmdAndRsp(sdh, 1ul, 0x40ff8000ul, u32CmdTimeOut); /* high voltage */ in SDH_Init()
627 resp = sdh->RESP0; in SDH_Init()
654 SDH_SDCmdAndRsp(sdh, 41ul, 0x00ff8000ul, u32CmdTimeOut); /* 3.0v-3.4v */ in SDH_Init()
655 resp = sdh->RESP0; in SDH_Init()
659 SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
661 SDH_SDCmdAndRsp(sdh, 41ul, 0x00ff8000ul, u32CmdTimeOut); /* 3.0v-3.4v */ in SDH_Init()
662 resp = sdh->RESP0; in SDH_Init()
680 SDH_SDCmdAndRsp2(sdh, 2ul, 0x00ul, CIDBuffer); in SDH_Init()
683 … if ((status = SDH_SDCmdAndRsp(sdh, 3ul, 0x10000ul, 0ul)) != Successful) /* set RCA */ in SDH_Init()
691 if ((status = SDH_SDCmdAndRsp(sdh, 3ul, 0x00ul, 0ul)) != Successful) /* get RCA */ in SDH_Init()
697 pSD->RCA = (sdh->RESP0 << 8) & 0xffff0000; in SDH_Init()
705 uint32_t SDH_SwitchToHighSpeed(SDH_T *sdh, SDH_INFO_T *pSD) in SDH_SwitchToHighSpeed() argument
713 sdh->DMASA = (uint32_t)pSD->dmabuf; in SDH_SwitchToHighSpeed()
714 sdh->BLEN = 63ul; in SDH_SwitchToHighSpeed()
716 if ((status = SDH_SDCmdAndRspDataIn(sdh, 6ul, 0x00ffff01ul)) != Successful) in SDH_SwitchToHighSpeed()
733 sdh->DMASA = (uint32_t)pSD->dmabuf; in SDH_SwitchToHighSpeed()
734 sdh->BLEN = 63ul; /* 512 bit */ in SDH_SwitchToHighSpeed()
736 if ((status = SDH_SDCmdAndRspDataIn(sdh, 6ul, 0x80ffff01ul)) != Successful) in SDH_SwitchToHighSpeed()
742 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_SwitchToHighSpeed()
743 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_SwitchToHighSpeed()
768 uint32_t SDH_SelectCardType(SDH_T *sdh) in SDH_SelectCardType() argument
777 if (sdh == SDH0) in SDH_SelectCardType()
786 if ((status = SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
791 SDH_CheckRB(sdh); in SDH_SelectCardType()
796 sdh->DMASA = (uint32_t)pSD->dmabuf; in SDH_SelectCardType()
797 sdh->BLEN = 0x07ul; /* 64 bit */ in SDH_SelectCardType()
798 sdh->DMACTL |= SDH_DMACTL_DMARST_Msk; in SDH_SelectCardType()
800 while ((sdh->DMACTL & SDH_DMACTL_DMARST_Msk) == 0x2) in SDH_SelectCardType()
809 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
813 if ((status = SDH_SDCmdAndRspDataIn(sdh, 51ul, 0x00ul)) != Successful) in SDH_SelectCardType()
820 status = SDH_SwitchToHighSpeed(sdh, pSD); in SDH_SelectCardType()
824 SDH_Set_clock(sdh, SDHC_FREQ); in SDH_SelectCardType()
828 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
832 if ((status = SDH_SDCmdAndRsp(sdh, 6ul, 0x02ul, 0ul)) != Successful) /* set bus width */ in SDH_SelectCardType()
837 sdh->CTL |= SDH_CTL_DBW_Msk; in SDH_SelectCardType()
841 sdh->DMASA = (uint32_t)pSD->dmabuf;; in SDH_SelectCardType()
842 sdh->BLEN = 0x07ul; in SDH_SelectCardType()
844 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
848 if ((status = SDH_SDCmdAndRspDataIn(sdh, 51ul, 0x00ul)) != Successful) in SDH_SelectCardType()
854 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
859 if ((status = SDH_SDCmdAndRsp(sdh, 6ul, 0x02ul, 0ul)) != Successful) in SDH_SelectCardType()
864 sdh->CTL |= SDH_CTL_DBW_Msk; in SDH_SelectCardType()
871 sdh->CTL &= ~SDH_CTL_DBW_Msk; in SDH_SelectCardType()
877 if ((status = SDH_SDCmdAndRsp(sdh, 6ul, param, 0ul)) != Successful) in SDH_SelectCardType()
881 SDH_CheckRB(sdh); in SDH_SelectCardType()
883 sdh->CTL |= SDH_CTL_DBW_Msk; /* set bus width to 4-bit mode for SD host controller */ in SDH_SelectCardType()
887 if ((status = SDH_SDCmdAndRsp(sdh, 16ul, SDH_BLOCK_SIZE, 0ul)) != Successful) in SDH_SelectCardType()
891 sdh->BLEN = SDH_BLOCK_SIZE - 1ul; in SDH_SelectCardType()
893 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_SelectCardType()
894 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_SelectCardType()
896 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_SelectCardType()
905 sdh->INTEN |= SDH_INTEN_BLKDIEN_Msk; in SDH_SelectCardType()
910 void SDH_Get_SD_info(SDH_T *sdh) in SDH_Get_SD_info() argument
920 if (sdh == SDH0) in SDH_Get_SD_info()
929 SDH_SDCmdAndRsp2(sdh, 9ul, pSD->RCA, Buffer); in SDH_Get_SD_info()
938 SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul); in SDH_Get_SD_info()
941 sdh->DMASA = (uint32_t)pSD->dmabuf;; in SDH_Get_SD_info()
942 sdh->BLEN = 511ul; /* read 512 bytes for EXT_CSD */ in SDH_Get_SD_info()
944 if (SDH_SDCmdAndRspDataIn(sdh, 8ul, 0x00ul) == Successful) in SDH_Get_SD_info()
946 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_Get_SD_info()
947 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_Get_SD_info()
948 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_Get_SD_info()
1011 void SDH_Open(SDH_T *sdh, uint32_t u32CardDetSrc) in SDH_Open() argument
1017 sdh->DMACTL = SDH_DMACTL_DMARST_Msk; in SDH_Open()
1019 while ((sdh->DMACTL & SDH_DMACTL_DMARST_Msk) == SDH_DMACTL_DMARST_Msk) in SDH_Open()
1028 sdh->DMACTL = SDH_DMACTL_DMAEN_Msk; in SDH_Open()
1030 sdh->GCTL = SDH_GCTL_GCTLRST_Msk | SDH_GCTL_SDEN_Msk; in SDH_Open()
1032 while ((sdh->GCTL & SDH_GCTL_GCTLRST_Msk) == SDH_GCTL_GCTLRST_Msk) in SDH_Open()
1041 if (sdh == SDH0) in SDH_Open()
1047 else if (sdh == SDH1) in SDH_Open()
1057 sdh->GCTL = SDH_GCTL_SDEN_Msk; in SDH_Open()
1061 sdh->INTEN &= ~SDH_INTEN_CDSRC_Msk; in SDH_Open()
1065 sdh->INTEN |= SDH_INTEN_CDSRC_Msk; in SDH_Open()
1067 sdh->INTEN |= SDH_INTEN_CDIEN_Msk; in SDH_Open()
1069 sdh->CTL |= SDH_CTL_CTLRST_Msk; in SDH_Open()
1071 while ((sdh->CTL & SDH_CTL_CTLRST_Msk) == SDH_CTL_CTLRST_Msk) in SDH_Open()
1092 uint32_t SDH_Probe(SDH_T *sdh) in SDH_Probe() argument
1096 sdh->GINTEN = 0ul; in SDH_Probe()
1097 sdh->CTL &= ~SDH_CTL_SDNWR_Msk; in SDH_Probe()
1098 sdh->CTL |= 0x09ul << SDH_CTL_SDNWR_Pos; /* set SDNWR = 9 */ in SDH_Probe()
1099 sdh->CTL &= ~SDH_CTL_BLKCNT_Msk; in SDH_Probe()
1100 sdh->CTL |= 0x01ul << SDH_CTL_BLKCNT_Pos; /* set BLKCNT = 1 */ in SDH_Probe()
1101 sdh->CTL &= ~SDH_CTL_DBW_Msk; /* SD 1-bit data bus */ in SDH_Probe()
1103 if(!(SDH_CardDetection(sdh))) in SDH_Probe()
1108 if ((val = SDH_Init(sdh)) != 0ul) in SDH_Probe()
1116 SDH_Set_clock(sdh, MMC_FREQ); in SDH_Probe()
1120 SDH_Set_clock(sdh, SD_FREQ); in SDH_Probe()
1122 SDH_Get_SD_info(sdh); in SDH_Probe()
1124 if ((val = SDH_SelectCardType(sdh)) != 0ul) in SDH_Probe()
1142 uint32_t SDH_Read(SDH_T *sdh, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount) in SDH_Read() argument
1154 if (sdh == SDH0) in SDH_Read()
1168 if ((status = SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul)) != Successful) in SDH_Read()
1172 SDH_CheckRB(sdh); in SDH_Read()
1174 sdh->BLEN = blksize - 1ul; /* the actual byte count is equal to (SDBLEN+1) */ in SDH_Read()
1178 sdh->CMDARG = u32StartSec; in SDH_Read()
1182 sdh->CMDARG = u32StartSec * blksize; in SDH_Read()
1185 sdh->DMASA = (uint32_t)pu8BufAddr; in SDH_Read()
1191 reg = sdh->CTL & ~SDH_CTL_CMDCODE_Msk; in SDH_Read()
1195 sdh->CTL = reg|(18ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DIEN_Msk); in SDH_Read()
1200 sdh->CTL = reg | SDH_CTL_DIEN_Msk; in SDH_Read()
1221 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) != SDH_INTSTS_CRC7_Msk) /* check CRC7 */ in SDH_Read()
1226 if ((sdh->INTSTS & SDH_INTSTS_CRC16_Msk) != SDH_INTSTS_CRC16_Msk) /* check CRC16 */ in SDH_Read()
1236 reg = sdh->CTL & (~SDH_CTL_CMDCODE_Msk); in SDH_Read()
1242 sdh->CTL = reg|(18ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DIEN_Msk); in SDH_Read()
1247 sdh->CTL = reg | SDH_CTL_DIEN_Msk; in SDH_Read()
1264 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) != SDH_INTSTS_CRC7_Msk) /* check CRC7 */ in SDH_Read()
1269 if ((sdh->INTSTS & SDH_INTSTS_CRC16_Msk) != SDH_INTSTS_CRC16_Msk) /* check CRC16 */ in SDH_Read()
1275 if (SDH_SDCmdAndRsp(sdh, 12ul, 0ul, 0ul)) /* stop command */ in SDH_Read()
1279 SDH_CheckRB(sdh); in SDH_Read()
1281 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_Read()
1282 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_Read()
1284 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_Read()
1311 uint32_t SDH_Write(SDH_T *sdh, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount) in SDH_Write() argument
1322 if (sdh == SDH0) in SDH_Write()
1336 if ((status = SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul)) != Successful) in SDH_Write()
1341 SDH_CheckRB(sdh); in SDH_Write()
1344 sdh->BLEN = SDH_BLOCK_SIZE - 1ul; in SDH_Write()
1348 sdh->CMDARG = u32StartSec; in SDH_Write()
1352 sdh->CMDARG = u32StartSec * SDH_BLOCK_SIZE; /* set start address for SD CMD */ in SDH_Write()
1355 sdh->DMASA = (uint32_t)pu8BufAddr; in SDH_Write()
1360 reg = sdh->CTL & 0xff00c080; in SDH_Write()
1364 sdh->CTL = reg|(25ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DOEN_Msk); in SDH_Write()
1369 sdh->CTL = reg | SDH_CTL_DOEN_Msk; in SDH_Write()
1386 if ((sdh->INTSTS & SDH_INTSTS_CRCIF_Msk) != 0ul) in SDH_Write()
1388 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_Write()
1397 reg = (sdh->CTL & 0xff00c080) | (loop << 16); in SDH_Write()
1400 sdh->CTL = reg|(25ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DOEN_Msk); in SDH_Write()
1405 sdh->CTL = reg | SDH_CTL_DOEN_Msk; in SDH_Write()
1422 if ((sdh->INTSTS & SDH_INTSTS_CRCIF_Msk) != 0ul) in SDH_Write()
1424 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_Write()
1428 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_Write()
1430 if (SDH_SDCmdAndRsp(sdh, 12ul, 0ul, 0ul)) /* stop command */ in SDH_Write()
1434 SDH_CheckRB(sdh); in SDH_Write()
1436 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_Write()
1437 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_Write()
1439 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_Write()