ae80a113df3c8e7c4b63326ce11257c02188cd84
[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      *gUSB_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 void USB_RegisterDriver(tUSBDriver *Driver)
62 {
63         Log_Warning("USB", "TODO: Implement USB_RegisterDriver");
64 }
65
66 // --- Hub Registration ---
67 // NOTE: Doesn't do much nowdays
68 tUSBHub *USB_RegisterHub(tUSBInterface *Device, int PortCount)
69 {
70         tUSBHub *ret;
71         
72         ret = malloc(sizeof(tUSBHub) + sizeof(ret->Devices[0])*PortCount);
73         ret->Interface = Device;
74         ret->nPorts = PortCount;
75         memset(ret->Devices, 0, sizeof(ret->Devices[0])*PortCount);
76         return ret;
77 }
78
79 void USB_RemoveHub(tUSBHub *Hub)
80 {
81         for( int i = 0; i < Hub->nPorts; i ++ )
82         {
83                 if( Hub->Devices[i] )
84                 {
85                         USB_DeviceDisconnected( Hub, i );
86                 }
87         }
88         free(Hub);
89 }
90

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