USB host shield setup packet error

I am attempting to use the Uno and a USB host shield to interface with the Logitech Force 3d Pro joystick. The goal of this project is to drive a servo and use force feedback to “feel” what the servo is pushing on. However I am having a problem getting the joystick to configure when I connect it to the USB host shield. I get the following error when I connect this device.

Start
State: 12
State: 12
State: 20
State: 30
State: 40
State: 50
State: 60
Setup packet error: D
State: A0

*note the state values are in HEX

From my research it looks like the state of 0x0D is “J-state in stead of response”, but what does this mean?

However if i connect nearly any other device I can get it to return “device unsupported” (this is generated by my code). Here’s my code:

#include <Max3421e.h>
#include <Usb.h>



#define joy_Addr      0x01
#define joy_outAddr   0x01
#define EP_MaxPktSize 0x08
#define EP_POLL       0x0A 
#define joy_inAddr    0x01
#define joy_NUM_EP    0x02

#define joy_DESCR_LEN  0x8B
#define joy_VID_LO     0x6D
#define joy_VID_HI     0x04
#define joy_PID_LO     0x86
#define joy_PID_HI     0xC2
#define joy_CONFIG     0x01
#define joy_Report_len 0x07

#define CONTROL_EP     0x00
#define OUTPUT_EP      0x01
#define INPUT_EP       0x81

#define EP_INTERRUPT   0x03


EP_RECORD ep_record[ joy_NUM_EP ];

char descrBuf[ 0x12 ] = { 
  0 };      
char buf[ 4 ] = { 
  0 };                  
char oldBuf[ 4 ] = { 
  0 };            


MAX3421E Max;
USB Usb;

void setup(){
  Serial.begin( 115200 ); // begin serial with baud of 115200
  Max.powerOn();
  delay(200);
 
  Serial.print( "Start" ); 

  delay(200);
} 

void loop(){
  
  byte temp;
  byte rcode;
  
  Max.Task();
  Usb.Task();
  
  Serial.print( "\n State: " );
  
  temp = Usb.getUsbTaskState();   //for testing
  
  Serial.print( temp, HEX );   //for testing
  
  if (Usb.getUsbTaskState()   != USB_STATE_CONFIGURING ){
    
     
     
     delay(200);
    
    
  }
  
 // Usb.setUsbTaskState(0x70);
  
  //joy_init();
  
  if( Usb.getUsbTaskState() == USB_STATE_CONFIGURING ) {  //wait for addressing state
    joy_init();
    Usb.setUsbTaskState( USB_STATE_RUNNING );
    
    Serial.print( " configuring done " );
  }
  if( Usb.getUsbTaskState() == USB_STATE_RUNNING ) {  //poll the joystick 
    joy_poll();
    
    Serial.print( " running " );
  }  
  
  delay(200);
}  


void joy_init( void ){
  
  
  byte rcode = 0;  //retrun code
  byte i;
  
  ep_record[ CONTROL_EP ] = *( Usb.getDevTableEntry( 0,0 ));
  ep_record[ OUTPUT_EP  ].epAddr     = joy_outAddr;
  ep_record[ OUTPUT_EP ].Attr        = EP_INTERRUPT;    
  ep_record[ OUTPUT_EP  ].MaxPktSize = EP_MaxPktSize;  
  ep_record[ OUTPUT_EP  ].Interval   = EP_POLL;        
  ep_record[ OUTPUT_EP  ].sndToggle  = bmSNDTOG0;
  ep_record[ OUTPUT_EP  ].rcvToggle  = bmRCVTOG0;
  
  ep_record[ INPUT_EP   ].epAddr     = joy_inAddr;
  ep_record[ INPUT_EP   ].Attr       = EP_INTERRUPT; 
  ep_record[ INPUT_EP   ].MaxPktSize = EP_MaxPktSize;
  ep_record[ INPUT_EP   ].Interval   = EP_POLL;
  ep_record[ OUTPUT_EP  ].sndToggle  = bmSNDTOG0;
  ep_record[ OUTPUT_EP  ].rcvToggle  = bmRCVTOG0;
   
 
  Usb.setDevTableEntry( joy_Addr, ep_record );
 
   Serial.print( "\n init" );
  
  rcode = Usb.getDevDescr( joy_Addr, ep_record[ CONTROL_EP ].epAddr, joy_DESCR_LEN, descrBuf );
  if( rcode ) {
    Serial.print("Error attempting read device descriptor. Return code :");
    Serial.println( rcode, HEX );
    while(1);  //stop
  }
 
  if((descrBuf[ 8 ] != joy_VID_LO) || (descrBuf[ 9 ] != joy_VID_HI) || (descrBuf[ 10 ] != joy_PID_LO) || (descrBuf[ 11 ] != joy_PID_HI) ){
    Serial.print("Unsupported USB Device");
   while(1);  //stop
  }  
  
  rcode = Usb.setConf( joy_Addr, ep_record[ CONTROL_EP ].epAddr, joy_CONFIG );                    
  if( rcode ) {
    Serial.print("Error attempting to configure Logitech Force 3d Pro. Return code :");
    Serial.println( rcode, HEX );
    while(1);  //stop
  
  Serial.println("Logitech Force 3d Pro initialized");
  Serial.println("");
  Serial.println("");
  Serial.println("");
  delay(200);
  
  }
}

