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; }
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; }
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; }