summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-01-26 09:58:56 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2018-02-09 10:26:38 +0100
commited1dded0898faa1f917309172f2065014756c59f (patch)
treea6d6faf2dae2e4464de07c2db55c52c228b696d2 /drivers
parente5098495d4be465d6a93b4bbd9a59257c48ce068 (diff)
downloadbarebox-ed1dded0898faa1f917309172f2065014756c59f.tar.gz
barebox-ed1dded0898faa1f917309172f2065014756c59f.tar.xz
usb: gadget: fastboot: Add external command execution support
Custom projects may need vendor specific expansions to the fastboot command execution. Allow these to be implemented without messing in the fastboot code directly. We have a hook for all commands and also one for the "flash" command. Each hook can decide if the generic command parser is executed afterwards (return value FASTBOOT_CMD_FALLTHROUGH) or if the generic parser shall be skipped (return value 0 or negative error code). This allows board code to implement vendor specific "oem" commands or to handle the downloaded image in a special way (i.e. do signature checks on them) Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/f_fastboot.c21
-rw-r--r--drivers/usb/gadget/multi.c2
2 files changed, 22 insertions, 1 deletions
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
index b851e8d1c3..787b1205ec 100644
--- a/drivers/usb/gadget/f_fastboot.c
+++ b/drivers/usb/gadget/f_fastboot.c
@@ -75,6 +75,9 @@ struct f_fastboot {
struct usb_ep *in_ep, *out_ep;
struct usb_request *in_req, *out_req;
struct file_list *files;
+ int (*cmd_exec)(struct f_fastboot *, const char *cmd);
+ int (*cmd_flash)(struct f_fastboot *, struct file_list_entry *entry,
+ const char *filename, const void *buf, size_t len);
int download_fd;
void *buf;
@@ -327,6 +330,8 @@ static int fastboot_bind(struct usb_configuration *c, struct usb_function *f)
struct fb_variable *var;
f_fb->files = opts->files;
+ f_fb->cmd_exec = opts->cmd_exec;
+ f_fb->cmd_flash = opts->cmd_flash;
var = fb_addvar(f_fb, "version");
fb_setvar(var, "0.4");
@@ -932,6 +937,13 @@ static void cb_flash(struct f_fastboot *f_fb, const char *cmd)
goto out;
}
+ if (f_fb->cmd_flash) {
+ ret = f_fb->cmd_flash(f_fb, fentry, sourcefile, f_fb->buf,
+ f_fb->download_size);
+ if (ret != FASTBOOT_CMD_FALLTHROUGH)
+ goto out;
+ }
+
filename = fentry->filename;
if (filetype == filetype_android_sparse) {
@@ -1197,15 +1209,22 @@ static void rx_handler_command(struct usb_ep *ep, struct usb_request *req)
{
char *cmdbuf = req->buf;
struct f_fastboot *f_fb = req->context;
+ int ret;
if (req->status != 0)
return;
*(cmdbuf + req->actual) = 0;
+ if (f_fb->cmd_exec) {
+ ret = f_fb->cmd_exec(f_fb, cmdbuf);
+ if (ret != FASTBOOT_CMD_FALLTHROUGH)
+ goto done;
+ }
+
fb_run_command(f_fb, cmdbuf, cmd_dispatch_info,
ARRAY_SIZE(cmd_dispatch_info));
-
+done:
*cmdbuf = '\0';
req->actual = 0;
memset(req->buf, 0, EP_BUFFER_SIZE);
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c
index 44969be0c9..d6edfb8cf2 100644
--- a/drivers/usb/gadget/multi.c
+++ b/drivers/usb/gadget/multi.c
@@ -128,6 +128,8 @@ static int multi_bind_fastboot(struct usb_composite_dev *cdev)
opts = container_of(fi_fastboot, struct f_fastboot_opts, func_inst);
opts->files = gadget_multi_opts->fastboot_opts.files;
+ opts->cmd_exec = gadget_multi_opts->fastboot_opts.cmd_exec;
+ opts->cmd_flash = gadget_multi_opts->fastboot_opts.cmd_flash;
opts->export_bbu = gadget_multi_opts->fastboot_opts.export_bbu;
f_fastboot = usb_get_function(fi_fastboot);