A few cleanups in serial passthrough

This commit is contained in:
Jasmine Iwanek
2025-06-19 21:39:09 -04:00
parent 6bb210a3df
commit 19c86c3f7e
4 changed files with 41 additions and 32 deletions

View File

@@ -13,7 +13,7 @@
* Jasmine Iwanek <jasmine@iwanek.co.uk> * Jasmine Iwanek <jasmine@iwanek.co.uk>
* *
* Copyright 2021 Andreas J. Reichel. * Copyright 2021 Andreas J. Reichel.
* Copyright 2021-2022 Jasmine Iwanek. * Copyright 2021-2025 Jasmine Iwanek.
*/ */
#include <stdarg.h> #include <stdarg.h>
@@ -222,10 +222,15 @@ serial_passthrough_dev_init(const device_t *info)
} }
const char *serpt_mode_names[SERPT_MODES_MAX] = { const char *serpt_mode_names[SERPT_MODES_MAX] = {
[SERPT_MODE_VCON] = "vcon", #ifdef _WIN32
[SERPT_MODE_TCPSRV] = "tcpsrv", [SERPT_MODE_NPIPE_SRV] = "npipesrv",
[SERPT_MODE_TCPCLNT] = "tcpclnt", [SERPT_MODE_NPIPE_CLNT] = "npipeclnt",
[SERPT_MODE_HOSTSER] = "hostser", #else
[SERPT_MODE_VCON] = "vcon",
#endif
[SERPT_MODE_TCP_SRV] = "tcpsrv",
[SERPT_MODE_TCP_CLNT] = "tcpclnt",
[SERPT_MODE_HOSTSER] = "hostser",
}; };
// clang-format off // clang-format off
@@ -240,19 +245,19 @@ static const device_config_t serial_passthrough_config[] = {
.spinner = { 0 }, .spinner = { 0 },
.selection = { .selection = {
#ifdef _WIN32 #ifdef _WIN32
{ .description = "Named Pipe (Server)", .value = SERPT_MODE_VCON }, { .description = "Named Pipe (Server)", .value = SERPT_MODE_NPIPE_SRV },
#if 0 /* TODO */ #if 0 /* TODO */
{ .description = "Named Pipe (Client)", .value = SERPT_MODE_VCON }, { .description = "Named Pipe (Client)", .value = SERPT_MODE_NPIPE_CLNT },
#endif #endif
#else /* _WIN32 */ #else /* _WIN32 */
{ .description = "Pseudo Terminal/Virtual Console", .value = SERPT_MODE_VCON }, { .description = "Pseudo Terminal/Virtual Console", .value = SERPT_MODE_VCON },
#endif /* _WIN32 */ #endif /* _WIN32 */
#if 0 /* TODO */ #if 0 /* TODO */
{ .description = "TCP Server", .value = SERPT_MODE_TCPSRV }, { .description = "TCP Server", .value = SERPT_MODE_TCP_SRV },
{ .description = "TCP Client", .value = SERPT_MODE_TCPCLNT }, { .description = "TCP Client", .value = SERPT_MODE_TCP_CLNT },
#endif #endif
{ .description = "Host Serial Passthrough", .value = SERPT_MODE_HOSTSER }, { .description = "Host Serial Passthrough", .value = SERPT_MODE_HOSTSER },
{ .description = "" } { .description = "" }
}, },
.bios = { { 0 } } .bios = { { 0 } }
}, },

View File

@@ -13,7 +13,7 @@
* Jasmine Iwanek <jasmine@iwanek.co.uk> * Jasmine Iwanek <jasmine@iwanek.co.uk>
* *
* Copyright 2021 Andreas J. Reichel. * Copyright 2021 Andreas J. Reichel.
* Copyright 2021-2022 Jasmine Iwanek. * Copyright 2021-2025 Jasmine Iwanek.
*/ */
#ifndef SERIAL_PASSTHROUGH_H #ifndef SERIAL_PASSTHROUGH_H
@@ -28,10 +28,15 @@
#include <86box/serial.h> #include <86box/serial.h>
enum serial_passthrough_mode { enum serial_passthrough_mode {
SERPT_MODE_VCON, /*Named Pipe (Server) / Pseudo Terminal/Virtual Console */ #ifdef _WIN32
SERPT_MODE_TCPSRV, /* TCP Server (TODO) */ SERPT_MODE_NPIPE_SRV, /* Named Pipe (Server) */
SERPT_MODE_TCPCLNT, /* TCP Client (TODO) */ SERPT_MODE_NPIPE_CLNT, /* Named Pipe (Client) */
SERPT_MODE_HOSTSER, /* Host Serial Passthrough */ #else
SERPT_MODE_VCON, /* Pseudo Terminal/Virtual Console */
#endif
SERPT_MODE_TCP_SRV, /* TCP Server (TODO) */
SERPT_MODE_TCP_CLNT, /* TCP Client (TODO) */
SERPT_MODE_HOSTSER, /* Host Serial Passthrough */
SERPT_MODES_MAX, SERPT_MODES_MAX,
}; };

