From patchwork Fri Aug 22 14:08:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?=C5=81ukasz_Majewski?= X-Patchwork-Id: 382226 X-Patchwork-Delegate: marek.vasut@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3864F140107 for ; Sat, 23 Aug 2014 00:09:01 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 44B854A04A; Fri, 22 Aug 2014 16:08:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id GowhK8CBLqB5; Fri, 22 Aug 2014 16:08:58 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 835BAA759A; Fri, 22 Aug 2014 16:08:55 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id C116DA75A3 for ; Fri, 22 Aug 2014 16:08:51 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pUxmkrcRBKmX for ; Fri, 22 Aug 2014 16:08:48 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by theia.denx.de (Postfix) with ESMTPS id 5F975A758C for ; Fri, 22 Aug 2014 16:08:44 +0200 (CEST) Received: from epcpsbgm2.samsung.com (epcpsbgm2 [203.254.230.27]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NAP0032HOMFCF40@mailout4.samsung.com> for u-boot@lists.denx.de; Fri, 22 Aug 2014 23:08:39 +0900 (KST) X-AuditID: cbfee61b-f79f86d00000144c-60-53f74ee79ca3 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 08.1D.05196.7EE47F35; Fri, 22 Aug 2014 23:08:39 +0900 (KST) Received: from mcdsrvbld02.digital.local ([106.116.37.23]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NAP00LZVOM3YA60@mmp1.samsung.com>; Fri, 22 Aug 2014 23:08:39 +0900 (KST) From: Lukasz Majewski To: u-boot@lists.denx.de, Tom Rini , Stephen Warren Date: Fri, 22 Aug 2014 16:08:24 +0200 Message-id: <1408716505-9013-1-git-send-email-l.majewski@samsung.com> X-Mailer: git-send-email 1.7.10.4 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrOLMWRmVeSWpSXmKPExsVy+t9jAd3nft+DDbrPqFrsuHOf2eLNI26L Nw83M1q8aWtktNhx+QaLxa7bk1ksbk+byGRxYO57FotvW7YxWtyY3sJq8epgG4vF5MXzmS3e 7u1kd+D1mPdzIpPH7IaLLB7zZp1g8Th7Zwejx7ppb5k9epvfsXn0bVnF6LH95CQmj/aF/5k8 jt/YzuSxcW5oAHcUl01Kak5mWWqRvl0CV8bB104FN9QqNnU9YGxg/CXXxcjJISFgIrF8+wRG CFtM4sK99WxdjFwcQgKLGCVevtzKAuF0MUkcm9cKVsUmoCfx+e5TJhBbRCBa4vWlk0wgRcwC S5klPn85ygaSEBYIl+jafQrMZhFQlVjRtAasmVfAVeLezb2sEOsUJbqfTWCbwMi9gJFhFaNo akFyQXFSeq6RXnFibnFpXrpecn7uJkZwcD6T3sG4qsHiEKMAB6MSD6+Bx/dgIdbEsuLK3EOM EhzMSiK8c22AQrwpiZVVqUX58UWlOanFhxilOViUxHkPtloHCgmkJ5akZqemFqQWwWSZODil GhhVrjpYPWdz2HrO8GF6RcbUcPnsbbYJ+xY530hWr7t8cs8mwxM31u75W2O4221y2YN/jb7d Z8s2XNteaL3nyoT4xT2HTjlmcGixfhLwF3AX4qnYf1DAxZY57mPTn40nPsQkaP6/4t0i0LWo /GitZre5U4rbvCWxe5vYbk67keK7No7Bm4Pxd7ESS3FGoqEWc1FxIgCAZVfJSgIAAA== Cc: Marek Vasut , Stephen Warren , Egli Samuel , Pantelis Antoniou , Przemyslaw Marczak , =?UTF-8?q?Tam=C3=A1s=20Bond=C3=A1r?= Subject: [U-Boot] [PATCH 1/2] dfu: Provide means to find difference between dfu-util -e and -R X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de 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 Reviewed-by: Stephen Warren Tested-by: Stephen Warren --- 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(-) 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 #include +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 #include -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);