void joy_poll( void ){

  byte rcode = 0;
 
  rcode = Usb.inTransfer( joy_Addr, ep_record[ INPUT_EP ].epAddr, joy_Report_len, buf);
  
  if( rcode != 0 ) {
    
    
    Serial.println( buf[ 0 ], DEC);
    Serial.println( buf[ 1 ], DEC);
    Serial.println( buf[ 2 ], DEC);
    Serial.println( buf[ 3 ], DEC);
    
    return;
  }
 
  return;
  
}

void joy_test( void ){
  
  byte rcode;
  
   rcode = Usb.getDevDescr( joy_Addr, 0x00 , joy_DESCR_LEN, descrBuf );
  if( rcode ) {
    Serial.print("Error attempting read device descriptor. Return code :");
    Serial.println( rcode, HEX );
    while(1);  //stop
  }
   return; 
  
  
}

Any suggestions / help would be great. Also this is my first post so let me know if you need more information. I am confused as to what is different about this joystick from other devices I have tried. Thanks in advance.

Opps, I forgot to include the device descriptor.

Low Speed device @ 2 (0x1D100000): .............................................   Composite device: "Logitech Force 3D Pro"
    Port Information:   0x001a
           Not Captive
           Attached to Root Hub
           External Device
           Connected
           Enabled
    Device Descriptor   
        Descriptor Version Number:   0x0110
        Device Class:   0   (Composite)
        Device Subclass:   0
        Device Protocol:   0
        Device MaxPacketSize:   8
        Device VendorID/ProductID:   0x046D/0xC286   (Logitech Inc.)
        Device Version Number:   0x1000
        Number of Configurations:   1
        Manufacturer String:   3 "Logitech"
        Product String:   1 "Logitech Force 3D Pro"
        Serial Number String:   0 (none)
    Configuration Descriptor   
        Length (and contents):   41
            Raw Descriptor (hex)    0000: 09 02 29 00 01 01 00 80  28 09 04 00 00 02 03 00  
            Raw Descriptor (hex)    0010: 00 00 09 21 10 01 21 01  22 8B 00 07 05 81 03 08  
            Raw Descriptor (hex)    0020: 00 0A 07 05 01 03 08 00  0A 
        Number of Interfaces:   1
        Configuration Value:   1
        Attributes:   0x80 (bus-powered)
        MaxPower:   80 ma
        Interface #0 - HID   
            Alternate Setting   0
            Number of Endpoints   2
            Interface Class:   3   (HID)
            Interface Subclass;   0
            Interface Protocol:   0
            HID Descriptor   
                Descriptor Version Number:   0x0110
                Country Code:   33
                Descriptor Count:   1
                Descriptor 1   
                    Type:   0x22  (Report Descriptor)
                    Length (and contents):   139
                        Raw Descriptor (hex)    0000: 05 01 09 04 A1 01 A1 02  95 02 75 0A 15 00 26 FF  
                        Raw Descriptor (hex)    0010: 03 35 00 46 FF 03 09 30  09 31 81 02 75 04 95 01  
                        Raw Descriptor (hex)    0020: 25 07 46 3B 01 66 14 00  09 39 81 42 65 00 75 08  
                        Raw Descriptor (hex)    0030: 26 FF 00 46 FF 00 09 35  81 02 A4 95 08 75 01 25  
                        Raw Descriptor (hex)    0040: 01 45 01 05 09 19 01 29  08 81 02 B4 09 36 81 02  
                        Raw Descriptor (hex)    0050: 95 04 75 01 25 01 45 01  05 09 19 09 29 0C 81 02  
                        Raw Descriptor (hex)    0060: 95 04 81 01 C0 A1 02 26  FF 00 46 FF 00 75 08 95  
                        Raw Descriptor (hex)    0070: 07 09 02 91 02 C0 A1 02  95 04 75 08 26 FF 00 46  
                        Raw Descriptor (hex)    0080: FF 00 06 00 FF 09 01 B1  02 C0 C0 
                    Parsed Report Descriptor:   
                          Usage Page    (Generic Desktop) 
                          Usage (Joystick)    
                              Collection (Application)    
                                    Collection (Logical)    
                                      Report Count............    (2)  
                                      Report Size.............    (10)  
                                      Logical Minimum.........    (0)  
                                      Logical Maximum.........    (1023)  
                                      Physical Minimum........    (0)  
                                      Physical Maximum........    (1023)  
                                      Usage (X)    
                                      Usage (Y)    
                                      Input...................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) 
                                      Report Size.............    (4)  
                                      Report Count............    (1)  
                                      Logical Maximum.........    (7)  
                                      Physical Maximum........    (315)  
                                      Unit....................    (20)  
                                      Usage (Hat Switch)    
                                      Input...................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, Null State, Bitfield) 
                                      Unit....................    (0)  
                                      Report Size.............    (8)  
                                      Logical Maximum.........    (255)  
                                      Physical Maximum........    (255)  
                                      Usage (Rz)    
                                      Input...................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) 
                                      Push....................     
                                      Report Count............    (8)  
                                      Report Size.............    (1)  
                                      Logical Maximum.........    (1)  
                                      Physical Maximum........    (1)  
                                      Usage Page    (Button) 
                                      Usage Minimum...........    (1)  
                                      Usage Maximum...........    (8)  
                                      Input...................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) 
                                      Pop.....................     
                                      Usage 54 (0x36)    
                                      Input...................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) 
                                      Report Count............    (4)  
                                      Report Size.............    (1)  
                                      Logical Maximum.........    (1)  
                                      Physical Maximum........    (1)  
                                      Usage Page    (Button) 
                                      Usage Minimum...........    (9)  
                                      Usage Maximum...........    (12)  
                                      Input...................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) 
                                      Report Count............    (4)  
                                      Input...................   (Constant, Array, Absolute) 
                                    End Collection     
                                    Collection (Logical)    
                                      Logical Maximum.........    (255)  
                                      Physical Maximum........    (255)  
                                      Report Size.............    (8)  
                                      Report Count............    (7)  
                                      Usage 2 (0x2)    
                                      Output..................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Nonvolatile, Bitfield) 
                                    End Collection     
                                    Collection (Logical)    
                                      Report Count............    (4)  
                                      Report Size.............    (8)  
                                      Logical Maximum.........    (255)  
                                      Physical Maximum........    (255)  
                                      Usage Page    (65280) 
                                      Usage 1 (0x1)    
                                          (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Nonvolatile, Bitfield) 
                                    End Collection     
                              End Collection     
            Endpoint 0x81 - Interrupt Input   
                Address:   0x81  (IN)
                Attributes:   0x03  (Interrupt no synchronization data endpoint)
                Max Packet Size:   8
                Polling Interval:   10 ms


            Endpoint 0x01 - Interrupt Output   
                Address:   0x01  (OUT)
                Attributes:   0x03  (Interrupt no synchronization data endpoint)
                Max Packet Size:   8
                Polling Interval:   10 ms

Thanks again :-)

Run your sketch, then press RESET on Arduino and see what happens. I know about one device ( out of ~200 I tested so far ) which requires 2 USB resets to function. If joy_init() works after the second reset, you'd need to modify Usb.Task() to issue two USB resets instead of one.

Ok, I tried that, it gives simular results. Except for now it gets to state 0x60, USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE, then goes to waiting for device (0x12). I am wondering are there some USB devices that just will not work with this host?