1 /* Remote serial interface using Hitachi E7000 PC ISA card in a PC
3 Copyright 1994 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 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
32 #include "mswin/w32sut.h"
39 static int e7000pc_open
PARAMS ((serial_t scb
, const char *name
));
40 static void e7000pc_raw
PARAMS ((serial_t scb
));
41 static int e7000pc_readchar
PARAMS ((serial_t scb
, int timeout
));
42 static int e7000pc_setbaudrate
PARAMS ((serial_t scb
, int rate
));
43 static int e7000pc_write
PARAMS ((serial_t scb
, const char *str
, int len
));
44 static void e7000pc_close
PARAMS ((serial_t scb
));
45 static serial_ttystate e7000pc_get_tty_state
PARAMS ((serial_t scb
));
46 static int e7000pc_set_tty_state
PARAMS ((serial_t scb
, serial_ttystate state
));
47 static char *aptr
PARAMS ((short p
));
49 static int dos_async_init
PARAMS ((int port
));
50 static void dos_async_tx
PARAMS ((const char c
));
51 static int dos_async_rx
PARAMS (());
55 #define OFF_DPD 0x0000
56 #define OFF_DDP 0x1000
57 #define OFF_CPD 0x2000
58 #define OFF_CDP 0x2400
62 #define OFF_IRQTOD 0x3008
63 #define OFF_IRQTOP 0x300a
64 #define OFF_READY 0x300c
65 #define OFF_PON 0x300e
81 static unsigned long fa
;
82 static unsigned long irqtod
;
83 static unsigned long ready
;
84 static unsigned long fb
;
85 static unsigned long cpd
;
86 static unsigned long cdp
;
87 static unsigned long ready
;
88 static unsigned long pon
;
89 static unsigned long irqtop
;
90 static unsigned long board_at
;
94 #define SET_BYTE(x,y) { char _buf = y;dosmemput(&_buf,1, x);}
95 #define SET_WORD(x,y) { short _buf = y;dosmemput(&_buf,2, x);}
96 #define GET_BYTE(x) ( dosmemget(x,1,&bb), bb)
97 #define GET_WORD(x) ( dosmemget(x,2,&sb), sb)
98 static unsigned char bb
;
99 static unsigned short sb
;
103 #define SET_BYTE(x,y) *(volatile unsigned char *)(x) = (y)
104 #define SET_WORD(x,y) *(volatile unsigned short *)(x) = (y)
105 #define GET_BYTE(x) (*(volatile unsigned char *)(x))
106 #define GET_WORD(x) (*(volatile unsigned short *)(x))
107 #define dosmemget(FROM, LEN, TO) memcpy ((void *)(TO), (void *)(FROM), (LEN))
108 #define dosmemput(FROM, LEN, TO) memcpy ((void *)(TO), (void *)(FROM), (LEN))
123 /* Get the base of the data segment. This is needed to calculate the offset
124 between data segment addresses and the base of linear memory, which is where
125 device registers reside. Note that this is really only necessary for
126 Win32s, since Win95 and NT keep the data segment at linear 0. */
131 unsigned short dsval
;
133 unsigned long dsbase
;
142 GetThreadSelectorEntry (GetCurrentThread(), dsval
, &ldt
);
144 dsbase
= ldt
.HighWord
.Bits
.BaseHi
<< 24 | ldt
.HighWord
.Bits
.BaseMid
<< 16
149 #else /* !__GO32__ */
150 #define get_ds_base() 0
151 #endif /* __GO32__ */
157 unsigned long dsbase
;
159 dsbase
= get_ds_base ();
161 /* Look around in memory for the board's signature */
163 for (try = 0; sigs
[try].sw
; try++)
166 board_at
= sigs
[try].addr
- dsbase
;
167 fa
= board_at
+ OFF_FA
;
168 fb
= board_at
+ OFF_FB
;
169 cpd
= board_at
+ OFF_CPD
;
170 cdp
= board_at
+ OFF_CDP
;
171 ready
=board_at
+ OFF_READY
;
172 pon
= board_at
+ OFF_PON
;
173 irqtop
= board_at
+ OFF_IRQTOP
;
174 irqtod
= board_at
+ OFF_IRQTOD
;
176 val
= GET_WORD (ready
);
178 if (val
== (0xaaa0 | sigs
[try].sw
))
180 if (GET_WORD (pon
) & 0xf)
185 SET_WORD (irqtop
, 1); /* Disable interrupts from e7000 */
187 printf_filtered ("\nConnected to the E7000PC at address 0x%x\n",
191 error ("The E7000 PC board is working, but the E7000 is turned off.\n");
196 error ("GDB cannot connect to the E7000 PC board, check that it is installed\n\
197 and that the switch settings are correct. Some other DOS programs can \n\
198 stop the board from working. Try starting from a very minimal boot, \n\
199 perhaps you need to disable EMM386 over the region where the board has\n\
200 its I/O space, remove other unneeded cards, etc etc\n");
205 static int pbuf_size
;
206 static int pbuf_index
;
208 /* Return next byte from cdp. If no more, then return -1. */
213 static char pbuf
[1000];
217 if (pbuf_index
< pbuf_size
)
219 x
= pbuf
[pbuf_index
++];
221 else if ((GET_WORD (fb
) & 1))
224 pbuf_size
= GET_WORD (cdp
+ 2);
226 dosmemget (cdp
+ 8, pbuf_size
+ 1, tmp
);
228 /* Tell the E7000 we've eaten */
231 for (i
= 0; i
< pbuf_size
; i
++)
236 x
= pbuf
[pbuf_index
++];
245 /* Works just like read(), except that it takes a TIMEOUT in seconds. Note
246 that TIMEOUT == 0 is a poll, and TIMEOUT == -1 means wait forever. */
249 dosasync_read (fd
, buf
, len
, timeout
)
260 /* Then look for some more if we're still hungry */
262 then
= now
+ timeout
;
265 int ch
= e7000_get();
267 /* While there's room in the buffer, and we've already
268 read the stuff in, suck it over */
272 while (i
< len
&& pbuf_index
< pbuf_size
)
285 if (now
>= then
&& timeout
> 0)
295 dosasync_write (fd
, buf
, len
)
303 /* Construct copy locally */
304 ((short *)dummy
)[0] = CMD_CI
;
305 ((short *)dummy
)[1] = len
;
306 ((short *)dummy
)[2] = 0;
307 ((short *)dummy
)[3] = 0;
308 for (i
= 0; i
< len
; i
++)
310 dummy
[8 + i
^ 1] = buf
[i
];
313 /* Wait for the card to get ready */
314 while (GET_WORD (fa
) & 1) ;
316 /* Blast onto the ISA card */
317 dosmemput (dummy
, 8 + len
+ 1, cpd
);
320 SET_WORD (irqtod
, 1); /* Interrupt the E7000 */
326 e7000pc_open (scb
, name
)
330 if (strncasecmp (name
, "pc", 2) != 0)
336 scb
->fd
= e7000pc_init ();
355 /* Always in raw mode */
359 e7000pc_readchar (scb
, timeout
)
367 if (dosasync_read (scb
->fd
, &buf
, 1, timeout
))
369 if (buf
== 0) goto top
;
373 return SERIAL_TIMEOUT
;
376 struct e7000pc_ttystate
{
380 /* e7000pc_{get set}_tty_state() are both dummys to fill out the function
381 vector. Someday, they may do something real... */
383 static serial_ttystate
384 e7000pc_get_tty_state (scb
)
387 struct e7000pc_ttystate
*state
;
389 state
= (struct e7000pc_ttystate
*) xmalloc (sizeof *state
);
391 return (serial_ttystate
) state
;
395 e7000pc_set_tty_state (scb
, ttystate
)
397 serial_ttystate ttystate
;
403 e7000pc_noflush_set_tty_state (scb
, new_ttystate
, old_ttystate
)
405 serial_ttystate new_ttystate
;
406 serial_ttystate old_ttystate
;
412 e7000pc_print_tty_state (scb
, ttystate
)
414 serial_ttystate ttystate
;
416 /* Nothing to print. */
421 e7000pc_setbaudrate (scb
, rate
)
429 e7000pc_write (scb
, str
, len
)
434 dosasync_write (scb
->fd
, str
, len
);
445 static struct serial_ops e7000pc_ops
=
453 e7000pc_noop
, /* flush output */
454 e7000pc_noop
, /* flush input */
455 e7000pc_noop
, /* send break -- currently used only for nindy */
457 e7000pc_get_tty_state
,
458 e7000pc_set_tty_state
,
459 e7000pc_print_tty_state
,
460 e7000pc_noflush_set_tty_state
,
465 _initialize_ser_e7000pc ()
467 serial_add_interface (&e7000pc_ops
);
472 _initialize_ser_e7000pc ()