3 * - By John Hodge (thePowersGang)
6 * - Wrapper for 'Serial' ports (UARTs and the like)
9 #include <meta_serial.h>
11 #define DEFAULT_BUFSIZ 64
18 const tSerialHandlers *Handlers;
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);
33 MODULE_DEFINE(0, 1, MetaSerial, Serial_Install, NULL, NULL);
34 tRWLock glSerial_ListLock;
35 tSerialPort *gSerial_FirstPort;
36 tSerialPort *gSerial_LastPort;
39 int Serial_Install(char **Arguments)
44 tSerialPort *Serial_AddPort(tSerialHandlers *Handlers, void *Handle, const char *Name)
46 tSerialPort *ret = NULL;
49 // Create new structure
50 ret = malloc( sizeof(tSerialPort) + strlen(Name) + 1 );
52 ret->Handlers = Handlers;
54 ret->Name = (void*)(ret + 1);
55 strcpy(ret->Name, Name);
59 Serial_SetInputBufferSize(ret, DEFAULT_BUFSIZ);
62 if( RWLock_AcquireWrite(&glSerial_ListLock) ) {
66 ret->Prev = gSerial_LastPort;
68 gSerial_LastPort->Next = ret;
70 gSerial_FirstPort = ret;
71 gSerial_LastPort = ret;
72 RWLock_Release(&glSerial_ListLock);
80 void Serial_RemovePort(tSerialPort *Port)
82 if( RWLock_AcquireWrite(&glSerial_ListLock) ) {
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);
93 void Serial_RecieveData(tSerialPort *Port, size_t Bytes, const void *Data)