mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-29 08:34:07 +02:00
EmbeddedPkg: Fix Command Argument for SD/eMMC R/W operation.
Issue : SD read failure for high capacity cards e.g. 64 GB Reason : Command argument value exceeds 32 bit for block number 0x3787FFF and cant be fit into 32 bit wide SD host controller register. Fix : AccessMode bits [29:30] of OCR is a valid definition to calculate data address for eMMC cards. For SD cards, data address is calculated on the basis of card capacity status bit[30] of OCR. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal@nxp.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
parent
d5788777bc
commit
b566259c8a
@ -70,6 +70,8 @@
|
|||||||
#define SD_HIGH_SPEED 50000000
|
#define SD_HIGH_SPEED 50000000
|
||||||
#define SWITCH_CMD_SUCCESS_MASK 0x0f000000
|
#define SWITCH_CMD_SUCCESS_MASK 0x0f000000
|
||||||
|
|
||||||
|
#define SD_CARD_CAPACITY 0x00000002
|
||||||
|
|
||||||
#define BUSWIDTH_4 4
|
#define BUSWIDTH_4 4
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -148,12 +148,23 @@ MmcTransferBlock (
|
|||||||
MmcHostInstance = MMC_HOST_INSTANCE_FROM_BLOCK_IO_THIS (This);
|
MmcHostInstance = MMC_HOST_INSTANCE_FROM_BLOCK_IO_THIS (This);
|
||||||
MmcHost = MmcHostInstance->MmcHost;
|
MmcHost = MmcHostInstance->MmcHost;
|
||||||
|
|
||||||
//Set command argument based on the card access mode (Byte mode or Block mode)
|
if (MmcHostInstance->CardInfo.CardType != EMMC_CARD) {
|
||||||
if ((MmcHostInstance->CardInfo.OCRData.AccessMode & MMC_OCR_ACCESS_MASK) ==
|
//Set command argument based on the card capacity
|
||||||
MMC_OCR_ACCESS_SECTOR) {
|
//if 0 : SDSC card
|
||||||
CmdArg = Lba;
|
//if 1 : SDXC/SDHC
|
||||||
|
if (MmcHostInstance->CardInfo.OCRData.AccessMode & SD_CARD_CAPACITY) {
|
||||||
|
CmdArg = Lba;
|
||||||
|
} else {
|
||||||
|
CmdArg = Lba * This->Media->BlockSize;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
CmdArg = Lba * This->Media->BlockSize;
|
//Set command argument based on the card access mode (Byte mode or Block mode)
|
||||||
|
if ((MmcHostInstance->CardInfo.OCRData.AccessMode & MMC_OCR_ACCESS_MASK) ==
|
||||||
|
MMC_OCR_ACCESS_SECTOR) {
|
||||||
|
CmdArg = Lba;
|
||||||
|
} else {
|
||||||
|
CmdArg = Lba * This->Media->BlockSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = MmcHost->SendCommand (MmcHost, Cmd, CmdArg);
|
Status = MmcHost->SendCommand (MmcHost, Cmd, CmdArg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user