Send command SEND_CID to the device to get the CID register data. @param[in] Device A pointer to the SD_DEVICE instance. @param[in] Rca The relative device address to use. @param[out] Cid The buffer to store the SD_CID register data. @retval EFI_SUCCESS The request is executed successfully. @retval EFI_OUT_OF_RESOURCES The requ
| 249 | |
| 250 | **/ |
| 251 | EFI_STATUS |
| 252 | SdGetCid ( |
| 253 | IN SD_DEVICE *Device, |
| 254 | IN UINT16 Rca, |
| 255 | OUT SD_CID *Cid |
| 256 | ) |
| 257 | { |
| 258 | EFI_STATUS Status; |
| 259 | EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru; |
| 260 | EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk; |
| 261 | EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk; |
| 262 | EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet; |
| 263 | |
| 264 | PassThru = Device->Private->PassThru; |
| 265 | |
| 266 | ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk)); |
| 267 | ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk)); |
| 268 | ZeroMem (&Packet, sizeof (Packet)); |
| 269 | ZeroMem (Cid, sizeof (SD_CID)); |
| 270 | |
| 271 | Packet.SdMmcCmdBlk = &SdMmcCmdBlk; |
| 272 | Packet.SdMmcStatusBlk = &SdMmcStatusBlk; |
| 273 | Packet.Timeout = SD_GENERIC_TIMEOUT; |
| 274 | |
| 275 | SdMmcCmdBlk.CommandIndex = SD_SEND_CID; |
| 276 | SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc; |
| 277 | SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2; |
| 278 | SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16; |
| 279 | |
| 280 | Status = PassThru->PassThru (PassThru, Device->Slot, &Packet, NULL); |
| 281 | |
| 282 | if (!EFI_ERROR(Status)) { |
| 283 | // |
| 284 | // For details, refer to SD Host Controller Simplified Spec 3.0 Table 2-12. |
| 285 | // |
| 286 | CopyMem(((UINT8*)Cid) + 1, &SdMmcStatusBlk.Resp0, sizeof (SD_CID) - 1); |
| 287 | } |
| 288 | |
| 289 | return Status; |
| 290 | } |
| 291 | |
| 292 | /** |
| 293 | Read/write single block through sync or async I/O request. |
no test coverage detected