int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s) { char *st; dfu->dev_type = DFU_DEV_MMC; st = strsep(&s, " "); if (!strcmp(st, "mmc")) { dfu->layout = DFU_RAW_ADDR; dfu->data.mmc.lba_start = simple_strtoul(s, &s, 16); dfu->data.mmc.lba_size = simple_strtoul(++s, &s, 16); dfu->data.mmc.lba_blk_size = get_mmc_blk_size(dfu->dev_num); } else if (!strcmp(st, "fat")) { dfu->layout = DFU_FS_FAT; dfu->data.mmc.dev = simple_strtoul(s, &s, 10); dfu->data.mmc.part = simple_strtoul(++s, &s, 10); } else { printf("%s: Memory layout (%s) not supported!\n", __func__, st); } dfu->read_medium = dfu_read_medium_mmc; dfu->write_medium = dfu_write_medium_mmc; return 0; }
int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s) { int dev, part; struct mmc *mmc; block_dev_desc_t *blk_dev; disk_partition_t partinfo; char *st; dfu->dev_type = DFU_DEV_MMC; st = strsep(&s, " "); if (!strcmp(st, "mmc")) { dfu->layout = DFU_RAW_ADDR; dfu->data.mmc.lba_start = simple_strtoul(s, &s, 16); dfu->data.mmc.lba_size = simple_strtoul(++s, &s, 16); dfu->data.mmc.lba_blk_size = get_mmc_blk_size(dfu->dev_num); } else if (!strcmp(st, "fat")) { dfu->layout = DFU_FS_FAT; } else if (!strcmp(st, "ext4")) { dfu->layout = DFU_FS_EXT4; } else if (!strcmp(st, "part")) { dfu->layout = DFU_RAW_ADDR; dev = simple_strtoul(s, &s, 10); s++; part = simple_strtoul(s, &s, 10); mmc = find_mmc_device(dev); if (mmc == NULL || mmc_init(mmc)) { printf("%s: could not find mmc device #%d!\n", __func__, dev); return -ENODEV; } blk_dev = &mmc->block_dev; if (get_partition_info(blk_dev, part, &partinfo) != 0) { printf("%s: could not find partition #%d on mmc device #%d!\n", __func__, part, dev); return -ENODEV; } dfu->data.mmc.lba_start = partinfo.start; dfu->data.mmc.lba_size = partinfo.size; dfu->data.mmc.lba_blk_size = partinfo.blksz; } else { printf("%s: Memory layout (%s) not supported!\n", __func__, st); return -ENODEV; } if (dfu->layout == DFU_FS_EXT4 || dfu->layout == DFU_FS_FAT) { dfu->data.mmc.dev = simple_strtoul(s, &s, 10); dfu->data.mmc.part = simple_strtoul(++s, &s, 10); } dfu->read_medium = dfu_read_medium_mmc; dfu->write_medium = dfu_write_medium_mmc; dfu->flush_medium = dfu_flush_medium_mmc; /* initial state */ dfu->inited = 0; return 0; }