Pass through serial lines between serial port and emulator

This commit is contained in:
Cacodemon345
2025-08-30 01:18:20 +06:00
parent 084091ac3b
commit 63bb0d8a92
4 changed files with 77 additions and 1 deletions

View File

@@ -36,6 +36,7 @@
#include <sys/select.h>
#include <stdint.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <86box/86box.h>
#include <86box/log.h>
@@ -48,6 +49,35 @@
#define LOG_PREFIX "serial_passthrough: "
void
plat_serpt_set_line_state(void *priv)
{
serial_passthrough_t *dev = (serial_passthrough_t *) priv;
int setstate = 0, clrstate = 0, curstate = 0;
if (dev->mode != SERPT_MODE_HOSTSER)
return;
if (dev->serial->lcr & (1 << 6)) {
tcsendbreak(dev->master_fd, 0);
}
ioctl(dev->master_fd, TIOCMGET, &curstate);
clrstate |= !(dev->serial->mctrl & 1) ? TIOCM_DTR : 0;
clrstate |= !(dev->serial->mctrl & 2) ? TIOCM_RTS : 0;
setstate |= (dev->serial->mctrl & 1) ? TIOCM_DTR : 0;
setstate |= (dev->serial->mctrl & 2) ? TIOCM_RTS : 0;
ioctl(dev->master_fd, TIOCMBIS, &setstate);
ioctl(dev->master_fd, TIOCMBIC, &clrstate);
serial_set_cts(dev->serial, !!(curstate & TIOCM_CTS));
serial_set_dcd(dev->serial, !!(curstate & TIOCM_CAR));
serial_set_dsr(dev->serial, !!(curstate & TIOCM_DSR));
serial_set_ri(dev->serial, !!(curstate & TIOCM_RI));
}
int
plat_serpt_read(void *priv, uint8_t *data)
{
@@ -194,6 +224,7 @@ plat_serpt_set_params(void *priv)
term_attr.c_cflag |= CMSPAR;
#endif
}
term_attr.c_iflag &= ~(IXON | IXOFF);
tcsetattr(dev->master_fd, TCSANOW, &term_attr);
#undef BAUDRATE_RANGE
}