Ejemplo n.º 1
0
void close_ifport ()
{
	BYTE spicmd[2] = {FLAG, SPI_DISABLE};


	switch (PortType) {
		case TY_COMM :
			_outp(COM_MCR, 0);
			_outp(COM_LCR, 3);
			break;

		case TY_VCOM :
			break;

		case TY_BRIDGE :
			send_bridge(spicmd, 2);
			read_bridge(spicmd, 1);
			break;

		case TY_AVRSP :
			_outp(LPT_DAT, 0);
			break;

		case TY_STK200 :
			_outp(LPT_DAT, BS_DIS);
			break;

		case TY_XILINX :
			_outp(LPT_DAT, BX_DIS1|BX_DIS2);
			break;

		case TY_LATTICE :
			_outp(LPT_DAT, BL_DIS);
			break;

		case TY_ALTERA :
			_outp(LPT_CTL, 0);
			break;
#if AVRSPX
		case TY_USBASP :	//@@@ by t.k
			usbasp_close();
			break;

		case TY_HIDASP :	//@@@ by k-k
			hidasp_close();
			break;

		case TY_RSCR :	//@@@ by t.k
			if (hComm != INVALID_HANDLE_VALUE)
				rscr_close();
			break;
#endif

	}

	if(hComm != INVALID_HANDLE_VALUE)
		CloseHandle(hComm);

	PortType = 0;
}
Ejemplo n.º 2
0
void spi_clk ()
{
	BYTE spicmd[2] = { FLAG, SPI_SCK };


	switch (PortType) {
		case TY_COMM :
			iodly();
			_outp(COM_MCR, C_SCK);		/* SCK = "H" */
			iodly();
			_outp(COM_MCR, 0);			/* SCK = "L" */
			break;

		case TY_VCOM :
			iodly();
			EscapeCommFunction(hComm, SETRTS);
			iodly();
			EscapeCommFunction(hComm, CLRRTS);
			break;

		case TY_BRIDGE :
			send_bridge(spicmd, 2);
			break;

		case TY_AVRSP :
			iodly();
			_outp(LPT_DAT, B_ENA|B_SCK);
			iodly();
			_outp(LPT_DAT, B_ENA);
			break;

		case TY_STK200 :
			iodly();
			_outp(LPT_DAT, BS_SCK);
			iodly();
			_outp(LPT_DAT, 0);
			break;

		case TY_XILINX :
			iodly();
			_outp(LPT_DAT, BX_DIS2|BX_SCK);
			iodly();
			_outp(LPT_DAT, BX_DIS2);
			break;

		case TY_LATTICE :
			iodly();
			_outp(LPT_DAT, BL_SCK);
			iodly();
			_outp(LPT_DAT, 0);
			break;

		case TY_ALTERA :
			_outp(LPT_DAT, BA_SCK);
			iodly();
			_outp(LPT_DAT, 0);
			break;
	}

}
Ejemplo n.º 3
0
static BOOL read_bridge (BYTE *buffer, DWORD count)
{
	DWORD cnt = 0;


	send_bridge(NULL, 0);	/* flush left data in the transmission buffer */
	ReadFile(hComm, buffer, count, &cnt, NULL);
	return (cnt == count) ? TRUE : FALSE;
}
Ejemplo n.º 4
0
void close_ifport ()
{
	BYTE spicmd[2] = {FLAG, SPI_DISABLE};


	switch (PortType) {
		case TY_COMM :
			_outp(COM_MCR, 0);
			_outp(COM_LCR, 3);
			break;

		case TY_VCOM :
			break;

		case TY_BRIDGE :
			send_bridge(spicmd, 2);
			read_bridge(spicmd, 1);
			break;

		case TY_AVRSP :
			_outp(LPT_DAT, 0);
			break;

		case TY_STK200 :
			_outp(LPT_DAT, BS_DIS);
			break;

		case TY_XILINX :
			_outp(LPT_DAT, BX_DIS1|BX_DIS2);
			break;

		case TY_LATTICE :
			_outp(LPT_DAT, BL_DIS);
			break;

		case TY_ALTERA :
			_outp(LPT_CTL, 0);
			break;
	}

	if(hComm != INVALID_HANDLE_VALUE)
		CloseHandle(hComm);

	PortType = 0;
}
Ejemplo n.º 5
0
int spi_flush ()
{
	BYTE spicmd[2] = { FLAG, SPI_NOP };
	int n;


	if(PortType != TY_BRIDGE) return 0;	/* Exit if no bridge */

	send_bridge(spicmd, 2);		/* Send SPI_NOP command */

	n = 50;
	do {						/* Wait until SPI_NOP is processed in timeout of 5 sec */
		read_bridge(spicmd, 1);
		if(spicmd[0] == SPI_NOP) break;
	} while(--n);

	return n ? 1 : 0;
}
Ejemplo n.º 6
0
void delay_ms (WORD dly)
{
	LARGE_INTEGER val1, val2;
	BYTE spicmd[3] = { FLAG, SPI_WAIT, 0 };


	if(PortType == TY_BRIDGE) {		/* Issue wait commadnd for bridge */
		spicmd[2] = (BYTE)dly;
		send_bridge(spicmd, 3);
	}
	else {							/* Make wait using Win32 API */
		QueryPerformanceCounter(&val1);
		QueryPerformanceFrequency(&val2);
		val1.QuadPart += val2.QuadPart / 1000 * dly;
		do
			QueryPerformanceCounter(&val2);
		while(val2.QuadPart < val1.QuadPart);
	}
}
Ejemplo n.º 7
0
void spi_xmit (BYTE td)
{
	BYTE a;
	BYTE spicmd[2];
	int n = 8;


	switch (PortType) {
		case TY_COMM :
			do {
				a = ((td & 0x80) ? C_MOSI : 0);		/* MOSI(TD) = data */
				_outp(COM_LCR, a);
				iodly();							/* delay */
				_outp(COM_MCR, C_SCK);				/* SCK(RS) = "H" */
				iodly();							/* delay */
				_outp(COM_MCR, 0);					/* SCK(RS) = "L" */
				td <<= 1;
			} while (--n);
			break;

		case TY_VCOM :
			do {
				if(td & 0x80) {						/* MOSI(TD) = data */
					if(!sig_break) {
						EscapeCommFunction(hComm, SETBREAK);
						sig_break = TRUE;
					}
				} else {
					if(sig_break) {
						EscapeCommFunction(hComm, CLRBREAK);
						sig_break = FALSE;
					}
				}
				iodly();							/* delay */
				EscapeCommFunction(hComm, SETRTS);	/* SCK(RS) = "H" */
				iodly();							/* delay */
				EscapeCommFunction(hComm, CLRRTS);	/* SCK(RS) = "L" */
				td <<= 1;
			} while (--n);
			break;

		case TY_BRIDGE :
			spicmd[0] = spicmd[1] = td;
			n = (td == FLAG) ? 2 : 1;
			send_bridge(spicmd, n);					/* Send data exchange command */
			break;

		case TY_AVRSP :
			do {
				a = ((td & 0x80) ? B_ENA | B_MOSI : B_ENA);	/* MOSI(D1) = data, SCK(D0) = "L" */
				_outp(LPT_DAT, a);
				iodly();									/* delay */
				_outp(LPT_DAT, a | B_SCK);					/* SCK(D0) = "H" */
				iodly();									/* delay */
				td <<= 1;
			} while (--n);
			_outp(LPT_DAT, a);								/* SCK(D0) = "L" */
			break;

		case TY_STK200 :
			do {
				a = ((td & 0x80) ? BS_MOSI : 0);	/* MOSI(D5) = data, SCK(D4) = "L" */
				_outp(LPT_DAT, a);
				iodly();							/* delay */
				_outp(LPT_DAT, a | BS_SCK);			/* SCK(D4) = "H" */
				iodly();							/* delay */
				td <<= 1;
			} while (--n);
			_outp(LPT_DAT, a);						/* SCK(D4) = "L" */
			break;

		case TY_XILINX :
			do {
				a = ((td & 0x80) ? BX_DIS2 | BX_MOSI : BX_DIS2); /* MOSI(D0) = data, SCK(D1) = "L" */
				_outp(LPT_DAT, a);
				iodly();									/* delay */
				_outp(LPT_DAT, a | BX_SCK);					/* SCK(D1) = "H" */
				iodly();									/* delay */
				td <<= 1;
			} while (--n);
			_outp(LPT_DAT, a);								/* SCK(D1) = "L" */
			break;

		case TY_LATTICE :
			do {
				a = ((td & 0x80) ? BL_MOSI : 0);	/* MOSI(D0) = data, SCK(D1) = "L" */
				_outp(LPT_DAT, a);
				iodly();							/* delay */
				_outp(LPT_DAT, a | BL_SCK);			/* SCK(D1) = "H" */
				iodly();							/* delay */
				td <<= 1;
			} while (--n);
			_outp(LPT_DAT, a);						/* SCK(D1) = "L" */
			break;

		case TY_ALTERA :
			do {
				a = ((td & 0x80) ? BA_MOSI : 0);	/* MOSI(D6) = data, SCK(D0) = "L" */
				_outp(LPT_DAT, a);
				iodly();							/* delay */
				_outp(LPT_DAT, a | BA_SCK);			/* SCK(D0) = "H" */
				iodly();							/* delay */
				td <<= 1;
			} while (--n);
			_outp(LPT_DAT, a);						/* SCK(D0) = "L" */
			break;
	}

}
Ejemplo n.º 8
0
void spi_reset ()
{
	BYTE spicmd[2] = { FLAG, SPI_RESET };


	switch (PortType) {
#if AVRSPX
		case TY_HIDASP :
			delay_ms(10);	/* Add by senshu 2008/10/12 14:02:01 */
			{
				unsigned char dat[]={0,0,0,0};
				hidasp_cmd(dat,NULL);
			}
			break;
#endif
		case TY_COMM :
			_outp(COM_MCR, 0);		/* RESET,SCK = "L" */
			delay_ms(10);			/* 10msec */
			_outp(COM_MCR, C_RES);	/* RESET = "H" */
			iodly(); iodly();		/* delay */
			_outp(COM_MCR, 0);		/* RESET = "L" */
			break;

		case TY_VCOM :
			EscapeCommFunction(hComm, CLRDTR);
			EscapeCommFunction(hComm, CLRRTS);
			delay_ms(10);
			EscapeCommFunction(hComm, SETDTR);
			iodly(); iodly();
			EscapeCommFunction(hComm, CLRDTR);
			break;

		case TY_BRIDGE :
			delay_ms(10);
			send_bridge(spicmd, 2);
			break;

		case TY_AVRSP :
			_outp(LPT_DAT, B_ENA);
			delay_ms(10);
			_outp(LPT_DAT, B_ENA|B_RES);
			iodly(); iodly();
			_outp(LPT_DAT, B_ENA);
			break;

		case TY_STK200 :
			_outp(LPT_DAT, 0);
			delay_ms(10);
			_outp(LPT_DAT, BS_RES);
			iodly(); iodly();
			_outp(LPT_DAT, 0);
			break;

		case TY_XILINX :
			_outp(LPT_DAT, BX_DIS2);
			delay_ms(10);
			_outp(LPT_DAT, BX_DIS2|BX_RES);
			iodly(); iodly();
			_outp(LPT_DAT, BX_DIS2);
			break;

		case TY_LATTICE :
			_outp(LPT_DAT, 0);
			delay_ms(10);
			_outp(LPT_DAT, BL_RES);
			iodly(); iodly();
			_outp(LPT_DAT, 0);
			break;

		case TY_ALTERA :
			_outp(LPT_DAT, 0);
			delay_ms(10);
			_outp(LPT_DAT, BA_RES);
			iodly(); iodly();
			_outp(LPT_DAT, 0);
			break;

	}
	RcvrFifo.Rp = 0;					/* Flush FIFO */
	RcvrFifo.Wp = 0;
	RcvrFifo.Ctr = 0;
	delay_ms(30);						/* 30msec */
}
Ejemplo n.º 9
0
int open_ifport (PORTPROP *pc)
{
	OSVERSIONINFO vinfo = { sizeof(OSVERSIONINFO) };
	LARGE_INTEGER val1;
	BYTE cmdspi[6];
	static const WORD PortsCom[] = { COM1ADR, COM2ADR, COM3ADR, COM4ADR };
	static const WORD PortsLpt[] = { LPT1ADR, LPT2ADR, LPT3ADR };
	char sComm[16];
	DCB dcb = { sizeof(DCB),
				9600, TRUE, FALSE, TRUE, FALSE,
				DTR_CONTROL_DISABLE, FALSE,
				TRUE, FALSE, FALSE, FALSE, FALSE,
				RTS_CONTROL_DISABLE, FALSE, 0, 0,
				10, 10,
				8, NOPARITY, ONESTOPBIT, '\x11', '\x13', '\xFF', '\xFF', 0 };
	COMMTIMEOUTS commtimeouts = { 0, 1, 100, 1, 300};


	/* Check if high resolution timer is supported */
	QueryPerformanceFrequency(&val1);
	if (val1.QuadPart == 0) {
		pc->Info1 = "Incompatible envilonment.\n";
		return 1;
	}

#if AVRSPX
	if (pc->Delay < 0) {				//@@x by t.k
		PortDly = DEFAULT_DELAY_VALUE;	//@@x
	} else {
		PortDly = pc->Delay;	/* I/O delay for direct I/O control */
	}

	if (pc->Baud < 0) {					//@@x by t.k
		if (pc->PortClass == TY_RSCR)
			dcb.BaudRate = 19200;
		else {
			dcb.BaudRate = DEFAULT_BAUDRATE;
		}
	} else {
		dcb.BaudRate = pc->Baud;	/* Bit rate for SPI bridge */
	}
#else
	PortDly = pc->Delay;		/* I/O delay for direct I/O control */
	dcb.BaudRate = pc->Baud;	/* Bit rate for SPI bridge */
#endif

	/* Open direct I/O driver if needed */
	if(GetVersionEx(&vinfo) == FALSE) {
		pc->Info1 = "Incompatible envilonment.\n";
		return 1;
	}
	if((vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
	    && ((pc->PortClass == TY_COMM)||(pc->PortClass == TY_LPT))) {
		if(init_driver()) {
			pc->Info1 = "I/O driver, giveio.sys, is not available due to any reason.\n"
			"To install giveio, type \"move giveio.sys %%windir%%\\system32\" and retry any function.\n";
			return 1;
		}
	}

	/* Use COM port in direct I/O */
	if(pc->PortClass == TY_COMM) {
		if((pc->PortNum < 1)||(pc->PortNum > 4)) {
			pc->Info1 = "Invalid Port#.\n";
			return 1;
		}
		PortBase = PortsCom[pc->PortNum - 1];
		sprintf(str_info, "No COM%u(0x%X) port.\n", pc->PortNum, PortBase);
		pc->Info1 = str_info;
		if(check_comport()) {
			if(vinfo.dwPlatformId != VER_PLATFORM_WIN32_NT) return 1;
			sprintf(sComm, "\\\\.\\COM%u", pc->PortNum);
			hComm = CreateFile(sComm, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
			if(hComm == INVALID_HANDLE_VALUE) return 1;
			if(check_comport()) return 1;
		}

		_outp(COM_IMR, 0x00);		/* Mask interrupts */
		pc->Info1 = NULL;
		PortType = TY_COMM;
#if AVRSPX
		sprintf(str_info, "Use COM%u(0x%X) port in direct I/O.\n", pc->PortNum, PortBase);
		pc->Info1 = str_info;
#endif
		return 0;
	}

#if AVRSPX
	if (pc->PortClass == TY_HIDASP)	{ //@@+ by k-k
		if (hidasp_init(pc->SerialNumber) == HIDASP_MODE_ERROR)	{
			sprintf(str_info, "HIDaspx(%s) not found.\n", pc->SerialNumber);
			pc->Info1 = str_info;
			return 1;
		}
		PortType = TY_HIDASP;
		return 0;
	}
#endif

	/* Use COM port via API */
	if(pc->PortClass == TY_VCOM) {
		sprintf(sComm, "\\\\.\\COM%u", pc->PortNum);
		hComm = CreateFile(sComm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if(hComm == INVALID_HANDLE_VALUE) {
			sprintf(str_info, "%s could not be opened.\n", sComm);
			pc->Info1 = str_info;
			return 1;
		}
#if AVRSPX
		if (SetCommState(hComm, &dcb)==0) {
			sprintf(str_info, "%s (%dbps) parameter error. \n", sComm, (int)dcb.BaudRate);
			pc->Info1 = str_info;
			return 1;
		}
#else
		SetCommState(hComm, &dcb);
#endif
		EscapeCommFunction(hComm, CLRRTS);
		EscapeCommFunction(hComm, CLRDTR);
		PortType = TY_VCOM;
#if AVRSPX
		sprintf(str_info, "Use COM%u port via API.\n", pc->PortNum);
		pc->Info1 = str_info;
#endif
		return 0;
	}

	/* Use SPI bridge attached on COM port */
	if(pc->PortClass == TY_BRIDGE) {
		sprintf(sComm, "\\\\.\\COM%u", pc->PortNum);
		hComm = CreateFile(sComm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if(hComm == INVALID_HANDLE_VALUE) {
			sprintf(str_info, "%s could not be opened.\n", sComm);
			pc->Info1 = str_info;
			return 1;
		}
		dcb.fOutxCtsFlow = TRUE;
		dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
#if AVRSPX
		if (SetCommState(hComm, &dcb)==0) {
			sprintf(str_info, "%s (%dbps) parameter error. \n", sComm, (int)dcb.BaudRate);
			pc->Info1 = str_info;
			return 1;
		}
#else
		SetCommState(hComm, &dcb);
#endif
		SetCommTimeouts(hComm, &commtimeouts);
		EscapeCommFunction(hComm, SETDTR);
		EscapeCommFunction(hComm, CLRDTR);
		delay_ms(10);
		while(read_bridge(cmdspi, sizeof(cmdspi)));
		cmdspi[0] = FLAG-1;
		cmdspi[1] = FLAG; cmdspi[2] = SPI_ENABLE;	/* Enable Bridge */
#if AVRSPX
		cmdspi[3] = FLAG; cmdspi[4] = SPI_SETDLY;
		if (PortDly > 255) {
			cmdspi[5] = 255; /* Set SPI delay */
		} else {
			cmdspi[5] = (BYTE)PortDly; /* Set SPI delay */
		}
#else
		cmdspi[3] = FLAG; cmdspi[4] = SPI_SETDLY; cmdspi[5] = (BYTE)PortDly; /* Set SPI delay */
#endif
		send_bridge(cmdspi, 6);		/* Send bridge initialization commands */
		read_bridge(cmdspi, 2);		/* Check if the commands are accepted */
		if((cmdspi[0] != SPI_ENABLE) || (cmdspi[1] != SPI_SETDLY)) {
			sprintf(str_info, "No SPI bridge on the %s.\n", sComm);
			pc->Info1 = str_info;
			return 1;
		}
#if AVRSPX
		cmdspi[0] = FLAG; cmdspi[1] = SPI_GETREV;
		send_bridge(cmdspi, 2);		/* Send f/w revision commands */
		read_bridge(cmdspi, 1);		/* Check if AVR specific command is supported */
		BridgeRev = (cmdspi[0] == 0xFF) ? 0 : cmdspi[0];
		if (BridgeRev < 4) {
			sprintf(str_info, "*** Use SPI bridge R4+ for fast operation ***\n");
		} else {
			sprintf(str_info, "SPI bridge on the %s (baud=%d).\n", sComm, (int)dcb.BaudRate);
		}
		pc->Info1 = str_info;
#endif
		PortType = TY_BRIDGE;
		return 0;
	}

	/* Use LPT port in direct I/O */
	if(pc->PortClass == TY_LPT) {
		if((pc->PortNum < 1)||(pc->PortNum > 3)) {
			pc->Info1 = "Invalid Port#.\n";
			return 1;
		}
		PortBase = PortsLpt[pc->PortNum - 1];
		if(check_lptport()) {
			sprintf(str_info, "No LPT%u(0x%X) port.\n", pc->PortNum, PortBase);
			pc->Info1 = str_info;
			return 1;
		}

		_outp(LPT_DAT, 0x20);	/* Check if the adapter is ByteBlasterMV (D5-ACK) */
		if(_inp(LPT_STA) & S_ACK) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_ACK) == 0) {
				_outp(LPT_CTL, BA_ENA);
				pc->Info1 = "Altera ByteBlasterMV was found.\n";
				PortType = TY_ALTERA;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x80);	/* Check if the adapter is AVRSP (D7-PE) */
		if(_inp(LPT_STA) & S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_PE) == 0) {
				_outp(LPT_DAT, B_ENA);
				pc->Info1 = "AVRSP adapter was found.\n";
				PortType = TY_AVRSP;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x40);	/* Check if the adapter is Xilinx JTAG (D6-BUSY-PE) */
		if((_inp(LPT_STA) & (S_PE | S_BUSY)) == S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & (S_PE | S_BUSY)) == S_BUSY) {
				pc->Info1 = "Xilinx JTAG adapter was found.\n";
				PortType = TY_XILINX;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x40);	/* Check if the adapter is Lattice ISP (D6-PE) */
		if(_inp(LPT_STA) & S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_PE) == 0) {
				pc->Info1 = "Lattice ISP adapter was found.\n";
				PortType = TY_LATTICE;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x01);	/* Check if the adapter is STK200 dongle (D0-PE) */
		if(_inp(LPT_STA) & S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_PE) == 0) {
				pc->Info1 = "STK200 ISP dongle was found.\n";
				PortType = TY_STK200;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		sprintf(str_info, "No ISP adapter on the LPT%u.\n", pc->PortNum);
		pc->Info1 = str_info;
		return 1;
	}
