alder_lake_bios/Insyde/InsydeModulePkg/Include/SdCard.h

172 lines
7.8 KiB
C

/** @file
SD Card spec definition.
;******************************************************************************
;* Copyright (c) 2013 - 2015, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#ifndef _SD_CARD_H
#define _SD_CARD_H
#include "Mmc.h"
#define CHECK_PATTERN 0xAA ///< Physical Layer Simplified Specification Version 3.01 recommended 0xAA
#define ACMD6 6
#define ACMD13 13
#define ACMD23 23
#define ACMD41 41
#define ACMD42 42
#define ACMD51 51
#define FREQUENCY_SD_PP (25 * 1000 * 1000)
#define FREQUENCY_SD_PP_HIGH (50 * 1000 * 1000)
#define SD_BUS_WIDTH_1 0
#define SD_BUS_WIDTH_4 2
#define SD_SPEC_10 0
#define SD_SPEC_11 1
#define SD_SPEC_20 2
#pragma pack(1)
typedef struct {
UINT32 Reserved1 :15;// 0
UINT32 V27 :1; // 2.70V
UINT32 V28 :1; // 2.80V
UINT32 V29 :1; // 2.90V
UINT32 V30 :1; // 3.00V
UINT32 V31 :1; // 3.10V
UINT32 V32 :1; // 3.20V
UINT32 V33 :1; // 3.30V
UINT32 V34 :1; // 3.40V
UINT32 V35 :1; // 3.50V
UINT32 S18A :1; // Switching to 1.8V Accepted (S18A)
UINT32 Reserved2 :5; // Reserved
UINT32 CardCapacityStatus:1; // Card Capacity Status (CCS)
UINT32 CardBusy :1; // This bit is set to LOW if the card has not finished the power up routine
} SD_OCR;
typedef struct {
UINT8 NotUsed :1; // Not used, always 1 [0:0]
UINT8 CRC :7; // CRC [7:1]
UINT8 Reserved1 :2; // Reserved [9:8]
UINT8 FileFormat :2; // File format [11:10]
UINT8 TemporaryWriteProtect :1; // Temporary write protection [12:12]
UINT8 PermanentWriteProtect :1; // Permanent write protection [13:13]
UINT8 CopyFlag :1; // Copy flag (OTP) [14:14]
UINT8 FileFormatGroup :1; // File format group [15:15]
UINT16 Reserved2 :5; // Reserved [20:16]
UINT16 WriteBlkPartial :1; // Partial blocks for write allowed [21:21]
UINT16 MaxWriteBlkLen :4; // Max. write data block length [25:22]
UINT16 WriteSpeedFactor :3; // Write speed factor [28:26]
UINT16 Reserved3 :2; // Reserved [30:29]
UINT16 WriteProtectGroupEnable :1; // Write protect group enable [31:31]
UINT16 WriteProtectGroupSize :7; // Write protect group size [38:32]
UINT16 EraseSectorSize :7; // Erase sector size [45:39]
UINT16 EraseSingleBlkEnable :1; // Erase single block enable [46:46]
UINT16 Reserved4 :1; // Reserved [47:47]
UINT32 DeviceSizeLow16 :16;// Device size [69:48]
UINT32 DeviceSizeHigh6 :6; // Device size [69:48]
UINT32 Reserved5 :6; // Reserved [75:70]
UINT32 DSRImplemented :1; // DSR implemented [76:76]
UINT32 ReadBlkMisalign :1; // Read block misalignment [77:77]
UINT32 WriteBlkMisalign :1; // Write block misalignment [78:78]
UINT32 ReadBlkPartial :1; // Partial blocks for read allowed [79:79]
UINT16 MaxReadBlkLen :4; // Max. read data block length [83:80]
UINT16 CardCommandClasses :12;// Card command classes [95:84]
UINT8 MaxTransferRate; // Max. bus clock frequency [103:96]
UINT8 Nsac; // Data read access-time 2 in CLK cycles (NSAC*100) [111:104]
UINT8 Taac; // Data read access-time 1 [119:112]
UINT8 Reserved6 :6; // 0 [125:120]
UINT8 CsdStructure :2; // CSD structure [127:126]
} SD_CSD2;
typedef struct {
UINT8 NotUsed :1; // Not used, always 1 [0:0]
UINT8 CRC :7; // CRC [7:1]
UINT8 Reserved1 :2; // Reserved [9:8]
UINT8 FileFormat :2; // File format [11:10]
UINT8 TemporaryWriteProtect :1; // Temporary write protection [12:12]
UINT8 PermanentWriteProtect :1; // Permanent write protection [13:13]
UINT8 CopyFlag :1; // Copy flag (OTP) [14:14]
UINT8 FileFormatGroup :1; // File format group [15:15]
UINT16 Reserved2 :5; // Reserved [20:16]
UINT16 WriteBlkPartial :1; // Partial blocks for write allowed [21:21]
UINT16 MaxWriteBlkLen :4; // Max. write data block length [25:22]
UINT16 WriteSpeedFactor :3; // Write speed factor [28:26]
UINT16 Reserved3 :2; // Reserved [30:29]
UINT16 WriteProtectGroupEnable :1; // Write protect group enable [31:31]
UINT32 WriteProtectGroupSize :7; // Write protect group size [38:32]
UINT32 EraseSectorSize :7; // Erase sector size [45:39]
UINT32 EraseSingleBlkEnable :1; // Erase single block enable [46:46]
UINT32 DeviceSizeMult :3; // Device size multiplier [49:47]
UINT32 VddMaxWriteCurrent :3; // Max. write current @ VDD max [52:50]
UINT32 VddMinWriteCurrent :3; // Max. write current @ VDD min [55:53]
UINT32 VddMaxReadCurrent :3; // Max. read current @ VDD max [58:56]
UINT32 VddMinReadCurrent :3; // Max. read current @ VDD min [61:59]
UINT32 DeviceSizeLow2 :2; // Device size [63:62]
UINT32 DeviceSizeHigh10 :10;// Device size [73:64]
UINT32 Reserved4 :2; // Reserved [75:74]
UINT32 DSRImplemented :1; // DSR implemented [76:76]
UINT32 ReadBlkMisalign :1; // Read block misalignment [77:77]
UINT32 WriteBlkMisalign :1; // Write block misalignment [78:78]
UINT32 ReadBlkPartial :1; // Partial blocks for read allowed [79:79]
UINT32 MaxReadBlkLen :4; // Max. read data block length [83:80]
UINT32 CardCommandClasses :12;// Card command classes [95:84]
UINT8 MaxTransferRate; // Max. bus clock frequency [103:96]
UINT8 Nsac; // Data read access-time 2 in CLK cycles (NSAC*100) [111:104]
UINT8 Taac; // Data read access-time 1 [119:112]
UINT8 Reserved5 :6; // Reserved [125:120]
UINT8 CsdStructure :2; // CSD structure [127:126]
} SD_CSD1;
typedef struct {
UINT8 NotUsed :1; // 1 [0:0]
UINT8 Checksum :7; // CRC7 checksum [7:1]
UINT16 ManufacturingDate :12;// Manufacturing date [19:8]
UINT16 Reserved1 :4; // Reserved [23:20]
UINT32 ProductSerialNumber; // Product serial number [55:24]
UINT8 ProductRevision; // Product revision [63:56]
UINT8 ProductName[5]; // Product name [64:103]
UINT16 OemApplicationId; // OEM/Application ID [119:104]
UINT8 ManufacturerId; // Manufacturer ID [127:120]
} SD_CID;
//
// TODO: Swtich Status data structure is different from the spec
// Switch Status data structure here is in the reverse order of the spec definition since all the actual SD cards we tested are so
//
typedef struct {
UINT16 MaxCurrent;
UINT16 Group6Function;
UINT16 Group5Function;
UINT16 Group4Function;
UINT16 Group3Function;
UINT16 Group2Function;
UINT16 Group1Function;
UINT8 Group65Status;
UINT8 Group43Status;
UINT8 Group21Status;
UINT8 DataStructureVersion;
UINT16 Group6BusyStatus;
UINT16 Group5BusyStatus;
UINT16 Group4BusyStatus;
UINT16 Group3BusyStatus;
UINT16 Group2BusyStatus;
UINT16 Group1BusyStatus;
UINT8 Reserved0[34];
} SWITCH_STATUS;
#pragma pack()
#endif