mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
fastboot: Move fastboot response functions to fastboot core
The functions and a few define to generate a fastboot message to be sent back to the host were so far duplicated among the users. Move them all to a common place. Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
parent
40aeeda396
commit
3c8f98f5fe
5 changed files with 76 additions and 59 deletions
|
@ -257,9 +257,9 @@ static void sparse_put_data_buffer(sparse_buffer_t *buffer)
|
|||
free(buffer);
|
||||
}
|
||||
|
||||
void write_sparse_image(block_dev_desc_t *dev_desc,
|
||||
disk_partition_t *info, const char *part_name,
|
||||
void *data, unsigned sz)
|
||||
int write_sparse_image(block_dev_desc_t *dev_desc,
|
||||
disk_partition_t *info, const char *part_name,
|
||||
void *data, unsigned sz)
|
||||
{
|
||||
lbaint_t start;
|
||||
lbaint_t blkcnt;
|
||||
|
@ -273,8 +273,8 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
|
|||
|
||||
sparse_header = sparse_parse_header(&data);
|
||||
if (!sparse_header) {
|
||||
fastboot_fail("sparse header issue\n");
|
||||
return;
|
||||
printf("sparse header issue\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -285,8 +285,7 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
|
|||
if (offset) {
|
||||
printf("%s: Sparse image block size issue [%u]\n",
|
||||
__func__, sparse_header->blk_sz);
|
||||
fastboot_fail("sparse image block size issue");
|
||||
return;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
puts("Flashing Sparse Image\n");
|
||||
|
@ -296,8 +295,8 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
|
|||
for (chunk = 0; chunk < sparse_header->total_chunks; chunk++) {
|
||||
chunk_header = sparse_parse_chunk(sparse_header, &data);
|
||||
if (!chunk_header) {
|
||||
fastboot_fail("Unknown chunk type");
|
||||
return;
|
||||
printf("Unknown chunk type");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -321,8 +320,7 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
|
|||
(info->start + info->size)) {
|
||||
printf("%s: Request would exceed partition size!\n",
|
||||
__func__);
|
||||
fastboot_fail("Request would exceed partition size!");
|
||||
return;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < buffer->repeat; i++) {
|
||||
|
@ -337,8 +335,7 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
|
|||
if (buffer_blks != buffer_blk_cnt) {
|
||||
printf("%s: Write %d failed " LBAFU "\n",
|
||||
__func__, i, buffer_blks);
|
||||
fastboot_fail("flash write failure");
|
||||
return;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
total_blocks += buffer_blk_cnt;
|
||||
|
@ -351,9 +348,10 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
|
|||
total_blocks, skipped, sparse_header->total_blks);
|
||||
printf("........ wrote %d blocks to '%s'\n", total_blocks, part_name);
|
||||
|
||||
if (total_blocks != sparse_header->total_blks)
|
||||
fastboot_fail("sparse image write failure");
|
||||
if (total_blocks != sparse_header->total_blks) {
|
||||
printf("sparse image write failure\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
fastboot_okay("");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <config.h>
|
||||
#include <common.h>
|
||||
#include <fastboot.h>
|
||||
#include <fb_mmc.h>
|
||||
#include <part.h>
|
||||
#include <aboot.h>
|
||||
|
@ -16,23 +17,8 @@
|
|||
#define CONFIG_FASTBOOT_GPT_NAME GPT_ENTRY_NAME
|
||||
#endif
|
||||
|
||||
/* The 64 defined bytes plus the '\0' */
|
||||
#define RESPONSE_LEN (64 + 1)
|
||||
|
||||
static char *response_str;
|
||||
|
||||
void fastboot_fail(const char *s)
|
||||
{
|
||||
strncpy(response_str, "FAIL\0", 5);
|
||||
strncat(response_str, s, RESPONSE_LEN - 4 - 1);
|
||||
}
|
||||
|
||||
void fastboot_okay(const char *s)
|
||||
{
|
||||
strncpy(response_str, "OKAY\0", 5);
|
||||
strncat(response_str, s, RESPONSE_LEN - 4 - 1);
|
||||
}
|
||||
|
||||
static int get_partition_info_efi_by_name_or_alias(block_dev_desc_t *dev_desc,
|
||||
const char *name, disk_partition_t *info)
|
||||
{
|
||||
|
@ -68,7 +54,7 @@ static void write_raw_image(block_dev_desc_t *dev_desc, disk_partition_t *info,
|
|||
|
||||
if (blkcnt > info->size) {
|
||||
error("too large for partition: '%s'\n", part_name);
|
||||
fastboot_fail("too large for partition");
|
||||
fastboot_fail(response_str, "too large for partition");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -78,13 +64,13 @@ static void write_raw_image(block_dev_desc_t *dev_desc, disk_partition_t *info,
|
|||
buffer);
|
||||
if (blks != blkcnt) {
|
||||
error("failed writing to device %d\n", dev_desc->dev);
|
||||
fastboot_fail("failed writing to device");
|
||||
fastboot_fail(response_str, "failed writing to device");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("........ wrote " LBAFU " bytes to '%s'\n", blkcnt * info->blksz,
|
||||
part_name);
|
||||
fastboot_okay("");
|
||||
fastboot_okay(response_str, "");
|
||||
}
|
||||
|
||||
void fb_mmc_flash_write(const char *cmd, void *download_buffer,
|
||||
|
@ -99,7 +85,7 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
|
|||
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_fail("invalid mmc device");
|
||||
fastboot_fail(response_str, "invalid mmc device");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -109,20 +95,21 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
|
|||
if (is_valid_gpt_buf(dev_desc, download_buffer)) {
|
||||
printf("%s: invalid GPT - refusing to write to flash\n",
|
||||
__func__);
|
||||
fastboot_fail("invalid GPT partition");
|
||||
fastboot_fail(response_str, "invalid GPT partition");
|
||||
return;
|
||||
}
|
||||
if (write_mbr_and_gpt_partitions(dev_desc, download_buffer)) {
|
||||
printf("%s: writing GPT partitions failed\n", __func__);
|
||||
fastboot_fail("writing GPT partitions failed");
|
||||
fastboot_fail(response_str,
|
||||
"writing GPT partitions failed");
|
||||
return;
|
||||
}
|
||||
printf("........ success\n");
|
||||
fastboot_okay("");
|
||||
fastboot_okay(response_str, "");
|
||||
return;
|
||||
} else if (get_partition_info_efi_by_name_or_alias(dev_desc, cmd, &info)) {
|
||||
error("cannot find partition: '%s'\n", cmd);
|
||||
fastboot_fail("cannot find partition");
|
||||
fastboot_fail(response_str, "cannot find partition");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -132,6 +119,8 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
|
|||
else
|
||||
write_raw_image(dev_desc, &info, cmd, download_buffer,
|
||||
download_bytes);
|
||||
|
||||
fastboot_okay(response_str, "");
|
||||
}
|
||||
|
||||
void fb_mmc_erase(const char *cmd, char *response)
|
||||
|
@ -144,7 +133,7 @@ void fb_mmc_erase(const char *cmd, char *response)
|
|||
|
||||
if (mmc == NULL) {
|
||||
error("invalid mmc device");
|
||||
fastboot_fail("invalid mmc device");
|
||||
fastboot_fail(response_str, "invalid mmc device");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -154,14 +143,14 @@ void fb_mmc_erase(const char *cmd, char *response)
|
|||
dev_desc = get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
|
||||
if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
|
||||
error("invalid mmc device");
|
||||
fastboot_fail("invalid mmc device");
|
||||
fastboot_fail(response_str, "invalid mmc device");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = get_partition_info_efi_by_name_or_alias(dev_desc, cmd, &info);
|
||||
if (ret) {
|
||||
error("cannot find partition: '%s'", cmd);
|
||||
fastboot_fail("cannot find partition");
|
||||
fastboot_fail(response_str, "cannot find partition");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -180,11 +169,11 @@ void fb_mmc_erase(const char *cmd, char *response)
|
|||
blks = dev_desc->block_erase(dev_desc->dev, blks_start, blks_size);
|
||||
if (blks != blks_size) {
|
||||
error("failed erasing from device %d", dev_desc->dev);
|
||||
fastboot_fail("failed erasing from device");
|
||||
fastboot_fail(response_str, "failed erasing from device");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("........ erased " LBAFU " bytes from '%s'\n",
|
||||
blks_size * info.blksz, cmd);
|
||||
fastboot_okay("");
|
||||
fastboot_okay(response_str, "");
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <config.h>
|
||||
#include <common.h>
|
||||
#include <errno.h>
|
||||
#include <fastboot.h>
|
||||
#include <malloc.h>
|
||||
#include <linux/usb/ch9.h>
|
||||
#include <linux/usb/gadget.h>
|
||||
|
@ -34,9 +35,6 @@
|
|||
#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_1_1 (0x0040)
|
||||
#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE (0x0040)
|
||||
|
||||
/* The 64 defined bytes plus \0 */
|
||||
#define RESPONSE_LEN (64 + 1)
|
||||
|
||||
#define EP_BUFFER_SIZE 4096
|
||||
|
||||
struct f_fastboot {
|
||||
|
@ -125,6 +123,19 @@ static struct usb_gadget_strings *fastboot_strings[] = {
|
|||
static void rx_handler_command(struct usb_ep *ep, struct usb_request *req);
|
||||
static int strcmp_l1(const char *s1, const char *s2);
|
||||
|
||||
|
||||
void fastboot_fail(char *response, const char *reason)
|
||||
{
|
||||
strncpy(response, "FAIL\0", 5);
|
||||
strncat(response, reason, FASTBOOT_RESPONSE_LEN - 4 - 1);
|
||||
}
|
||||
|
||||
void fastboot_okay(char *response, const char *reason)
|
||||
{
|
||||
strncpy(response, "OKAY\0", 5);
|
||||
strncat(response, reason, FASTBOOT_RESPONSE_LEN - 4 - 1);
|
||||
}
|
||||
|
||||
static void fastboot_complete(struct usb_ep *ep, struct usb_request *req)
|
||||
{
|
||||
int status = req->status;
|
||||
|
@ -358,7 +369,7 @@ static int strcmp_l1(const char *s1, const char *s2)
|
|||
static void cb_getvar(struct usb_ep *ep, struct usb_request *req)
|
||||
{
|
||||
char *cmd = req->buf;
|
||||
char response[RESPONSE_LEN];
|
||||
char response[FASTBOOT_RESPONSE_LEN];
|
||||
const char *s;
|
||||
size_t chars_left;
|
||||
|
||||
|
@ -415,7 +426,7 @@ static unsigned int rx_bytes_expected(unsigned int maxpacket)
|
|||
#define BYTES_PER_DOT 0x20000
|
||||
static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
|
||||
{
|
||||
char response[RESPONSE_LEN];
|
||||
char response[FASTBOOT_RESPONSE_LEN];
|
||||
unsigned int transfer_size = download_size - download_bytes;
|
||||
const unsigned char *buffer = req->buf;
|
||||
unsigned int buffer_size = req->actual;
|
||||
|
@ -472,7 +483,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
|
|||
static void cb_download(struct usb_ep *ep, struct usb_request *req)
|
||||
{
|
||||
char *cmd = req->buf;
|
||||
char response[RESPONSE_LEN];
|
||||
char response[FASTBOOT_RESPONSE_LEN];
|
||||
unsigned int max;
|
||||
|
||||
strsep(&cmd, ":");
|
||||
|
@ -533,7 +544,7 @@ static void cb_continue(struct usb_ep *ep, struct usb_request *req)
|
|||
static void cb_flash(struct usb_ep *ep, struct usb_request *req)
|
||||
{
|
||||
char *cmd = req->buf;
|
||||
char response[RESPONSE_LEN];
|
||||
char response[FASTBOOT_RESPONSE_LEN];
|
||||
|
||||
strsep(&cmd, ":");
|
||||
if (!cmd) {
|
||||
|
@ -577,7 +588,7 @@ static void cb_oem(struct usb_ep *ep, struct usb_request *req)
|
|||
static void cb_erase(struct usb_ep *ep, struct usb_request *req)
|
||||
{
|
||||
char *cmd = req->buf;
|
||||
char response[RESPONSE_LEN];
|
||||
char response[FASTBOOT_RESPONSE_LEN];
|
||||
|
||||
strsep(&cmd, ":");
|
||||
if (!cmd) {
|
||||
|
|
|
@ -9,9 +9,6 @@
|
|||
|
||||
#define ROUNDUP(x, y) (((x) + ((y) - 1)) & ~((y) - 1))
|
||||
|
||||
void fastboot_fail(const char *s);
|
||||
void fastboot_okay(const char *s);
|
||||
|
||||
static inline int is_sparse_image(void *buf)
|
||||
{
|
||||
sparse_header_t *s_header = (sparse_header_t *)buf;
|
||||
|
@ -23,6 +20,6 @@ static inline int is_sparse_image(void *buf)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void write_sparse_image(block_dev_desc_t *dev_desc,
|
||||
disk_partition_t *info, const char *part_name,
|
||||
void *data, unsigned sz);
|
||||
int write_sparse_image(block_dev_desc_t *dev_desc,
|
||||
disk_partition_t *info, const char *part_name,
|
||||
void *data, unsigned sz);
|
||||
|
|
22
include/fastboot.h
Normal file
22
include/fastboot.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* (C) Copyright 2008 - 2009
|
||||
* Windriver, <www.windriver.com>
|
||||
* Tom Rix <Tom.Rix@windriver.com>
|
||||
*
|
||||
* Copyright 2011 Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
||||
*
|
||||
* Copyright 2014 Linaro, Ltd.
|
||||
* Rob Herring <robh@kernel.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
#ifndef _FASTBOOT_H_
|
||||
#define _FASTBOOT_H_
|
||||
|
||||
/* The 64 defined bytes plus \0 */
|
||||
#define FASTBOOT_RESPONSE_LEN (64 + 1)
|
||||
|
||||
void fastboot_fail(char *response, const char *reason);
|
||||
void fastboot_okay(char *response, const char *reason);
|
||||
|
||||
#endif /* _FASTBOOT_H_ */
|
Loading…
Reference in a new issue