X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FUSB%2FCore%2Fusb.c;h=44f0c6fe8f402577c0c003a5634854de625a443b;hb=015f48988e0ff398409d71dfc692005ab439490a;hp=b3195804c129892969048d4ea29e7c87e1ce11f2;hpb=48743e39650eb1ef988380e9d95f27fd40d3a9ce;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/USB/Core/usb.c b/KernelLand/Modules/USB/Core/usb.c index b3195804..44f0c6fe 100644 --- a/KernelLand/Modules/USB/Core/usb.c +++ b/KernelLand/Modules/USB/Core/usb.c @@ -5,7 +5,7 @@ * usb.c * - USB Structure */ -#define DEBUG 1 +#define DEBUG 0 #include #include #include @@ -21,6 +21,9 @@ extern tUSBDriver gUSBHub_Driver; tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts); // === GLOBALS === +tMutex glUSB_Hosts; +tUSBHost *gUSB_Hosts = NULL; +tMutex glUSB_InterfaceDrivers; tUSBDriver *gpUSB_InterfaceDrivers = &gUSBHub_Driver; // === CODE === @@ -28,7 +31,7 @@ tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts) { tUSBHost *host; - host = malloc(sizeof(tUSBHost) + nPorts*sizeof(void*)); + host = malloc(sizeof(tUSBHost) + nPorts*sizeof(tUSBHubPort) + sizeof(tUSBDevice) + sizeof(tUSBInterface)); if(!host) { // Oh, bugger. return NULL; @@ -37,23 +40,29 @@ tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts) host->Ptr = ControllerPtr; memset(host->AddressBitmap, 0, sizeof(host->AddressBitmap)); - host->RootHubDev.ParentHub = NULL; - host->RootHubDev.Host = host; - host->RootHubDev.Address = 0; + host->RootHubDev = (void*)(host->RootHub.Ports + nPorts); + host->RootHubDev->ParentHub = NULL; + host->RootHubDev->Host = host; + host->RootHubDev->Address = 0; + ASSERT(HostDef->InitControl); + host->RootHubDev->EndpointHandles[0] = HostDef->InitControl(ControllerPtr, 0, 64); + host->RootHubDev->nInterfaces = 0; -// host->RootHubIf.Next = NULL; - host->RootHubIf.Dev = &host->RootHubDev; - host->RootHubIf.Driver = NULL; - host->RootHubIf.Data = NULL; - host->RootHubIf.nEndpoints = 0; + host->RootHubIf = (void*)(host->RootHubDev + 1); + host->RootHubIf->Dev = host->RootHubDev; + host->RootHubIf->Driver = NULL; + host->RootHubIf->Data = NULL; + host->RootHubIf->nEndpoints = 0; - host->RootHub.Interface = &host->RootHubIf; + host->RootHub.Interface = host->RootHubIf; host->RootHub.nPorts = nPorts; - memset(host->RootHub.Devices, 0, sizeof(void*)*nPorts); + memset(host->RootHub.Ports, 0, sizeof(tUSBHubPort)*nPorts); - // TODO: Lock + // Append to list + Mutex_Acquire( &glUSB_Hosts ); host->Next = gUSB_Hosts; gUSB_Hosts = host; + Mutex_Release( &glUSB_Hosts ); return &host->RootHub; } @@ -61,7 +70,12 @@ tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts) // --- Drivers --- void USB_RegisterDriver(tUSBDriver *Driver) { - Log_Warning("USB", "TODO: Implement USB_RegisterDriver"); + Mutex_Acquire( &glUSB_InterfaceDrivers ); + Driver->Next = gpUSB_InterfaceDrivers; + gpUSB_InterfaceDrivers = Driver; + Mutex_Release( &glUSB_InterfaceDrivers ); + + // TODO: Recheck devices that didn't have a driver } tUSBDriver *USB_int_FindDriverByClass(Uint32 ClassCode) @@ -87,10 +101,10 @@ tUSBHub *USB_RegisterHub(tUSBInterface *Device, int PortCount) { tUSBHub *ret; - ret = malloc(sizeof(tUSBHub) + sizeof(ret->Devices[0])*PortCount); + ret = malloc(sizeof(tUSBHub) + sizeof(ret->Ports[0])*PortCount); ret->Interface = Device; ret->nPorts = PortCount; - memset(ret->Devices, 0, sizeof(ret->Devices[0])*PortCount); + memset(ret->Ports, 0, sizeof(ret->Ports[0])*PortCount); return ret; } @@ -98,7 +112,7 @@ void USB_RemoveHub(tUSBHub *Hub) { for( int i = 0; i < Hub->nPorts; i ++ ) { - if( Hub->Devices[i] ) + if( Hub->Ports[i].Dev ) { USB_DeviceDisconnected( Hub, i ); }