Usermode/libc++ - Implement map::insert and map::erase
[tpg/acess2.git] / KernelLand / Kernel / drv / serial.c
index 7a4192c..df13fc7 100644 (file)
@@ -5,11 +5,15 @@
  * drv/serial.c
  * - Common serial port code
  */
+#define DEBUG  0
 #include <acess.h>
 #include <modules.h>
 #include <fs_devfs.h>
 #include <drv_serial.h>
 #include <drv_pty.h>
+#include <debug_hooks.h>
+
+extern void    Validate_VirtualMemoryUsage(void);
 
 // === TYPES ===
 struct sSerialPort
@@ -42,28 +46,72 @@ int Serial_Install(char **Arguments)
 tSerialPort *Serial_CreatePort(tSerial_OutFcn output, void *handle)
 {
        tSerialPort     *ret = malloc( sizeof(tSerialPort) );
-       // TODO: Make PTY code handle 'serial#' and auto-number
-       ret->PTY = PTY_Create("serial0", ret, Serial_int_PTYOutput, Serial_int_PTYSetDims, Serial_int_PTYSetArrib);
-       ret->OutputFcn = output;
-       ret->OutHandle = handle;
-       struct ptymode mode = {
-               .OutputMode = PTYBUFFMT_TEXT,
-               .InputMode = PTYIMODE_CANON|PTYIMODE_ECHO
-       };
+       // Automatically indexed
        struct ptydims dims = {
                .W = 80, .H = 25,
                .PW = 0, .PH = 0
        };
-       PTY_SetAttrib(ret->PTY, &dims, &mode, 0);
+       struct ptymode mode = {
+               .OutputMode = PTYBUFFMT_TEXT,
+               .InputMode = PTYIMODE_CANON|PTYIMODE_ECHO
+       };
+       ret->PTY = PTY_Create("serial#", ret,
+               Serial_int_PTYOutput, Serial_int_PTYSetDims, Serial_int_PTYSetArrib,
+               &dims, &mode
+               );
+       ret->OutputFcn = output;
+       ret->OutHandle = handle;
        return ret;
 }
 
 void Serial_ByteReceived(tSerialPort *Port, char Ch)
 {
+       LOG("Port=%p,Ch=%i", Port, Ch);
        if( !Port )
                return ;
+       if( Port == gSerial_KernelDebugPort )
+       {
+               static tDebugHook       info;
+               static int serial_debug_mode = 0;
+               // Kernel serial debug hooks.
+               if( serial_debug_mode == 2 )
+               {
+                       // Leave latched mode
+                       if( Ch == '.' )
+                               serial_debug_mode = 0;
+                       else
+                               DebugHook_HandleInput(&info, 1, &Ch);
+                       return ;
+               }
+               else if( serial_debug_mode )
+               {
+                       if( Ch == 'X'-'A'+1 ) {
+                               PTY_SendInput(Port->PTY, &Ch, 1);
+                               serial_debug_mode = 0;
+                       }
+                       else if( Ch == '~' ) {
+                               // Enter latched mode
+                               serial_debug_mode = 2;
+                       }
+                       else {
+                               DebugHook_HandleInput(&info, 1, &Ch);
+                               serial_debug_mode = 0;
+                       }
+                       return ;
+               }
+               else if( Ch == 'X'-'A'+1 )
+               {
+                       serial_debug_mode = 1;
+                       return ;
+               }
+               else
+               {
+                       // Fall
+               }
+       }
        if( Ch == '\r' )
                Ch = '\n';
+       LOG("Dispatch to PTY");
        PTY_SendInput(Port->PTY, &Ch, 1);
 }
 

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