diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2016-03-11 10:49:35 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2016-03-11 10:49:35 +0100 |
commit | 330dc0a6b7866f4256a058b2e8980a7522ee04e2 (patch) | |
tree | ffe42e2a25e89ab99ab4b0dcefbf7254fc578adb | |
parent | aaad4dad239d59520063c09288480ab215a263f9 (diff) | |
parent | 0240fd3f8469eba3bda367b79dc221b9736baec7 (diff) | |
download | barebox-330dc0a6b7866f4256a058b2e8980a7522ee04e2.tar.gz barebox-330dc0a6b7866f4256a058b2e8980a7522ee04e2.tar.xz |
Merge branch 'for-next/bbu'
-rw-r--r-- | common/bbu.c | 34 | ||||
-rw-r--r-- | common/filetype.c | 13 | ||||
-rw-r--r-- | drivers/usb/gadget/f_fastboot.c | 48 | ||||
-rw-r--r-- | include/bbu.h | 2 | ||||
-rw-r--r-- | include/filetype.h | 2 |
5 files changed, 97 insertions, 2 deletions
diff --git a/common/bbu.c b/common/bbu.c index fc821934c6..68812a733d 100644 --- a/common/bbu.c +++ b/common/bbu.c @@ -97,6 +97,34 @@ static struct bbu_handler *bbu_find_handler(const char *name) return NULL; } +static struct bbu_handler *bbu_find_handler_by_device(const char *devicepath) +{ + struct bbu_handler *handler; + + if (!devicepath) + return NULL; + + list_for_each_entry(handler, &bbu_image_handlers, list) + if (!strcmp(handler->devicefile, devicepath)) + return handler; + + return NULL; +} + +bool barebox_update_handler_exists(struct bbu_data *data) +{ + struct bbu_handler *handler; + + handler = bbu_find_handler_by_device(data->devicefile); + if (handler) + return true; + + if (!data->handler_name) + return false; + + return !bbu_find_handler(data->handler_name); +} + /* * do a barebox update with data from *data */ @@ -105,7 +133,11 @@ int barebox_update(struct bbu_data *data) struct bbu_handler *handler; int ret; - handler = bbu_find_handler(data->handler_name); + handler = bbu_find_handler_by_device(data->devicefile); + + if (!handler) + handler = bbu_find_handler(data->handler_name); + if (!handler) return -ENODEV; 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 bf28f7c22a..0df08c9a2b 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -23,6 +23,7 @@ #include <clock.h> #include <ioctl.h> #include <libbb.h> +#include <bbu.h> #include <boot.h> #include <dma.h> #include <fs.h> @@ -686,7 +687,21 @@ static void cb_flash(struct usb_ep *ep, struct usb_request *req, const char *cmd } if (filetype == filetype_ubi) { - char *cmd = asprintf("ubiformat -y -f %s %s", FASTBOOT_TMPFILE, filename); + char *cmd; + int fd; + struct mtd_info_user meminfo; + + fd = open(filename, O_RDONLY); + if (fd < 0) + goto copy; + + ret = ioctl(fd, MEMGETINFO, &meminfo); + close(fd); + /* Not a MTD device, ubiformat is not a valid operation */ + if (ret) + goto copy; + + cmd = asprintf("ubiformat -y -f %s %s", FASTBOOT_TMPFILE, filename); fastboot_tx_print(f_fb, "INFOThis is an UBI image..."); @@ -702,6 +717,37 @@ 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) { fastboot_tx_print(f_fb, "FAILwrite partition: %s", strerror(-ret)); diff --git a/include/bbu.h b/include/bbu.h index 7277911718..0fe7a1a9bc 100644 --- a/include/bbu.h +++ b/include/bbu.h @@ -36,6 +36,8 @@ int bbu_confirm(struct bbu_data *); int barebox_update(struct bbu_data *); +bool barebox_update_handler_exists(struct bbu_data *); + void bbu_handlers_list(void); #ifdef CONFIG_BAREBOX_UPDATE 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 <linux/string.h> +#include <linux/types.h> /* * 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 |