void fb_nand_flash_write(const char *cmd, void *download_buffer, unsigned int download_bytes) { struct part_info *part; struct mtd_info *mtd = NULL; int ret; ret = fb_nand_lookup(cmd, &mtd, &part); if (ret) { error("invalid NAND device"); fastboot_fail("invalid NAND device"); return; } ret = board_fastboot_write_partition_setup(part->name); if (ret) return; if (is_sparse_image(download_buffer)) { struct fb_nand_sparse sparse_priv; struct sparse_storage sparse; sparse_priv.mtd = mtd; sparse_priv.part = part; sparse.blksz = mtd->writesize; sparse.start = part->offset / sparse.blksz; sparse.size = part->size / sparse.blksz; sparse.write = fb_nand_sparse_write; sparse.reserve = fb_nand_sparse_reserve; printf("Flashing sparse image at offset " LBAFU "\n", sparse.start); sparse.priv = &sparse_priv; write_sparse_image(&sparse, cmd, download_buffer, download_bytes); } else { printf("Flashing raw image at offset 0x%llx\n", part->offset); ret = _fb_nand_write(mtd, part, download_buffer, part->offset, download_bytes, NULL); printf("........ wrote %u bytes to '%s'\n", download_bytes, part->name); } if (ret) { fastboot_fail("error writing the image"); return; } fastboot_okay(""); }
void fb_nand_flash_write(const char *partname, unsigned int session_id, void *download_buffer, unsigned int download_bytes, char *response) { struct part_info *part; nand_info_t *nand = NULL; int ret; /* initialize the response buffer */ response_str = response; ret = fb_nand_lookup(partname, response, &nand, &part); if (ret) { error("invalid NAND device"); fastboot_fail(response_str, "invalid NAND device"); return; } ret = board_fastboot_write_partition_setup(part->name); if (ret) return; if (is_sparse_image(download_buffer)) { struct fb_nand_sparse sparse_priv; sparse_storage_t sparse; sparse_priv.nand = nand; sparse_priv.part = part; sparse.block_sz = nand->writesize; sparse.start = part->offset / sparse.block_sz; sparse.size = part->size / sparse.block_sz; sparse.name = part->name; sparse.write = fb_nand_sparse_write; ret = store_sparse_image(&sparse, &sparse_priv, session_id, download_buffer); } else { printf("Flashing raw image at offset 0x%llx\n", part->offset); ret = _fb_nand_write(nand, part, download_buffer, part->offset, download_bytes, NULL); printf("........ wrote %u bytes to '%s'\n", download_bytes, part->name); } if (ret) { fastboot_fail(response_str, "error writing the image"); return; } fastboot_okay(response_str, ""); }
static int fb_nand_sparse_write(struct sparse_storage *storage, void *priv, unsigned int offset, unsigned int size, char *data) { struct fb_nand_sparse *sparse = priv; size_t written; int ret; ret = _fb_nand_write(sparse->nand, sparse->part, data, offset * storage->block_sz, size * storage->block_sz, &written); if (ret < 0) { printf("Failed to write sparse chunk\n"); return ret; } return written / storage->block_sz; }
static lbaint_t fb_nand_sparse_write(struct sparse_storage *info, lbaint_t blk, lbaint_t blkcnt, const void *buffer) { struct fb_nand_sparse *sparse = info->priv; size_t written; int ret; ret = _fb_nand_write(sparse->mtd, sparse->part, (void *)buffer, blk * info->blksz, blkcnt * info->blksz, &written); if (ret < 0) { printf("Failed to write sparse chunk\n"); return ret; } /* TODO - verify that the value "written" includes the "bad-blocks" ... */ /* * the return value must be 'blkcnt' ("good-blocks") plus the * number of "bad-blocks" encountered within this space... */ return written / info->blksz; }