ben-arduino-usb

Changeset

30:ac59c54c0253
2013-03-14 Paul Boddie raw files shortlog changelog graph Added an explicit bus reset test.
test.c (file)
     1.1 --- a/test.c	Wed Mar 13 23:33:39 2013 +0000
     1.2 +++ b/test.c	Thu Mar 14 00:49:41 2013 +0000
     1.3 @@ -439,6 +439,7 @@
     1.4          status = max_write(MAX_REG_HXFR, MAX_HXFR_SETUP);
     1.5          status = max_wait_transfer(status);
     1.6          hrsl = max_read(MAX_REG_HRSL, &status);
     1.7 +        printf("HRSL = %x\n", hrsl);
     1.8      }
     1.9      while ((hrsl & MAX_HRSL_HRSLT) && (--timer));
    1.10  
    1.11 @@ -480,6 +481,16 @@
    1.12      max_write(MAX_REG_USBCTL, 0);
    1.13  }
    1.14  
    1.15 +void busreset()
    1.16 +{
    1.17 +    max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST);
    1.18 +}
    1.19 +
    1.20 +bool bus_is_reset()
    1.21 +{
    1.22 +    return !(max_read(MAX_REG_HCTL, NULL) & MAX_HCTL_BUSRST);
    1.23 +}
    1.24 +
    1.25  uint8_t check()
    1.26  {
    1.27      uint8_t oscillator;
    1.28 @@ -628,7 +639,7 @@
    1.29      }
    1.30      max_control_status(true);
    1.31  
    1.32 -    if (len >= usb_descriptor_size(type))
    1.33 +    if ((initial && (len >= 8)) || (len >= usb_descriptor_size(type)))
    1.34          return data;
    1.35      else
    1.36      {
    1.37 @@ -657,10 +668,7 @@
    1.38      if (desc != NULL)
    1.39      {
    1.40          device->max_packet_size = device->desc.bMaxPacketSize0;
    1.41 -
    1.42 -        /* Reset the device. */
    1.43 -
    1.44 -        max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST);
    1.45 +        busreset();
    1.46          return true;
    1.47      }
    1.48  
    1.49 @@ -948,16 +956,14 @@
    1.50  
    1.51              else if ((devstate == MAX_DEVSTATE_CONNECTED) && frame_event && !(--framecount))
    1.52              {
    1.53 -                /* Reset the device. */
    1.54 -
    1.55 -                max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST);
    1.56 +                busreset();
    1.57                  devstate = MAX_DEVSTATE_START;
    1.58                  printf("START\n");
    1.59              }
    1.60  
    1.61              /* Handle device reset initiation. */
    1.62  
    1.63 -            else if ((devstate == MAX_DEVSTATE_START) && bus_event)
    1.64 +            else if ((devstate == MAX_DEVSTATE_START) && bus_event && bus_is_reset())
    1.65              {
    1.66                  devstate = MAX_DEVSTATE_RESET;
    1.67                  framecount = 200;
    1.68 @@ -983,7 +989,7 @@
    1.69  
    1.70              /* Handle second reset initiation. */
    1.71  
    1.72 -            else if ((devstate == MAX_DEVSTATE_INSPECTED) && bus_event)
    1.73 +            else if ((devstate == MAX_DEVSTATE_INSPECTED) && bus_event && bus_is_reset())
    1.74              {
    1.75                  devstate = MAX_DEVSTATE_RESET_AGAIN;
    1.76                  framecount = 200;