in lib/cmsis/CMSIS/Pack/Example/CMSIS_Driver/MCI_LPC18xx.c [845:998]
void SDIO_IRQHandler (void) {
uint32_t rintsts, idsts;
uint32_t rintclr, idclr;
uint32_t event, mask;
event = 0;
rintclr = 0;
idclr = 0;
rintsts = LPC_SDMMC->RINTSTS;
idsts = LPC_SDMMC->IDSTS;
/* Abnormal Interrupt Summary */
if (idsts & SDMMC_IDSTS_DU) {
idclr |= SDMMC_IDSTS_DU;
/* Descriptor Unavailable Interrupt */
if (MCI.xfer.cnt) {
SetupDMADescriptor (&MCI.xfer, false);
LPC_SDMMC->PLDMND = 1;
}
}
if (idsts & SDMMC_IDSTS_FBE) {
idclr |= SDMMC_IDSTS_FBE;
/* Fatal Bus Error Interrupt */
event |= ARM_MCI_EVENT_TRANSFER_ERROR;
}
#if (RTE_SD_CD_PIN_EN)
if (rintsts & SDMMC_RINTSTS_CDET) {
rintclr |= SDMMC_RINTSTS_CDET;
/* Card detect */
if (LPC_SDMMC->CDETECT & 1) {
event |= ARM_MCI_EVENT_CARD_REMOVED;
}
else {
event |= ARM_MCI_EVENT_CARD_INSERTED;
}
}
#endif
if (rintsts & SDMMC_RINTSTS_RE) {
rintclr |= SDMMC_RINTSTS_RE;
/* Response error */
event |= ARM_MCI_EVENT_COMMAND_ERROR;
}
if (rintsts & SDMMC_RINTSTS_CDONE) {
rintclr |= SDMMC_RINTSTS_CDONE;
/* Command done */
event |= ARM_MCI_EVENT_COMMAND_COMPLETE;
if (MCI.response) {
/* Read response registers */
MCI.response[0] = LPC_SDMMC->RESP0;
if (MCI.flags & MCI_RESP_LONG) {
MCI.response[1] = LPC_SDMMC->RESP1;
MCI.response[2] = LPC_SDMMC->RESP2;
MCI.response[3] = LPC_SDMMC->RESP3;
}
}
}
if (rintsts & SDMMC_RINTSTS_DTO) {
rintclr |= SDMMC_RINTSTS_DTO;
/* Data transfer over */
event |= ARM_MCI_EVENT_TRANSFER_COMPLETE;
}
if (rintsts & SDMMC_RINTSTS_RCRC) {
rintclr |= SDMMC_RINTSTS_RCRC;
/* Response CRC error */
event |= ARM_MCI_EVENT_COMMAND_ERROR;
}
if (rintsts & SDMMC_RINTSTS_DCRC) {
rintclr |= SDMMC_RINTSTS_DCRC;
/* Data CRC error */
event |= ARM_MCI_EVENT_TRANSFER_ERROR;
}
if (rintsts & SDMMC_RINTSTS_RTO_BAR) {
rintclr |= SDMMC_RINTSTS_RTO_BAR;
/* Response time-out/Boot Ack Received */
event |= ARM_MCI_EVENT_COMMAND_TIMEOUT;
}
if (rintsts & SDMMC_RINTSTS_DRTO_BDS) {
rintclr |= SDMMC_RINTSTS_DRTO_BDS;
/* Data read time-out / Boot Data Start */
/* Card has not sent data within the time-out period */
event |= ARM_MCI_EVENT_TRANSFER_TIMEOUT;
}
if (rintsts & SDMMC_RINTSTS_HLE) {
rintclr |= SDMMC_RINTSTS_HLE;
/* Hardware locked error (command buffer full) */
event |= ARM_MCI_EVENT_COMMAND_ERROR;
}
if (rintsts & SDMMC_RINTSTS_SBE) {
rintclr |= SDMMC_RINTSTS_SBE;
/* Start-bit error */
event |= ARM_MCI_EVENT_TRANSFER_ERROR;
}
if (rintsts & SDMMC_RINTSTS_EBE) {
rintclr |= SDMMC_RINTSTS_EBE;
/* End-bit error (read)/write no CRC */
event |= ARM_MCI_EVENT_TRANSFER_ERROR;
}
if (rintsts & SDMMC_RINTSTS_SDIO_INTERRUPT) {
rintclr |= SDMMC_RINTSTS_SDIO_INTERRUPT;
/* Interrupt from SDIO card */
event |= ARM_MCI_EVENT_SDIO_INTERRUPT;
MCI.status.sdio_interrupt = 1;
/* Disable interrupt (must be re-enabled using Control) */
LPC_SDMMC->INTMASK &= ~SDMMC_INTMASK_SDIO_INT_MASK;
}
LPC_SDMMC->RINTSTS = rintclr;
LPC_SDMMC->IDSTS = idclr;
if (event && MCI.cb_event) {
mask = ARM_MCI_EVENT_TRANSFER_ERROR |
ARM_MCI_EVENT_TRANSFER_TIMEOUT |
ARM_MCI_EVENT_TRANSFER_COMPLETE;
if (event & mask) {
MCI.status.transfer_active = 0;
if (event & ARM_MCI_EVENT_TRANSFER_ERROR) {
(MCI.cb_event)(ARM_MCI_EVENT_TRANSFER_ERROR);
}
else if (event & ARM_MCI_EVENT_TRANSFER_TIMEOUT) {
(MCI.cb_event)(ARM_MCI_EVENT_TRANSFER_TIMEOUT);
}
else {
(MCI.cb_event)(ARM_MCI_EVENT_TRANSFER_COMPLETE);
}
}
mask = ARM_MCI_EVENT_COMMAND_ERROR |
ARM_MCI_EVENT_COMMAND_TIMEOUT |
ARM_MCI_EVENT_COMMAND_COMPLETE;
if (event & mask) {
MCI.status.command_active = 0;
if (event & ARM_MCI_EVENT_COMMAND_ERROR) {
(MCI.cb_event)(ARM_MCI_EVENT_COMMAND_ERROR);
}
else if (event & ARM_MCI_EVENT_COMMAND_TIMEOUT) {
(MCI.cb_event)(ARM_MCI_EVENT_COMMAND_TIMEOUT);
}
else {
(MCI.cb_event)(ARM_MCI_EVENT_COMMAND_COMPLETE);
}
}
mask = ARM_MCI_EVENT_CARD_INSERTED |
ARM_MCI_EVENT_CARD_REMOVED |
ARM_MCI_EVENT_SDIO_INTERRUPT;
if (event & mask) {
(MCI.cb_event)(event & mask);
}
}
}