1 /* Remote serial interface using Hitachi E7000 PC ISA card in a PC
2 Copyright 1994, 1999, 2000 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 #if defined __GO32__ || defined _WIN32
24 #include "gdb_string.h"
26 /* MSVC uses strnicmp instead of strncasecmp */
28 #define strncasecmp strnicmp
29 #define WIN32_LEAN_AND_MEAN
40 static int e7000pc_open (serial_t scb, const char *name);
41 static void e7000pc_raw (serial_t scb);
42 static int e7000pc_readchar (serial_t scb, int timeout);
43 static int e7000pc_setbaudrate (serial_t scb, int rate);
44 static int e7000pc_write (serial_t scb, const char *str, int len);
45 static void e7000pc_close (serial_t scb);
46 static serial_ttystate e7000pc_get_tty_state (serial_t scb);
47 static int e7000pc_set_tty_state (serial_t scb, serial_ttystate state);
49 #define OFF_DPD 0x0000
50 #define OFF_DDP 0x1000
51 #define OFF_CPD 0x2000
52 #define OFF_CDP 0x2400
56 #define OFF_IRQTOD 0x3008
57 #define OFF_IRQTOP 0x300a
58 #define OFF_READY 0x300c
59 #define OFF_PON 0x300e
75 static unsigned long fa;
76 static unsigned long irqtod;
77 static unsigned long ready;
78 static unsigned long fb;
79 static unsigned long cpd;
80 static unsigned long cdp;
81 static unsigned long ready;
82 static unsigned long pon;
83 static unsigned long irqtop;
84 static unsigned long board_at;
88 #define SET_BYTE(x,y) { char _buf = y;dosmemput(&_buf,1, x);}
89 #define SET_WORD(x,y) { short _buf = y;dosmemput(&_buf,2, x);}
90 #define GET_BYTE(x) ( dosmemget(x,1,&bb), bb)
91 #define GET_WORD(x) ( dosmemget(x,2,&sb), sb)
92 static unsigned char bb;
93 static unsigned short sb;
97 #define SET_BYTE(x,y) *(volatile unsigned char *)(x) = (y)
98 #define SET_WORD(x,y) *(volatile unsigned short *)(x) = (y)
99 #define GET_BYTE(x) (*(volatile unsigned char *)(x))
100 #define GET_WORD(x) (*(volatile unsigned short *)(x))
101 #define dosmemget(FROM, LEN, TO) memcpy ((void *)(TO), (void *)(FROM), (LEN))
102 #define dosmemput(FROM, LEN, TO) memcpy ((void *)(TO), (void *)(FROM), (LEN))
132 /* Get the base of the data segment. This is needed to calculate the offset
133 between data segment addresses and the base of linear memory, which is where
134 device registers reside. Note that this is really only necessary for
135 Win32s, since Win95 and NT keep the data segment at linear 0. */
140 unsigned short dsval;
142 unsigned long dsbase;
151 GetThreadSelectorEntry (GetCurrentThread (), dsval, &ldt);
153 dsbase = ldt.HighWord.Bits.BaseHi << 24 | ldt.HighWord.Bits.BaseMid << 16
158 #else /* !_MSC_VER */
159 #define get_ds_base() 0
160 #endif /* _MSC_VER */
166 unsigned long dsbase;
168 dsbase = get_ds_base ();
170 /* Look around in memory for the board's signature */
172 for (try = 0; sigs[try].sw; try++)
175 board_at = sigs[try].addr - dsbase;
176 fa = board_at + OFF_FA;
177 fb = board_at + OFF_FB;
178 cpd = board_at + OFF_CPD;
179 cdp = board_at + OFF_CDP;
180 ready = board_at + OFF_READY;
181 pon = board_at + OFF_PON;
182 irqtop = board_at + OFF_IRQTOP;
183 irqtod = board_at + OFF_IRQTOD;
185 val = GET_WORD (ready);
187 if (val == (0xaaa0 | sigs[try].sw))
189 if (GET_WORD (pon) & 0xf)
194 SET_WORD (irqtop, 1); /* Disable interrupts from e7000 */
196 printf_filtered ("\nConnected to the E7000PC at address 0x%x\n",
200 error ("The E7000 PC board is working, but the E7000 is turned off.\n");
205 error ("GDB cannot connect to the E7000 PC board, check that it is installed\n\
206 and that the switch settings are correct. Some other DOS programs can \n\
207 stop the board from working. Try starting from a very minimal boot, \n\
208 perhaps you need to disable EMM386 over the region where the board has\n\
209 its I/O space, remove other unneeded cards, etc etc\n");
214 static int pbuf_size;
215 static int pbuf_index;
217 /* Return next byte from cdp. If no more, then return -1. */
222 static char pbuf[1000];
226 if (pbuf_index < pbuf_size)
228 x = pbuf[pbuf_index++];
230 else if ((GET_WORD (fb) & 1))
233 pbuf_size = GET_WORD (cdp + 2);
235 dosmemget (cdp + 8, pbuf_size + 1, tmp);
237 /* Tell the E7000 we've eaten */
240 for (i = 0; i < pbuf_size; i++)
242 pbuf[i] = tmp[i ^ 1];
245 x = pbuf[pbuf_index++];
254 /* Works just like read(), except that it takes a TIMEOUT in seconds. Note
255 that TIMEOUT == 0 is a poll, and TIMEOUT == -1 means wait forever. */
258 dosasync_read (fd, buf, len, timeout)
269 /* Then look for some more if we're still hungry */
271 then = now + timeout;
274 int ch = e7000_get ();
276 /* While there's room in the buffer, and we've already
277 read the stuff in, suck it over */
281 while (i < len && pbuf_index < pbuf_size)
294 if (now >= then && timeout > 0)
304 dosasync_write (fd, buf, len)
312 /* Construct copy locally */
313 ((short *) dummy)[0] = CMD_CI;
314 ((short *) dummy)[1] = len;
315 ((short *) dummy)[2] = 0;
316 ((short *) dummy)[3] = 0;
317 for (i = 0; i < len; i++)
319 dummy[(8 + i) ^ 1] = buf[i];
322 /* Wait for the card to get ready */
323 while (GET_WORD (fa) & 1);
325 /* Blast onto the ISA card */
326 dosmemput (dummy, 8 + len + 1, cpd);
329 SET_WORD (irqtod, 1); /* Interrupt the E7000 */
335 e7000pc_open (scb, name)
339 if (strncasecmp (name, "pc", 2) != 0)
345 scb->fd = e7000pc_init ();
364 /* Always in raw mode */
368 e7000pc_readchar (scb, timeout)
376 if (dosasync_read (scb->fd, &buf, 1, timeout))
383 return SERIAL_TIMEOUT;
386 struct e7000pc_ttystate
391 /* e7000pc_{get set}_tty_state() are both dummys to fill out the function
392 vector. Someday, they may do something real... */
394 static serial_ttystate
395 e7000pc_get_tty_state (scb)
398 struct e7000pc_ttystate *state;
400 state = (struct e7000pc_ttystate *) xmalloc (sizeof *state);
402 return (serial_ttystate) state;
406 e7000pc_set_tty_state (scb, ttystate)
408 serial_ttystate ttystate;
414 e7000pc_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
416 serial_ttystate new_ttystate;
417 serial_ttystate old_ttystate;
423 e7000pc_print_tty_state (serial_t scb,
424 serial_ttystate ttystate,
425 struct ui_file *stream)
427 /* Nothing to print. */
432 e7000pc_setbaudrate (scb, rate)
440 e7000pc_write (scb, str, len)
445 dosasync_write (scb->fd, str, len);
456 static struct serial_ops e7000pc_ops =
464 e7000pc_noop, /* flush output */
465 e7000pc_noop, /* flush input */
466 e7000pc_noop, /* send break -- currently used only for nindy */
468 e7000pc_get_tty_state,
469 e7000pc_set_tty_state,
470 e7000pc_print_tty_state,
471 e7000pc_noflush_set_tty_state,
473 e7000pc_noop, /* wait for output to drain */
477 _initialize_ser_e7000pc ()
479 serial_add_interface (&e7000pc_ops);
484 _initialize_ser_e7000pc ()