-/* Remote serial interface for local (hardwired) serial ports for
- GO32. Copyright 1992, 1993 Free Software Foundation, Inc.
+/* Remote serial interface for local (hardwired) serial ports for GO32.
+ Copyright 1992, 1993, 2000 Free Software Foundation, Inc.
Contributed by Nigel Stephens, Algorithmics Ltd. (nigel@algor.co.uk).
#define MSR_DDSR 0x02
#define MSR_DCTS 0x01
+#include <string.h>
#include <dos.h>
#include <go32.h>
#include <dpmi.h>
typedef unsigned long u_long;
-/* DPMI Communication */
-static union REGS dpmi_regs;
-static struct SREGS dpmi_sregs;
-
/* 16550 rx fifo trigger point */
#define FIFO_TRIGGER FIFO_TRIGGER_4
ports[4] =
{
{
- COM1ADDR, 4
+ COM1ADDR, 4, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
,
{
- COM2ADDR, 3
+ COM2ADDR, 3, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
,
{
- COM3ADDR, 4
+ COM3ADDR, 4, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
,
{
- COM4ADDR, 3
+ COM4ADDR, 3, 0, NULL, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0
}
};
-static int dos_open PARAMS ((serial_t scb, const char *name));
-static void dos_raw PARAMS ((serial_t scb));
-static int dos_readchar PARAMS ((serial_t scb, int timeout));
-static int dos_setbaudrate PARAMS ((serial_t scb, int rate));
-static int dos_write PARAMS ((serial_t scb, const char *str, int len));
-static void dos_close PARAMS ((serial_t scb));
-static serial_ttystate dos_get_tty_state PARAMS ((serial_t scb));
-static int dos_set_tty_state PARAMS ((serial_t scb, serial_ttystate state));
-static int dos_baudconv PARAMS ((int rate));
+static int dos_open (serial_t scb, const char *name);
+static void dos_raw (serial_t scb);
+static int dos_readchar (serial_t scb, int timeout);
+static int dos_setbaudrate (serial_t scb, int rate);
+static int dos_write (serial_t scb, const char *str, int len);
+static void dos_close (serial_t scb);
+static serial_ttystate dos_get_tty_state (serial_t scb);
+static int dos_set_tty_state (serial_t scb, serial_ttystate state);
+static int dos_baudconv (int rate);
#define inb(p,a) inportb((p)->base + (a))
#define outb(p,a,v) outportb((p)->base + (a), (v))
static int
-dos_getc (port)
- volatile struct dos_ttystate *port;
+dos_getc (volatile struct dos_ttystate *port)
{
int c;
static int
-dos_putc (c, port)
- int c;
- struct dos_ttystate *port;
+dos_putc (int c, struct dos_ttystate *port)
{
if (port->count >= CBSIZE - 1)
return -1;
static void
-dos_comisr (irq)
- int irq;
+dos_comisr (int irq)
{
struct dos_ttystate *port;
unsigned char iir, lsr, c;
static void
-dos_unhookirq (intr)
- struct intrupt *intr;
+dos_unhookirq (struct intrupt *intr)
{
unsigned int irq, vec;
unsigned char mask;
static int
-dos_open (scb, name)
- serial_t scb;
- const char *name;
+dos_open (serial_t scb, const char *name)
{
struct dos_ttystate *port;
int fd, i;
return -1;
}
+ /* FIXME: this is a Bad Idea (tm)! One should *never* invent file
+ handles, since they might be already used by other files/devices.
+ The Right Way to do this is to create a real handle by dup()'ing
+ some existing one. */
fd = name[3] - '1';
port = &ports[fd];
if (port->refcnt++ > 0)
static void
-dos_close (scb)
- serial_t scb;
+dos_close (serial_t scb)
{
struct dos_ttystate *port;
struct intrupt *intrupt;
static int
-dos_noop (scb)
- serial_t scb;
+dos_noop (serial_t scb ATTRIBUTE_UNUSED)
{
return 0;
}
static void
-dos_raw (scb)
- serial_t scb;
+dos_raw (serial_t scb ATTRIBUTE_UNUSED)
{
/* Always in raw mode */
}
static int
-dos_readchar (scb, timeout)
- serial_t scb;
- int timeout;
+dos_readchar (serial_t scb, int timeout)
{
struct dos_ttystate *port = &ports[scb->fd];
long then;
static serial_ttystate
-dos_get_tty_state (scb)
- serial_t scb;
+dos_get_tty_state (serial_t scb)
{
struct dos_ttystate *port = &ports[scb->fd];
struct dos_ttystate *state;
+ /* Are they asking about a port we opened? */
+ if (port->refcnt <= 0)
+ {
+ /* We've never heard about this port. We should fail this call,
+ unless they are asking about one of the 3 standard handles,
+ in which case we pretend the handle was open by us if it is
+ connected to a terminal device. This is beacuse Unix
+ terminals use the serial interface, so GDB expects the
+ standard handles to go through here. */
+ if (scb->fd >= 3 || !isatty (scb->fd))
+ return NULL;
+ }
+
state = (struct dos_ttystate *) xmalloc (sizeof *state);
*state = *port;
return (serial_ttystate) state;
}
static int
-dos_set_tty_state (scb, ttystate)
- serial_t scb;
- serial_ttystate ttystate;
+dos_set_tty_state (serial_t scb, serial_ttystate ttystate)
{
struct dos_ttystate *state;
}
static int
-dos_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
- serial_t scb;
- serial_ttystate new_ttystate;
- serial_ttystate old_ttystate;
+dos_noflush_set_tty_state (serial_t scb, serial_ttystate new_ttystate,
+ serial_ttystate old_ttystate ATTRIBUTE_UNUSED)
{
struct dos_ttystate *state;
}
static int
-dos_flush_input (scb)
- serial_t scb;
+dos_flush_input (serial_t scb)
{
struct dos_ttystate *port = &ports[scb->fd];
disable ();
if (port->fifo)
outb (port, com_fifo, FIFO_ENABLE | FIFO_RCV_RST | FIFO_TRIGGER);
enable ();
+ return 0;
}
static void
-dos_print_tty_state (scb, ttystate)
- serial_t scb;
- serial_ttystate ttystate;
+dos_print_tty_state (serial_t scb ATTRIBUTE_UNUSED,
+ serial_ttystate ttystate ATTRIBUTE_UNUSED,
+ struct ui_file *stream ATTRIBUTE_UNUSED)
{
/* Nothing to print */
return;
}
static int
-dos_baudconv (rate)
- int rate;
+dos_baudconv (int rate)
{
long x, err;
static int
-dos_setbaudrate (scb, rate)
- serial_t scb;
- int rate;
+dos_setbaudrate (serial_t scb, int rate)
{
struct dos_ttystate *port = &ports[scb->fd];
}
static int
-dos_setstopbits (scb, num)
- serial_t scb;
- int num;
+dos_setstopbits (serial_t scb, int num)
{
struct dos_ttystate *port = &ports[scb->fd];
unsigned char cfcr;
}
static int
-dos_write (scb, str, len)
- serial_t scb;
- const char *str;
- int len;
+dos_write (serial_t scb, const char *str, int len)
{
volatile struct dos_ttystate *port = &ports[scb->fd];
int fifosize = port->fifo ? 16 : 1;
static int
-dos_sendbreak (scb)
- serial_t scb;
+dos_sendbreak (serial_t scb)
{
volatile struct dos_ttystate *port = &ports[scb->fd];
unsigned char cfcr;
dos_setbaudrate,
dos_setstopbits,
dos_noop, /* wait for output to drain */
+ (void (*)(serial_t, int))NULL /* change into async mode */
};
static void
-dos_info (arg, from_tty)
- char *arg;
- int from_tty;
+dos_info (char *arg ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
{
struct dos_ttystate *port;
+#ifdef DOS_STATS
int i;
+#endif
for (port = ports; port < &ports[4]; port++)
{
if (port->baudrate == 0)
continue;
- printf_filtered ("Port:\tCOM%d (%sactive)\n", port - ports + 1,
+ printf_filtered ("Port:\tCOM%ld (%sactive)\n", (long)(port - ports) + 1,
port->intrupt ? "" : "not ");
printf_filtered ("Addr:\t0x%03x (irq %d)\n", port->base, port->irq);
printf_filtered ("16550:\t%s\n", port->fifo ? "yes" : "no");
void
-_initialize_ser_dos ()
+_initialize_ser_dos (void)
{
- struct cmd_list_element *c;
-
serial_add_interface (&dos_ops);
/* Save original interrupt mask register. */