return Status;\r
}\r
\r
-/**\r
- Send command SEND_CSD to the SD device to get the data of the CSD register.\r
-\r
- Refer to SD Physical Layer Simplified Spec 4.1 Section 4.7 for details.\r
-\r
- @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.\r
- @param[in] Slot The slot number of the SD card to send the command to.\r
- @param[in] Rca The relative device address of selected device.\r
- @param[out] Csd The buffer to store the content of the CSD register.\r
- Note the caller should ignore the lowest byte of this\r
- buffer as the content of this byte is meaningless even\r
- if the operation succeeds.\r
-\r
- @retval EFI_SUCCESS The operation is done correctly.\r
- @retval Others The operation fails.\r
-\r
-**/\r
-EFI_STATUS\r
-SdCardGetCsd (\r
- IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,\r
- IN UINT8 Slot,\r
- IN UINT16 Rca,\r
- OUT SD_CSD *Csd\r
- )\r
-{\r
- EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;\r
- EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;\r
- EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;\r
- EFI_STATUS Status;\r
-\r
- ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));\r
- ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));\r
- ZeroMem (&Packet, sizeof (Packet));\r
-\r
- Packet.SdMmcCmdBlk = &SdMmcCmdBlk;\r
- Packet.SdMmcStatusBlk = &SdMmcStatusBlk;\r
- Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;\r
\r
- SdMmcCmdBlk.CommandIndex = SD_SEND_CSD;\r
- SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;\r
- SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2;\r
- SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;\r
\r
- Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // For details, refer to SD Host Controller Simplified Spec 3.0 Table 2-12.\r
- //\r
- CopyMem (((UINT8*)Csd) + 1, &SdMmcStatusBlk.Resp0, sizeof (SD_CSD) - 1);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Send command SEND_CSD to the SD device to get the data of the CSD register.\r
-\r
- Refer to SD Physical Layer Simplified Spec 4.1 Section 4.7 for details.\r
\r
- @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.\r
- @param[in] Slot The slot number of the SD card to send the command to.\r
- @param[in] Rca The relative device address of selected device.\r
- @param[out] Scr The buffer to store the content of the SCR register.\r
-\r
- @retval EFI_SUCCESS The operation is done correctly.\r
- @retval Others The operation fails.\r
-\r
-**/\r
-EFI_STATUS\r
-SdCardGetScr (\r
- IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,\r
- IN UINT8 Slot,\r
- IN UINT16 Rca,\r
- OUT SD_SCR *Scr\r
- )\r
-{\r
- EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;\r
- EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;\r
- EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;\r
- EFI_STATUS Status;\r
-\r
- ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));\r
- ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));\r
- ZeroMem (&Packet, sizeof (Packet));\r
-\r
- Packet.SdMmcCmdBlk = &SdMmcCmdBlk;\r
- Packet.SdMmcStatusBlk = &SdMmcStatusBlk;\r
- Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;\r
-\r
- SdMmcCmdBlk.CommandIndex = SD_APP_CMD;\r
- SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;\r
- SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;\r
- SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;\r
-\r
- Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- SdMmcCmdBlk.CommandIndex = SD_SEND_SCR;\r
- SdMmcCmdBlk.CommandType = SdMmcCommandTypeAdtc;\r
- SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;\r
-\r
- Packet.InDataBuffer = Scr;\r
- Packet.InTransferLength = sizeof (SD_SCR);\r
-\r
- Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);\r
-\r
- return Status;\r
-}\r
\r
/**\r
Send command SELECT_DESELECT_CARD to the SD device to select/deselect it.\r