📄 sdiocontrollerbase.cpp
字号:
if( bSlotStateChanged || m_bReinsertTheCard )
{
m_bReinsertTheCard = FALSE;
// If a card is inserted, unload the driver...
if(m_bDevicePresent == TRUE)
{
m_fCardInTheSlot = FALSE;
// indicate the slot change
SDHCDIndicateSlotStateChange(m_pHCContext, 0, DeviceEjected);
m_bDevicePresent = FALSE;
Stop_SDI_Clock();
RETAILMSG(WGH_SDCARD, (TEXT("CardDetectIstThread:SDHCD: Clock stopped...--------to unload the driver-----\r\n")));
}
if(IsCardPresent())
{
m_fCardInTheSlot = TRUE;
m_bDevicePresent = TRUE;
RETAILMSG(FUSQ_DEBUG, (TEXT("---------------SD CARD INTSERT ---\r\n")));
//----- 5. Reset the clock to the ID rate -----
vm_pSDIReg->SDICON |= LITTLE_ENDIAN_BYTE_ORDER; // Windows CE is always Little Endian.
vm_pSDIReg->SDIFSTA |= FIFO_RESET; // Reset the FIFO
vm_pSDIReg->SDIBSIZE = BYTES_PER_SECTOR;
vm_pSDIReg->SDIDTIMER = MAX_DATABUSY_TIMEOUT; // Data/busy timeout
SetClockRate(SD_DEFAULT_CARD_ID_CLOCK_RATE);
// give the card enough time for initialization
Start_SDI_Clock();
Wait_80_SDI_Clock_Cycles();
//----- 6. Inform the bus handler that this is the first command sent -----
m_bSendInitClocks = TRUE;
//----- 7. Indicate the slot change -----
SDHCDIndicateSlotStateChange(m_pHCContext, 0, DeviceInserted);
}
} // if
} // for
return TRUE;
}
//-------------------------------------------- Helper Functions ---------------------------------------
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function: CSDIOControllerBase::SendCommand()
Description: Issues the specified SDI command
Returns: SD_API_STATUS status code.
-------------------------------------------------------------------*/
SD_API_STATUS CSDIOControllerBase::SendCommand(UINT16 Cmd, UINT32 Arg, UINT16 respType, BOOL bDataTransfer)
{
unsigned int uiNewCmdRegVal = 0;
DWORD dwWaitCount = 0;
DEBUGMSG (SDHC_SEND_ZONE,(TEXT("SendCommand (0x%08x, 0x%04x, 0x%08x, 0x%04x, 0x%x) starts\r\n"),
this, Cmd, Arg, respType, bDataTransfer));
RETAILMSG (WGH_SDCARD,(TEXT("SendCommand (0x%08x, 0x%04x, 0x%08x, 0x%04x, 0x%x) starts\r\n"), this, Cmd, Arg, respType, bDataTransfer));
RETAILMSG (FUSQ_DEBUG,(TEXT("SendCommand (0x%08x, 0x%04x, 0x%08x, 0x%04x, 0x%x) starts\r\n"), this, Cmd, Arg, respType, bDataTransfer));
//----- 1. Reset any pending status flags -----
vm_pSDIReg->SDICSTA = (CRC_CHECK_FAILED | COMMAND_SENT | COMMAND_TIMED_OUT | RESPONSE_RECEIVED);
//----- 2. Specify the command's argument -----
vm_pSDIReg->SDICARG = Arg;
//----- 3. Specify the command's data transfer requirements -----
if(bDataTransfer == TRUE)
{
vm_pSDIReg->SDICCON |= SDIO_COMMAND_WITH_DATA;
}else
{
vm_pSDIReg->SDICCON &= ~SDIO_COMMAND_WITH_DATA;
}
//----- 4. Send the command to the MMC controller -----
switch(respType)
{
case NoResponse: // Response is not required, but make sure the command was sent
DEBUGMSG (SDHC_RESPONSE_ZONE,(TEXT("SendCommand no response required\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("SendCommand no response required\r\n")));
RETAILMSG (FUSQ_DEBUG,(TEXT("SendCommand no response required\r\n")));
vm_pSDIReg->SDICCON = START_COMMAND | COMMAND_START_BIT | (Cmd & MAX_CMD_VALUE);
while(!(vm_pSDIReg->SDICSTA & COMMAND_SENT))
{
dwWaitCount++;
if( dwWaitCount > WAIT_TIME )
{
DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD:SendCommand() - timeout waiting for command completion!\r\n")));
RETAILMSG(WGH_SDCARD, (TEXT("SDHCD:SendCommand() - timeout waiting for command completion!\r\n")));
return SD_API_STATUS_RESPONSE_TIMEOUT;
}
if( !IsCardPresent() )
{
DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD:SendCommand() - Card ejected!\r\n")));
RETAILMSG(WGH_SDCARD, (TEXT("SDHCD:SendCommand() - Card ejected!\r\n")));
return SD_API_STATUS_DEVICE_REMOVED;
}
if(vm_pSDIReg->SDICSTA & COMMAND_TIMED_OUT)
{
DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD:SendCommand() - Command 0x%04x timed out!\r\n"), Cmd));
RETAILMSG(WGH_SDCARD, (TEXT("SDHCD:SendCommand() - Command 0x%04x timed out!\r\n"), Cmd));
vm_pSDIReg->SDICSTA = COMMAND_TIMED_OUT; // Clear the error
return SD_API_STATUS_RESPONSE_TIMEOUT;
}
}
vm_pSDIReg->SDICSTA = COMMAND_SENT; // Clear the status
RETAILMSG(WGH_SDCARD, (TEXT("SSP REG Arg = 0x%x.\r\n"), Arg));
break;
case ResponseR1: // Short response required
case ResponseR1b:
case ResponseR3:
case ResponseR4:
case ResponseR5:
case ResponseR6:
DEBUGMSG (SDHC_RESPONSE_ZONE,(TEXT("sendSDICommand short response required\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("sendSDICommand short response required\r\n")));
RETAILMSG (FUSQ_DEBUG,(TEXT("SendCommand ResponseR6 required\r\n")));
// vm_pSDIReg->SDICCON = uiNewCmdRegVal | WAIT_FOR_RESPONSE | START_COMMAND | COMMAND_START_BIT | (Cmd & MAX_CMD_VALUE);
vm_pSDIReg->SDICCON = WAIT_FOR_RESPONSE | START_COMMAND | COMMAND_START_BIT | (Cmd & MAX_CMD_VALUE);
RETAILMSG(WGH_SDCARD, (TEXT("SSP REG Arg = 0x%x.\r\n"), Arg));
break;
case ResponseR2: // Long response required
DEBUGMSG (SDHC_RESPONSE_ZONE,(TEXT("sendSDICommand long response required\r\n")));
RETAILMSG(WGH_SDCARD, (TEXT("sendSDICommand long response required.\r\n")));
RETAILMSG (FUSQ_DEBUG,(TEXT("SendCommand ResponseR2 required\r\n")));
// vm_pSDIReg->SDICCON = uiNewCmdRegVal | LONG_RESPONSE | WAIT_FOR_RESPONSE | START_COMMAND | COMMAND_START_BIT | (Cmd & MAX_CMD_VALUE);
vm_pSDIReg->SDICCON = LONG_RESPONSE | WAIT_FOR_RESPONSE | START_COMMAND | COMMAND_START_BIT | (Cmd & MAX_CMD_VALUE);
RETAILMSG(WGH_SDCARD, (TEXT("SSP REG Arg = 0x%x.\r\n"), Arg));
break;
case ResponseR7:
DEBUGMSG (SDHC_RESPONSE_ZONE,(TEXT("sendSDICommand short response required")));
RETAILMSG (FUSQ_DEBUG,(TEXT("SendCommand ResponseR7 required\r\n")));
// vm_pSDIReg->SDICCON = uiNewCmdRegVal | WAIT_FOR_RESPONSE | START_COMMAND | COMMAND_START_BIT | (Cmd & MAX_CMD_VALUE);
vm_pSDIReg->SDICCON = WAIT_FOR_RESPONSE | START_COMMAND | COMMAND_START_BIT | (Cmd & MAX_CMD_VALUE);
break;
default:
DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD:sendSDICommand() - Invalid response type. Command not sent!\r\n")));
RETAILMSG(WGH_SDCARD, (TEXT("SDHCD:sendSDICommand() - Invalid response type. Command not sent!\r\n")));
RETAILMSG (FUSQ_DEBUG,(TEXT("SendCommand default Response required\r\n")));
return SD_API_STATUS_NOT_IMPLEMENTED;
RETAILMSG(WGH_SDCARD, (TEXT("SSP REG Arg = 0x%x.\r\n"), Arg));
break;
}
return SD_API_STATUS_SUCCESS;
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function: CSDIOControllerBase::GetCommandResponse()
Description: Retrieves the response info for the last SDI command
issues.
Notes: This routine assumes that the caller has already locked
the current request and checked for errors.
Returns: SD_API_STATUS status code.
-------------------------------------------------------------------*/
SD_API_STATUS CSDIOControllerBase::GetCommandResponse(PSD_BUS_REQUEST pRequest)
{
DEBUGMSG (SDHC_RESPONSE_ZONE,(TEXT("GetCommandResponse started\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("GetCommandResponse started\r\n")));
PUCHAR respBuff; // response buffer
DWORD dwWaitCount = 0;
int i=0;
//----- 1. Wait for the response information to get arrive at the controller -----
while(!(vm_pSDIReg->SDICSTA & RESPONSE_RECEIVED))
{
dwWaitCount++;
if( dwWaitCount > WAIT_TIME )
{
DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD:GetCommandResponse() - timeout waiting for command response!\r\n")));
RETAILMSG(WGH_SDCARD, (TEXT("SDHCD:GetCommandResponse() - timeout waiting for command response!\r\n")));
return SD_API_STATUS_RESPONSE_TIMEOUT;
}
if( !IsCardPresent() )
{
DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD:GetCommandResponse() - Card ejected!\r\n")));
RETAILMSG(WGH_SDCARD, (TEXT("SDHCD:GetCommandResponse() - ----------------------------Card ejected!\r\n")));
return SD_API_STATUS_DEVICE_REMOVED;
}
if(vm_pSDIReg->SDICSTA & COMMAND_TIMED_OUT)
{
vm_pSDIReg->SDICSTA = COMMAND_TIMED_OUT; // Clear the error
DEBUGMSG (SDCARD_ZONE_ERROR,(TEXT("GetCommandResponse returned SD_API_STATUS_RESPONSE_TIMEOUT (COMMAND_TIMED_OUT)\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("GetCommandResponse returned SD_API_STATUS_RESPONSE_TIMEOUT (COMMAND_TIMED_OUT)\r\n")));
return SD_API_STATUS_RESPONSE_TIMEOUT;
}
if(vm_pSDIReg->SDIDSTA & CRC_CHECK_FAILED)
{
vm_pSDIReg->SDIDSTA = CRC_CHECK_FAILED; // Clear the error
DEBUGMSG (SDCARD_ZONE_ERROR,(TEXT("GetCommandResponse returned SD_API_STATUS_CRC_ERROR (CRC_CHECK_FAILED)\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("GetCommandResponse returned SD_API_STATUS_CRC_ERROR (CRC_CHECK_FAILED)\r\n")));
return SD_API_STATUS_CRC_ERROR;
}
if(vm_pSDIReg->SDIDSTA & DATA_TRANSMIT_CRC_ERROR)
{
vm_pSDIReg->SDIDSTA = DATA_TRANSMIT_CRC_ERROR; // Clear the error
DEBUGMSG (SDCARD_ZONE_ERROR,(TEXT("getSDICommandResponse returned SD_API_STATUS_CRC_ERROR (DATA_TRANSMIT_CRC_ERROR)\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("getSDICommandResponse returned SD_API_STATUS_CRC_ERROR (DATA_TRANSMIT_CRC_ERROR)\r\n")));
return SD_API_STATUS_CRC_ERROR;
}
if(vm_pSDIReg->SDIDSTA & DATA_RECEIVE_CRC_ERROR)
{
vm_pSDIReg->SDIDSTA = DATA_RECEIVE_CRC_ERROR; // Clear the error
DEBUGMSG (SDCARD_ZONE_ERROR,(TEXT("GetCommandResponse returned SD_API_STATUS_CRC_ERROR (DATA_RECEIVE_CRC_ERROR)\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("GetCommandResponse returned SD_API_STATUS_CRC_ERROR (DATA_RECEIVE_CRC_ERROR)\r\n")));
return SD_API_STATUS_CRC_ERROR;
}
if(vm_pSDIReg->SDIDSTA & DATA_TIME_OUT)
{
vm_pSDIReg->SDIDSTA = DATA_TIME_OUT; // Clear the error
DEBUGMSG (SDCARD_ZONE_ERROR,(TEXT("GetCommandResponse returned SD_API_STATUS_DATA_TIMEOUT (DATA_TIME_OUT)\r\n")));
RETAILMSG (WGH_SDCARD,(TEXT("GetCommandResponse returned SD_API_STATUS_DATA_TIMEOUT (DATA_TIME_OUT)\r\n")));
return SD_API_STATUS_DATA_TIMEOUT;
}
}
vm_pSDIReg->SDICSTA = RESPONSE_RECEIVED; // Clear the status
//----- 2. Copy the response information to our "response buffer" -----
// NOTE: All START_BIT and TRANSMISSION_BIT bits ='0'. All END_BIT bits ='0'. All RESERVED bits ='1'
respBuff = pRequest->CommandResponse.ResponseBuffer;
switch(pRequest->CommandResponse.ResponseType)
{
case NoResponse:
RETAILMSG (FUSQ_DEBUG,(TEXT("GetCommandResponse NoResponse ----------\r\n")));
break;
case ResponseR1:
case ResponseR1b:
//--- SHORT RESPONSE (48 bits total)---
// Format: { START_BIT(1) | TRANSMISSION_BIT(1) | COMMAND_INDEX(6) | CARD_STATUS(32) | CRC7(7) | END_BIT(1) }
// NOTE: START_BIT and TRANSMISSION_BIT = 0, END_BIT = 1
//
RETAILMSG (FUSQ_DEBUG,(TEXT("GetCommandResponse ResponseR1b ----------\r\n")));
*(respBuff ) = (BYTE)(START_BIT | TRANSMISSION_BIT | pRequest->CommandCode);
*(respBuff + 1) = (BYTE)(vm_pSDIReg->SDIRSP0 );
*(respBuff + 2) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 8 );
*(respBuff + 3) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 16);
*(respBuff + 4) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 24);
*(respBuff + 5) = (BYTE)(END_RESERVED | END_BIT);
RETAILMSG(WGH_SDCARD, (TEXT("GetCommandResponse R1 or R1b returned (0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x)!\r\n"),
*(respBuff ), *(respBuff + 1), *(respBuff + 2), *(respBuff + 3), *(respBuff + 4), *(respBuff + 5)));
break;
case ResponseR3:
case ResponseR4:
//--- SHORT RESPONSE (48 bits total)---
// Format: { START_BIT(1) | TRANSMISSION_BIT(1) | RESERVED(6) | CARD_STATUS(32) | RESERVED(7) | END_BIT(1) }
//
RETAILMSG (FUSQ_DEBUG,(TEXT("GetCommandResponse ResponseR4 ----------\r\n")));
*(respBuff ) = (BYTE)(START_BIT | TRANSMISSION_BIT | START_RESERVED);
*(respBuff + 1) = (BYTE)(vm_pSDIReg->SDIRSP0 );
*(respBuff + 2) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 8 );
*(respBuff + 3) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 16);
*(respBuff + 4) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 24);
*(respBuff + 5) = (BYTE)(END_RESERVED | END_BIT);
RETAILMSG(WGH_SDCARD, (TEXT("GetCommandResponse R3 or R4 returned (0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x, 0x%2x)!\r\n"),
*(respBuff ), *(respBuff + 1), *(respBuff + 2), *(respBuff + 3), *(respBuff + 4), *(respBuff + 5)));
break;
case ResponseR5:
case ResponseR6:
//--- SHORT RESPONSE (48 bits total)---
// Format: { START_BIT(1) | TRANSMISSION_BIT(1) | COMMAND_INDEX(6) | RCA(16) | CARD_STATUS(16) | CRC7(7) | END_BIT(1) }
//
RETAILMSG (FUSQ_DEBUG,(TEXT("GetCommandResponse ResponseR6 ----------\r\n")));
*(respBuff ) = (BYTE)(START_BIT | TRANSMISSION_BIT | pRequest->CommandCode);
*(respBuff + 1) = (BYTE)(vm_pSDIReg->SDIRSP0 );
*(respBuff + 2) = (BYTE)(vm_pSDIReg->SDIRSP0 >> 8 );
*(respBuff + 3) = (BYTE)(vm_pSDIReg->SDIRSP0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -