3 * - By John Hodge (thePowersGang)
15 extern tUSBHost *gUSB_Hosts;
16 extern tUSBDriver gUSBHub_Driver;
21 tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts);
25 tUSBHost *gUSB_Hosts = NULL;
26 tMutex glUSB_InterfaceDrivers;
27 tUSBDriver *gpUSB_InterfaceDrivers = &gUSBHub_Driver;
30 tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts)
34 host = malloc(sizeof(tUSBHost) + nPorts*sizeof(tUSBHubPort) + sizeof(tUSBDevice) + sizeof(tUSBInterface));
39 host->HostDef = HostDef;
40 host->Ptr = ControllerPtr;
41 memset(host->AddressBitmap, 0, sizeof(host->AddressBitmap));
43 host->RootHubDev = (void*)(host->RootHub.Ports + nPorts);
44 host->RootHubDev->ParentHub = NULL;
45 host->RootHubDev->Host = host;
46 host->RootHubDev->Address = 0;
47 ASSERT(HostDef->InitControl);
48 host->RootHubDev->EndpointHandles[0] = HostDef->InitControl(ControllerPtr, 0, 64);
49 host->RootHubDev->nInterfaces = 0;
51 host->RootHubIf = (void*)(host->RootHubDev + 1);
52 host->RootHubIf->Dev = host->RootHubDev;
53 host->RootHubIf->Driver = NULL;
54 host->RootHubIf->Data = NULL;
55 host->RootHubIf->nEndpoints = 0;
57 host->RootHub.Interface = host->RootHubIf;
58 host->RootHub.nPorts = nPorts;
59 memset(host->RootHub.Ports, 0, sizeof(tUSBHubPort)*nPorts);
62 Mutex_Acquire( &glUSB_Hosts );
63 host->Next = gUSB_Hosts;
65 Mutex_Release( &glUSB_Hosts );
67 return &host->RootHub;
71 void USB_RegisterDriver(tUSBDriver *Driver)
73 Mutex_Acquire( &glUSB_InterfaceDrivers );
74 Driver->Next = gpUSB_InterfaceDrivers;
75 gpUSB_InterfaceDrivers = Driver;
76 Mutex_Release( &glUSB_InterfaceDrivers );
78 // TODO: Recheck devices that didn't have a driver
81 tUSBDriver *USB_int_FindDriverByClass(Uint32 ClassCode)
83 ENTER("xClassCode", ClassCode);
84 for( tUSBDriver *ret = gpUSB_InterfaceDrivers; ret; ret = ret->Next )
86 LOG(" 0x%x & 0x%x == 0x%x?", ClassCode, ret->Match.Class.ClassMask, ret->Match.Class.ClassCode);
87 if( (ClassCode & ret->Match.Class.ClassMask) == ret->Match.Class.ClassCode )
89 LOG("Found '%s'", ret->Name);
98 // --- Hub Registration ---
99 // NOTE: Doesn't do much nowdays
100 tUSBHub *USB_RegisterHub(tUSBInterface *Device, int PortCount)
104 ret = malloc(sizeof(tUSBHub) + sizeof(ret->Ports[0])*PortCount);
105 ret->Interface = Device;
106 ret->nPorts = PortCount;
107 memset(ret->Ports, 0, sizeof(ret->Ports[0])*PortCount);
111 void USB_RemoveHub(tUSBHub *Hub)
113 for( int i = 0; i < Hub->nPorts; i ++ )
115 if( Hub->Ports[i].Dev )
117 USB_DeviceDisconnected( Hub, i );