⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdfunc.c

📁 gdb for adsp develop
💻 C
字号:
static char _[] = "@(#)tdfunc.c	5.25 93/10/28 08:44:32, Srini, AMD.";/****************************************************************************** * Copyright 1991 Advanced Micro Devices, Inc. * * This software is the property of Advanced Micro Devices, Inc  (AMD)  which * specifically  grants the user the right to modify, use and distribute this * software provided this notice is not removed or altered.  All other rights * are reserved by AMD. * * AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS * SOFTWARE.  IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL * DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR * USE OF THIS SOFTWARE. * * So that all may benefit from your experience, please report  any  problems * or  suggestions about this software to the 29K Technical Support Center at * 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131  in  the  UK,  or * 0031-11-1129 in Japan, toll free.  The direct dial number is 512-462-4118. * * Advanced Micro Devices, Inc. * 29K Support Products * Mail Stop 573 * 5900 E. Ben White Blvd. * Austin, TX 78741 * 800-292-9263 ***************************************************************************** *      Engineer: Srini Subramanian. ***************************************************************************** * This module contains the functions to initialize, read, and write to the * serial port on an Unix-based machine. ***************************************************************************** *//* This file contains the Target Dependent Functions used by Minimon's * Message System. */#include  <stdio.h>#include  <fcntl.h>#include  <termio.h>#ifdef __hpux#include <sys/modem.h>#endif#include  "messages.h"#include  "tdfunc.h"#include  "mtip.h"#include  "macros.h"/* Serial connection *//* ** Serial port routines*//*definitions */#define BAUD_RATE       B9600#define CHAR_SIZE         CS8#define STOP_BITS           0#define PARITY_ENABLE       0#define PARITY              0#define CH0_BUFFER_SIZE  1024#define BLOCK 1#define NOBLOCK 0/* Global for serial */static	int   msg_port;static	INT32  in_byte_count=0;extern	int	BlockCount;/*** This function is used to initialize the communication** channel.  This consists of basically opening the com** port for reading and writing.**** With Sun UNIX, each time the port is opened, the communication** parameters are reset to default values.  These default values for** the serial port are currently 9600 baud, 7 bits, even parity.*/INT32init_comm_serial(ignore1, ignore2)INT32 ignore1;INT32 ignore2;   {   int      result;   unsigned short  baud;   struct   termio tbuf;#ifdef __hpux   mflag	mbits;#else   int		mbits;#endif   int		cd;	/* carrier detect */   /* Open serial port */      if ((msg_port = open(tip_config.comm_port, O_NDELAY|O_RDWR)) == -1) {      return (-1);   }   /* Get baud rate */   if (strcmp(tip_config.baud_rate, "300") == 0)      baud = B300;   else   if (strcmp(tip_config.baud_rate, "600") == 0)      baud = B600;   else   if (strcmp(tip_config.baud_rate, "1200") == 0)      baud = B1200;   else   if (strcmp(tip_config.baud_rate, "2400") == 0)      baud = B2400;   else   if (strcmp(tip_config.baud_rate, "4800") == 0)      baud = B4800;   else   if (strcmp(tip_config.baud_rate, "9600") == 0)      baud = B9600;   else   if (strcmp(tip_config.baud_rate, "19200") == 0)      baud = B19200;   else   if (strcmp(tip_config.baud_rate, "38400") == 0)      baud = B38400;   else      return(-1);   /* Set up new parameters */   /* Get termio (for modification) */   result = ioctl(msg_port, TCGETA, &tbuf);   if (result == -1)      return (-1);   /*   ** Note:  On a Sun III, the port comes up at 9600 baud,   ** 7 bits, even parity, with read enabled.  We will change   ** this to 8 bits, no parity (with RTS/CTS handshaking).   ** We will also set I/O to "raw" mode.   */   /* Set up new parameters */   tbuf.c_iflag = 0;   tbuf.c_oflag = 0;   tbuf.c_cflag = (baud          | CHAR_SIZE | STOP_BITS | CREAD |                   PARITY_ENABLE | PARITY   );   tbuf.c_lflag = 0;   tbuf.c_cc[VMIN] = 0;  /* Number of characters to satisfy read */#ifdef __hpux   tbuf.c_cc[VTIME] = 100;  /* intercharacter timer interval in seconds */#else   tbuf.c_cc[VTIME] = 1;  /* intercharacter timer interval in seconds */#endif   /* Set termio to new mode */   result = ioctl(msg_port, TCSETA, &tbuf);   if (result == -1)      return (-1);#ifdef __hpux   /* modem status */   (void) ioctl (msg_port, MCGETA, &mbits);   mbits = (MDSR|MDTR|MRTS);   (void) ioctl (msg_port, MCSETA, &mbits);#else   /* modem status */   (void) ioctl (msg_port, TIOCMGET, &mbits);   mbits  = (TIOCM_DTR|TIOCM_RTS);   (void) ioctl (msg_port, TIOCMSET, &mbits);#endif   /* FLush queue */   if (ioctl(msg_port, TCFLSH, 2) == -1)      return (-1);   return(0);   }  /* end init_comm_serial() *//*** This function is used to send a message over the** serial line.**** If the message is successfully sent, a zero is** returned.  If the message was not sendable, a -1** is returned.  This function blocks.  That is, it** does not return until the message is completely** sent, or until an error is encountered.***/INT32send_bfr_serial(bfr_ptr, length, port_base, comm_err)   BYTE  *bfr_ptr;   INT32 length;   INT32 port_base;   INT32 *comm_err;   {   int    result;   /* Send message */   result = write(msg_port, (char *)bfr_ptr, length);   if (result != length)      return (-1);   else      return (0);   }  /* end msg_send_serial() *//*** This function is used to receive a message over a** serial line.**** If the message is waiting in the buffer, a zero is** returned and the buffer pointed to by msg_ptr is filled** in.  If no message was available, a -1 is returned.***//* Read as many characters as are coming and return the number of character * read into the buffer. * Buffer : pointer to the receiving buffer. * nbytes : number of bytes requested. * Mode   : Blocking/Non-blocking mode. In blocking mode, this will not *          return until atleast a character is received. It is used when *          the TIP is to wait for a response from the target, and there is *          no need to poll the keyboard. * PortBase : not used. * CommError : Error during communication. */INT32recv_bfr_serial(Buffer, nbytes, Mode, PortBase, CommError)   BYTE  *Buffer;   INT32 nbytes;   INT32 Mode;   INT32 PortBase;   INT32 *CommError;   {   int    result;   unsigned char	  ch;   INT32    count;   int	bcount;   struct termio	OrigTBuf, NewTBuf;     count = 0;     do {	if (Mode == BLOCK) {	  bcount = 0;	  while (bcount++ < BlockCount) {	    if ((result = read(msg_port, (char *)&ch, 1)) == 1) { /* success */              *Buffer++ = (BYTE) ch;	      count = count + 1;	      bcount = 0;	    };	    if (count == nbytes)	      return (0);	  };	  return ((INT32) -1);	} else { /* non-block */	  if ((result = read(msg_port, (char *)&ch, 1)) == 1) { /* success */            *Buffer++ = (BYTE) ch;	    count = count + 1;	  } else { /* Timed out */            return ((INT32) -1);	  }	}     } while (count < nbytes);     return (0);#ifdef DEBUG   if (Mode) { /* BLOCK while reading */     /*      * Set blocking mode by set MIN=0 and TIME > 0      * Here we set TIME to block for 60 seconds.      */      (void) ioctl (msg_port, TCGETA, &OrigTBuf);      (void) ioctl (msg_port, TCGETA, &NewTBuf);      NewTBuf.c_cc[4] = 0;	/* set MIN to 0 */      NewTBuf.c_cc[5] = 1;	/* 600 * 0.1 seconds */      (void) ioctl (msg_port, TCSETA, &NewTBuf);     count = 0;     do {	if (read(msg_port, (char *)&ch, 1) == 1) { /* success */          *Buffer++ = (BYTE) ch;	  count = count + 1;	} else { /* Timed out */          (void) ioctl (msg_port, TCSETA, &OrigTBuf); /* restore termio */          return ((INT32) -1);	}     } while (count < nbytes);     (void) ioctl (msg_port, TCSETA, &OrigTBuf); /* restore termio */     return (0);   } else { /* Non blocking */     result = (INT32) -1;     count = 0;     while ((count < nbytes) && (read(msg_port, (char *)&ch, 1) == 1)) {       *Buffer++ = (BYTE) ch;       count = count + 1;       result = 0;     }     if (count == nbytes) /* read enough */       return (0);     else	/* not enough chars read */       return ((INT32) -1);   }#endif#if 0   result = read(msg_port, (char *) Buffer, nbytes); /* read as many */   if (result == nbytes) {     return (0);   } else {     return (-1);   }   	if (result > 0) {      		in_byte_count = in_byte_count + result;		block_count = 0;   		if (in_byte_count >= length) {      			/* Message received */      			in_byte_count = 0;      			return(0);      			}	} else {      		/* return if no char & not blocking */      		if (block == NOBLOCK) return (-1);        		/* return if no char, blocking, and past block count */      		if ((block == BLOCK) && (block_count++ > BlockCount))         		return (-1);        		}#endif   }  /* end msg_recv_serial() */#ifndef	MSDOS/*** This function is used to close the communication** channel.  This is used when resyncing the host and** target and when exiting the monitor.*/INT32reset_comm_pcserver(ignore1, ignore2)INT32	ignore1;INT32	ignore2;   {   unsigned char	  ch;#ifdef __hpux    mflag  mbits;#else    int  mbits;#endif   printf("reset:\n");   /* Reset message buffer counters */   in_byte_count = 0;#ifdef __hpux   mbits = (MDSR|MDTR|MRTS);   (void) ioctl (msg_port, MCSETA, &mbits);#else   mbits  = (TIOCM_DTR|TIOCM_RTS);   (void) ioctl (msg_port, TIOCMGET, &mbits);#endif   /* Clear data from buffer */   if (ioctl(msg_port, TCFLSH, 2) == -1) {     return (-1);   }   return(0);   }  /* end reset_comm_serial() */#endif/*** This function is used to close the communication** channel.  This is used when resyncing the host and** target and when exiting the monitor.*/INT32reset_comm_serial(ignore1, ignore2)INT32	ignore1;INT32	ignore2;   {#ifdef __hpux   mflag	mbits;#else    int  mbits;#endif   /* Reset message buffer counters */   in_byte_count = 0;#ifdef __hpux   (void) ioctl (msg_port, MCGETA, &mbits);   mbits = (MDSR|MDTR|MRTS);   (void) ioctl (msg_port, MCSETA, &mbits);#else   (void) ioctl (msg_port, TIOCMGET, &mbits);   mbits  = (TIOCM_DTR|TIOCM_RTS);   (void) ioctl (msg_port, TIOCMSET, &mbits);#endif   /* Clear data from buffer */   if (ioctl(msg_port, TCFLSH, 2) == -1) {     return (-1);   }   return(0);   }  /* end reset_comm_serial() */INT32exit_comm_serial(ignore1, ignore2)INT32	ignore1;INT32	ignore2;   {   /* Reset message buffer counters */   in_byte_count = 0;   (void) close(msg_port);   return(0);   }  /* end reset_comm_serial() *//*** This function is usually used to "kick-start" the target.** This is nesessary when targets are shared memory boards.** With serial communications, this function does nothing.*/voidgo_serial(port_base, msg_seg)INT32 port_base;INT32 msg_seg;   { return; }INT32 write_memory_serial (ignore1, ignore2, ignore3, ignore4, ignore5, ignore6)	INT32 ignore1;	ADDR32 ignore2;	BYTE *ignore3;	INT32 ignore4; 	INT32 ignore5;	INT32 ignore6; { 	return(-1); }INT32 read_memory_serial (ignore1, ignore2, ignore3, ignore4, ignore5, ignore6)	INT32 ignore1;	ADDR32 ignore2;	BYTE *ignore3;	INT32 ignore4;	INT32 ignore5;	INT32 ignore6;{ return(-1); }INT32fill_memory_serial()   { return(-1); }/*** Stubs for PC plug-in board routines*//* EB29K */INT32  init_comm_eb29k()    {return (FAILURE);}INT32  msg_send_eb29k()     {return (-1);}INT32  msg_recv_eb29k()     {return (-1);}INT32  reset_comm_eb29k()   {return (-1);}INT32  exit_comm_eb29k()   {return (-1);}void   go_eb29k()           {}INT32  read_memory_eb29k()  {return (-1);}INT32  write_memory_eb29k() {return (-1);}INT32  fill_memory_eb29k()  {return (-1);}/* LCB29K */INT32  init_comm_lcb29k()   {return (FAILURE);}INT32  msg_send_lcb29k()    {return (-1);}INT32  msg_recv_lcb29k()    {return (-1);}INT32  reset_comm_lcb29k()  {return (-1);}INT32  exit_comm_lcb29k()  {return (-1);}void   go_lcb29k()          {}INT32  read_memory_lcb29k() {return (-1);}INT32  write_memory_lcb29k(){return (-1);}INT32  fill_memory_lcb29k() {return (-1);}/* PCEB */INT32  init_comm_pceb()     {return (FAILURE);}INT32  msg_send_pceb()      {return (-1);}INT32  msg_recv_pceb()      {return (-1);}INT32  reset_comm_pceb()    {return (-1);}INT32  exit_comm_pceb()    {return (-1);}void   go_pceb()            {}INT32  read_memory_pceb()   {return (-1);}INT32  write_memory_pceb()  {return (-1);}INT32  fill_memory_pceb()   {return (-1);}/* EB030 */INT32  init_comm_eb030()    {return (FAILURE);}INT32  msg_send_eb030()     {return (-1);}INT32  msg_recv_eb030()     {return (-1);}INT32  reset_comm_eb030()   {return (-1);}INT32  exit_comm_eb030()   {return (-1);}void   go_eb030()           {}INT32  read_memory_eb030()  {return (-1);}INT32  write_memory_eb030() {return (-1);}INT32  fill_memory_eb030()  {return (-1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -