diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2021-05-03 13:48:57 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2021-05-12 08:00:00 +0200 |
commit | f1dd6339a8d7d62667ba8a1da863319bc5a1dc57 (patch) | |
tree | b2a9a3a75f1ff22c05a2416fe3e8d3311409afbd /common | |
parent | eecf05d8ced03ab994cd083c7906df434ffd44b7 (diff) | |
download | barebox-f1dd6339a8d7d62667ba8a1da863319bc5a1dc57.tar.gz |
fastboot/dfu: use system partitions as fall back
Use the new system partitions infrastructure to have fastboot and DFU
fall back to using the same partitions if the global.usbgadget.dfu_function
and global.fastboot_partitions are not set, respectively.
No functional change intended for configurations that have
SYSTEM_PARTITIONS disabled.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Link: https://lore.barebox.org/20210503114901.13095-13-a.fatoum@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common')
-rw-r--r-- | common/fastboot.c | 9 | ||||
-rw-r--r-- | common/usbgadget.c | 77 |
2 files changed, 55 insertions, 31 deletions
diff --git a/common/fastboot.c b/common/fastboot.c index c8576a8d97..dc80b66e67 100644 --- a/common/fastboot.c +++ b/common/fastboot.c @@ -41,6 +41,7 @@ #include <linux/stat.h> #include <linux/mtd/mtd.h> #include <fastboot.h> +#include <system-partitions.h> #define FASTBOOT_VERSION "0.4" @@ -932,9 +933,13 @@ bool get_fastboot_bbu(void) return fastboot_bbu; } -const char *get_fastboot_partitions(void) +struct file_list *get_fastboot_partitions(void) { - return fastboot_partitions; + if (fastboot_partitions && *fastboot_partitions) + return file_list_parse(fastboot_partitions); + if (!system_partitions_empty()) + return system_partitions_get(); + return NULL; } static int fastboot_globalvars_init(void) diff --git a/common/usbgadget.c b/common/usbgadget.c index 009debd93e..d4437b5169 100644 --- a/common/usbgadget.c +++ b/common/usbgadget.c @@ -17,6 +17,7 @@ #include <usb/gadget-multi.h> #include <globalvar.h> #include <magicvar.h> +#include <system-partitions.h> static int autostart; static int acm; @@ -24,14 +25,29 @@ static char *dfu_function; static struct file_list *parse(const char *files) { - struct file_list *list = file_list_parse(files); + struct file_list *list; + + if (!files) + return NULL; + + list = file_list_parse(files); if (IS_ERR(list)) { pr_err("Parsing file list \"%s\" failed: %pe\n", files, list); return NULL; } + return list; } +static inline struct file_list *get_dfu_function(void) +{ + if (dfu_function && *dfu_function) + return file_list_parse(dfu_function); + if (!system_partitions_empty()) + return system_partitions_get(); + return NULL; +} + int usbgadget_register(bool dfu, const char *dfu_opts, bool fastboot, const char *fastboot_opts, bool acm, bool export_bbu) @@ -39,45 +55,44 @@ int usbgadget_register(bool dfu, const char *dfu_opts, int ret; struct device_d *dev; struct f_multi_opts *opts; - const char *fastboot_partitions = get_fastboot_partitions(); - - if (dfu && !dfu_opts && dfu_function && *dfu_function) - dfu_opts = dfu_function; - - if (IS_ENABLED(CONFIG_FASTBOOT_BASE) && fastboot && !fastboot_opts && - fastboot_partitions && *fastboot_partitions) - fastboot_opts = fastboot_partitions; - - if (!dfu_opts && !fastboot_opts && !acm) - return COMMAND_ERROR_USAGE; - - /* - * Creating a gadget with both DFU and Fastboot may not work. - * fastboot 1:8.1.0+r23-5 can deal with it, but dfu-util 0.9 - * seems to assume that the device only has a single configuration - * That's not our fault though. Emit a warning and continue - */ - if (fastboot_opts && dfu_opts) - pr_warn("Both DFU and Fastboot enabled. dfu-util may not like this!\n"); opts = xzalloc(sizeof(*opts)); opts->release = usb_multi_opts_release; - if (fastboot_opts) { + if (dfu) { + opts->dfu_opts.files = parse(dfu_opts); + if (IS_ENABLED(CONFIG_USB_GADGET_DFU) && file_list_empty(opts->dfu_opts.files)) { + file_list_free(opts->dfu_opts.files); + opts->dfu_opts.files = get_dfu_function(); + } + } + + if (fastboot) { opts->fastboot_opts.files = parse(fastboot_opts); + if (IS_ENABLED(CONFIG_FASTBOOT_BASE) && file_list_empty(opts->fastboot_opts.files)) { + file_list_free(opts->fastboot_opts.files); + opts->fastboot_opts.files = get_fastboot_partitions(); + } + opts->fastboot_opts.export_bbu = export_bbu; } - if (dfu_opts) - opts->dfu_opts.files = parse(dfu_opts); + opts->create_acm = acm; - if (!opts->dfu_opts.files && !opts->fastboot_opts.files && !acm) { + if (usb_multi_count_functions(opts) == 0) { pr_warn("No functions to register\n"); - free(opts); - return 0; + ret = COMMAND_ERROR_USAGE; + goto err; } - opts->create_acm = acm; + /* + * Creating a gadget with both DFU and Fastboot may not work. + * fastboot 1:8.1.0+r23-5 can deal with it, but dfu-util 0.9 + * seems to assume that the device only has a single configuration + * That's not our fault though. Emit a warning and continue + */ + if (!file_list_empty(opts->fastboot_opts.files) && !file_list_empty(opts->dfu_opts.files)) + pr_warn("Both DFU and Fastboot enabled. dfu-util may not like this!\n"); dev = get_device_by_name("otg"); if (dev) @@ -85,7 +100,11 @@ int usbgadget_register(bool dfu, const char *dfu_opts, ret = usb_multi_register(opts); if (ret) - usb_multi_opts_release(opts); + goto err; + + return 0; +err: + usb_multi_opts_release(opts); return ret; } |