Modules/EHCI - Debugging EHCI, still broken
[tpg/acess2.git] / KernelLand / Modules / USB / Core / usb.c
index a265be9..3234a77 100644 (file)
@@ -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));
        if(!host) {
                // Oh, bugger.
                return NULL;
@@ -40,6 +43,8 @@ tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int 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->RootHubIf.Next = NULL;
        host->RootHubIf.Dev = &host->RootHubDev;
@@ -49,11 +54,13 @@ tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts)
 
        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,9 +68,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)
@@ -89,10 +99,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;
 }
 
@@ -100,7 +110,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 );
                }

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