int mmc_send_rwcmd(SIM_HBA *hba, int nbytes, int flag) { SIM_MMC_EXT *ext; uint32_t cmd; ext = (SIM_MMC_EXT *)hba->ext; if (nbytes == ext->mmc_blksize) { cmd = ext->dir == MMC_DIR_IN ? MMC_READ_SINGLE_BLOCK : MMC_WRITE_BLOCK; ext->stop = MMCSD_STOP_NONE; } else { cmd = ext->dir == MMC_DIR_IN ? MMC_READ_MULTIPLE_BLOCK : MMC_WRITE_MULTIPLE_BLOCK; if (!(ext->hccap & MMC_HCCAP_ACMD12)) ext->stop = MMCSD_STOP_PEND; else ext->stop = MMCSD_STOP_AUTO; flag |= MMC_CMD_DATA_MULTI; } if (ext->dir == MMC_DIR_IN) flag |= MMC_CMD_DATA_IN; flag |= MMC_CMD_DATA; /* * Data is expected * DON'T set MMC_CMD_INTR flag */ if (mmc_sendcmd(hba, cmd, MMC_RSP_R1, flag, (ext->eflags & MMC_EFLAG_HC) ? ext->blkno : (ext->blkno * ext->mmc_blksize)) != MMC_SUCCESS) return 0; return nbytes; }
static int mmc_get_card_status(SIM_HBA *hba) { SIM_MMC_EXT *ext; ext = (SIM_MMC_EXT *)hba->ext; if(mmc_sendcmd(hba, MMC_SEND_STATUS, MMC_RSP_R1, MMC_CMD_INTR, ext->rca << 16)!=MMC_SUCCESS) return MMC_FAILURE; return (mmc_wait_command(hba)); }