示例#1
0
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));
}