- add support for 'fastboot flash' command for eMMC devices Signed-off-by: Steve Rae <srae@broadcom.com>master
parent
7172de33b0
commit
c0aebb3382
@ -0,0 +1,80 @@ |
||||
/*
|
||||
* Copyright 2014 Broadcom Corporation. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <fb_mmc.h> |
||||
#include <part.h> |
||||
|
||||
/* The 64 defined bytes plus the '\0' */ |
||||
#define RESPONSE_LEN (64 + 1) |
||||
|
||||
static char *response_str; |
||||
|
||||
static void fastboot_resp(const char *s) |
||||
{ |
||||
strncpy(response_str, s, RESPONSE_LEN); |
||||
response_str[RESPONSE_LEN - 1] = '\0'; |
||||
} |
||||
|
||||
static void write_raw_image(block_dev_desc_t *dev_desc, disk_partition_t *info, |
||||
const char *part_name, void *buffer, |
||||
unsigned int download_bytes) |
||||
{ |
||||
lbaint_t blkcnt; |
||||
lbaint_t blks; |
||||
|
||||
/* determine number of blocks to write */ |
||||
blkcnt = ((download_bytes + (info->blksz - 1)) & ~(info->blksz - 1)); |
||||
blkcnt = blkcnt / info->blksz; |
||||
|
||||
if (blkcnt > info->size) { |
||||
error("too large for partition: '%s'\n", part_name); |
||||
fastboot_resp("FAILtoo large for partition"); |
||||
return; |
||||
} |
||||
|
||||
puts("Flashing Raw Image\n"); |
||||
|
||||
blks = dev_desc->block_write(dev_desc->dev, info->start, blkcnt, |
||||
buffer); |
||||
if (blks != blkcnt) { |
||||
error("failed writing to device %d\n", dev_desc->dev); |
||||
fastboot_resp("FAILfailed writing to device"); |
||||
return; |
||||
} |
||||
|
||||
printf("........ wrote " LBAFU " bytes to '%s'\n", blkcnt * info->blksz, |
||||
part_name); |
||||
fastboot_resp("OKAY"); |
||||
} |
||||
|
||||
void fb_mmc_flash_write(const char *cmd, void *download_buffer, |
||||
unsigned int download_bytes, char *response) |
||||
{ |
||||
int ret; |
||||
block_dev_desc_t *dev_desc; |
||||
disk_partition_t info; |
||||
|
||||
/* initialize the response buffer */ |
||||
response_str = response; |
||||
|
||||
dev_desc = get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); |
||||
if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { |
||||
error("invalid mmc device\n"); |
||||
fastboot_resp("FAILinvalid mmc device"); |
||||
return; |
||||
} |
||||
|
||||
ret = get_partition_info_efi_by_name(dev_desc, cmd, &info); |
||||
if (ret) { |
||||
error("cannot find partition: '%s'\n", cmd); |
||||
fastboot_resp("FAILcannot find partition"); |
||||
return; |
||||
} |
||||
|
||||
write_raw_image(dev_desc, &info, cmd, download_buffer, |
||||
download_bytes); |
||||
} |
@ -0,0 +1,8 @@ |
||||
/*
|
||||
* Copyright 2014 Broadcom Corporation. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
void fb_mmc_flash_write(const char *cmd, void *download_buffer, |
||||
unsigned int download_bytes, char *response); |
Loading…
Reference in new issue