X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fser-mac.c;h=ed0b693eb9af4baef1a0581e3ef6dc6079f1b3ab;hb=43a0748c7811bf542e8a9f020292a991db0bfa1a;hp=a8db83f3e146a33cb567e96e5a63ac012091a195;hpb=85c8b135fe413021e644dbd69a56ae7abe455f2e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ser-mac.c b/gdb/ser-mac.c index a8db83f3e1..ed0b693eb9 100644 --- a/gdb/ser-mac.c +++ b/gdb/ser-mac.c @@ -1,5 +1,5 @@ /* Remote serial interface for local (hardwired) serial ports for Macintosh. - Copyright 1994 Free Software Foundation, Inc. + Copyright 1994, 1995, 1996, 1998, 2000 Free Software Foundation, Inc. Contributed by Cygnus Support. Written by Stan Shebs. This file is part of GDB. @@ -16,7 +16,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "defs.h" #include "serial.h" @@ -34,15 +35,15 @@ struct mac_ttystate int bogus; }; -static int mac_open PARAMS ((serial_t scb, const char *name)); -static void mac_raw PARAMS ((serial_t scb)); -static int mac_readchar PARAMS ((serial_t scb, int timeout)); -static int mac_setbaudrate PARAMS ((serial_t scb, int rate)); -static int mac_write PARAMS ((serial_t scb, const char *str, int len)); -static void mac_close PARAMS ((serial_t scb)); -static serial_ttystate mac_get_tty_state PARAMS ((serial_t scb)); -static int mac_set_tty_state PARAMS ((serial_t scb, serial_ttystate state)); -static char *aptr PARAMS ((short p)); +static int mac_open (serial_t scb, const char *name); +static void mac_raw (serial_t scb); +static int mac_readchar (serial_t scb, int timeout); +static int mac_setbaudrate (serial_t scb, int rate); +static int mac_write (serial_t scb, const char *str, int len); +static void mac_close (serial_t scb); +static serial_ttystate mac_get_tty_state (serial_t scb); +static int mac_set_tty_state (serial_t scb, serial_ttystate state); +static char *aptr (short p); short input_refnum; short output_refnum; @@ -51,16 +52,14 @@ char *mac_input_buffer; char *mac_output_buffer; static int -mac_open (scb, name) - serial_t scb; - const char *name; +mac_open (serial_t scb, const char *name) { OSErr err; /* Alloc buffer space first - that way any allocation failures are intercepted before the serial driver gets involved. */ if (mac_input_buffer == NULL) - mac_input_buffer = (char *) xmalloc (256); + mac_input_buffer = (char *) xmalloc (4096); /* Match on a name and open a port. */ if (strcmp (name, "modem") == 0) { @@ -95,16 +94,16 @@ mac_open (scb, name) } else { - error ("You must specify a port. Choices are `modem' or `printer'."); + error ("You must specify a valid serial port name; your choices are `modem' or `printer'."); errno = ENOENT; return (-1); } /* We got something open. */ - if (1 /* using custom buffer */) - SerSetBuf (input_refnum, mac_input_buffer, 256); + if (1 /* using custom buffer */ ) + SerSetBuf (input_refnum, mac_input_buffer, 4096); /* Set to a GDB-preferred state. */ - SerReset (input_refnum, stop10|noParity|data8|baud9600); - SerReset (output_refnum, stop10|noParity|data8|baud9600); + SerReset (input_refnum, stop10 | noParity | data8 | baud9600); + SerReset (output_refnum, stop10 | noParity | data8 | baud9600); { CntrlParam cb; struct SerShk *handshake; @@ -120,7 +119,7 @@ mac_open (scb, name) handshake->evts = 0; handshake->fInX = 0; handshake->fDTR = 0; - err = PBControl ((ParmBlkPtr) &cb, 0); + err = PBControl ((ParmBlkPtr) & cb, 0); if (err < 0) return (-1); } @@ -130,15 +129,13 @@ mac_open (scb, name) } static int -mac_noop (scb) - serial_t scb; +mac_noop (serial_t scb) { return 0; } static void -mac_raw (scb) - serial_t scb; +mac_raw (serial_t scb) { /* Always effectively in raw mode. */ } @@ -149,9 +146,7 @@ mac_raw (scb) dead, or -3 for any other error (see errno in that case). */ static int -mac_readchar (scb, timeout) - serial_t scb; - int timeout; +mac_readchar (serial_t scb, int timeout) { int status, n; /* time_t */ unsigned long start_time, now; @@ -168,7 +163,7 @@ mac_readchar (scb, timeout) { cb.ioCRefNum = input_refnum; cb.csCode = 2; - err = PBStatus ((ParmBlkPtr) &cb, 0); + err = PBStatus ((ParmBlkPtr) & cb, 0); if (err < 0) return SERIAL_ERROR; n = *((long *) &cb.csParam[0]); @@ -177,7 +172,7 @@ mac_readchar (scb, timeout) pb.ioRefNum = input_refnum; pb.ioBuffer = (Ptr) (scb->buf); pb.ioReqCount = (n > 64 ? 64 : n); - err = PBRead ((ParmBlkPtr) &pb, 0); + err = PBRead ((ParmBlkPtr) & pb, 0); if (err < 0) return SERIAL_ERROR; scb->bufcnt = pb.ioReqCount; @@ -195,6 +190,7 @@ mac_readchar (scb, timeout) if (now > start_time + timeout) return SERIAL_TIMEOUT; } + PROGRESS (1); } } @@ -202,8 +198,7 @@ mac_readchar (scb, timeout) vector. Someday, they may do something real... */ static serial_ttystate -mac_get_tty_state (scb) - serial_t scb; +mac_get_tty_state (serial_t scb) { struct mac_ttystate *state; @@ -213,43 +208,110 @@ mac_get_tty_state (scb) } static int -mac_set_tty_state (scb, ttystate) - serial_t scb; - serial_ttystate ttystate; +mac_set_tty_state (serial_t scb, serial_ttystate ttystate) { return 0; } static int -mac_noflush_set_tty_state (scb, new_ttystate, old_ttystate) - serial_t scb; - serial_ttystate new_ttystate; - serial_ttystate old_ttystate; +mac_noflush_set_tty_state (serial_t scb, serial_ttystate new_ttystate, + serial_ttystate old_ttystate) { return 0; } static void -mac_print_tty_state (scb, ttystate) - serial_t scb; - serial_ttystate ttystate; +mac_print_tty_state (serial_t scb, + serial_ttystate ttystate, + struct ui_file *stream) { /* Nothing to print. */ return; } +/* If there is a tricky formula to relate real baud rates + to what the serial driver wants, we should use it. Until + we get one, this table will have to do. */ + +static struct +{ + int real_rate; + int bits; +} +mac_baud_rate_table[] = +{ + { + 57600, baud57600 + } + , + { + 38400, 1 + } + , + { + 19200, baud19200 + } + , + { + 9600, baud9600 + } + , + { + 7200, baud7200 + } + , + { + 4800, baud4800 + } + , + { + 3600, baud3600 + } + , + { + 2400, baud2400 + } + , + { + 1800, baud1800 + } + , + { + 1200, baud1200 + } + , + { + 600, baud600 + } + , + { + 300, baud300 + } + , + { + 0, 0 + } +}; + static int -mac_set_baud_rate (scb, rate) - serial_t scb; - int rate; +mac_set_baud_rate (serial_t scb, int rate) { - return 0; + int i, bits; + + for (i = 0; mac_baud_rate_table[i].real_rate != 0; ++i) + { + if (mac_baud_rate_table[i].real_rate == rate) + { + bits = mac_baud_rate_table[i].bits; + break; + } + } + SerReset (input_refnum, stop10 | noParity | data8 | bits); + SerReset (output_refnum, stop10 | noParity | data8 | bits); } static int -mac_set_stop_bits (scb, num) - serial_t scb; - int num; +mac_set_stop_bits (serial_t scb, int num) { return 0; } @@ -257,22 +319,19 @@ mac_set_stop_bits (scb, num) int first_mac_write = 0; static int -mac_write (scb, str, len) - serial_t scb; - const char *str; - int len; +mac_write (serial_t scb, const char *str, int len) { OSErr err; IOParam pb; if (first_mac_write++ < 4) { - sec_sleep (1); + sleep (1); } pb.ioRefNum = output_refnum; pb.ioBuffer = (Ptr) str; pb.ioReqCount = len; - err = PBWrite ((ParmBlkPtr) &pb, 0); + err = PBWrite ((ParmBlkPtr) & pb, 0); if (err < 0) { return 1; @@ -280,34 +339,20 @@ mac_write (scb, str, len) return 0; } -sec_sleep (int timeout) -{ - unsigned long start_time, now; - - time (&start_time); - - while (1) - { - time (&now); - if (now > start_time + timeout) - return; - } -} - static void mac_close (serial_t scb) { if (input_refnum) { - if (1 /* custom buffer */) + if (1 /* custom buffer */ ) SerSetBuf (input_refnum, mac_input_buffer, 0); CloseDriver (input_refnum); input_refnum = 0; } if (output_refnum) { - if (0 /* custom buffer */) - SetSetBuf (input_refnum, mac_output_buffer, 0); + if (0 /* custom buffer */ ) + SerSetBuf (input_refnum, mac_output_buffer, 0); CloseDriver (output_refnum); output_refnum = 0; } @@ -331,10 +376,11 @@ static struct serial_ops mac_ops = mac_noflush_set_tty_state, mac_set_baud_rate, mac_set_stop_bits, + mac_noop, /* wait for output to drain */ }; void -_initialize_ser_mac () +_initialize_ser_mac (void) { serial_add_interface (&mac_ops); }