From 0240fd3f8469eba3bda367b79dc221b9736baec7 Mon Sep 17 00:00:00 2001 From: Markus Pargmann Date: Wed, 17 Feb 2016 12:28:20 +0100 Subject: fastboot: Add a ARM Barebox filetype handler This will automatically call barebox_update for the transfered file if it is an ARM Barebox image and the destination file is defined by some update handler. Signed-off-by: Markus Pargmann Signed-off-by: Sascha Hauer --- common/filetype.c | 13 +++++++++++++ drivers/usb/gadget/f_fastboot.c | 31 +++++++++++++++++++++++++++++++ include/filetype.h | 2 ++ 3 files changed, 46 insertions(+) diff --git a/common/filetype.c b/common/filetype.c index 8cfae88aeb..74baf51446 100644 --- a/common/filetype.c +++ b/common/filetype.c @@ -369,3 +369,16 @@ err_out: cdev_close(cdev); return type; } + +bool filetype_is_barebox_image(enum filetype ft) +{ + switch (ft) { + case filetype_arm_barebox: + case filetype_mips_barebox: + case filetype_ch_image: + case filetype_ch_image_be: + return true; + default: + return false; + } +} diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index bc06c58d8d..0df08c9a2b 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -716,6 +717,36 @@ static void cb_flash(struct usb_ep *ep, struct usb_request *req, const char *cmd goto out; } + if (IS_ENABLED(CONFIG_BAREBOX_UPDATE) && filetype_is_barebox_image(filetype)) { + struct bbu_data data = { + .devicefile = filename, + .imagefile = FASTBOOT_TMPFILE, + .flags = BBU_FLAG_YES, + }; + + if (!barebox_update_handler_exists(&data)) + goto copy; + + fastboot_tx_print(f_fb, "INFOThis is a barebox image..."); + + data.image = read_file(data.imagefile, &data.len); + if (!data.image) { + fastboot_tx_print(f_fb, "FAILreading barebox"); + return; + } + + ret = barebox_update(&data); + + free(data.image); + + if (ret) { + fastboot_tx_print(f_fb, "FAILupdate barebox: %s", strerror(-ret)); + return; + } + + goto out; + } + copy: ret = copy_file(FASTBOOT_TMPFILE, filename, 1); if (ret) { diff --git a/include/filetype.h b/include/filetype.h index cde543e5b0..e87ca174a8 100644 --- a/include/filetype.h +++ b/include/filetype.h @@ -2,6 +2,7 @@ #define __FILE_TYPE_H #include +#include /* * List of file types we know @@ -48,6 +49,7 @@ enum filetype file_name_detect_type(const char *filename); enum filetype cdev_detect_type(const char *name); enum filetype is_fat_or_mbr(const unsigned char *sector, unsigned long *bootsec); int is_fat_boot_sector(const void *_buf); +bool filetype_is_barebox_image(enum filetype ft); #define ARM_HEAD_SIZE 0x30 #define ARM_HEAD_MAGICWORD_OFFSET 0x20 -- cgit v1.2.3