View File

@@ -13,7 +13,7 @@
* Jasmine Iwanek <jasmine@iwanek.co.uk> * Jasmine Iwanek <jasmine@iwanek.co.uk>
* *
* Copyright 2021 Andreas J. Reichel * Copyright 2021 Andreas J. Reichel
* Copyright 2021-2023 Jasmine Iwanek * Copyright 2021-2025 Jasmine Iwanek
*/ */
#define _XOPEN_SOURCE 500 #define _XOPEN_SOURCE 500
@@ -46,9 +46,9 @@ plat_serpt_close(void *priv)
fclose(dev->master_fd); fclose(dev->master_fd);
#endif #endif
FlushFileBuffers((HANDLE) dev->master_fd); FlushFileBuffers((HANDLE) dev->master_fd);
if (dev->mode == SERPT_MODE_VCON) if (dev->mode == SERPT_MODE_NPIPE_SRV)
DisconnectNamedPipe((HANDLE) dev->master_fd); DisconnectNamedPipe((HANDLE) dev->master_fd);
if (dev->mode == SERPT_MODE_HOSTSER) { else if (dev->mode == SERPT_MODE_HOSTSER) {
SetCommState((HANDLE) dev->master_fd, (DCB *) dev->backend_priv); SetCommState((HANDLE) dev->master_fd, (DCB *) dev->backend_priv);
free(dev->backend_priv); free(dev->backend_priv);
} }
@@ -133,7 +133,8 @@ plat_serpt_write(void *priv, uint8_t data)
serial_passthrough_t *dev = (serial_passthrough_t *) priv; serial_passthrough_t *dev = (serial_passthrough_t *) priv;
switch (dev->mode) { switch (dev->mode) {
case SERPT_MODE_VCON: case SERPT_MODE_NPIPE_SRV:
case SERPT_MODE_NPIPE_CLNT:
case SERPT_MODE_HOSTSER: case SERPT_MODE_HOSTSER:
plat_serpt_write_vcon(dev, data); plat_serpt_write_vcon(dev, data);
break; break;
@@ -157,7 +158,8 @@ plat_serpt_read(void *priv, uint8_t *data)
int res = 0; int res = 0;
switch (dev->mode) { switch (dev->mode) {
case SERPT_MODE_VCON: case SERPT_MODE_NPIPE_SRV:
case SERPT_MODE_NPIPE_CLNT:
case SERPT_MODE_HOSTSER: case SERPT_MODE_HOSTSER:
res = plat_serpt_read_vcon(dev, data); res = plat_serpt_read_vcon(dev, data);
break; break;
@@ -222,15 +224,14 @@ plat_serpt_open_device(void *priv)
serial_passthrough_t *dev = (serial_passthrough_t *) priv; serial_passthrough_t *dev = (serial_passthrough_t *) priv;
switch (dev->mode) { switch (dev->mode) {
case SERPT_MODE_VCON: case SERPT_MODE_NPIPE_SRV:
if (open_pseudo_terminal(dev)) { if (open_pseudo_terminal(dev))
return 0; return 0;
}
break; break;
case SERPT_MODE_HOSTSER: case SERPT_MODE_HOSTSER:
if (open_host_serial_port(dev)) { if (open_host_serial_port(dev))
return 0; return 0;
} break;
default: default:
break; break;
} }

View File

@@ -13,7 +13,7 @@
* Jasmine Iwanek <jasmine@iwanek.co.uk> * Jasmine Iwanek <jasmine@iwanek.co.uk>
* *
* Copyright 2021 Andreas J. Reichel. * Copyright 2021 Andreas J. Reichel.
* Copyright 2021-2022 Jasmine Iwanek. * Copyright 2021-2025 Jasmine Iwanek.
*/ */
#ifndef __APPLE__ #ifndef __APPLE__
@@ -310,14 +310,12 @@ plat_serpt_open_device(void *priv)
switch (dev->mode) { switch (dev->mode) {
case SERPT_MODE_VCON: case SERPT_MODE_VCON:
if (!open_pseudo_terminal(dev)) { if (!open_pseudo_terminal(dev))
return 1; return 1;
}
break; break;
case SERPT_MODE_HOSTSER: case SERPT_MODE_HOSTSER:
if (!open_host_serial_port(dev)) { if (!open_host_serial_port(dev))
return 1; return 1;
}
break; break;
default: default:
break; break;