Lines Matching refs:sdh
51 void SDH_CheckRB(SDH_T *sdh) in SDH_CheckRB() argument
55 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_CheckRB()
56 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_CheckRB()
59 if ((sdh->INTSTS & SDH_INTSTS_DAT0STS_Msk) == SDH_INTSTS_DAT0STS_Msk) in SDH_CheckRB()
67 uint32_t SDH_SDCommand(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg) in SDH_SDCommand() argument
72 if (sdh == SDH0) in SDH_SDCommand()
81 sdh->CMDARG = uArg; in SDH_SDCommand()
82 buf = (sdh->CTL&(~SDH_CTL_CMDCODE_Msk))|(ucCmd << 8ul)|(SDH_CTL_COEN_Msk); in SDH_SDCommand()
83 sdh->CTL = buf; in SDH_SDCommand()
85 while ((sdh->CTL & SDH_CTL_COEN_Msk) == SDH_CTL_COEN_Msk) in SDH_SDCommand()
96 uint32_t SDH_SDCmdAndRsp(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg, uint32_t ntickCount) in SDH_SDCmdAndRsp() argument
101 if (sdh == SDH0) in SDH_SDCmdAndRsp()
110 sdh->CMDARG = uArg; in SDH_SDCmdAndRsp()
111 …buf = (sdh->CTL & (~SDH_CTL_CMDCODE_Msk)) | (ucCmd << 8ul) | (SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk); in SDH_SDCmdAndRsp()
112 sdh->CTL = buf; in SDH_SDCmdAndRsp()
116 while ((sdh->CTL & SDH_CTL_RIEN_Msk) == SDH_CTL_RIEN_Msk) in SDH_SDCmdAndRsp()
120 sdh->CTL |= SDH_CTL_CTLRST_Msk; /* reset SD engine */ in SDH_SDCmdAndRsp()
131 while ((sdh->CTL & SDH_CTL_RIEN_Msk) == SDH_CTL_RIEN_Msk) in SDH_SDCmdAndRsp()
143 tmp1 = sdh->RESP1 & 0xfful; in SDH_SDCmdAndRsp()
144 tmp0 = sdh->RESP0 & 0xful; in SDH_SDCmdAndRsp()
154 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) == SDH_INTSTS_CRC7_Msk) /* check CRC7 */ in SDH_SDCmdAndRsp()
167 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_SDCmdAndRsp()
186 uint32_t SDH_SDCmdAndRsp2(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg, uint32_t puR2ptr[]) in SDH_SDCmdAndRsp2() argument
192 if (sdh == SDH0) in SDH_SDCmdAndRsp2()
201 sdh->CMDARG = uArg; in SDH_SDCmdAndRsp2()
202 buf = (sdh->CTL&(~SDH_CTL_CMDCODE_Msk))|(ucCmd << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_R2EN_Msk); in SDH_SDCmdAndRsp2()
203 sdh->CTL = buf; in SDH_SDCmdAndRsp2()
205 while ((sdh->CTL & SDH_CTL_R2EN_Msk) == SDH_CTL_R2EN_Msk) in SDH_SDCmdAndRsp2()
213 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) == SDH_INTSTS_CRC7_Msk) in SDH_SDCmdAndRsp2()
217 tmpBuf[i] = SDH_Swap32(sdh->FB[i]); in SDH_SDCmdAndRsp2()
232 uint32_t SDH_SDCmdAndRspDataIn(SDH_T *sdh, uint32_t ucCmd, uint32_t uArg) in SDH_SDCmdAndRspDataIn() argument
237 if (sdh == SDH0) in SDH_SDCmdAndRspDataIn()
246 sdh->CMDARG = uArg; in SDH_SDCmdAndRspDataIn()
247 buf = (sdh->CTL & (~SDH_CTL_CMDCODE_Msk))|(ucCmd << 8ul)| in SDH_SDCmdAndRspDataIn()
250 sdh->CTL = buf; in SDH_SDCmdAndRspDataIn()
252 while ((sdh->CTL & SDH_CTL_RIEN_Msk) == SDH_CTL_RIEN_Msk) in SDH_SDCmdAndRspDataIn()
260 while ((sdh->CTL & SDH_CTL_DIEN_Msk) == SDH_CTL_DIEN_Msk) in SDH_SDCmdAndRspDataIn()
268 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) != SDH_INTSTS_CRC7_Msk) in SDH_SDCmdAndRspDataIn()
274 if ((sdh->INTSTS & SDH_INTSTS_CRC16_Msk) != SDH_INTSTS_CRC16_Msk) in SDH_SDCmdAndRspDataIn()
285 void SDH_Set_clock(SDH_T *sdh, uint32_t sd_clock_khz) in SDH_Set_clock() argument
301 if (sdh == SDH0) in SDH_Set_clock()
317 if (sdh == SDH0) in SDH_Set_clock()
380 if (sdh == SDH0) in SDH_Set_clock()
393 uint32_t SDH_CardDetection(SDH_T *sdh) in SDH_CardDetection() argument
398 if (sdh == SDH0) in SDH_CardDetection()
408 if ((sdh->INTEN & SDH_INTEN_CDSRC_Msk) == SDH_INTEN_CDSRC_Msk) /* Card detect pin from GPIO */ in SDH_CardDetection()
410 if ((sdh->INTSTS & SDH_INTSTS_CDSTS_Msk) == SDH_INTSTS_CDSTS_Msk) /* Card remove */ in SDH_CardDetection()
420 else if ((sdh->INTEN & SDH_INTEN_CDSRC_Msk) != SDH_INTEN_CDSRC_Msk) in SDH_CardDetection()
422 sdh->CTL |= SDH_CTL_CLKKEEP_Msk; in SDH_CardDetection()
427 if ((sdh->INTSTS & SDH_INTSTS_CDSTS_Msk) == SDH_INTSTS_CDSTS_Msk) /* Card insert */ in SDH_CardDetection()
437 sdh->CTL &= ~SDH_CTL_CLKKEEP_Msk; in SDH_CardDetection()
443 uint32_t SDH_Init(SDH_T *sdh) in SDH_Init() argument
451 if (sdh == SDH0) in SDH_Init()
461 SDH_Set_clock(sdh, 300ul); in SDH_Init()
464 sdh->CTL |= SDH_CTL_CLK74OEN_Msk; in SDH_Init()
466 while ((sdh->CTL & SDH_CTL_CLK74OEN_Msk) == SDH_CTL_CLK74OEN_Msk) in SDH_Init()
474 SDH_SDCommand(sdh, 0ul, 0ul); /* reset all cards */ in SDH_Init()
483 i = SDH_SDCmdAndRsp(sdh, 8ul, 0x00000155ul, u32CmdTimeOut); in SDH_Init()
487 SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
489 SDH_SDCmdAndRsp(sdh, 41ul, 0x40ff8000ul, u32CmdTimeOut); /* 2.7v-3.6v */ in SDH_Init()
490 resp = sdh->RESP0; in SDH_Init()
494 SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
496 SDH_SDCmdAndRsp(sdh, 41ul, 0x40ff8000ul, u32CmdTimeOut); /* 3.0v-3.4v */ in SDH_Init()
497 resp = sdh->RESP0; in SDH_Init()
511 SDH_SDCommand(sdh, 0ul, 0ul); /* reset all cards */ in SDH_Init()
516 i = SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
520 SDH_SDCommand(sdh, 0ul, 0ul); /* reset */ in SDH_Init()
527 if (SDH_SDCmdAndRsp(sdh, 1ul, 0x40ff8000ul, u32CmdTimeOut) != 2ul) /* eMMC memory */ in SDH_Init()
529 resp = sdh->RESP0; in SDH_Init()
535 SDH_SDCmdAndRsp(sdh, 1ul, 0x40ff8000ul, u32CmdTimeOut); /* high voltage */ in SDH_Init()
536 resp = sdh->RESP0; in SDH_Init()
557 SDH_SDCmdAndRsp(sdh, 41ul, 0x00ff8000ul, u32CmdTimeOut); /* 3.0v-3.4v */ in SDH_Init()
558 resp = sdh->RESP0; in SDH_Init()
561 SDH_SDCmdAndRsp(sdh, 55ul, 0x00ul, u32CmdTimeOut); in SDH_Init()
563 SDH_SDCmdAndRsp(sdh, 41ul, 0x00ff8000ul, u32CmdTimeOut); /* 3.0v-3.4v */ in SDH_Init()
564 resp = sdh->RESP0; in SDH_Init()
577 SDH_SDCmdAndRsp2(sdh, 2ul, 0x00ul, CIDBuffer); in SDH_Init()
580 … if ((status = SDH_SDCmdAndRsp(sdh, 3ul, 0x10000ul, 0ul)) != Successful) /* set RCA */ in SDH_Init()
588 if ((status = SDH_SDCmdAndRsp(sdh, 3ul, 0x00ul, 0ul)) != Successful) /* get RCA */ in SDH_Init()
594 pSD->RCA = (sdh->RESP0 << 8) & 0xffff0000; in SDH_Init()
602 uint32_t SDH_SwitchToHighSpeed(SDH_T *sdh, SDH_INFO_T *pSD) in SDH_SwitchToHighSpeed() argument
607 sdh->DMASA = (uint32_t)_SDH_ucSDHCBuffer; in SDH_SwitchToHighSpeed()
608 sdh->BLEN = 63ul; in SDH_SwitchToHighSpeed()
610 if ((status = SDH_SDCmdAndRspDataIn(sdh, 6ul, 0x00ffff01ul)) != Successful) in SDH_SwitchToHighSpeed()
627 sdh->DMASA = (uint32_t)_SDH_ucSDHCBuffer; in SDH_SwitchToHighSpeed()
628 sdh->BLEN = 63ul; /* 512 bit */ in SDH_SwitchToHighSpeed()
630 if ((status = SDH_SDCmdAndRspDataIn(sdh, 6ul, 0x80ffff01ul)) != Successful) in SDH_SwitchToHighSpeed()
636 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_SwitchToHighSpeed()
637 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_SwitchToHighSpeed()
657 uint32_t SDH_SelectCardType(SDH_T *sdh) in SDH_SelectCardType() argument
663 if (sdh == SDH0) in SDH_SelectCardType()
672 if ((status = SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
677 SDH_CheckRB(sdh); in SDH_SelectCardType()
682 sdh->DMASA = (uint32_t)_SDH_ucSDHCBuffer; in SDH_SelectCardType()
683 sdh->BLEN = 0x07ul; /* 64 bit */ in SDH_SelectCardType()
684 sdh->DMACTL |= SDH_DMACTL_DMARST_Msk; in SDH_SelectCardType()
685 while ((sdh->DMACTL & SDH_DMACTL_DMARST_Msk) == 0x2); in SDH_SelectCardType()
687 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
691 if ((status = SDH_SDCmdAndRspDataIn(sdh, 51ul, 0x00ul)) != Successful) in SDH_SelectCardType()
698 status = SDH_SwitchToHighSpeed(sdh, pSD); in SDH_SelectCardType()
702 SDH_Set_clock(sdh, SDHC_FREQ); in SDH_SelectCardType()
706 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
710 if ((status = SDH_SDCmdAndRsp(sdh, 6ul, 0x02ul, 0ul)) != Successful) /* set bus width */ in SDH_SelectCardType()
715 sdh->CTL |= SDH_CTL_DBW_Msk; in SDH_SelectCardType()
719 sdh->DMASA = (uint32_t) _SDH_ucSDHCBuffer; in SDH_SelectCardType()
720 sdh->BLEN = 0x07ul; in SDH_SelectCardType()
722 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
726 if ((status = SDH_SDCmdAndRspDataIn(sdh, 51ul, 0x00ul)) != Successful) in SDH_SelectCardType()
732 if ((status = SDH_SDCmdAndRsp(sdh, 55ul, pSD->RCA, 0ul)) != Successful) in SDH_SelectCardType()
737 if ((status = SDH_SDCmdAndRsp(sdh, 6ul, 0x02ul, 0ul)) != Successful) in SDH_SelectCardType()
742 sdh->CTL |= SDH_CTL_DBW_Msk; in SDH_SelectCardType()
749 sdh->CTL &= ~SDH_CTL_DBW_Msk; in SDH_SelectCardType()
755 if ((status = SDH_SDCmdAndRsp(sdh, 6ul, param, 0ul)) != Successful) in SDH_SelectCardType()
759 SDH_CheckRB(sdh); in SDH_SelectCardType()
761 sdh->CTL |= SDH_CTL_DBW_Msk; /* set bus width to 4-bit mode for SD host controller */ in SDH_SelectCardType()
765 if ((status = SDH_SDCmdAndRsp(sdh, 16ul, SDH_BLOCK_SIZE, 0ul)) != Successful) in SDH_SelectCardType()
769 sdh->BLEN = SDH_BLOCK_SIZE - 1ul; in SDH_SelectCardType()
771 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_SelectCardType()
772 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_SelectCardType()
773 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_SelectCardType()
777 sdh->INTEN |= SDH_INTEN_BLKDIEN_Msk; in SDH_SelectCardType()
782 void SDH_Get_SD_info(SDH_T *sdh) in SDH_Get_SD_info() argument
789 if (sdh == SDH0) in SDH_Get_SD_info()
798 SDH_SDCmdAndRsp2(sdh, 9ul, pSD->RCA, Buffer); in SDH_Get_SD_info()
807 SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul); in SDH_Get_SD_info()
810 sdh->DMASA = (uint32_t)_SDH_ucSDHCBuffer; in SDH_Get_SD_info()
811 sdh->BLEN = 511ul; /* read 512 bytes for EXT_CSD */ in SDH_Get_SD_info()
813 if (SDH_SDCmdAndRspDataIn(sdh, 8ul, 0x00ul) == Successful) in SDH_Get_SD_info()
815 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_Get_SD_info()
816 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_Get_SD_info()
817 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_Get_SD_info()
875 void SDH_Open(SDH_T *sdh, uint32_t u32CardDetSrc) in SDH_Open() argument
877 sdh->DMACTL = SDH_DMACTL_DMARST_Msk; in SDH_Open()
878 while ((sdh->DMACTL & SDH_DMACTL_DMARST_Msk) == SDH_DMACTL_DMARST_Msk) in SDH_Open()
882 sdh->DMACTL = SDH_DMACTL_DMAEN_Msk; in SDH_Open()
884 sdh->GCTL = SDH_GCTL_GCTLRST_Msk | SDH_GCTL_SDEN_Msk; in SDH_Open()
885 while ((sdh->GCTL & SDH_GCTL_GCTLRST_Msk) == SDH_GCTL_GCTLRST_Msk) in SDH_Open()
889 if (sdh == SDH0) in SDH_Open()
894 else if (sdh == SDH1) in SDH_Open()
903 sdh->GCTL = SDH_GCTL_SDEN_Msk; in SDH_Open()
907 sdh->INTEN &= ~SDH_INTEN_CDSRC_Msk; in SDH_Open()
911 sdh->INTEN |= SDH_INTEN_CDSRC_Msk; in SDH_Open()
913 sdh->INTEN |= SDH_INTEN_CDIEN_Msk; in SDH_Open()
915 sdh->CTL |= SDH_CTL_CTLRST_Msk; in SDH_Open()
916 while ((sdh->CTL & SDH_CTL_CTLRST_Msk) == SDH_CTL_CTLRST_Msk) in SDH_Open()
932 uint32_t SDH_Probe(SDH_T *sdh) in SDH_Probe() argument
936 sdh->GINTEN = 0ul; in SDH_Probe()
937 sdh->CTL &= ~SDH_CTL_SDNWR_Msk; in SDH_Probe()
938 sdh->CTL |= 0x09ul << SDH_CTL_SDNWR_Pos; /* set SDNWR = 9 */ in SDH_Probe()
939 sdh->CTL &= ~SDH_CTL_BLKCNT_Msk; in SDH_Probe()
940 sdh->CTL |= 0x01ul << SDH_CTL_BLKCNT_Pos; /* set BLKCNT = 1 */ in SDH_Probe()
941 sdh->CTL &= ~SDH_CTL_DBW_Msk; /* SD 1-bit data bus */ in SDH_Probe()
943 if(!(SDH_CardDetection(sdh))) in SDH_Probe()
948 if ((val = SDH_Init(sdh)) != 0ul) in SDH_Probe()
956 SDH_Set_clock(sdh, MMC_FREQ); in SDH_Probe()
960 SDH_Set_clock(sdh, SD_FREQ); in SDH_Probe()
962 SDH_Get_SD_info(sdh); in SDH_Probe()
964 if ((val = SDH_SelectCardType(sdh)) != 0ul) in SDH_Probe()
983 uint32_t SDH_Read(SDH_T *sdh, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount) in SDH_Read() argument
991 if (sdh == SDH0) in SDH_Read()
1005 if ((status = SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul)) != Successful) in SDH_Read()
1009 SDH_CheckRB(sdh); in SDH_Read()
1011 sdh->BLEN = blksize - 1ul; /* the actual byte count is equal to (SDBLEN+1) */ in SDH_Read()
1015 sdh->CMDARG = u32StartSec; in SDH_Read()
1019 sdh->CMDARG = u32StartSec * blksize; in SDH_Read()
1022 sdh->DMASA = (uint32_t)pu8BufAddr; in SDH_Read()
1028 reg = sdh->CTL & ~SDH_CTL_CMDCODE_Msk; in SDH_Read()
1032 sdh->CTL = reg|(18ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DIEN_Msk); in SDH_Read()
1037 sdh->CTL = reg | SDH_CTL_DIEN_Msk; in SDH_Read()
1052 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) != SDH_INTSTS_CRC7_Msk) /* check CRC7 */ in SDH_Read()
1057 if ((sdh->INTSTS & SDH_INTSTS_CRC16_Msk) != SDH_INTSTS_CRC16_Msk) /* check CRC16 */ in SDH_Read()
1067 reg = sdh->CTL & (~SDH_CTL_CMDCODE_Msk); in SDH_Read()
1073 sdh->CTL = reg|(18ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DIEN_Msk); in SDH_Read()
1078 sdh->CTL = reg | SDH_CTL_DIEN_Msk; in SDH_Read()
1089 if ((sdh->INTSTS & SDH_INTSTS_CRC7_Msk) != SDH_INTSTS_CRC7_Msk) /* check CRC7 */ in SDH_Read()
1094 if ((sdh->INTSTS & SDH_INTSTS_CRC16_Msk) != SDH_INTSTS_CRC16_Msk) /* check CRC16 */ in SDH_Read()
1100 if (SDH_SDCmdAndRsp(sdh, 12ul, 0ul, 0ul)) /* stop command */ in SDH_Read()
1104 SDH_CheckRB(sdh); in SDH_Read()
1106 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_Read()
1107 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_Read()
1108 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_Read()
1130 uint32_t SDH_Write(SDH_T *sdh, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount) in SDH_Write() argument
1138 if (sdh == SDH0) in SDH_Write()
1152 if ((status = SDH_SDCmdAndRsp(sdh, 7ul, pSD->RCA, 0ul)) != Successful) in SDH_Write()
1157 SDH_CheckRB(sdh); in SDH_Write()
1160 sdh->BLEN = SDH_BLOCK_SIZE - 1ul; in SDH_Write()
1164 sdh->CMDARG = u32StartSec; in SDH_Write()
1168 sdh->CMDARG = u32StartSec * SDH_BLOCK_SIZE; /* set start address for SD CMD */ in SDH_Write()
1171 sdh->DMASA = (uint32_t)pu8BufAddr; in SDH_Write()
1176 reg = sdh->CTL & 0xff00c080; in SDH_Write()
1180 sdh->CTL = reg|(25ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DOEN_Msk); in SDH_Write()
1185 sdh->CTL = reg | SDH_CTL_DOEN_Msk; in SDH_Write()
1196 if ((sdh->INTSTS & SDH_INTSTS_CRCIF_Msk) != 0ul) in SDH_Write()
1198 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_Write()
1207 reg = (sdh->CTL & 0xff00c080) | (loop << 16); in SDH_Write()
1210 sdh->CTL = reg|(25ul << 8)|(SDH_CTL_COEN_Msk | SDH_CTL_RIEN_Msk | SDH_CTL_DOEN_Msk); in SDH_Write()
1215 sdh->CTL = reg | SDH_CTL_DOEN_Msk; in SDH_Write()
1226 if ((sdh->INTSTS & SDH_INTSTS_CRCIF_Msk) != 0ul) in SDH_Write()
1228 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_Write()
1232 sdh->INTSTS = SDH_INTSTS_CRCIF_Msk; in SDH_Write()
1234 if (SDH_SDCmdAndRsp(sdh, 12ul, 0ul, 0ul)) /* stop command */ in SDH_Write()
1238 SDH_CheckRB(sdh); in SDH_Write()
1240 SDH_SDCommand(sdh, 7ul, 0ul); in SDH_Write()
1241 sdh->CTL |= SDH_CTL_CLK8OEN_Msk; in SDH_Write()
1242 while ((sdh->CTL & SDH_CTL_CLK8OEN_Msk) == SDH_CTL_CLK8OEN_Msk) in SDH_Write()