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

📄 parallel.c

📁 lwip在ucos上的移植
💻 C
字号:
static char _[] = "@(#)parallel.c	1.4 93/09/08 14:14:32, Srini, AMD.";/****************************************************************************** * Copyright 1992 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 Systems Engineering * Mail Stop 573 * 5204 E. Ben White Blvd. * Austin, TX 78741 * 800-292-9263 * 29k-support@AMD.COM **************************************************************************** * Engineer:  Srini Subramanian. **************************************************************************** */#include <bios.h>#include <conio.h>#include <stdio.h>#include <string.h>#include "types.h"#include "memspcs.h"#include "messages.h"#include "mtip.h"#include "tdfunc.h"void   endian_cvt PARAMS((union msg_t *, int));extern	FILE	*MsgFile;	/* for logging error retries */unsigned _bios_printer(unsigned service, unsigned printer, unsigned data);INT32 par_write( char	*buffer, INT32	length);static	unsigned	portID=0;#define	LPT1	0#define	LPT2	1#define CHECKSUM_FAIL -1INT32init_parport(portname)char	*portname;{  unsigned status;  if (strncmp(portname, "lpt1", 4) == 0)  {     status = _bios_printer( _PRINTER_INIT, LPT1, 0);     portID = LPT1;  } else if (strncmp(portname, "lpt2", 4) == 0) {     status = _bios_printer( _PRINTER_INIT, LPT2, 0);     portID = LPT2;  }#if 0  if (status != 0x90) {    printf("parallel port status 0x%.4x\n", status);    return ((INT32) -1);  } else {    return ((INT32) 0);  }#endif    return ((INT32) 0);}INT32msg_send_parport(msg_ptr, port_base)union  msg_t  *msg_ptr;INT32  port_base;{   INT32 result, i, ack, comm_err;    UINT32 checksum;   unsigned int		timeout;   INT32 	Rx_ack[2];   INT32 header_size = (2 * sizeof(INT32));   BYTE  *bfr_ptr = (BYTE *) msg_ptr;   /* Save length before doing endian conversion */   INT32 length = msg_ptr->generic_msg.length;   INT32 total_length;	   total_length = header_size + length;   /* Endian conversion */   if (tip_target_config.TipEndian != tip_target_config.P29KEndian)      endian_cvt(msg_ptr, OUTGOING_MSG);   /* calc checksum for msg */   checksum = 0;       for (i=0; i < total_length; i++)     checksum = checksum + bfr_ptr[i];   /* Append checksum to the end of the message. Do not update the    * "length" field of the message header.    */   bfr_ptr[total_length] = (BYTE) ((checksum >> 24) & 0xff);   bfr_ptr[total_length+1] = (BYTE) ((checksum >> 16) & 0xff);   bfr_ptr[total_length+2] = (BYTE) ((checksum >> 8) & 0xff);   bfr_ptr[total_length+3] = (BYTE) ((checksum >> 0) & 0xff);   /* send msg */	comm_err = (INT32) 0;	/* send msg */         result = par_write((char *)bfr_ptr, total_length+4 /* +4 */);	if (result != (INT32) 0)	    return((INT32) FAILURE);	/* get ack */	timeout = 0;	result = (INT32) -1;	comm_err = (INT32) 0;	while ((timeout < 600) && (result == (INT32) -1) 					  && (comm_err == (INT32) 0)) {	/* Poll for user interrupt */	   timeout=timeout+1;           result = recv_bfr_serial((BYTE *) Rx_ack, (2 * sizeof(INT32)), 					BLOCK, port_base, &comm_err);	}	if (comm_err != (INT32) 0) {	     reset_comm_serial((INT32) -1, (INT32) -1);	     return ((INT32) MSGRETRY);	}	/* check if timed out */	if (timeout >= 10000) {	 if (MsgFile) {	   fprintf(MsgFile,"Timed out before ACK received. Reset comm. timeout=%ld\n",timeout);     	   fflush(MsgFile);	  }	  (void) reset_comm_serial((INT32) 0, (INT32) 0);	  return ((INT32) MSGRETRY);	}	ack = (INT32) Rx_ack[1];	/* endian convert Ack */    	if (tip_target_config.TipEndian != tip_target_config.P29KEndian)       			        tip_convert32((BYTE *) &ack);	if (ack != CHECKSUM_FAIL) { 		return(0);		/* successful send */		}	else {  		if (MsgFile) {	/* log the error */     	 		fprintf(MsgFile, 			  "\n** Checksum: Nack Received, Resending.\n");     			fflush(MsgFile);  			};		}      return ((INT32) FAILURE);}INT32par_write(buffer, length)char	*buffer;INT32 		length;{ unsigned 	status; for ( ; length > (INT32) 0; length=length-1) {   status = _bios_printer(_PRINTER_WRITE, portID, (unsigned) *buffer);   /* printf("status 0x%.4x \n", status); */   buffer++; } return ((INT32) 0);}

⌨️ 快捷键说明

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