b3195804c129892969048d4ea29e7c87e1ce11f2
[tpg/acess2.git] / Modules / USB / Core / usb.c
1 /*
2  * Acess2 USB Stack
3  * - By John Hodge (thePowersGang)
4  *
5  * usb.c
6  * - USB Structure
7  */
8 #define DEBUG   1
9 #include <acess.h>
10 #include <vfs.h>
11 #include <drv_pci.h>
12 #include "usb.h"
13
14 // === IMPORTS ===
15 extern tUSBHost *gUSB_Hosts;
16 extern tUSBDriver gUSBHub_Driver;
17
18 // === STRUCTURES ===
19
20 // === PROTOTYPES ===
21 tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts);
22
23 // === GLOBALS ===
24 tUSBDriver      *gpUSB_InterfaceDrivers = &gUSBHub_Driver;
25
26 // === CODE ===
27 tUSBHub *USB_RegisterHost(tUSBHostDef *HostDef, void *ControllerPtr, int nPorts)
28 {
29         tUSBHost        *host;
30         
31         host = malloc(sizeof(tUSBHost) + nPorts*sizeof(void*));
32         if(!host) {
33                 // Oh, bugger.
34                 return NULL;
35         }
36         host->HostDef = HostDef;
37         host->Ptr = ControllerPtr;
38         memset(host->AddressBitmap, 0, sizeof(host->AddressBitmap));
39
40         host->RootHubDev.ParentHub = NULL;
41         host->RootHubDev.Host = host;
42         host->RootHubDev.Address = 0;
43
44 //      host->RootHubIf.Next = NULL;
45         host->RootHubIf.Dev = &host->RootHubDev;
46         host->RootHubIf.Driver = NULL;
47         host->RootHubIf.Data = NULL;
48         host->RootHubIf.nEndpoints = 0;
49
50         host->RootHub.Interface = &host->RootHubIf;
51         host->RootHub.nPorts = nPorts;
52         memset(host->RootHub.Devices, 0, sizeof(void*)*nPorts);
53
54         // TODO: Lock
55         host->Next = gUSB_Hosts;
56         gUSB_Hosts = host;
57
58         return &host->RootHub;
59 }
60
61 // --- Drivers ---
62 void USB_RegisterDriver(tUSBDriver *Driver)
63 {
64         Log_Warning("USB", "TODO: Implement USB_RegisterDriver");
65 }
66
67 tUSBDriver *USB_int_FindDriverByClass(Uint32 ClassCode)
68 {
69         ENTER("xClassCode", ClassCode);
70         for( tUSBDriver *ret = gpUSB_InterfaceDrivers; ret; ret = ret->Next )
71         {
72                 LOG(" 0x%x & 0x%x == 0x%x?", ClassCode, ret->Match.Class.ClassMask, ret->Match.Class.ClassCode);
73                 if( (ClassCode & ret->Match.Class.ClassMask) == ret->Match.Class.ClassCode )
74                 {
75                         LOG("Found '%s'", ret->Name);
76                         LEAVE('p', ret);
77                         return ret;
78                 }
79         }
80         LEAVE('n');
81         return NULL;
82 }
83
84 // --- Hub Registration ---
85 // NOTE: Doesn't do much nowdays
86 tUSBHub *USB_RegisterHub(tUSBInterface *Device, int PortCount)
87 {
88         tUSBHub *ret;
89         
90         ret = malloc(sizeof(tUSBHub) + sizeof(ret->Devices[0])*PortCount);
91         ret->Interface = Device;
92         ret->nPorts = PortCount;
93         memset(ret->Devices, 0, sizeof(ret->Devices[0])*PortCount);
94         return ret;
95 }
96
97 void USB_RemoveHub(tUSBHub *Hub)
98 {
99         for( int i = 0; i < Hub->nPorts; i ++ )
100         {
101                 if( Hub->Devices[i] )
102                 {
103                         USB_DeviceDisconnected( Hub, i );
104                 }
105         }
106         free(Hub);
107 }
108

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