#include <fs_devfs.h>
#include <drv_serial.h>
#include <drv_pty.h>
+#include <debug_hooks.h>
+
+extern void Validate_VirtualMemoryUsage(void);
// === TYPES ===
struct sSerialPort
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;
}
{
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';
PTY_SendInput(Port->PTY, &Ch, 1);