Modules/UHCI - More verbose interrupt messages (x86_64 debugging)
[tpg/acess2.git] / KernelLand / Modules / USB / Core / usb_devinit.c
index 3207669..7eb55f9 100644 (file)
@@ -6,7 +6,6 @@
  * - USB Device Initialisation
  */
 #define DEBUG  1
-
 #include <acess.h>
 #include <vfs.h>
 #include <drv_pci.h>
@@ -14,6 +13,8 @@
 #include "usb_proto.h"
 #include "usb_lowlevel.h"
 
+#define DUMP_DESCRIPTORS       1
+
 // === PROTOTYPES ===
 void   USB_DeviceConnected(tUSBHub *Hub, int Port);
 void   USB_DeviceDisconnected(tUSBHub *Hub, int Port);
@@ -55,7 +56,8 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                LOG("Getting device descriptor");
                // Endpoint 0, Desc Type 1, Index 0
                USB_int_ReadDescriptor(dev, 0, 1, 0, sizeof(desc), &desc);
-               
+
+               #if DUMP_DESCRIPTORS            
                LOG("Device Descriptor = {");
                LOG(" .Length = %i", desc.Length);
                LOG(" .Type = %i", desc.Type);
@@ -99,6 +101,9 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                        }
                }
                #endif
+               #endif
+               
+               memcpy(&dev->DevDesc, &desc, sizeof(desc));
        }
 
        // TODO: Support alternate configurations
@@ -112,6 +117,8 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                size_t  total_length;
        
                USB_int_ReadDescriptor(dev, 0, 2, i, sizeof(desc), &desc);
+               // TODO: Check return length? (Do we get a length?)
+               #if DUMP_DESCRIPTORS
                LOG("Configuration Descriptor %i = {", i);
                LOG(" .Length = %i", desc.Length);
                LOG(" .Type = %i", desc.Type);
@@ -127,6 +134,12 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                        LOG("ConfigurationStr = '%s'", tmp);
                        free(tmp);
                }
+               #endif
+
+               if( desc.NumInterfaces == 0 ) {
+                       Log_Notice("USB", "Device does not have any interfaces");
+                       continue ;
+               }
 
                // TODO: Split here and allow some method of selection
 
@@ -139,10 +152,10 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                total_length = LittleEndian16(desc.TotalLength);
                full_buf = malloc( total_length );
                USB_int_ReadDescriptor(dev, 0, 2, i, total_length, full_buf);
-
                ptr_ofs += desc.Length;
 
-               // TODO: Interfaces
+
+               // Interfaces!
                for( int j = 0; ptr_ofs < total_length && j < desc.NumInterfaces; j ++ )
                {
                        struct sDescriptor_Interface *iface;
@@ -167,26 +180,30 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                                continue ;
                        }
 
+                       #if DUMP_DESCRIPTORS
                        LOG("Interface %i/%i = {", i, j);
                        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 DEBUG       
                        if( iface->InterfaceStr ) {
                                char    *tmp = USB_int_GetDeviceString(dev, 0, iface->InterfaceStr);
                                LOG(" .InterfaceStr = %i '%s'", iface->InterfaceStr, tmp);
                                free(tmp);
                        }
-                       #endif
                        LOG("}");
+                       #endif
 
-                       dev_if = malloc(sizeof(tUSBInterface) + iface->NumEndpoints*sizeof(dev_if->Endpoints[0]));
+                       dev_if = malloc(
+                               sizeof(tUSBInterface)
+                               + iface->NumEndpoints*sizeof(dev_if->Endpoints[0])
+                               );
                        dev_if->Dev = dev;
                        dev_if->Driver = NULL;
                        dev_if->Data = NULL;
                        dev_if->nEndpoints = iface->NumEndpoints;
+                       memcpy(&dev_if->IfaceDesc, iface, sizeof(*iface));
                        dev->Interfaces[j] = dev_if;
 
                        // Copy interface data
@@ -239,11 +256,11 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port)
                                        );
                        }
                        else {
+                               LOG("Driver '%s' in use", dev_if->Driver->Name);
                                dev_if->Driver->Connected(
                                        dev_if,
                                        full_buf + iface_base_ofs, ptr_ofs - iface_base_ofs
                                        );
-                       //      dev_if->Driver->Connected( dev_if );
                        }
                }
                

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