* externalize a function
[binutils-gdb.git] / gdb / ser-mac.c
blobed0b693eb9af4baef1a0581e3ef6dc6079f1b3ab
1 /* Remote serial interface for local (hardwired) serial ports for Macintosh.
2 Copyright 1994, 1995, 1996, 1998, 2000 Free Software Foundation, Inc.
3 Contributed by Cygnus Support. Written by Stan Shebs.
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., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #include "defs.h"
23 #include "serial.h"
25 #include <Types.h>
26 #include <Devices.h>
27 /* This is the regular Mac Serial.h, but copied to a different name
28 so as not to get confused with the GDB serial.h above. */
29 #include "MacSerial.h"
31 /* This is unused for now. We just return a placeholder. */
33 struct mac_ttystate
35 int bogus;
38 static int mac_open (serial_t scb, const char *name);
39 static void mac_raw (serial_t scb);
40 static int mac_readchar (serial_t scb, int timeout);
41 static int mac_setbaudrate (serial_t scb, int rate);
42 static int mac_write (serial_t scb, const char *str, int len);
43 static void mac_close (serial_t scb);
44 static serial_ttystate mac_get_tty_state (serial_t scb);
45 static int mac_set_tty_state (serial_t scb, serial_ttystate state);
46 static char *aptr (short p);
48 short input_refnum;
49 short output_refnum;
51 char *mac_input_buffer;
52 char *mac_output_buffer;
54 static int
55 mac_open (serial_t scb, const char *name)
57 OSErr err;
59 /* Alloc buffer space first - that way any allocation failures are
60 intercepted before the serial driver gets involved. */
61 if (mac_input_buffer == NULL)
62 mac_input_buffer = (char *) xmalloc (4096);
63 /* Match on a name and open a port. */
64 if (strcmp (name, "modem") == 0)
66 err = OpenDriver ("\p.AIn", &input_refnum);
67 if (err != 0)
69 return (-1);
71 err = OpenDriver ("\p.AOut", &output_refnum);
72 if (err != 0)
74 CloseDriver (input_refnum);
75 return (-1);
78 else if (strcmp (name, "printer") == 0)
80 err = OpenDriver ("\p.BIn", &input_refnum);
81 if (err != 0)
83 return (-1);
85 err = OpenDriver ("\p.BOut", &output_refnum);
86 if (err != 0)
88 CloseDriver (input_refnum);
89 return (-1);
91 /* fake */
92 scb->fd = 1;
93 return 0;
95 else
97 error ("You must specify a valid serial port name; your choices are `modem' or `printer'.");
98 errno = ENOENT;
99 return (-1);
101 /* We got something open. */
102 if (1 /* using custom buffer */ )
103 SerSetBuf (input_refnum, mac_input_buffer, 4096);
104 /* Set to a GDB-preferred state. */
105 SerReset (input_refnum, stop10 | noParity | data8 | baud9600);
106 SerReset (output_refnum, stop10 | noParity | data8 | baud9600);
108 CntrlParam cb;
109 struct SerShk *handshake;
111 cb.ioCRefNum = output_refnum;
112 cb.csCode = 14;
113 handshake = (struct SerShk *) &cb.csParam[0];
114 handshake->fXOn = 0;
115 handshake->fCTS = 0;
116 handshake->xOn = 0;
117 handshake->xOff = 0;
118 handshake->errs = 0;
119 handshake->evts = 0;
120 handshake->fInX = 0;
121 handshake->fDTR = 0;
122 err = PBControl ((ParmBlkPtr) & cb, 0);
123 if (err < 0)
124 return (-1);
126 /* fake */
127 scb->fd = 1;
128 return 0;
131 static int
132 mac_noop (serial_t scb)
134 return 0;
137 static void
138 mac_raw (serial_t scb)
140 /* Always effectively in raw mode. */
143 /* Read a character with user-specified timeout. TIMEOUT is number of seconds
144 to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns
145 char if successful. Returns -2 if timeout expired, EOF if line dropped
146 dead, or -3 for any other error (see errno in that case). */
148 static int
149 mac_readchar (serial_t scb, int timeout)
151 int status, n;
152 /* time_t */ unsigned long start_time, now;
153 OSErr err;
154 CntrlParam cb;
155 IOParam pb;
157 if (scb->bufcnt-- > 0)
158 return *scb->bufp++;
160 time (&start_time);
162 while (1)
164 cb.ioCRefNum = input_refnum;
165 cb.csCode = 2;
166 err = PBStatus ((ParmBlkPtr) & cb, 0);
167 if (err < 0)
168 return SERIAL_ERROR;
169 n = *((long *) &cb.csParam[0]);
170 if (n > 0)
172 pb.ioRefNum = input_refnum;
173 pb.ioBuffer = (Ptr) (scb->buf);
174 pb.ioReqCount = (n > 64 ? 64 : n);
175 err = PBRead ((ParmBlkPtr) & pb, 0);
176 if (err < 0)
177 return SERIAL_ERROR;
178 scb->bufcnt = pb.ioReqCount;
179 scb->bufcnt--;
180 scb->bufp = scb->buf;
181 return *scb->bufp++;
183 else if (timeout == 0)
184 return SERIAL_TIMEOUT;
185 else if (timeout == -1)
187 else
189 time (&now);
190 if (now > start_time + timeout)
191 return SERIAL_TIMEOUT;
193 PROGRESS (1);
197 /* mac_{get set}_tty_state() are both dummys to fill out the function
198 vector. Someday, they may do something real... */
200 static serial_ttystate
201 mac_get_tty_state (serial_t scb)
203 struct mac_ttystate *state;
205 state = (struct mac_ttystate *) xmalloc (sizeof *state);
207 return (serial_ttystate) state;
210 static int
211 mac_set_tty_state (serial_t scb, serial_ttystate ttystate)
213 return 0;
216 static int
217 mac_noflush_set_tty_state (serial_t scb, serial_ttystate new_ttystate,
218 serial_ttystate old_ttystate)
220 return 0;
223 static void
224 mac_print_tty_state (serial_t scb,
225 serial_ttystate ttystate,
226 struct ui_file *stream)
228 /* Nothing to print. */
229 return;
232 /* If there is a tricky formula to relate real baud rates
233 to what the serial driver wants, we should use it. Until
234 we get one, this table will have to do. */
236 static struct
238 int real_rate;
239 int bits;
241 mac_baud_rate_table[] =
244 57600, baud57600
248 38400, 1
252 19200, baud19200
256 9600, baud9600
260 7200, baud7200
264 4800, baud4800
268 3600, baud3600
272 2400, baud2400
276 1800, baud1800
280 1200, baud1200
284 600, baud600
288 300, baud300
292 0, 0
296 static int
297 mac_set_baud_rate (serial_t scb, int rate)
299 int i, bits;
301 for (i = 0; mac_baud_rate_table[i].real_rate != 0; ++i)
303 if (mac_baud_rate_table[i].real_rate == rate)
305 bits = mac_baud_rate_table[i].bits;
306 break;
309 SerReset (input_refnum, stop10 | noParity | data8 | bits);
310 SerReset (output_refnum, stop10 | noParity | data8 | bits);
313 static int
314 mac_set_stop_bits (serial_t scb, int num)
316 return 0;
319 int first_mac_write = 0;
321 static int
322 mac_write (serial_t scb, const char *str, int len)
324 OSErr err;
325 IOParam pb;
327 if (first_mac_write++ < 4)
329 sleep (1);
331 pb.ioRefNum = output_refnum;
332 pb.ioBuffer = (Ptr) str;
333 pb.ioReqCount = len;
334 err = PBWrite ((ParmBlkPtr) & pb, 0);
335 if (err < 0)
337 return 1;
339 return 0;
342 static void
343 mac_close (serial_t scb)
345 if (input_refnum)
347 if (1 /* custom buffer */ )
348 SerSetBuf (input_refnum, mac_input_buffer, 0);
349 CloseDriver (input_refnum);
350 input_refnum = 0;
352 if (output_refnum)
354 if (0 /* custom buffer */ )
355 SerSetBuf (input_refnum, mac_output_buffer, 0);
356 CloseDriver (output_refnum);
357 output_refnum = 0;
361 static struct serial_ops mac_ops =
363 "hardwire",
365 mac_open,
366 mac_close,
367 mac_readchar,
368 mac_write,
369 mac_noop, /* flush output */
370 mac_noop, /* flush input */
371 mac_noop, /* send break -- currently only for nindy */
372 mac_raw,
373 mac_get_tty_state,
374 mac_set_tty_state,
375 mac_print_tty_state,
376 mac_noflush_set_tty_state,
377 mac_set_baud_rate,
378 mac_set_stop_bits,
379 mac_noop, /* wait for output to drain */
382 void
383 _initialize_ser_mac (void)
385 serial_add_interface (&mac_ops);