X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FUSB%2FCore%2Fusb_devinit.c;h=6143bdbe41b1c9517c1c6d48f148367c1c05ef0b;hb=4ebe00546574e97c5316881881f7f2562deea74b;hp=30807ff41a15445ff88c6e7ed767dfecde90f40d;hpb=253e9e4a08af1d1d73fe4e3643c3c63e478d4b04;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/USB/Core/usb_devinit.c b/KernelLand/Modules/USB/Core/usb_devinit.c index 30807ff4..6143bdbe 100644 --- a/KernelLand/Modules/USB/Core/usb_devinit.c +++ b/KernelLand/Modules/USB/Core/usb_devinit.c @@ -5,7 +5,7 @@ * usb_devinit.c * - USB Device Initialisation */ -#define DEBUG 1 +#define DEBUG 0 #include #include #include @@ -51,7 +51,7 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port) USB_int_SendSetupSetAddress(dev->Host, dev->Address); LOG("Assigned address %i", dev->Address); - dev->EndpointHandles[0] = dev->Host->HostDef->InitControl(dev->Host->Ptr, dev->Address << 4); + dev->EndpointHandles[0] = dev->Host->HostDef->InitControl(dev->Host->Ptr, dev->Address << 4, 64); for( int i = 1; i < 16; i ++ ) dev->EndpointHandles[i] = 0; @@ -256,7 +256,14 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port) LOG(" .MaxPacketSize = %i", LittleEndian16(endpt->MaxPacketSize)); LOG(" .PollingInterval = %i", endpt->PollingInterval); LOG("}"); - + + // Make sure things don't break + if( !((endpt->Address & 0x7F) < 15) ) { + Log_Error("USB", "Endpoint number %i>16", endpt->Address & 0x7F); + k --; + continue ; + } + dev_if->Endpoints[k].Next = NULL; dev_if->Endpoints[k].Interface = dev_if; dev_if->Endpoints[k].EndpointIdx = k; @@ -268,6 +275,31 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port) dev_if->Endpoints[k].InputData = NULL; // TODO: Register endpoint early + int ep_num = endpt->Address & 15; + if( dev->EndpointHandles[ep_num] ) { + Log_Notice("USB", "Device %p:%i ep %i reused", dev->Host->Ptr, dev->Address, ep_num); + } + else { + int addr = dev->Address*16+ep_num; + int mps = dev_if->Endpoints[k].MaxPacketSize; + void *handle = NULL; + switch( endpt->Attributes & 3) + { + case 0: // Control + handle = dev->Host->HostDef->InitControl(dev->Host->Ptr, addr, mps); + break; + case 1: // Isochronous + // handle = dev->Host->HostDef->InitIsoch(dev->Host->Ptr, addr, mps); + break; + case 2: // Bulk + handle = dev->Host->HostDef->InitBulk(dev->Host->Ptr, addr, mps); + break; + case 3: // Interrupt + // handle = dev->Host->HostDef->InitInterrupt(dev->Host->Ptr, addr, ...); + break; + } + dev->EndpointHandles[ep_num] = handle; + } } // Initialise driver @@ -292,14 +324,35 @@ void USB_DeviceConnected(tUSBHub *Hub, int Port) free(full_buf); } - + + Hub->Devices[Port] = dev; + // Done. LEAVE('-'); } void USB_DeviceDisconnected(tUSBHub *Hub, int Port) { - + tUSBDevice *dev; + if( !Hub->Devices[Port] ) { + Log_Error("USB", "Non-registered device disconnected"); + return; + } + dev = Hub->Devices[Port]; + + // TODO: Free related resources + // - Endpoint registrations + for( int i = 0; i < 16; i ++ ) + { + if(dev->EndpointHandles[i]) + dev->Host->HostDef->RemEndpoint(dev->Host->Ptr, dev->EndpointHandles[i]); + } + + // - Bus Address + USB_int_DeallocateAddress(dev->Host, dev->Address); + // - Inform handler + // - Allocate memory + free(dev); } void *USB_GetDeviceDataPtr(tUSBInterface *Dev) { return Dev->Data; }