⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdiocontrollerbase.cpp

📁 2440 SD卡驱动源码第二部分继续上传
💻 CPP
📖 第 1 页 / 共 5 页
字号:

        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 + -