#if AVRSPX
	if (pc->PortClass == TY_USBASP) {	//@@+ by t.k
		if (usbasp_initialize(pc->SerialNumber) != 0) {
			pc->Info1 = "USBasp not fonud.\n";
			return 1;
		}
		PortType = TY_USBASP;
		if (usbasp_connect(pc->Delay) != 0) {
			pc->Info1 = "USBasp connection error!!.\n";
			return 1;
		}
		return 0;
	}

	/* Use COM port via API */
	if (pc->PortClass == TY_RSCR) {	//@@+ by t.k
		sprintf(sComm, "\\\\.\\COM%u", pc->PortNum);
		hComm = CreateFile(sComm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if (hComm == INVALID_HANDLE_VALUE) {
			sprintf(str_info, "%s could not be opened.\n", sComm);
			pc->Info1 = str_info;
			return 1;
		}
		dcb.fOutxCtsFlow = FALSE;
		dcb.fOutxDsrFlow = FALSE;
		dcb.fDtrControl  = DTR_CONTROL_DISABLE;
		dcb.fRtsControl  = RTS_CONTROL_DISABLE;
#if AVRSPX
		if (SetCommState(hComm, &dcb)==0) {
			sprintf(str_info, "%s (%dbps) parameter error. \n", sComm, (int)dcb.BaudRate);
			pc->Info1 = str_info;
			return 1;
		}
#else
		SetCommState(hComm, &dcb);
#endif
		EscapeCommFunction(hComm, CLRRTS);
		EscapeCommFunction(hComm, CLRDTR);
		PortType = TY_RSCR;
		rscr_setup(hComm, dcb.BaudRate);
		return 0;
	}

#endif

	pc->Info1 = "Invalid port class.\n";
	return 1;
}
Ejemplo n.º 10
0
BYTE spi_rcvr (BYTE mode)
{
	BYTE rd = 0;
	BYTE spicmd[2] = { FLAG, SPI_RCVZ };
	int n = 8;


	switch (PortType) {
		case TY_COMM :
			_outp(COM_LCR, 0);						/* MOSI(TD) = "L" */
			iodly();
			do {
				rd <<= 1;							/* Read MISO(DR) */
				if(_inp(COM_MSR) & C_MISO) rd++;
				_outp(COM_MCR, C_SCK);				/* SCK(RS) = "H" */
				iodly();							/* delay */
				_outp(COM_MCR, 0);					/* SCK(RS) = "L" */
				iodly();							/* delay */
			} while (--n);
			if(mode == RM_ASYNC)
				fifo_put(rd);
			break;

		case TY_VCOM :
			if(!sig_break) {
				EscapeCommFunction(hComm, CLRBREAK);/* MOSI(TD) = "L" */
				sig_break = FALSE;
			}
			iodly();
			do {
				rd <<= 1;							/* Read MISO(DR) */
				GetCommModemStatus(hComm, &ModemStat);
				if(ModemStat & MS_DSR_ON) rd++;
				EscapeCommFunction(hComm, SETRTS);	/* SCK(RS) = "H" */
				iodly();							/* delay */
				EscapeCommFunction(hComm, CLRRTS);	/* SCK(RS) = "L" */
				iodly();							/* delay */
			} while (--n);
			if(mode == RM_ASYNC)
				fifo_put(rd);
			break;

		case TY_BRIDGE :
			send_bridge(spicmd, 2);					/* Send SPI_RCVZ command */
			if(mode == RM_SYNC) {
				if(!read_bridge(&rd, 1))			/* Get a read data from pipeline */
					rd = 0xFF;
			}
			break;

		case TY_AVRSP :
			_outp(LPT_DAT, B_ENA);					/* MOSI(D0) = "L" */
			iodly();
			do {
				rd <<= 1;							/* Read MISO(BUSY) */
				if((_inp(LPT_STA) & S_BUSY) == 0) rd++;
				_outp(LPT_DAT, B_ENA | B_SCK);		/* SCK(D1) = "H" */
				iodly();							/* delay */
				_outp(LPT_DAT, B_ENA);				/* SCK(D1) = "L" */
				iodly();							/* delay */
			} while (--n);
			if(mode == RM_ASYNC)
				fifo_put(rd);
			break;

		case TY_STK200 :
			_outp(LPT_DAT, 0);						/* MOSI(D5) = "L" */
			iodly();
			do {
				rd <<= 1;							/* Read MISO(ACK) */
				if(_inp(LPT_STA) & S_ACK) rd++;
				_outp(LPT_DAT, BS_SCK);				/* SCK(D4) = "H" */
				iodly();							/* delay */
				_outp(LPT_DAT, 0);					/* SCK(D4) = "L" */
				iodly();							/* delay */
			} while (--n);
			if(mode == RM_ASYNC)
				fifo_put(rd);
			break;

		case TY_XILINX :
			_outp(LPT_DAT, BX_DIS2);				/* MOSI(D0) = "L" */
			iodly();
			do {
				rd <<= 1;							/* Read MISO(SEL) */
				if(_inp(LPT_STA) & S_SEL) rd++;
				_outp(LPT_DAT, BX_DIS2 | BX_SCK);	/* SCK(D1) = "H" */
				iodly();							/* delay */
				_outp(LPT_DAT, BX_DIS2);			/* SCK(D1) = "L" */
				iodly();							/* delay */
			} while (--n);
			if(mode == RM_ASYNC)
				fifo_put(rd);
			break;

		case TY_LATTICE :
			_outp(LPT_DAT, 0);						/* MOSI(D0) = "L" */
			iodly();
			do {
				rd <<= 1;							/* Read MISO(ACK) */
				if(_inp(LPT_STA) & S_ACK) rd++;
				_outp(LPT_DAT, BL_SCK);				/* SCK(D1) = "H" */
				iodly();							/* delay */
				_outp(LPT_DAT, 0);					/* SCK(D1) = "L" */
				iodly();							/* delay */
			} while (--n);
			if(mode == RM_ASYNC)
				fifo_put(rd);
			break;

		case TY_ALTERA :
			_outp(LPT_DAT, 0);						/* MOSI(D6) = "L" */
			iodly();
			do {
				rd <<= 1;							/* Read MISO(BUSY) */
				if((_inp(LPT_STA) & S_BUSY) == 0) rd++;
				_outp(LPT_DAT, BA_SCK);				/* SCK(D0) = "H" */
				iodly();							/* delay */
				_outp(LPT_DAT, 0);					/* SCK(D0) = "L" */
				iodly();							/* delay */
			} while (--n);
			if(mode == RM_ASYNC)
				fifo_put(rd);
			break;
	}

	return(rd);
}
Ejemplo n.º 11
0
void spi_reset ()
{
	BYTE spicmd[2] = { FLAG, SPI_RESET };


	switch (PortType) {
		case TY_COMM :
			_outp(COM_MCR, 0);		/* RESET,SCK = "L" */
			delay_ms(10);			/* 10msec */
			_outp(COM_MCR, C_RES);	/* RESET = "H" */
			iodly(); iodly();		/* delay */
			_outp(COM_MCR, 0);		/* RESET = "L" */
			break;

		case TY_VCOM :
			EscapeCommFunction(hComm, CLRDTR);
			EscapeCommFunction(hComm, CLRRTS);
			delay_ms(10);
			EscapeCommFunction(hComm, SETDTR);
			iodly(); iodly();
			EscapeCommFunction(hComm, CLRDTR);
			break;

		case TY_BRIDGE :
			delay_ms(10);
			send_bridge(spicmd, 2);
			break;

		case TY_AVRSP :
			_outp(LPT_DAT, B_ENA);
			delay_ms(10);
			_outp(LPT_DAT, B_ENA|B_RES);
			iodly(); iodly();
			_outp(LPT_DAT, B_ENA);
			break;

		case TY_STK200 :
			_outp(LPT_DAT, 0);
			delay_ms(10);
			_outp(LPT_DAT, BS_RES);
			iodly(); iodly();
			_outp(LPT_DAT, 0);
			break;

		case TY_XILINX :
			_outp(LPT_DAT, BX_DIS2);
			delay_ms(10);
			_outp(LPT_DAT, BX_DIS2|BX_RES);
			iodly(); iodly();
			_outp(LPT_DAT, BX_DIS2);
			break;

		case TY_LATTICE :
			_outp(LPT_DAT, 0);
			delay_ms(10);
			_outp(LPT_DAT, BL_RES);
			iodly(); iodly();
			_outp(LPT_DAT, 0);
			break;

		case TY_ALTERA :
			_outp(LPT_DAT, 0);
			delay_ms(10);
			_outp(LPT_DAT, BA_RES);
			iodly(); iodly();
			_outp(LPT_DAT, 0);
			break;

	}
	RcvrFifo.Rp = 0;					/* Flush FIFO */
	RcvrFifo.Wp = 0;
	RcvrFifo.Ctr = 0;
	delay_ms(30);						/* 30msec */
}
Ejemplo n.º 12
0
int open_ifport (PORTPROP *pc)
{
	OSVERSIONINFO vinfo = { sizeof(OSVERSIONINFO) };
	LARGE_INTEGER val1;
	BYTE cmdspi[6];
	static const WORD PortsCom[] = { COM1ADR, COM2ADR, COM3ADR, COM4ADR };
	static const WORD PortsLpt[] = { LPT1ADR, LPT2ADR, LPT3ADR };
	char sComm[16];
	DCB dcb = { sizeof(DCB),
				9600, TRUE, FALSE, TRUE, FALSE,
				DTR_CONTROL_DISABLE, FALSE,
				TRUE, FALSE, FALSE, FALSE, FALSE,
				RTS_CONTROL_DISABLE, FALSE, 0, 0,
				10, 10,
				8, NOPARITY, ONESTOPBIT, '\x11', '\x13', '\xFF', '\xFF', 0 };
	COMMTIMEOUTS commtimeouts = { 0, 1, 100, 1, 300};


	/* Check if high resolution timer is supported */
	QueryPerformanceFrequency(&val1);
	if (val1.QuadPart == 0) {
		pc->Info1 = "Incompatible envilonment.\n";
		return 1;
	}

	PortDly = pc->Delay;		/* I/O delay for direct I/O control */
	dcb.BaudRate = pc->Baud;	/* Bit rate for SPI bridge */

	/* Open direct I/O driver if needed */
	if(GetVersionEx(&vinfo) == FALSE) {
		pc->Info1 = "Incompatible envilonment.\n";
		return 1;
	}
	if((vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
	    && ((pc->PortClass == TY_COMM)||(pc->PortClass == TY_LPT))) {
		if(init_driver()) {
			pc->Info1 = "I/O driver initialization failed.\n";
			return 1;
		}
	}

	/* Use COM port in direct I/O */
	if(pc->PortClass == TY_COMM) {
		if((pc->PortNum < 1)||(pc->PortNum > 4)) {
			pc->Info1 = "Invalid Port#.\n";
			return 1;
		}
		PortBase = PortsCom[pc->PortNum - 1];
		sprintf(str_info, "No COM%u(0x%X) port.\n", pc->PortNum, PortBase);
		pc->Info1 = str_info;
		if(check_comport()) {
			if(vinfo.dwPlatformId != VER_PLATFORM_WIN32_NT) return 1;
			sprintf(sComm, "\\\\.\\COM%u", pc->PortNum);
			hComm = CreateFile(sComm, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
			if(hComm == INVALID_HANDLE_VALUE) return 1;
			if(check_comport()) return 1;
		}

		_outp(COM_IMR, 0x00);		/* Mask interrupts */
		pc->Info1 = NULL;
		PortType = TY_COMM;
		return 0;
	}

	/* Use COM port via API */
	if(pc->PortClass == TY_VCOM) {
		sprintf(sComm, "\\\\.\\COM%u", pc->PortNum);
		hComm = CreateFile(sComm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if(hComm == INVALID_HANDLE_VALUE) {
			sprintf(str_info, "%s could not be opened.\n", sComm);
			pc->Info1 = str_info;
			return 1;
		}
		SetCommState(hComm, &dcb);
		EscapeCommFunction(hComm, CLRRTS);
		EscapeCommFunction(hComm, CLRDTR);
		PortType = TY_VCOM;
		return 0;
	}

	/* Use SPI bridge attached on COM port */
	if(pc->PortClass == TY_BRIDGE) {
		sprintf(sComm, "\\\\.\\COM%u", pc->PortNum);
		hComm = CreateFile(sComm, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if(hComm == INVALID_HANDLE_VALUE) {
			sprintf(str_info, "%s could not be opened.\n", sComm);
			pc->Info1 = str_info;
			return 1;
		}
		dcb.fOutxCtsFlow = TRUE;
		dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
		SetCommState(hComm, &dcb);
		SetCommTimeouts(hComm, &commtimeouts);
		EscapeCommFunction(hComm, CLRDTR);
		delay_ms(10);
		while(read_bridge(cmdspi, sizeof(cmdspi)));
		cmdspi[0] = FLAG-1;
		cmdspi[1] = FLAG; cmdspi[2] = SPI_ENABLE;	/* Enable Bridge */
		cmdspi[3] = FLAG; cmdspi[4] = SPI_SETDLY; cmdspi[5] = (BYTE)PortDly; /* Set SPI delay */
		send_bridge(cmdspi, 6);		/* Send bridge initialization commands */
		read_bridge(cmdspi, 2);		/* Check if the commands are accepted */
		if((cmdspi[0] != SPI_ENABLE) || (cmdspi[1] != SPI_SETDLY)) {
			sprintf(str_info, "No SPI bridge on the %s.\n", sComm);
			pc->Info1 = str_info;
			return 1;
		}
		PortType = TY_BRIDGE;
		return 0;
	}

	/* Use LPT port in direct I/O */
	if(pc->PortClass == TY_LPT) {
		if((pc->PortNum < 1)||(pc->PortNum > 3)) {
			pc->Info1 = "Invalid Port#.\n";
			return 1;
		}
		PortBase = PortsLpt[pc->PortNum - 1];
		if(check_lptport()) {
			sprintf(str_info, "No LPT%u(0x%X) port.\n", pc->PortNum, PortBase);
			pc->Info1 = str_info;
			return 1;
		}

		_outp(LPT_DAT, 0x20);	/* Check if the adapter is ByteBlasterMV (D5-ACK) */
		if(_inp(LPT_STA) & S_ACK) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_ACK) == 0) {
				_outp(LPT_CTL, BA_ENA);
				pc->Info1 = "Altera ByteBlasterMV was found.\n";
				PortType = TY_ALTERA;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x80);	/* Check if the adapter is AVRSP (D7-PE) */
		if(_inp(LPT_STA) & S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_PE) == 0) {
				_outp(LPT_DAT, B_ENA);
				pc->Info1 = "AVRSP adapter was found.\n";
				PortType = TY_AVRSP;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x40);	/* Check if the adapter is Xilinx JTAG (D6-BUSY-PE) */
		if((_inp(LPT_STA) & (S_PE | S_BUSY)) == S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & (S_PE | S_BUSY)) == S_BUSY) {
				pc->Info1 = "Xilinx JTAG adapter was found.\n";
				PortType = TY_XILINX;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x40);	/* Check if the adapter is Lattice ISP (D6-PE) */
		if(_inp(LPT_STA) & S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_PE) == 0) {
				pc->Info1 = "Lattice ISP adapter was found.\n";
				PortType = TY_LATTICE;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		_outp(LPT_DAT, 0x01);	/* Check if the adapter is STK200 dongle (D0-PE) */
		if(_inp(LPT_STA) & S_PE) {
			_outp(LPT_DAT, 0);
			if((_inp(LPT_STA) & S_PE) == 0) {
				pc->Info1 = "STK200 ISP dongle was found.\n";
				PortType = TY_STK200;
				if(_inp(LPT_STA) & S_ERR) return 0;	/* Check target power */
				pc->Info2 = "But target power is OFF.\n";
				return 1;
			}
		}
		sprintf(str_info, "No ISP adapter on the LPT%u.\n", pc->PortNum);
		pc->Info1 = str_info;
		return 1;
	}

	pc->Info1 = "Invalid port class.\n";
	return 1;
}