#include "usb_proto.h"
#include "usb_lowlevel.h"
-#define DUMP_DESCRIPTORS 0
+#define DUMP_DESCRIPTORS 1
// === PROTOTYPES ===
void USB_DeviceConnected(tUSBHub *Hub, int Port);
}
#endif
#endif
+
+ memcpy(&dev->DevDesc, &desc, sizeof(desc));
}
// TODO: Support alternate configurations
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);
}
#endif
+ if( desc.NumInterfaces == 0 ) {
+ Log_Notice("USB", "Device does not have any interfaces");
+ continue ;
+ }
+
// TODO: Split here and allow some method of selection
// Allocate device now that we have the configuration
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;
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
);
}
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 );
}
}