2 * Copyright 2014 Broadcom Corporation.
4 * SPDX-License-Identifier: GPL-2.0+
11 #include <sparse_format.h>
13 /* The 64 defined bytes plus the '\0' */
14 #define RESPONSE_LEN (64 + 1)
16 static char *response_str
;
18 void fastboot_fail(const char *s
)
20 strncpy(response_str
, "FAIL", 4);
21 strncat(response_str
, s
, RESPONSE_LEN
- 4 - 1);
24 void fastboot_okay(const char *s
)
26 strncpy(response_str
, "OKAY", 4);
27 strncat(response_str
, s
, RESPONSE_LEN
- 4 - 1);
30 static void write_raw_image(block_dev_desc_t
*dev_desc
, disk_partition_t
*info
,
31 const char *part_name
, void *buffer
,
32 unsigned int download_bytes
)
37 /* determine number of blocks to write */
38 blkcnt
= ((download_bytes
+ (info
->blksz
- 1)) & ~(info
->blksz
- 1));
39 blkcnt
= blkcnt
/ info
->blksz
;
41 if (blkcnt
> info
->size
) {
42 error("too large for partition: '%s'\n", part_name
);
43 fastboot_fail("too large for partition");
47 puts("Flashing Raw Image\n");
49 blks
= dev_desc
->block_write(dev_desc
->dev
, info
->start
, blkcnt
,
52 error("failed writing to device %d\n", dev_desc
->dev
);
53 fastboot_fail("failed writing to device");
57 printf("........ wrote " LBAFU
" bytes to '%s'\n", blkcnt
* info
->blksz
,
62 void fb_mmc_flash_write(const char *cmd
, void *download_buffer
,
63 unsigned int download_bytes
, char *response
)
66 block_dev_desc_t
*dev_desc
;
67 disk_partition_t info
;
69 /* initialize the response buffer */
70 response_str
= response
;
72 dev_desc
= get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV
);
73 if (!dev_desc
|| dev_desc
->type
== DEV_TYPE_UNKNOWN
) {
74 error("invalid mmc device\n");
75 fastboot_fail("invalid mmc device");
79 ret
= get_partition_info_efi_by_name(dev_desc
, cmd
, &info
);
81 error("cannot find partition: '%s'\n", cmd
);
82 fastboot_fail("cannot find partition");
86 if (is_sparse_image(download_buffer
))
87 write_sparse_image(dev_desc
, &info
, cmd
, download_buffer
,
90 write_raw_image(dev_desc
, &info
, cmd
, download_buffer
,