Merge branch 'master' of git://git.ucc.asn.au/tpg/acess2
[tpg/acess2.git] / KernelLand / Kernel / drv / meta_serial.c
1 /*
2  * Acess2 Kernel
3  * - By John Hodge (thePowersGang)
4  *
5  * drv/meta_serial.c
6  * - Wrapper for 'Serial' ports (UARTs and the like)
7  */
8 #include <fs_devfs.h>
9 #include <meta_serial.h>
10
11 #define DEFAULT_BUFSIZ  64
12
13 // === STRUCTS ===
14 struct sSerialPort
15 {
16         tSerialPort     *Next;
17         tSerialPort     *Prev;
18         const tSerialHandlers   *Handlers;
19         void    *Handle;
20         size_t  BufferSize;
21         size_t  BufferLen;
22         const char *Name;
23         void    *Buffer;
24 };
25
26 // === PROTOTYPES ===
27 int     Serial_Install(char **Arguments);
28 tSerialPort     *Serial_AddPort(tSerialHandlers *Handlers, void *Handle, const char *Ident);
29 void    Serial_RemovePort(tSerialPort *Port);
30 void    Serial_RecieveData(tSerialPort *Port, size_t Bytes, const void *Data);
31
32 // === GLOBALS ===
33 MODULE_DEFINE(0, 1, MetaSerial, Serial_Install, NULL, NULL);
34 tRWLock glSerial_ListLock;
35 tSerialPort     *gSerial_FirstPort;
36 tSerialPort     *gSerial_LastPort;
37
38 // === CODE ===
39 int Serial_Install(char **Arguments)
40 {
41         return 0;
42 }
43
44 tSerialPort *Serial_AddPort(tSerialHandlers *Handlers, void *Handle, const char *Name)
45 {
46         tSerialPort     *ret = NULL;
47         
48         // Remove duplicates?
49         // Create new structure
50         ret = malloc( sizeof(tSerialPort) + strlen(Name) + 1 );
51
52         ret->Handlers = Handlers;
53         ret->Handle = Handle;
54         ret->Name = (void*)(ret + 1);
55         strcpy(ret->Name, Name);
56         
57         ret->BufferLen = 0;
58         ret->Buffer = NULL;
59         Serial_SetInputBufferSize(ret, DEFAULT_BUFSIZ);
60
61         // Add to list
62         if( RWLock_AcquireWrite(&glSerial_ListLock) ) {
63                 goto _err;
64         }
65         ret->Next = NULL;
66         ret->Prev = gSerial_LastPort;
67         if(gSerial_LastPort)
68                 gSerial_LastPort->Next = ret;
69         else
70                 gSerial_FirstPort = ret;
71         gSerial_LastPort = ret;
72         RWLock_Release(&glSerial_ListLock);
73         
74         return ret;
75 _err:
76         free(ret);
77         return NULL;
78 }
79
80 void Serial_RemovePort(tSerialPort *Port)
81 {
82         if( RWLock_AcquireWrite(&glSerial_ListLock) ) {
83                 // dafuq?
84         }
85
86         *(Port->Prev ? &Port->Prev->Next : &gSerial_FirstPort) = Port->Next;
87         *(Port->Next ? &Port->Next->Prev : &gSerial_LastPort) = Port->Prev;
88         RWLock_Release(&glSerial_ListLock);
89         
90         free(Port);
91 }
92
93 void Serial_RecieveData(tSerialPort *Port, size_t Bytes, const void *Data)
94 {
95         
96 }
97

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