diff --git a/fw/boot/boot.c b/fw/boot/boot.c index 88a0af0..2ce765f 100644 --- a/fw/boot/boot.c +++ b/fw/boot/boot.c @@ -71,6 +71,15 @@ void run_payload(void) /* Restart USB */ USB0XCN = 0; + /* + * The USB host must detect a disconnect (pull-ups absent) within 2 and + * 2.5 us according to parameter Tddis in table 7-13 on page 186 of the + * Universal Serial Bus Specification Revision 2.0. + * + * If our application calls usb_init really really quickly, we may need + * an extra delay here. + */ + debug("launching payload\n"); __asm diff --git a/fw/common/usb.c b/fw/common/usb.c index 3342126..6d037af 100644 --- a/fw/common/usb.c +++ b/fw/common/usb.c @@ -1,8 +1,8 @@ /* * common/usb.c - USB hardware setup and standard device requests * - * Written 2008, 2009 by Werner Almesberger - * Copyright 2008m 2009 Werner Almesberger + * Written 2008-2010 by Werner Almesberger + * Copyright 2008-2010 Werner Almesberger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -258,8 +258,9 @@ okay: } stall: printk("STALL\n"); - usb_write(E0CSR, SDSTL_0); - ep0.state = EP_STALL; + /* AN139 recommends this sequence */ + usb_write(E0CSR, SOPRDY | SDSTL_0); + ep0.state = EP_IDLE; }