X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FUSB%2FCore%2Fusb_devinit.c;h=7eb55f9d2fee79441dd45b14d49b86a0f3b1c1b1;hb=bce1f445f4d3836e12d07591d00537981e75439a;hp=4b18b30a582c7e5c9e1b0c220a4082d00122f795;hpb=1ba64c63a4a3a8ce27155f9463f0442ea7f7dc89;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/USB/Core/usb_devinit.c b/KernelLand/Modules/USB/Core/usb_devinit.c index 4b18b30a..7eb55f9d 100644 --- a/KernelLand/Modules/USB/Core/usb_devinit.c +++ b/KernelLand/Modules/USB/Core/usb_devinit.c @@ -5,8 +5,7 @@ * usb_devinit.c * - USB Device Initialisation */ -#define DEBUG 0 - +#define DEBUG 1 #include #include #include @@ -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); @@ -72,25 +74,36 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port) LOG(" .SerialNumberStr = Str %i", desc.SerialNumberStr); LOG(" .NumConfigurations = %i", desc.SerialNumberStr); LOG("}"); - + + #if DEBUG if( desc.ManufacturerStr ) { char *tmp = USB_int_GetDeviceString(dev, 0, desc.ManufacturerStr); - LOG("ManufacturerStr = '%s'", tmp); - free(tmp); + if( tmp ) { + LOG("ManufacturerStr = '%s'", tmp); + free(tmp); + } } if( desc.ProductStr ) { char *tmp = USB_int_GetDeviceString(dev, 0, desc.ProductStr); - LOG("ProductStr = '%s'", tmp); - free(tmp); + if( tmp ) { + LOG("ProductStr = '%s'", tmp); + free(tmp); + } } if( desc.SerialNumberStr ) { char *tmp = USB_int_GetDeviceString(dev, 0, desc.SerialNumberStr); - LOG("SerialNumbertStr = '%s'", tmp); - free(tmp); + if( tmp ) { + LOG("SerialNumbertStr = '%s'", tmp); + free(tmp); + } } + #endif + #endif + + memcpy(&dev->DevDesc, &desc, sizeof(desc)); } // TODO: Support alternate configurations @@ -104,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); @@ -119,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 @@ -131,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; @@ -142,6 +163,10 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port) size_t iface_base_ofs; iface = (void*)(full_buf + ptr_ofs); + if( iface->Length == 0 ) { + Log_Warning("USB", "Bad USB descriptor (length = 0)"); + break ; + } ptr_ofs += iface->Length; if( ptr_ofs > total_length ) { // Sanity fail @@ -155,6 +180,7 @@ 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); @@ -167,12 +193,17 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port) free(tmp); } 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 @@ -225,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 ); } }