MTK平台,kernel中写EMMC指定分区

代码如下:

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科技之光666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值