Message ID | 1408716505-9013-1-git-send-email-l.majewski@samsung.com |
---|---|
State | Superseded |
Delegated to: | Marek Vasut |
Headers | show |
On 08/22/2014 08:08 AM, Lukasz Majewski wrote: > This commit provides distinction between DFU device detach and reset. > The -R behavior is preserved with proper handling of the dfu-util's -e > switch, which detach the DFU device. > > By running dfu-util -e; one can force device to finish the execution of > dfu command on target and execute some other scripted commands. This sounds extremely useful; I wonder if UMS could have the same feature? > diff --git a/common/cmd_dfu.c b/common/cmd_dfu.c > +static bool dfu_reset; Can't this be a local variable inside the do_dfu() function? Aside from that, Reviewed-by: Stephen Warren <swarren@nvidia.com>
On Fri, 22 Aug 2014 12:06:03 -0600 Stephen Warren <swarren@wwwdotorg.org> wrote: > > On 08/22/2014 08:08 AM, Lukasz Majewski wrote: > > This commit provides distinction between DFU device detach and > > reset. The -R behavior is preserved with proper handling of the > > dfu-util's -e switch, which detach the DFU device. > > > > By running dfu-util -e; one can force device to finish the > > execution of dfu command on target and execute some other scripted > > commands. > > This sounds extremely useful; I wonder if UMS could have the same > feature? It is worth considering. I will think about this > > > diff --git a/common/cmd_dfu.c b/common/cmd_dfu.c > > > +static bool dfu_reset; > > Can't this be a local variable inside the do_dfu() function? I think I can put this variable there. > > Aside from that, > Reviewed-by: Stephen Warren <swarren@nvidia.com> Best regards, Lukasz Majewski
On 08/22/2014 08:08 AM, Lukasz Majewski wrote: > This commit provides distinction between DFU device detach and reset. > The -R behavior is preserved with proper handling of the dfu-util's -e > switch, which detach the DFU device. > > By running dfu-util -e; one can force device to finish the execution of > dfu command on target and execute some other scripted commands. > > Moreover, some naming has been changed - the dfu_reset() method now is known > as dfu_detach(). New name better reflects the purpose of the code. > > It was also necessary to increase the number of usb_gadget_handle_interrupts() > calls since we also must wait for detection of the USB reset event. > > Example usage: > 1. -e (detach) switch > dfu-util -a0 -D file1.bin;dfu-util -a3 -D uImage;dfu-util -e > > access to u-boot prompt. > > 2. -R (reset) switch > dfu-util -a0 -D file1.bin;dfu-util -R -a3 -D uImage > > target board reset Tested-by: Stephen Warren <swarren@nvidia.com>
Hi Stephen, > On 08/22/2014 08:08 AM, Lukasz Majewski wrote: > > This commit provides distinction between DFU device detach and > > reset. The -R behavior is preserved with proper handling of the > > dfu-util's -e switch, which detach the DFU device. > > > > By running dfu-util -e; one can force device to finish the > > execution of dfu command on target and execute some other scripted > > commands. > > > > Moreover, some naming has been changed - the dfu_reset() method now > > is known as dfu_detach(). New name better reflects the purpose of > > the code. > > > > It was also necessary to increase the number of > > usb_gadget_handle_interrupts() calls since we also must wait for > > detection of the USB reset event. > > > > Example usage: > > 1. -e (detach) switch > > dfu-util -a0 -D file1.bin;dfu-util -a3 -D uImage;dfu-util -e > > > > access to u-boot prompt. > > > > 2. -R (reset) switch > > dfu-util -a0 -D file1.bin;dfu-util -R -a3 -D uImage > > > > target board reset > > Tested-by: Stephen Warren <swarren@nvidia.com> Applied to u-boot-dfu. Thanks!
diff --git a/common/cmd_dfu.c b/common/cmd_dfu.c index 2633b30..ffd6c17 100644 --- a/common/cmd_dfu.c +++ b/common/cmd_dfu.c @@ -13,6 +13,8 @@ #include <g_dnl.h> #include <usb.h> +static bool dfu_reset; + static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if (argc < 4) @@ -36,17 +38,28 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) int controller_index = simple_strtoul(usb_controller, NULL, 0); board_usb_init(controller_index, USB_INIT_DEVICE); - + dfu_clear_detach(); g_dnl_register("usb_dnl_dfu"); while (1) { - if (dfu_reset()) + if (dfu_detach()) { + /* + * Check if USB bus reset is performed after detach, + * which indicates that -R switch has been passed to + * dfu-util. In this case reboot the device + */ + if (dfu_usb_get_reset()) { + dfu_reset = true; + goto exit; + } + /* * This extra number of usb_gadget_handle_interrupts() * calls is necessary to assure correct transmission * completion with dfu-util */ - if (++i == 10) + if (++i == 10000) goto exit; + } if (ctrlc()) goto exit; @@ -58,9 +71,11 @@ exit: done: dfu_free_entities(); - if (dfu_reset()) + if (dfu_reset) run_command("reset", 0); + dfu_clear_detach(); + return ret; } diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c index 3512b14..55e6a83 100644 --- a/drivers/dfu/dfu.c +++ b/drivers/dfu/dfu.c @@ -17,20 +17,41 @@ #include <linux/list.h> #include <linux/compiler.h> -static bool dfu_reset_request; +static bool dfu_detach_request; static LIST_HEAD(dfu_list); static int dfu_alt_num; static int alt_num_cnt; static struct hash_algo *dfu_hash_algo; -bool dfu_reset(void) +/* + * The purpose of the dfu_usb_get_reset() function is to + * provide information if after USB_DETACH request + * being sent the dfu-util performed reset of USB + * bus. + * + * Described behaviour is the only way to distinct if + * user has typed -e (detach) or -R (reset) when invoking + * dfu-util command. + * + */ +__weak bool dfu_usb_get_reset(void) +{ + return true; +} + +bool dfu_detach(void) +{ + return dfu_detach_request; +} + +void dfu_trigger_detach(void) { - return dfu_reset_request; + dfu_detach_request = true; } -void dfu_trigger_reset() +void dfu_clear_detach(void) { - dfu_reset_request = true; + dfu_detach_request = false; } static int dfu_find_alt_num(const char *s) diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index 9863dec..3e4f029 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -372,7 +372,7 @@ static int state_dfu_idle(struct f_dfu *f_dfu, to_runtime_mode(f_dfu); f_dfu->dfu_state = DFU_STATE_appIDLE; - dfu_trigger_reset(); + dfu_trigger_detach(); break; default: f_dfu->dfu_state = DFU_STATE_dfuERROR; diff --git a/include/dfu.h b/include/dfu.h index 7e0a999..f1a71c7 100644 --- a/include/dfu.h +++ b/include/dfu.h @@ -150,11 +150,14 @@ struct dfu_entity *dfu_get_entity(int alt); char *dfu_extract_token(char** e, int *n); void dfu_trigger_reset(void); int dfu_get_alt(char *name); -bool dfu_reset(void); +bool dfu_detach(void); +void dfu_trigger_detach(void); +void dfu_clear_detach(void); int dfu_init_env_entities(char *interface, char *devstr); unsigned char *dfu_get_buf(struct dfu_entity *dfu); unsigned char *dfu_free_buf(void); unsigned long dfu_get_buf_size(void); +bool dfu_usb_get_reset(void); int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num); int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
This commit provides distinction between DFU device detach and reset. The -R behavior is preserved with proper handling of the dfu-util's -e switch, which detach the DFU device. By running dfu-util -e; one can force device to finish the execution of dfu command on target and execute some other scripted commands. Moreover, some naming has been changed - the dfu_reset() method now is known as dfu_detach(). New name better reflects the purpose of the code. It was also necessary to increase the number of usb_gadget_handle_interrupts() calls since we also must wait for detection of the USB reset event. Example usage: 1. -e (detach) switch dfu-util -a0 -D file1.bin;dfu-util -a3 -D uImage;dfu-util -e access to u-boot prompt. 2. -R (reset) switch dfu-util -a0 -D file1.bin;dfu-util -R -a3 -D uImage target board reset Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> --- common/cmd_dfu.c | 23 +++++++++++++++++++---- drivers/dfu/dfu.c | 31 ++++++++++++++++++++++++++----- drivers/usb/gadget/f_dfu.c | 2 +- include/dfu.h | 5 ++++- 4 files changed, 50 insertions(+), 11 deletions(-)