Modules/USB - Parsing interface descriptors now
authorJohn Hodge <[email protected]>
Sat, 26 Nov 2011 14:10:41 +0000 (22:10 +0800)
committerJohn Hodge <[email protected]>
Sat, 26 Nov 2011 14:10:41 +0000 (22:10 +0800)
Modules/USB/Core/usb.c
Modules/USB/Core/usb_proto.h

index b43aae4..52968e3 100644 (file)
@@ -138,9 +138,10 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
        for( int i = 0; i < 1; i ++ )
        {
                struct sDescriptor_Configuration        desc;
-//             void    *full_buf;
+               void    *full_buf;
+               char    *cur_ptr;
                
-               USB_int_ReadDescriptor(dev, 0, 2, 0, sizeof(desc), &desc);
+               USB_int_ReadDescriptor(dev, 0, 2, i, sizeof(desc), &desc);
                LOG("Configuration Descriptor %i = {", i);
                LOG(" .Length = %i", desc.Length);
                LOG(" .Type = %i", desc.Type);
@@ -156,8 +157,46 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                        LOG("ConfigurationStr = '%s'", tmp);
                        free(tmp);
                }
-               
+
+               cur_ptr = full_buf = malloc( LittleEndian16(desc.TotalLength) );
+               USB_int_ReadDescriptor(dev, 0, 2, i, desc.TotalLength, full_buf);
+
+               cur_ptr += desc.Length;
+
                // TODO: Interfaces
+               for( int j = 0; j < desc.NumInterfaces; j ++ )
+               {
+                       struct sDescriptor_Interface *iface;
+                       iface = (void*)cur_ptr;
+                       // TODO: Sanity check with remaining space
+                       cur_ptr += sizeof(*iface);
+                       
+                       LOG("Interface %i/%i = {");
+                       LOG(" .InterfaceNum = %i", iface->InterfaceNum);
+                       LOG(" .NumEndpoints = %i", iface->NumEndpoints);
+                       LOG(" .InterfaceClass = 0x%x", iface->InterfaceClass);
+                       LOG(" .InterfaceSubClass = 0x%x", iface->InterfaceSubClass);
+                       LOG(" .InterfaceProcol = 0x%x", iface->InterfaceProtocol);
+
+                       if( iface->InterfaceStr ) {
+                               char    *tmp = USB_int_GetDeviceString(dev, 0, iface->InterfaceStr);
+                               LOG(" .InterfaceStr = %i '%s'", iface->InterfaceStr, tmp);
+                               free(tmp);
+                       }
+                       LOG("}");
+
+                       for( int k = 0; k < iface->NumEndpoints; k ++ )
+                       {
+                               struct sDescriptor_Endpoint *endpt;
+                               endpt = (void*)cur_ptr;
+                               // TODO: Sanity check with remaining space
+                               cur_ptr += sizeof(*endpt);
+                               
+                               
+                       }
+               }
+               
+               free(full_buf);
        }
 
        // Done.
index 776237d..b5399e8 100644 (file)
@@ -33,7 +33,7 @@ struct sDescriptor_Device
        Uint8   SerialNumberStr;
        
        Uint8   NumConfigurations;
-};
+} PACKED;
 
 struct sDescriptor_Configuration
 {
@@ -46,7 +46,7 @@ struct sDescriptor_Configuration
        Uint8   ConfigurationStr;
        Uint8   AttributesBmp;
        Uint8   MaxPower;       // in units of 2 mA
-};
+} PACKED;
 
 struct sDescriptor_String
 {
@@ -54,7 +54,7 @@ struct sDescriptor_String
        Uint8   Type;   // = 3
        
        Uint16  Data[62];       // 62 is arbitary
-};
+} PACKED;
 
 struct sDescriptor_Interface
 {
@@ -70,7 +70,7 @@ struct sDescriptor_Interface
        Uint8   InterfaceProtocol;
        
        Uint8   InterfaceStr;
-};
+} PACKED;
 
 struct sDescriptor_Endpoint
 {
@@ -100,7 +100,7 @@ struct sDescriptor_Endpoint
         * 
         */
        Uint8   PollingInterval;
-};
+} PACKED;
 
 #endif
 

UCC git Repository :: git.ucc.asn.au