Пример #1
0
static int mmc_spi_command_send(struct mmc_spi_host *host, struct mci_cmd *cmd)
{
	uint8_t r1;
	uint8_t command[7];
	int i;

	command[0] = 0xff;
	command[1] = MMC_SPI_CMD(cmd->cmdidx);
	command[2] = cmd->cmdarg >> 24;
	command[3] = cmd->cmdarg >> 16;
	command[4] = cmd->cmdarg >> 8;
	command[5] = cmd->cmdarg;
#ifdef CONFIG_MMC_SPI_CRC_ON
	command[6] = (crc7(0, &command[1], 5) << 1) | 0x01;
#else
	command[6] = MMC_SPI_CMD0_CRC;
#endif

	mmc_spi_writebytes(host, 7, command);

	for (i = 0; i < CTOUT; i++) {
		mmc_spi_readbytes(host, 1, &r1);
		if (i && ((r1 & 0x80) == 0)) {  /* r1 response */
			dev_dbg(host->dev, "%s: CMD%d, TRY %d, RESP %x\n", __func__, cmd->cmdidx, i, r1);
			break;
		}
	}

	return r1;
}
Пример #2
0
static uint mmc_spi_sendcmd(struct mmc *mmc, ushort cmdidx, u32 cmdarg)
{
	struct spi_slave *spi = mmc->priv;
	u8 cmdo[7];
	u8 r1;
	int i;
	cmdo[0] = 0xff;
	cmdo[1] = MMC_SPI_CMD(cmdidx);
	cmdo[2] = cmdarg >> 24;
	cmdo[3] = cmdarg >> 16;
	cmdo[4] = cmdarg >> 8;
	cmdo[5] = cmdarg;
	cmdo[6] = (crc7(0, &cmdo[1], 5) << 1) | 0x01;
	spi_xfer(spi, sizeof(cmdo) * 8, cmdo, NULL, 0);
	for (i = 0; i < CTOUT; i++) {
		spi_xfer(spi, 1 * 8, NULL, &r1, 0);
		if (i && (r1 & 0x80) == 0) /* r1 response */
			break;
	}
	debug("%s:cmd%d resp%d %x\n", __func__, cmdidx, i, r1);
	return r1;
}
Пример #3
0
void MMC_SendCommand(MMCcmd *pCMD)
{
    BYTE resp;
    //TODO: transfer cmd, arg and crc
    MMC_SPI_Transfer(MMC_SPI_CMD(pCMD->cmd));
    MMC_SPI_Transfer(pCMD->arg[3]);
    MMC_SPI_Transfer(pCMD->arg[2]);
    MMC_SPI_Transfer(pCMD->arg[1]);
    MMC_SPI_Transfer(pCMD->arg[0]);
    MMC_SPI_Transfer(pCMD->crc);
    //TODO: waiting response with timeout
    for(WORD tout=MMC_CMD_TIMEOUT; tout>0; tout--)
    {
        resp = MMC_SPI_Transfer(0xff);
        if((resp&0x80)==0)
        {
            pCMD->response.r2[0] = resp;
            if(pCMD->cmd==MMC_CMD_SEND_STATUS)
                pCMD->response.r2[1] = MMC_SPI_Transfer(0xff);
            return;
        }
    }
    pCMD->response.r1 = 0xff;
}