rt_err_t mmcsd_send_app_cmd(struct rt_mmcsd_host *host, struct rt_mmcsd_card *card, struct rt_mmcsd_cmd *cmd, int retry) { struct rt_mmcsd_req req; rt_uint32_t i; rt_err_t err; err = -RT_ERROR; /* * We have to resend MMC_APP_CMD for each attempt so * we cannot use the retries field in mmc_command. */ for (i = 0;i <= retry;i++) { rt_memset(&req, 0, sizeof(struct rt_mmcsd_req)); err = mmcsd_app_cmd(host, card); if (err) { /* no point in retrying; no APP commands allowed */ if (controller_is_spi(host)) { if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND) break; } continue; } rt_memset(&req, 0, sizeof(struct rt_mmcsd_req)); rt_memset(cmd->resp, 0, sizeof(cmd->resp)); req.cmd = cmd; //cmd->data = NULL; mmcsd_send_request(host, &req); err = cmd->err; if (!cmd->err) break; /* no point in retrying illegal APP commands */ if (controller_is_spi(host)) { if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND) break; } } return err; }
rt_int32_t mmcsd_get_scr(struct rt_mmcsd_card *card, rt_uint32_t *scr) { rt_int32_t err; struct rt_mmcsd_req req; struct rt_mmcsd_cmd cmd; struct rt_mmcsd_data data; err = mmcsd_app_cmd(card->host, card); if (err) return err; rt_memset(&req, 0, sizeof(struct rt_mmcsd_req)); rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd)); rt_memset(&data, 0, sizeof(struct rt_mmcsd_data)); req.cmd = &cmd; req.data = &data; cmd.cmd_code = SD_APP_SEND_SCR; cmd.arg = 0; cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC; data.blksize = 8; data.blks = 1; data.flags = DATA_DIR_READ; data.buf = scr; mmcsd_set_data_timeout(&data, card); mmcsd_send_request(card->host, &req); if (cmd.err) return cmd.err; if (data.err) return data.err; scr[0] = be32_to_cpu(scr[0]); scr[1] = be32_to_cpu(scr[1]); return 0; }
int mmcsd_app_send_op_cond(long long arg, short crc_check) { mmcsd_app_cmd(crc_check); mmcsd_send_cmd(41, arg, crc_check); return mmcsd_get_r1(); }