sdps: Added support for SD v1.0

This patch add support for SD card v1.0

Signed-off-by: P L Sai Krishna <lakshmis@xilinx.com>
Reviewed-by: Harini Katakam <harinik@xilinx.com>
This commit is contained in:
P L Sai Krishna 2015-10-12 16:09:32 +05:30 committed by Nava kishore Manne
parent 1e332095b8
commit 5594d1f3fc
2 changed files with 42 additions and 11 deletions

View file

@ -59,6 +59,7 @@
* Added Support for SD Card v1.0 * Added Support for SD Card v1.0
* 2.5 sg 07/09/15 Added SD 3.0 features * 2.5 sg 07/09/15 Added SD 3.0 features
* kvn 07/15/15 Modified the code according to MISRAC-2012. * kvn 07/15/15 Modified the code according to MISRAC-2012.
* 2.6 sk 10/12/15 Added support for SD card v1.0 CR# 840601.
* </pre> * </pre>
* *
******************************************************************************/ ******************************************************************************/
@ -301,6 +302,7 @@ s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr)
u32 RespOCR; u32 RespOCR;
u32 CSD[4]; u32 CSD[4];
u32 Arg; u32 Arg;
u8 ReadReg;
Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
@ -331,11 +333,25 @@ s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr)
*/ */
Status = XSdPs_CmdTransfer(InstancePtr, CMD8, Status = XSdPs_CmdTransfer(InstancePtr, CMD8,
XSDPS_CMD8_VOL_PATTERN, 0U); XSDPS_CMD8_VOL_PATTERN, 0U);
if (Status != XST_SUCCESS) { if ((Status != XST_SUCCESS) && (Status != XSDPS_CT_ERROR)) {
Status = XST_FAILURE; Status = XST_FAILURE;
goto RETURN_PATH; goto RETURN_PATH;
} }
if (Status == XSDPS_CT_ERROR) {
/* "Software reset for all" is initiated */
XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, XSDPS_SW_RST_OFFSET,
XSDPS_SWRST_CMD_LINE_MASK);
/* Proceed with initialization only after reset is complete */
ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
XSDPS_SW_RST_OFFSET);
while ((ReadReg & XSDPS_SWRST_CMD_LINE_MASK) != 0U) {
ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
XSDPS_SW_RST_OFFSET);
}
}
RespOCR = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, RespOCR = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
XSDPS_RESP0_OFFSET); XSDPS_RESP0_OFFSET);
if (RespOCR != XSDPS_CMD8_VOL_PATTERN) { if (RespOCR != XSDPS_CMD8_VOL_PATTERN) {
@ -587,20 +603,28 @@ static u8 ExtCsd[512] __attribute__ ((aligned(32)));
} }
} else { } else {
/* Get speed supported by device */
Status = XSdPs_Get_BusSpeed(InstancePtr, ReadBuff);
if (Status != XST_SUCCESS) {
Status = XST_FAILURE;
goto RETURN_PATH;
}
/* Check for high speed support */ /*
if ((ReadBuff[13] & HIGH_SPEED_SUPPORT) != 0U) { * card supports CMD6 when SD_SPEC field in SCR register
Status = XSdPs_Change_BusSpeed(InstancePtr); * indicates that the Physical Layer Specification Version
* is 1.10 or later. So for SD v1.0 cmd6 is not supported.
*/
if (SCR[0] != 0U) {
/* Get speed supported by device */
Status = XSdPs_Get_BusSpeed(InstancePtr, ReadBuff);
if (Status != XST_SUCCESS) { if (Status != XST_SUCCESS) {
Status = XST_FAILURE; Status = XST_FAILURE;
goto RETURN_PATH; goto RETURN_PATH;
} }
/* Check for high speed support */
if ((ReadBuff[13] & HIGH_SPEED_SUPPORT) != 0U) {
Status = XSdPs_Change_BusSpeed(InstancePtr);
if (Status != XST_SUCCESS) {
Status = XST_FAILURE;
goto RETURN_PATH;
}
}
} }
} }
@ -925,11 +949,15 @@ s32 XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt)
XSDPS_NORM_INTR_STS_OFFSET); XSDPS_NORM_INTR_STS_OFFSET);
if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) {
Status = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
XSDPS_ERR_INTR_STS_OFFSET);
if ((Status & ~XSDPS_INTR_ERR_CT_MASK) == 0) {
Status = XSDPS_CT_ERROR;
}
/* Write to clear error bits */ /* Write to clear error bits */
XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
XSDPS_ERR_INTR_STS_OFFSET, XSDPS_ERR_INTR_STS_OFFSET,
XSDPS_ERROR_INTR_ALL_MASK); XSDPS_ERROR_INTR_ALL_MASK);
Status = XST_FAILURE;
goto RETURN_PATH; goto RETURN_PATH;
} }
} while((StatusReg & XSDPS_INTR_CC_MASK) == 0U); } while((StatusReg & XSDPS_INTR_CC_MASK) == 0U);

View file

@ -118,6 +118,7 @@
* Added Support for SD Card v1.0 * Added Support for SD Card v1.0
* 2.5 sg 07/09/15 Added SD 3.0 features * 2.5 sg 07/09/15 Added SD 3.0 features
* kvn 07/15/15 Modified the code according to MISRAC-2012. * kvn 07/15/15 Modified the code according to MISRAC-2012.
* 2.6 sk 10/12/15 Added support for SD card v1.0 CR# 840601.
* *
* </pre> * </pre>
* *
@ -139,6 +140,8 @@ extern "C" {
/************************** Constant Definitions *****************************/ /************************** Constant Definitions *****************************/
#define XSDPS_CT_ERROR 0x2U /**< Command timeout flag */
/**************************** Type Definitions *******************************/ /**************************** Type Definitions *******************************/
/** /**
* This typedef contains configuration information for the device. * This typedef contains configuration information for the device.