# HG changeset patch # User Paul Boddie # Date 1363222181 0 # Node ID ac59c54c025318c139e156d9c0714b7ca67eb6b0 # Parent 1d47c41fd48758a0f906d2c35788c9e529572512 Added an explicit bus reset test. diff -r 1d47c41fd487 -r ac59c54c0253 test.c --- a/test.c Wed Mar 13 23:33:39 2013 +0000 +++ b/test.c Thu Mar 14 00:49:41 2013 +0000 @@ -439,6 +439,7 @@ status = max_write(MAX_REG_HXFR, MAX_HXFR_SETUP); status = max_wait_transfer(status); hrsl = max_read(MAX_REG_HRSL, &status); + printf("HRSL = %x\n", hrsl); } while ((hrsl & MAX_HRSL_HRSLT) && (--timer)); @@ -480,6 +481,16 @@ max_write(MAX_REG_USBCTL, 0); } +void busreset() +{ + max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST); +} + +bool bus_is_reset() +{ + return !(max_read(MAX_REG_HCTL, NULL) & MAX_HCTL_BUSRST); +} + uint8_t check() { uint8_t oscillator; @@ -628,7 +639,7 @@ } max_control_status(true); - if (len >= usb_descriptor_size(type)) + if ((initial && (len >= 8)) || (len >= usb_descriptor_size(type))) return data; else { @@ -657,10 +668,7 @@ if (desc != NULL) { device->max_packet_size = device->desc.bMaxPacketSize0; - - /* Reset the device. */ - - max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST); + busreset(); return true; } @@ -948,16 +956,14 @@ else if ((devstate == MAX_DEVSTATE_CONNECTED) && frame_event && !(--framecount)) { - /* Reset the device. */ - - max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST); + busreset(); devstate = MAX_DEVSTATE_START; printf("START\n"); } /* Handle device reset initiation. */ - else if ((devstate == MAX_DEVSTATE_START) && bus_event) + else if ((devstate == MAX_DEVSTATE_START) && bus_event && bus_is_reset()) { devstate = MAX_DEVSTATE_RESET; framecount = 200; @@ -983,7 +989,7 @@ /* Handle second reset initiation. */ - else if ((devstate == MAX_DEVSTATE_INSPECTED) && bus_event) + else if ((devstate == MAX_DEVSTATE_INSPECTED) && bus_event && bus_is_reset()) { devstate = MAX_DEVSTATE_RESET_AGAIN; framecount = 200;