Fixed SD card initialisation.
This commit is contained in:
parent
d98a27f637
commit
d3f045e7c3
3 changed files with 80 additions and 79 deletions
|
@ -101,9 +101,9 @@ DSTATUS disk_initialize (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//DSTATUS stat;
|
//DSTATUS stat;
|
||||||
//int result;
|
int result;
|
||||||
|
|
||||||
//switch (pdrv) {
|
switch (pdrv) {
|
||||||
////case DEV_RAM :
|
////case DEV_RAM :
|
||||||
//// result = RAM_disk_initialize();
|
//// result = RAM_disk_initialize();
|
||||||
|
|
||||||
|
@ -111,12 +111,12 @@ DSTATUS disk_initialize (
|
||||||
|
|
||||||
//// return stat;
|
//// return stat;
|
||||||
|
|
||||||
////case DEV_MMC :
|
case DEV_MMC :
|
||||||
//// result = MMC_disk_initialize();
|
result = pEMMC->Initialize();
|
||||||
|
|
||||||
//// // translate the reslut code here
|
// translate the reslut code here
|
||||||
|
|
||||||
//// return stat;
|
break;
|
||||||
|
|
||||||
////case DEV_USB :
|
////case DEV_USB :
|
||||||
//// result = USB_disk_initialize();
|
//// result = USB_disk_initialize();
|
||||||
|
@ -124,7 +124,7 @@ DSTATUS disk_initialize (
|
||||||
//// // translate the reslut code here
|
//// // translate the reslut code here
|
||||||
|
|
||||||
//// return stat;
|
//// return stat;
|
||||||
//}
|
}
|
||||||
//return STA_NOINIT;
|
//return STA_NOINIT;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
138
src/emmc.cpp
138
src/emmc.cpp
|
@ -442,7 +442,7 @@ bool CEMMCDevice::Initialize(void)
|
||||||
PowerOn();
|
PowerOn();
|
||||||
//if (PowerOn() == false)
|
//if (PowerOn() == false)
|
||||||
//{
|
//{
|
||||||
// DEBUG_LOG("BCM2708 controller did not power on successfully");
|
// DEBUG_LOG("BCM2708 controller did not power on successfully\r\n");
|
||||||
// return false;
|
// return false;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
@ -461,7 +461,7 @@ bool CEMMCDevice::Initialize(void)
|
||||||
m_hci_ver = sdversion;
|
m_hci_ver = sdversion;
|
||||||
if (m_hci_ver < 2)
|
if (m_hci_ver < 2)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Only SDHCI versions >= 3.0 are supported");
|
DEBUG_LOG("Only SDHCI versions >= 3.0 are supported\r\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -556,7 +556,7 @@ bool CEMMCDevice::PowerOn(void)
|
||||||
{
|
{
|
||||||
u32 state = buf->data.buffer_32[0];
|
u32 state = buf->data.buffer_32[0];
|
||||||
|
|
||||||
//DEBUG_LOG("state = %x\r\n, state");
|
//DEBUG_LOG("state = %x\r\n, state\r\n");
|
||||||
//DEBUG_LOG("state = %x %x %x\r\n", buf->data.buffer_32[0], buf->data.buffer_32[1], buf->data.buffer_32[2]);
|
//DEBUG_LOG("state = %x %x %x\r\n", buf->data.buffer_32[0], buf->data.buffer_32[1], buf->data.buffer_32[2]);
|
||||||
|
|
||||||
if ((state & POWER_STATE_DEVICE_DOESNT_EXIST) || ((state & 1) == POWER_STATE_OFF))
|
if ((state & POWER_STATE_DEVICE_DOESNT_EXIST) || ((state & 1) == POWER_STATE_OFF))
|
||||||
|
@ -660,7 +660,7 @@ u32 CEMMCDevice::GetClockDivider(u32 base_clock, u32 target_rate)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Unsupported host version");
|
DEBUG_LOG("Unsupported host version\r\n");
|
||||||
|
|
||||||
return SD_GET_CLOCK_DIVIDER_FAIL;
|
return SD_GET_CLOCK_DIVIDER_FAIL;
|
||||||
}
|
}
|
||||||
|
@ -716,7 +716,7 @@ int CEMMCDevice::ResetCmd(void)
|
||||||
|
|
||||||
if (TimeoutWait(EMMC_CONTROL1, SD_RESET_CMD, 0, 1000000) < 0)
|
if (TimeoutWait(EMMC_CONTROL1, SD_RESET_CMD, 0, 1000000) < 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("CMD line did not reset properly");
|
DEBUG_LOG("CMD line did not reset properly\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -731,7 +731,7 @@ int CEMMCDevice::ResetDat(void)
|
||||||
|
|
||||||
if (TimeoutWait(EMMC_CONTROL1, SD_RESET_DAT, 0, 1000000) < 0)
|
if (TimeoutWait(EMMC_CONTROL1, SD_RESET_DAT, 0, 1000000) < 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("DAT line did not reset properly");
|
DEBUG_LOG("DAT line did not reset properly\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -801,7 +801,7 @@ void CEMMCDevice::IssueCommandInt(u32 cmd_reg, u32 argument, int timeout)
|
||||||
if ((irpts & 0xffff0001) != 1)
|
if ((irpts & 0xffff0001) != 1)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Error occured whilst waiting for command complete interrupt");
|
DEBUG_LOG("Error occured whilst waiting for command complete interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
m_last_error = irpts & 0xffff0000;
|
m_last_error = irpts & 0xffff0000;
|
||||||
m_last_interrupt = irpts;
|
m_last_interrupt = irpts;
|
||||||
|
@ -845,7 +845,7 @@ void CEMMCDevice::IssueCommandInt(u32 cmd_reg, u32 argument, int timeout)
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
if (m_blocks_to_transfer > 1)
|
if (m_blocks_to_transfer > 1)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Multi block transfer");
|
DEBUG_LOG("Multi block transfer\r\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
TimeoutWait(EMMC_INTERRUPT, wr_irpt | 0x8000, 1, timeout);
|
TimeoutWait(EMMC_INTERRUPT, wr_irpt | 0x8000, 1, timeout);
|
||||||
|
@ -855,7 +855,7 @@ void CEMMCDevice::IssueCommandInt(u32 cmd_reg, u32 argument, int timeout)
|
||||||
if ((irpts &(0xffff0000 | wr_irpt)) != wr_irpt)
|
if ((irpts &(0xffff0000 | wr_irpt)) != wr_irpt)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG
|
#ifdef EMMC_DEBUG
|
||||||
DEBUG_LOG("Error occured whilst waiting for data ready interrupt");
|
DEBUG_LOG("Error occured whilst waiting for data ready interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
m_last_error = irpts & 0xffff0000;
|
m_last_error = irpts & 0xffff0000;
|
||||||
m_last_interrupt = irpts;
|
m_last_interrupt = irpts;
|
||||||
|
@ -887,7 +887,7 @@ void CEMMCDevice::IssueCommandInt(u32 cmd_reg, u32 argument, int timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Block transfer complete");
|
DEBUG_LOG("Block transfer complete\r\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -914,7 +914,7 @@ void CEMMCDevice::IssueCommandInt(u32 cmd_reg, u32 argument, int timeout)
|
||||||
&&((irpts & 0xffff0002) != 0x100002))
|
&&((irpts & 0xffff0002) != 0x100002))
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG
|
#ifdef EMMC_DEBUG
|
||||||
DEBUG_LOG("Error occured whilst waiting for transfer complete interrupt");
|
DEBUG_LOG("Error occured whilst waiting for transfer complete interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
m_last_error = irpts & 0xffff0000;
|
m_last_error = irpts & 0xffff0000;
|
||||||
m_last_interrupt = irpts;
|
m_last_interrupt = irpts;
|
||||||
|
@ -937,7 +937,7 @@ void CEMMCDevice::HandleCardInterrupt(void)
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
u32 status = read32(EMMC_STATUS);
|
u32 status = read32(EMMC_STATUS);
|
||||||
|
|
||||||
DEBUG_LOG("Card interrupt");
|
DEBUG_LOG("Card interrupt\r\n");
|
||||||
DEBUG_LOG("controller status: %08x\r\n", status);
|
DEBUG_LOG("controller status: %08x\r\n", status);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -948,7 +948,7 @@ void CEMMCDevice::HandleCardInterrupt(void)
|
||||||
if (FAIL)
|
if (FAIL)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG
|
#ifdef EMMC_DEBUG
|
||||||
DEBUG_LOG("Unable to get card status");
|
DEBUG_LOG("Unable to get card status\r\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -961,7 +961,7 @@ void CEMMCDevice::HandleCardInterrupt(void)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("no card currently selected");
|
DEBUG_LOG("no card currently selected\r\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -974,7 +974,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_COMMAND_COMPLETE)
|
if (irpts & SD_COMMAND_COMPLETE)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("spurious command complete interrupt");
|
DEBUG_LOG("spurious command complete interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_COMMAND_COMPLETE;
|
reset_mask |= SD_COMMAND_COMPLETE;
|
||||||
}
|
}
|
||||||
|
@ -982,7 +982,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_TRANSFER_COMPLETE)
|
if (irpts & SD_TRANSFER_COMPLETE)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("spurious transfer complete interrupt");
|
DEBUG_LOG("spurious transfer complete interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_TRANSFER_COMPLETE;
|
reset_mask |= SD_TRANSFER_COMPLETE;
|
||||||
}
|
}
|
||||||
|
@ -990,7 +990,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_BLOCK_GAP_EVENT)
|
if (irpts & SD_BLOCK_GAP_EVENT)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("spurious block gap event interrupt");
|
DEBUG_LOG("spurious block gap event interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_BLOCK_GAP_EVENT;
|
reset_mask |= SD_BLOCK_GAP_EVENT;
|
||||||
}
|
}
|
||||||
|
@ -998,7 +998,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_DMA_INTERRUPT)
|
if (irpts & SD_DMA_INTERRUPT)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("spurious DMA interrupt");
|
DEBUG_LOG("spurious DMA interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_DMA_INTERRUPT;
|
reset_mask |= SD_DMA_INTERRUPT;
|
||||||
}
|
}
|
||||||
|
@ -1006,7 +1006,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_BUFFER_WRITE_READY)
|
if (irpts & SD_BUFFER_WRITE_READY)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("spurious buffer write ready interrupt");
|
DEBUG_LOG("spurious buffer write ready interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_BUFFER_WRITE_READY;
|
reset_mask |= SD_BUFFER_WRITE_READY;
|
||||||
ResetDat();
|
ResetDat();
|
||||||
|
@ -1015,7 +1015,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_BUFFER_READ_READY)
|
if (irpts & SD_BUFFER_READ_READY)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("spurious buffer read ready interrupt");
|
DEBUG_LOG("spurious buffer read ready interrupt\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_BUFFER_READ_READY;
|
reset_mask |= SD_BUFFER_READ_READY;
|
||||||
ResetDat();
|
ResetDat();
|
||||||
|
@ -1024,7 +1024,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_CARD_INSERTION)
|
if (irpts & SD_CARD_INSERTION)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("card insertion detected");
|
DEBUG_LOG("card insertion detected\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_CARD_INSERTION;
|
reset_mask |= SD_CARD_INSERTION;
|
||||||
}
|
}
|
||||||
|
@ -1032,7 +1032,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_CARD_REMOVAL)
|
if (irpts & SD_CARD_REMOVAL)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("card removal detected");
|
DEBUG_LOG("card removal detected\r\n");
|
||||||
#endif
|
#endif
|
||||||
reset_mask |= SD_CARD_REMOVAL;
|
reset_mask |= SD_CARD_REMOVAL;
|
||||||
m_card_removal = 1;
|
m_card_removal = 1;
|
||||||
|
@ -1041,7 +1041,7 @@ void CEMMCDevice::HandleInterrupts(void)
|
||||||
if (irpts & SD_CARD_INTERRUPT)
|
if (irpts & SD_CARD_INTERRUPT)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("card interrupt detected");
|
DEBUG_LOG("card interrupt detected\r\n");
|
||||||
#endif
|
#endif
|
||||||
HandleCardInterrupt();
|
HandleCardInterrupt();
|
||||||
reset_mask |= SD_CARD_INTERRUPT;
|
reset_mask |= SD_CARD_INTERRUPT;
|
||||||
|
@ -1124,7 +1124,7 @@ bool CEMMCDevice::IssueCommand(u32 command, u32 argument, int timeout)
|
||||||
|
|
||||||
if (m_last_error == 0)
|
if (m_last_error == 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("TIMEOUT");
|
DEBUG_LOG("TIMEOUT\r\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1139,7 +1139,7 @@ bool CEMMCDevice::IssueCommand(u32 command, u32 argument, int timeout)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DEBUG_LOG("command completed successfully");
|
DEBUG_LOG("command completed successfully\r\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1149,7 +1149,7 @@ bool CEMMCDevice::IssueCommand(u32 command, u32 argument, int timeout)
|
||||||
int CEMMCDevice::CardReset(void)
|
int CEMMCDevice::CardReset(void)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Resetting controller");
|
DEBUG_LOG("Resetting controller\r\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u32 control1 = read32(EMMC_CONTROL1);
|
u32 control1 = read32(EMMC_CONTROL1);
|
||||||
|
@ -1160,7 +1160,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
write32(EMMC_CONTROL1, control1);
|
write32(EMMC_CONTROL1, control1);
|
||||||
if (TimeoutWait(EMMC_CONTROL1, 7 << 24, 0, 1000000) < 0)
|
if (TimeoutWait(EMMC_CONTROL1, 7 << 24, 0, 1000000) < 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Controller did not reset properly");
|
DEBUG_LOG("Controller did not reset properly\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1171,13 +1171,13 @@ int CEMMCDevice::CardReset(void)
|
||||||
|
|
||||||
// Check for a valid card
|
// Check for a valid card
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("checking for an inserted card");
|
DEBUG_LOG("checking for an inserted card\r\n");
|
||||||
#endif
|
#endif
|
||||||
TimeoutWait(EMMC_STATUS, 1 << 16, 1, 500000);
|
TimeoutWait(EMMC_STATUS, 1 << 16, 1, 500000);
|
||||||
u32 status_reg = read32(EMMC_STATUS);
|
u32 status_reg = read32(EMMC_STATUS);
|
||||||
if ((status_reg &(1 << 16)) == 0)
|
if ((status_reg &(1 << 16)) == 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("no card inserted");
|
DEBUG_LOG("no card inserted\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1192,13 +1192,13 @@ int CEMMCDevice::CardReset(void)
|
||||||
u32 base_clock = get_clock_rate(CLOCK_ID_EMMC);
|
u32 base_clock = get_clock_rate(CLOCK_ID_EMMC);
|
||||||
if (base_clock == 0)
|
if (base_clock == 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("assuming clock rate to be 100MHz");
|
DEBUG_LOG("assuming clock rate to be 100MHz\r\n");
|
||||||
base_clock = 100000000;
|
base_clock = 100000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set clock rate to something slow
|
// Set clock rate to something slow
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("setting clock rate");
|
DEBUG_LOG("setting clock rate\r\n");
|
||||||
#endif
|
#endif
|
||||||
control1 = read32(EMMC_CONTROL1);
|
control1 = read32(EMMC_CONTROL1);
|
||||||
control1 |= 1; // enable clock
|
control1 |= 1; // enable clock
|
||||||
|
@ -1207,7 +1207,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
u32 f_id = GetClockDivider(base_clock, SD_CLOCK_ID);
|
u32 f_id = GetClockDivider(base_clock, SD_CLOCK_ID);
|
||||||
if (f_id == SD_GET_CLOCK_DIVIDER_FAIL)
|
if (f_id == SD_GET_CLOCK_DIVIDER_FAIL)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("unable to get a valid clock divider for ID frequency");
|
DEBUG_LOG("unable to get a valid clock divider for ID frequency\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1221,7 +1221,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
|
|
||||||
if (TimeoutWait(EMMC_CONTROL1, 2, 1, 1000000) < 0)
|
if (TimeoutWait(EMMC_CONTROL1, 2, 1, 1000000) < 0)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Clock did not stabilise within 1 second");
|
DEBUG_LOG("Clock did not stabilise within 1 second\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1232,7 +1232,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
|
|
||||||
// Enable the SD clock
|
// Enable the SD clock
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("enabling SD clock");
|
DEBUG_LOG("enabling SD clock\r\n");
|
||||||
#endif
|
#endif
|
||||||
delay_us(2000);
|
delay_us(2000);
|
||||||
control1 = read32(EMMC_CONTROL1);
|
control1 = read32(EMMC_CONTROL1);
|
||||||
|
@ -1288,7 +1288,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
// Send CMD0 to the card(reset to idle state)
|
// Send CMD0 to the card(reset to idle state)
|
||||||
if (!IssueCommand(GO_IDLE_STATE, 0))
|
if (!IssueCommand(GO_IDLE_STATE, 0))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("no CMD0 response");
|
DEBUG_LOG("no CMD0 response\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1297,7 +1297,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
// Voltage supplied = 0x1 = 2.7-3.6V(standard)
|
// Voltage supplied = 0x1 = 2.7-3.6V(standard)
|
||||||
// Check pattern = 10101010b(as per PLSS 4.3.13) = 0xAA
|
// Check pattern = 10101010b(as per PLSS 4.3.13) = 0xAA
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Note a timeout error on the following command(CMD8) is normal and expected if the SD card version is less than 2.0");
|
DEBUG_LOG("Note a timeout error on the following command(CMD8) is normal and expected if the SD card version is less than 2.0\r\n");
|
||||||
#endif
|
#endif
|
||||||
IssueCommand(SEND_IF_COND, 0x1aa);
|
IssueCommand(SEND_IF_COND, 0x1aa);
|
||||||
int v2_later = 0;
|
int v2_later = 0;
|
||||||
|
@ -1324,7 +1324,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
{
|
{
|
||||||
if ((m_last_r0 & 0xfff) != 0x1aa)
|
if ((m_last_r0 & 0xfff) != 0x1aa)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("unusable card");
|
DEBUG_LOG("unusable card\r\n");
|
||||||
#ifdef EMMC_DEBUG
|
#ifdef EMMC_DEBUG
|
||||||
DEBUG_LOG("CMD8 response %08x\r\n", m_last_r0);
|
DEBUG_LOG("CMD8 response %08x\r\n", m_last_r0);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1340,7 +1340,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
// Here we are supposed to check the response to CMD5(HCSS 3.6)
|
// Here we are supposed to check the response to CMD5(HCSS 3.6)
|
||||||
// It only returns if the card is a SDIO card
|
// It only returns if the card is a SDIO card
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Note that a timeout error on the following command(CMD5) is normal and expected if the card is not a SDIO card.");
|
DEBUG_LOG("Note that a timeout error on the following command(CMD5) is normal and expected if the card is not a SDIO card.\r\n");
|
||||||
#endif
|
#endif
|
||||||
IssueCommand(IO_SET_OP_COND, 0, 10000);
|
IssueCommand(IO_SET_OP_COND, 0, 10000);
|
||||||
if (!TIMEOUT)
|
if (!TIMEOUT)
|
||||||
|
@ -1356,7 +1356,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DEBUG_LOG("SDIO card detected - not currently supported");
|
DEBUG_LOG("SDIO card detected - not currently supported\r\n");
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("CMD5 returned %08x\r\n", m_last_r0);
|
DEBUG_LOG("CMD5 returned %08x\r\n", m_last_r0);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1367,11 +1367,11 @@ int CEMMCDevice::CardReset(void)
|
||||||
|
|
||||||
// Call an inquiry ACMD41(voltage window = 0) to get the OCR
|
// Call an inquiry ACMD41(voltage window = 0) to get the OCR
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("sending inquiry ACMD41");
|
DEBUG_LOG("sending inquiry ACMD41\r\n");
|
||||||
#endif
|
#endif
|
||||||
if (!IssueCommand(ACMD(41), 0))
|
if (!IssueCommand(ACMD(41), 0))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Inquiry ACMD41 failed");
|
DEBUG_LOG("Inquiry ACMD41 failed\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
|
@ -1403,7 +1403,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
|
|
||||||
if (!IssueCommand(ACMD(41), 0x00ff8000 | v2_flags))
|
if (!IssueCommand(ACMD(41), 0x00ff8000 | v2_flags))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Error issuing ACMD41");
|
DEBUG_LOG("Error issuing ACMD41\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1426,7 +1426,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
{
|
{
|
||||||
// Card is still busy
|
// Card is still busy
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Card is busy, retrying");
|
DEBUG_LOG("Card is busy, retrying\r\n");
|
||||||
#endif
|
#endif
|
||||||
delay_us(500000);
|
delay_us(500000);
|
||||||
}
|
}
|
||||||
|
@ -1447,7 +1447,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
if (m_card_supports_18v)
|
if (m_card_supports_18v)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("switching to 1.8V mode");
|
DEBUG_LOG("switching to 1.8V mode\r\n");
|
||||||
#endif
|
#endif
|
||||||
// As per HCSS 3.6.1
|
// As per HCSS 3.6.1
|
||||||
|
|
||||||
|
@ -1455,7 +1455,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
if (!IssueCommand(VOLTAGE_SWITCH, 0))
|
if (!IssueCommand(VOLTAGE_SWITCH, 0))
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG
|
#ifdef EMMC_DEBUG
|
||||||
DEBUG_LOG("error issuing VOLTAGE_SWITCH");
|
DEBUG_LOG("error issuing VOLTAGE_SWITCH\r\n");
|
||||||
#endif
|
#endif
|
||||||
m_failed_voltage_switch = 1;
|
m_failed_voltage_switch = 1;
|
||||||
PowerOff();
|
PowerOff();
|
||||||
|
@ -1474,7 +1474,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
if (dat30 != 0)
|
if (dat30 != 0)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG
|
#ifdef EMMC_DEBUG
|
||||||
DEBUG_LOG("DAT[3:0] did not settle to 0");
|
DEBUG_LOG("DAT[3:0] did not settle to 0\r\n");
|
||||||
#endif
|
#endif
|
||||||
m_failed_voltage_switch = 1;
|
m_failed_voltage_switch = 1;
|
||||||
PowerOff();
|
PowerOff();
|
||||||
|
@ -1495,7 +1495,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
if (((control0 >> 8) & 1) == 0)
|
if (((control0 >> 8) & 1) == 0)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG
|
#ifdef EMMC_DEBUG
|
||||||
DEBUG_LOG("controller did not keep 1.8V signal enable high");
|
DEBUG_LOG("controller did not keep 1.8V signal enable high\r\n");
|
||||||
#endif
|
#endif
|
||||||
m_failed_voltage_switch = 1;
|
m_failed_voltage_switch = 1;
|
||||||
PowerOff();
|
PowerOff();
|
||||||
|
@ -1525,14 +1525,14 @@ int CEMMCDevice::CardReset(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("voltage switch complete");
|
DEBUG_LOG("voltage switch complete\r\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send CMD2 to get the cards CID
|
// Send CMD2 to get the cards CID
|
||||||
if (!IssueCommand(ALL_SEND_CID, 0))
|
if (!IssueCommand(ALL_SEND_CID, 0))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("error sending ALL_SEND_CID");
|
DEBUG_LOG("error sending ALL_SEND_CID\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1548,7 +1548,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
// Send CMD3 to enter the data state
|
// Send CMD3 to enter the data state
|
||||||
if (!IssueCommand(SEND_RELATIVE_ADDR, 0))
|
if (!IssueCommand(SEND_RELATIVE_ADDR, 0))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("error sending SEND_RELATIVE_ADDR");
|
DEBUG_LOG("error sending SEND_RELATIVE_ADDR\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1567,28 +1567,28 @@ int CEMMCDevice::CardReset(void)
|
||||||
|
|
||||||
if (crc_error)
|
if (crc_error)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("CRC error");
|
DEBUG_LOG("CRC error\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (illegal_cmd)
|
if (illegal_cmd)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("illegal command");
|
DEBUG_LOG("illegal command\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("generic error");
|
DEBUG_LOG("generic error\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ready)
|
if (!ready)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("not ready for data");
|
DEBUG_LOG("not ready for data\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1600,7 +1600,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
// Now select the card(toggles it to transfer state)
|
// Now select the card(toggles it to transfer state)
|
||||||
if (!IssueCommand(SELECT_CARD, m_card_rca << 16))
|
if (!IssueCommand(SELECT_CARD, m_card_rca << 16))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("error sending CMD7");
|
DEBUG_LOG("error sending CMD7\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1620,7 +1620,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
{
|
{
|
||||||
if (!IssueCommand(SET_BLOCKLEN, SD_BLOCK_SIZE))
|
if (!IssueCommand(SET_BLOCKLEN, SD_BLOCK_SIZE))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Error sending SET_BLOCKLEN");
|
DEBUG_LOG("Error sending SET_BLOCKLEN\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1638,7 +1638,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
m_block_size = SD_BLOCK_SIZE;
|
m_block_size = SD_BLOCK_SIZE;
|
||||||
if (FAIL)
|
if (FAIL)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Error sending SEND_SCR");
|
DEBUG_LOG("Error sending SEND_SCR\r\n");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1689,7 +1689,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
// See HCSS 3.4 for the algorithm
|
// See HCSS 3.4 for the algorithm
|
||||||
#ifdef SD_4BIT_DATA
|
#ifdef SD_4BIT_DATA
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Switching to 4-bit data mode");
|
DEBUG_LOG("Switching to 4-bit data mode\r\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Disable card interrupt in host
|
// Disable card interrupt in host
|
||||||
|
@ -1700,7 +1700,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
// Send ACMD6 to change the card's bit mode
|
// Send ACMD6 to change the card's bit mode
|
||||||
if (!IssueCommand(SET_BUS_WIDTH, 2))
|
if (!IssueCommand(SET_BUS_WIDTH, 2))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Switch to 4-bit data mode failed");
|
DEBUG_LOG("Switch to 4-bit data mode failed\r\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1713,7 +1713,7 @@ int CEMMCDevice::CardReset(void)
|
||||||
write32(EMMC_IRPT_MASK, old_irpt_mask);
|
write32(EMMC_IRPT_MASK, old_irpt_mask);
|
||||||
|
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("switch to 4-bit complete");
|
DEBUG_LOG("switch to 4-bit complete\r\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1748,7 +1748,7 @@ int CEMMCDevice::EnsureDataMode(void)
|
||||||
|
|
||||||
if (!IssueCommand(SEND_STATUS, m_card_rca << 16))
|
if (!IssueCommand(SEND_STATUS, m_card_rca << 16))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("EnsureDataMode() error sending CMD13");
|
DEBUG_LOG("EnsureDataMode() error sending CMD13\r\n");
|
||||||
m_card_rca = 0;
|
m_card_rca = 0;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1764,7 +1764,7 @@ int CEMMCDevice::EnsureDataMode(void)
|
||||||
// Currently in the stand-by state - select it
|
// Currently in the stand-by state - select it
|
||||||
if (!IssueCommand(SELECT_CARD, m_card_rca << 16))
|
if (!IssueCommand(SELECT_CARD, m_card_rca << 16))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("EnsureDataMode() no response from CMD17");
|
DEBUG_LOG("EnsureDataMode() no response from CMD17\r\n");
|
||||||
m_card_rca = 0;
|
m_card_rca = 0;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1775,7 +1775,7 @@ int CEMMCDevice::EnsureDataMode(void)
|
||||||
// In the data transfer state - cancel the transmission
|
// In the data transfer state - cancel the transmission
|
||||||
if (!IssueCommand(STOP_TRANSMISSION, 0))
|
if (!IssueCommand(STOP_TRANSMISSION, 0))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("EnsureDataMode() no response from CMD12");
|
DEBUG_LOG("EnsureDataMode() no response from CMD12\r\n");
|
||||||
m_card_rca = 0;
|
m_card_rca = 0;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1798,11 +1798,11 @@ int CEMMCDevice::EnsureDataMode(void)
|
||||||
if (cur_state != 4)
|
if (cur_state != 4)
|
||||||
{
|
{
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("EnsureDataMode() rechecking status: ");
|
DEBUG_LOG("EnsureDataMode() rechecking status: \r\n");
|
||||||
#endif
|
#endif
|
||||||
if (!IssueCommand(SEND_STATUS, m_card_rca << 16))
|
if (!IssueCommand(SEND_STATUS, m_card_rca << 16))
|
||||||
{
|
{
|
||||||
DEBUG_LOG("EnsureDataMode() no response from CMD13");
|
DEBUG_LOG("EnsureDataMode() no response from CMD13\r\n");
|
||||||
m_card_rca = 0;
|
m_card_rca = 0;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1890,11 +1890,11 @@ int CEMMCDevice::DoDataCommand(int is_write, u8 *buf, size_t buf_size, u32 block
|
||||||
|
|
||||||
if (++retry_count < max_retries)
|
if (++retry_count < max_retries)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Retrying");
|
DEBUG_LOG("Retrying\r\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Giving up");
|
DEBUG_LOG("Giving up\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1947,7 +1947,7 @@ int CEMMCDevice::DoRead(u8 *buf, size_t buf_size, u32 block_no)
|
||||||
//}
|
//}
|
||||||
|
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Data read successful");
|
DEBUG_LOG("Data read successful\r\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return buf_size;
|
return buf_size;
|
||||||
|
@ -1971,7 +1971,7 @@ int CEMMCDevice::DoWrite(u8 *buf, size_t buf_size, u32 block_no)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EMMC_DEBUG2
|
#ifdef EMMC_DEBUG2
|
||||||
DEBUG_LOG("Data write successful");
|
DEBUG_LOG("Data write successful\r\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return buf_size;
|
return buf_size;
|
||||||
|
|
|
@ -1810,12 +1810,13 @@ extern "C"
|
||||||
|
|
||||||
m_EMMC.Initialize();
|
m_EMMC.Initialize();
|
||||||
|
|
||||||
disk_setEMM(&m_EMMC);
|
|
||||||
f_mount(&fileSystemSD, "SD:", 1);
|
|
||||||
|
|
||||||
#if not defined(EXPERIMENTALZERO)
|
#if not defined(EXPERIMENTALZERO)
|
||||||
RPI_AuxMiniUartInit(115200, 8);
|
RPI_AuxMiniUartInit(115200, 8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
disk_setEMM(&m_EMMC);
|
||||||
|
f_mount(&fileSystemSD, "SD:", 1);
|
||||||
|
|
||||||
LoadOptions();
|
LoadOptions();
|
||||||
|
|
||||||
InitialiseHardware();
|
InitialiseHardware();
|
||||||
|
|
Loading…
Reference in a new issue