📄 landzo
字号:
if (command->READ)
{
xfertyp |= SDHC_XFERTYP_DTDSEL_MASK;
}
if (command->BLOCKS > 1)
{
xfertyp |= SDHC_XFERTYP_MSBSEL_MASK;
}
if ((uint32) - 1 != command->BLOCKS)
{
SDHC_BLKATTR |= SDHC_BLKATTR_BLKCNT(command->BLOCKS);
xfertyp |= SDHC_XFERTYP_BCEN_MASK;
}
}
/* Issue command */
SDHC_DSADDR = 0;
SDHC_XFERTYP = xfertyp;
/* Wait for response */
if (SDHC_status_wait (SDHC_IRQSTAT_CIE_MASK | SDHC_IRQSTAT_CEBE_MASK | SDHC_IRQSTAT_CCE_MASK | SDHC_IRQSTAT_CC_MASK) != SDHC_IRQSTAT_CC_MASK)
{
SDHC_IRQSTAT |= SDHC_IRQSTAT_CTOE_MASK | SDHC_IRQSTAT_CIE_MASK | SDHC_IRQSTAT_CEBE_MASK | SDHC_IRQSTAT_CCE_MASK | SDHC_IRQSTAT_CC_MASK;
return 1;
}
/* Check card removal */
if (SDHC_IRQSTAT & SDHC_IRQSTAT_CRM_MASK)
{
SDHC_IRQSTAT |= SDHC_IRQSTAT_CTOE_MASK | SDHC_IRQSTAT_CC_MASK;
return 1;
}
/* Get response, if available */
if (SDHC_IRQSTAT & SDHC_IRQSTAT_CTOE_MASK)
{
SDHC_IRQSTAT |= SDHC_IRQSTAT_CTOE_MASK | SDHC_IRQSTAT_CC_MASK;
return -1;
}
if ((xfertyp & SDHC_XFERTYP_RSPTYP_MASK) != SDHC_XFERTYP_RSPTYP(ESDHC_XFERTYP_RSPTYP_NO))
{
command->RESPONSE[0] = SDHC_CMDRSP(0);
if ((xfertyp & SDHC_XFERTYP_RSPTYP_MASK) == SDHC_XFERTYP_RSPTYP(ESDHC_XFERTYP_RSPTYP_136))
{
command->RESPONSE[1] = SDHC_CMDRSP(1);
command->RESPONSE[2] = SDHC_CMDRSP(2);
command->RESPONSE[3] = SDHC_CMDRSP(3);
}
}
SDHC_IRQSTAT |= SDHC_IRQSTAT_CC_MASK;
return 0;
}
/*FUNCTION****************************************************************
*
* Function Name : _esdhc_ioctl
* Returned Value : MQX error code
* Comments :
* This function performs miscellaneous services for the ESDHC I/O device.
*
*END*********************************************************************/
int32 SDHC_ioctl
(
/* [IN] The command to perform */
uint32 cmd,
/* [IN/OUT] Parameters for the command */
void *param_ptr
)
{
ESDHC_INFO_STRUCT_PTR esdhc_info_ptr;
ESDHC_DEVICE_STRUCT_PTR esdhc_device_ptr;
ESDHC_INIT_STRUCT_CPTR esdhc_init_ptr;
ESDHC_COMMAND_STRUCT command;
uint8 mem, io, mmc, ceata, mp, hc;
int32 val;
uint32 result = ESDHC_OK;
uint32 *param32_ptr = param_ptr;
/* Check parameters */
esdhc_info_ptr = (ESDHC_INFO_STRUCT_PTR)&SDHC_Info;
if (NULL == esdhc_info_ptr)
{
return IO_DEVICE_DOES_NOT_EXIST;
}
esdhc_device_ptr = &SDHC_Device;
if (NULL == esdhc_device_ptr)
{
return IO_ERROR_DEVICE_INVALID;
}
esdhc_init_ptr = esdhc_device_ptr->INIT;
if (NULL == esdhc_init_ptr)
{
return IO_ERROR_DEVICE_INVALID;
}
switch (cmd)
{
case IO_IOCTL_ESDHC_INIT:
result = SDHC_init (esdhc_info_ptr, &K60_SDHC0_init);
if (ESDHC_OK != result)
{
break;
}
mem = FALSE;
io = FALSE;
mmc = FALSE;
ceata = FALSE;
hc = FALSE;
mp = FALSE;
/* CMD0 - Go to idle - reset card */
command.COMMAND = ESDHC_CMD0;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0;
command.READ = FALSE;
command.BLOCKS = 0;
if (SDHC_send_command (&command))
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
DELAY_MS(1100);
/* CMD8 - Send interface condition - check HC support */
command.COMMAND = ESDHC_CMD8;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0x000001AA;
command.READ = FALSE;
command.BLOCKS = 0;
val = SDHC_send_command (&command);
if (val == 0)
{
// SDHC Card
if (command.RESPONSE[0] != command.ARGUMENT)
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
hc = TRUE;
}
mp = TRUE;
if (mp)
{
/* CMD55 - Application specific command - check MMC */
command.COMMAND = ESDHC_CMD55;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0;
command.READ = FALSE;
command.BLOCKS = 0;
val = SDHC_send_command (&command);
if (val > 0)
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
if (val < 0)
{
/* MMC or CE-ATA */
io = FALSE;
mem = FALSE;
hc = FALSE;
/* CMD1 - Send operating conditions - check HC */
command.COMMAND = ESDHC_CMD1;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0x40300000;
command.READ = FALSE;
command.BLOCKS = 0;
if (SDHC_send_command (&command))
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
if (0x20000000 == (command.RESPONSE[0] & 0x60000000))
{
hc = TRUE;
}
mmc = TRUE;
/* CMD39 - Fast IO - check CE-ATA signature CE */
command.COMMAND = ESDHC_CMD39;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0x0C00;
command.READ = FALSE;
command.BLOCKS = 0;
if (SDHC_send_command (&command))
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
if (0xCE == (command.RESPONSE[0] >> 8) & 0xFF)
{
/* CMD39 - Fast IO - check CE-ATA signature AA */
command.COMMAND = ESDHC_CMD39;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0x0D00;
command.READ = FALSE;
command.BLOCKS = 0;
if (SDHC_send_command (&command))
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
if (0xAA == (command.RESPONSE[0] >> 8) & 0xFF)
{
mmc = FALSE;
ceata = TRUE;
}
}
}
else
{
/* SD */
/* ACMD41 - Send Operating Conditions */
command.COMMAND = ESDHC_ACMD41;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0;
command.READ = FALSE;
command.BLOCKS = 0;
if (SDHC_send_command (&command))
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
if (command.RESPONSE[0] & 0x300000)
{
val = 0;
do
{
DELAY_MS(BSP_ALARM_RESOLUTION);
val++;
/* CMD55 + ACMD41 - Send OCR */
command.COMMAND = ESDHC_CMD55;
command.TYPE = ESDHC_TYPE_NORMAL;
command.ARGUMENT = 0;
command.READ = FALSE;
command.BLOCKS = 0;
if (SDHC_send_command (&command))
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
command.COMMAND = ESDHC_ACMD41;
command.TYPE = ESDHC_TYPE_NORMAL;
if (hc)
{
command.ARGUMENT = 0x40300000;
}
else
{
command.ARGUMENT = 0x00300000;
}
command.READ = FALSE;
command.BLOCKS = 0;
if (SDHC_send_command (&command))
{
result = ESDHC_ERROR_INIT_FAILED;
break;
}
}
while ((0 == (command.RESPONSE[0] & 0x80000000)) && (val < BSP_ALARM_FREQUENCY));
if (ESDHC_OK != result)
{
break;
}
if (val >= BSP_ALARM_FREQUENCY)
{
hc = FALSE;
}
else
{
mem = TRUE;
if (hc)
{
hc = FALSE;
if (command.RESPONSE[0] & 0x40000000)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -