代码如下:
int mmc_write_recovery_flag(struct mmc_card *card, struct mmc_host *host)
{
struct mmc_request mrq = {NULL};
struct mmc_command cmd = {0};
struct mmc_data data = {0};
struct mmc_command msdc_sbc;
struct scatterlist sg;
unsigned char *data_buf;
int len = 14;
mmc_claim_host(host);
memset(&data, 0, sizeof(struct mmc_data));
memset(&mrq, 0, sizeof(struct mmc_request));
memset(&cmd, 0, sizeof(struct mmc_command));
memset(&msdc_sbc, 0, sizeof(struct mmc_command));
mrq.cmd = &cmd;
mrq.data = &data;
data.flags = MMC_DATA_WRITE;
cmd.opcode = MMC_WRITE_MULTIPLE_BLOCK;
mrq.sbc = &msdc_sbc;
mrq.sbc->opcode = MMC_SET_BLOCK_COUNT;
mrq.sbc->arg = data.blocks | (1 << 31);
mrq.sbc->flags = MMC_RSP_R1 | MMC_CMD_AC;
data.blocks = 1;
cmd.arg = 0xe800;
if (!mmc_card_blockaddr(card)) {
pr_debug("sdssgl **************** msdc0 the device is used byte address!\n");
cmd.arg <<= 9;
}
cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
data.stop = NULL;
data.blksz = 512;
data.sg = &sg;
data.sg_len = 1;
data_buf = kmalloc(len, GFP_KERNEL);
if(!data_buf){
printk(KERN_EMERG "sdssgl *********************** %s ************************* quiet..\n\n",__func__);
return -ENOMEM;
}
snprintf(data_buf,len,"boot--recovery");
printk(KERN_EMERG"sdssgl msdc0 %s,data_buf is %s.\n",__func__,data_buf);
sg_init_one(&sg, data_buf, 512);
mmc_set_data_timeout(&data, card);
mmc_wait_for_req(host, &mrq);
mmc_release_host(host);
if (cmd.error)
return cmd.error;
if (data.error)
return data.error;
return 0;
}