Send command SEND_CSD to the device to get the CSD register data. @param[in] Device A pointer to the SD_DEVICE instance. @param[in] Rca The relative device address to use. @param[out] Csd The buffer to store the SD_CSD register data. @retval EFI_SUCCESS The request is executed successfully. @retval EFI_OUT_OF_RESOURCES The requ
| 196 | |
| 197 | **/ |
| 198 | EFI_STATUS |
| 199 | SdGetCsd ( |
| 200 | IN SD_DEVICE *Device, |
| 201 | IN UINT16 Rca, |
| 202 | OUT SD_CSD *Csd |
| 203 | ) |
| 204 | { |
| 205 | EFI_STATUS Status; |
| 206 | EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru; |
| 207 | EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk; |
| 208 | EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk; |
| 209 | EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet; |
| 210 | |
| 211 | PassThru = Device->Private->PassThru; |
| 212 | |
| 213 | ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk)); |
| 214 | ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk)); |
| 215 | ZeroMem (&Packet, sizeof (Packet)); |
| 216 | ZeroMem (Csd, sizeof (SD_CSD)); |
| 217 | |
| 218 | Packet.SdMmcCmdBlk = &SdMmcCmdBlk; |
| 219 | Packet.SdMmcStatusBlk = &SdMmcStatusBlk; |
| 220 | Packet.Timeout = SD_GENERIC_TIMEOUT; |
| 221 | |
| 222 | SdMmcCmdBlk.CommandIndex = SD_SEND_CSD; |
| 223 | SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc; |
| 224 | SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2; |
| 225 | SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16; |
| 226 | |
| 227 | Status = PassThru->PassThru (PassThru, Device->Slot, &Packet, NULL); |
| 228 | |
| 229 | if (!EFI_ERROR(Status)) { |
| 230 | // |
| 231 | // For details, refer to SD Host Controller Simplified Spec 3.0 Table 2-12. |
| 232 | // |
| 233 | CopyMem(((UINT8*)Csd) + 1, &SdMmcStatusBlk.Resp0, sizeof (SD_CSD) - 1); |
| 234 | } |
| 235 | |
| 236 | return Status; |
| 237 | } |
| 238 | |
| 239 | /** |
| 240 | Send command SEND_CID to the device to get the CID register data. |
no test coverage detected