xref: /openbmc/u-boot/drivers/fpga/ivm_core.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
23b8ac464SStefano Babic /*
33b8ac464SStefano Babic  * Porting to u-boot:
43b8ac464SStefano Babic  *
53b8ac464SStefano Babic  * (C) Copyright 2010
63b8ac464SStefano Babic  * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
73b8ac464SStefano Babic  *
83b8ac464SStefano Babic  * Lattice ispVME Embedded code to load Lattice's FPGA:
93b8ac464SStefano Babic  *
103b8ac464SStefano Babic  * Copyright 2009 Lattice Semiconductor Corp.
113b8ac464SStefano Babic  *
123b8ac464SStefano Babic  * ispVME Embedded allows programming of Lattice's suite of FPGA
133b8ac464SStefano Babic  * devices on embedded systems through the JTAG port.  The software
143b8ac464SStefano Babic  * is distributed in source code form and is open to re - distribution
153b8ac464SStefano Babic  * and modification where applicable.
163b8ac464SStefano Babic  *
173b8ac464SStefano Babic  * Revision History of ivm_core.c module:
183b8ac464SStefano Babic  * 4/25/06 ht   Change some variables from unsigned short or int
193b8ac464SStefano Babic  *              to long int to make the code compiler independent.
203b8ac464SStefano Babic  * 5/24/06 ht   Support using RESET (TRST) pin as a special purpose
213b8ac464SStefano Babic  *              control pin such as triggering the loading of known
223b8ac464SStefano Babic  *              state exit.
233b8ac464SStefano Babic  * 3/6/07 ht added functions to support output to terminals
243b8ac464SStefano Babic  *
253b8ac464SStefano Babic  * 09/11/07 NN Type cast mismatch variables
263b8ac464SStefano Babic  *		   Moved the sclock() function to hardware.c
273b8ac464SStefano Babic  * 08/28/08 NN Added Calculate checksum support.
283b8ac464SStefano Babic  * 4/1/09 Nguyen replaced the recursive function call codes on
293b8ac464SStefano Babic  *        the ispVMLCOUNT function
303b8ac464SStefano Babic  */
313b8ac464SStefano Babic 
323b8ac464SStefano Babic #include <common.h>
333b8ac464SStefano Babic #include <linux/string.h>
343b8ac464SStefano Babic #include <malloc.h>
353b8ac464SStefano Babic #include <lattice.h>
363b8ac464SStefano Babic 
373b8ac464SStefano Babic #define vme_out_char(c)	printf("%c", c)
383b8ac464SStefano Babic #define vme_out_hex(c)	printf("%x", c)
393b8ac464SStefano Babic #define vme_out_string(s) printf("%s", s)
403b8ac464SStefano Babic 
413b8ac464SStefano Babic /*
423b8ac464SStefano Babic  *
433b8ac464SStefano Babic  * Global variables used to specify the flow control and data type.
443b8ac464SStefano Babic  *
453b8ac464SStefano Babic  *	g_usFlowControl:	flow control register. Each bit in the
463b8ac464SStefano Babic  *                               register can potentially change the
473b8ac464SStefano Babic  *                               personality of the embedded engine.
483b8ac464SStefano Babic  *	g_usDataType:		holds the data type of the current row.
493b8ac464SStefano Babic  *
503b8ac464SStefano Babic  */
513b8ac464SStefano Babic 
523b8ac464SStefano Babic static unsigned short g_usFlowControl;
533b8ac464SStefano Babic unsigned short g_usDataType;
543b8ac464SStefano Babic 
553b8ac464SStefano Babic /*
563b8ac464SStefano Babic  *
573b8ac464SStefano Babic  * Global variables used to specify the ENDDR and ENDIR.
583b8ac464SStefano Babic  *
593b8ac464SStefano Babic  *	g_ucEndDR:		the state that the device goes to after SDR.
603b8ac464SStefano Babic  *	g_ucEndIR:		the state that the device goes to after SIR.
613b8ac464SStefano Babic  *
623b8ac464SStefano Babic  */
633b8ac464SStefano Babic 
643b8ac464SStefano Babic unsigned char g_ucEndDR = DRPAUSE;
653b8ac464SStefano Babic unsigned char g_ucEndIR = IRPAUSE;
663b8ac464SStefano Babic 
673b8ac464SStefano Babic /*
683b8ac464SStefano Babic  *
693b8ac464SStefano Babic  * Global variables used to support header/trailer.
703b8ac464SStefano Babic  *
713b8ac464SStefano Babic  *	g_usHeadDR:		the number of lead devices in bypass.
723b8ac464SStefano Babic  *	g_usHeadIR:		the sum of IR length of lead devices.
733b8ac464SStefano Babic  *	g_usTailDR:		the number of tail devices in bypass.
743b8ac464SStefano Babic  *	g_usTailIR:		the sum of IR length of tail devices.
753b8ac464SStefano Babic  *
763b8ac464SStefano Babic  */
773b8ac464SStefano Babic 
783b8ac464SStefano Babic static unsigned short g_usHeadDR;
793b8ac464SStefano Babic static unsigned short g_usHeadIR;
803b8ac464SStefano Babic static unsigned short g_usTailDR;
813b8ac464SStefano Babic static unsigned short g_usTailIR;
823b8ac464SStefano Babic 
833b8ac464SStefano Babic /*
843b8ac464SStefano Babic  *
853b8ac464SStefano Babic  * Global variable to store the number of bits of data or instruction
863b8ac464SStefano Babic  * to be shifted into or out from the device.
873b8ac464SStefano Babic  *
883b8ac464SStefano Babic  */
893b8ac464SStefano Babic 
903b8ac464SStefano Babic static unsigned short g_usiDataSize;
913b8ac464SStefano Babic 
923b8ac464SStefano Babic /*
933b8ac464SStefano Babic  *
943b8ac464SStefano Babic  * Stores the frequency. Default to 1 MHz.
953b8ac464SStefano Babic  *
963b8ac464SStefano Babic  */
973b8ac464SStefano Babic 
983b8ac464SStefano Babic static int g_iFrequency = 1000;
993b8ac464SStefano Babic 
1003b8ac464SStefano Babic /*
1013b8ac464SStefano Babic  *
1023b8ac464SStefano Babic  * Stores the maximum amount of ram needed to hold a row of data.
1033b8ac464SStefano Babic  *
1043b8ac464SStefano Babic  */
1053b8ac464SStefano Babic 
1063b8ac464SStefano Babic static unsigned short g_usMaxSize;
1073b8ac464SStefano Babic 
1083b8ac464SStefano Babic /*
1093b8ac464SStefano Babic  *
1103b8ac464SStefano Babic  * Stores the LSH or RSH value.
1113b8ac464SStefano Babic  *
1123b8ac464SStefano Babic  */
1133b8ac464SStefano Babic 
1143b8ac464SStefano Babic static unsigned short g_usShiftValue;
1153b8ac464SStefano Babic 
1163b8ac464SStefano Babic /*
1173b8ac464SStefano Babic  *
1183b8ac464SStefano Babic  * Stores the current repeat loop value.
1193b8ac464SStefano Babic  *
1203b8ac464SStefano Babic  */
1213b8ac464SStefano Babic 
1223b8ac464SStefano Babic static unsigned short g_usRepeatLoops;
1233b8ac464SStefano Babic 
1243b8ac464SStefano Babic /*
1253b8ac464SStefano Babic  *
1263b8ac464SStefano Babic  * Stores the current vendor.
1273b8ac464SStefano Babic  *
1283b8ac464SStefano Babic  */
1293b8ac464SStefano Babic 
1303b8ac464SStefano Babic static signed char g_cVendor = LATTICE;
1313b8ac464SStefano Babic 
1323b8ac464SStefano Babic /*
1333b8ac464SStefano Babic  *
1343b8ac464SStefano Babic  * Stores the VME file CRC.
1353b8ac464SStefano Babic  *
1363b8ac464SStefano Babic  */
1373b8ac464SStefano Babic 
1383b8ac464SStefano Babic unsigned short g_usCalculatedCRC;
1393b8ac464SStefano Babic 
1403b8ac464SStefano Babic /*
1413b8ac464SStefano Babic  *
1423b8ac464SStefano Babic  * Stores the Device Checksum.
1433b8ac464SStefano Babic  *
1443b8ac464SStefano Babic  */
1453b8ac464SStefano Babic /* 08/28/08 NN Added Calculate checksum support. */
1463b8ac464SStefano Babic unsigned long g_usChecksum;
1473b8ac464SStefano Babic static unsigned int g_uiChecksumIndex;
1483b8ac464SStefano Babic 
1493b8ac464SStefano Babic /*
1503b8ac464SStefano Babic  *
1513b8ac464SStefano Babic  * Stores the current state of the JTAG state machine.
1523b8ac464SStefano Babic  *
1533b8ac464SStefano Babic  */
1543b8ac464SStefano Babic 
1553b8ac464SStefano Babic static signed char g_cCurrentJTAGState;
1563b8ac464SStefano Babic 
1573b8ac464SStefano Babic /*
1583b8ac464SStefano Babic  *
1593b8ac464SStefano Babic  * Global variables used to support looping.
1603b8ac464SStefano Babic  *
1613b8ac464SStefano Babic  *	g_pucHeapMemory:	holds the entire repeat loop.
1623b8ac464SStefano Babic  *	g_iHeapCounter:		points to the current byte in the repeat loop.
1633b8ac464SStefano Babic  *	g_iHEAPSize:		the current size of the repeat in bytes.
1643b8ac464SStefano Babic  *
1653b8ac464SStefano Babic  */
1663b8ac464SStefano Babic 
1673b8ac464SStefano Babic unsigned char *g_pucHeapMemory;
1683b8ac464SStefano Babic unsigned short g_iHeapCounter;
1693b8ac464SStefano Babic unsigned short g_iHEAPSize;
1703b8ac464SStefano Babic static unsigned short previous_size;
1713b8ac464SStefano Babic 
1723b8ac464SStefano Babic /*
1733b8ac464SStefano Babic  *
1743b8ac464SStefano Babic  * Global variables used to support intelligent programming.
1753b8ac464SStefano Babic  *
1763b8ac464SStefano Babic  *	g_usIntelDataIndex:     points to the current byte of the
1773b8ac464SStefano Babic  *                               intelligent buffer.
1783b8ac464SStefano Babic  *	g_usIntelBufferSize:	holds the size of the intelligent
1793b8ac464SStefano Babic  *                               buffer.
1803b8ac464SStefano Babic  *
1813b8ac464SStefano Babic  */
1823b8ac464SStefano Babic 
1833b8ac464SStefano Babic unsigned short g_usIntelDataIndex;
1843b8ac464SStefano Babic unsigned short g_usIntelBufferSize;
1853b8ac464SStefano Babic 
1863b8ac464SStefano Babic /*
1873b8ac464SStefano Babic  *
1883b8ac464SStefano Babic  * Supported VME versions.
1893b8ac464SStefano Babic  *
1903b8ac464SStefano Babic  */
1913b8ac464SStefano Babic 
1923b8ac464SStefano Babic const char *const g_szSupportedVersions[] = {
1933b8ac464SStefano Babic 	"__VME2.0", "__VME3.0", "____12.0", "____12.1", 0};
1943b8ac464SStefano Babic 
1953b8ac464SStefano Babic /*
1963b8ac464SStefano Babic  *
1973b8ac464SStefano Babic  * Holds the maximum size of each respective buffer. These variables are used
1983b8ac464SStefano Babic  * to write the HEX files when converting VME to HEX.
1993b8ac464SStefano Babic  *
2003b8ac464SStefano Babic */
2013b8ac464SStefano Babic 
2023b8ac464SStefano Babic static unsigned short g_usTDOSize;
2033b8ac464SStefano Babic static unsigned short g_usMASKSize;
2043b8ac464SStefano Babic static unsigned short g_usTDISize;
2053b8ac464SStefano Babic static unsigned short g_usDMASKSize;
2063b8ac464SStefano Babic static unsigned short g_usLCOUNTSize;
2073b8ac464SStefano Babic static unsigned short g_usHDRSize;
2083b8ac464SStefano Babic static unsigned short g_usTDRSize;
2093b8ac464SStefano Babic static unsigned short g_usHIRSize;
2103b8ac464SStefano Babic static unsigned short g_usTIRSize;
2113b8ac464SStefano Babic static unsigned short g_usHeapSize;
2123b8ac464SStefano Babic 
2133b8ac464SStefano Babic /*
2143b8ac464SStefano Babic  *
2153b8ac464SStefano Babic  * Global variables used to store data.
2163b8ac464SStefano Babic  *
2173b8ac464SStefano Babic  *	g_pucOutMaskData:	local RAM to hold one row of MASK data.
2183b8ac464SStefano Babic  *	g_pucInData:		local RAM to hold one row of TDI data.
2193b8ac464SStefano Babic  *	g_pucOutData:		local RAM to hold one row of TDO data.
2203b8ac464SStefano Babic  *	g_pucHIRData:		local RAM to hold the current SIR header.
2213b8ac464SStefano Babic  *	g_pucTIRData:		local RAM to hold the current SIR trailer.
2223b8ac464SStefano Babic  *	g_pucHDRData:		local RAM to hold the current SDR header.
2233b8ac464SStefano Babic  *	g_pucTDRData:		local RAM to hold the current SDR trailer.
2243b8ac464SStefano Babic  *	g_pucIntelBuffer:	local RAM to hold the current intelligent buffer
2253b8ac464SStefano Babic  *	g_pucOutDMaskData:	local RAM to hold one row of DMASK data.
2263b8ac464SStefano Babic  *
2273b8ac464SStefano Babic  */
2283b8ac464SStefano Babic 
2293b8ac464SStefano Babic unsigned char	*g_pucOutMaskData	= NULL,
2303b8ac464SStefano Babic 		*g_pucInData		= NULL,
2313b8ac464SStefano Babic 		*g_pucOutData		= NULL,
2323b8ac464SStefano Babic 		*g_pucHIRData		= NULL,
2333b8ac464SStefano Babic 		*g_pucTIRData		= NULL,
2343b8ac464SStefano Babic 		*g_pucHDRData		= NULL,
2353b8ac464SStefano Babic 		*g_pucTDRData		= NULL,
2363b8ac464SStefano Babic 		*g_pucIntelBuffer	= NULL,
2373b8ac464SStefano Babic 		*g_pucOutDMaskData	= NULL;
2383b8ac464SStefano Babic 
2393b8ac464SStefano Babic /*
2403b8ac464SStefano Babic  *
2413b8ac464SStefano Babic  * JTAG state machine transition table.
2423b8ac464SStefano Babic  *
2433b8ac464SStefano Babic  */
2443b8ac464SStefano Babic 
2453b8ac464SStefano Babic struct {
2463b8ac464SStefano Babic 	 unsigned char  CurState;  /* From this state */
2473b8ac464SStefano Babic 	 unsigned char  NextState; /* Step to this state */
2483b8ac464SStefano Babic 	 unsigned char  Pattern;   /* The tragetory of TMS */
2493b8ac464SStefano Babic 	 unsigned char  Pulses;    /* The number of steps */
2503b8ac464SStefano Babic } g_JTAGTransistions[25] = {
2513b8ac464SStefano Babic { RESET,	RESET,		0xFC, 6 },	/* Transitions from RESET */
2523b8ac464SStefano Babic { RESET,	IDLE,		0x00, 1 },
2533b8ac464SStefano Babic { RESET,	DRPAUSE,	0x50, 5 },
2543b8ac464SStefano Babic { RESET,	IRPAUSE,	0x68, 6 },
2553b8ac464SStefano Babic { IDLE,		RESET,		0xE0, 3 },	/* Transitions from IDLE */
2563b8ac464SStefano Babic { IDLE,		DRPAUSE,	0xA0, 4 },
2573b8ac464SStefano Babic { IDLE,		IRPAUSE,	0xD0, 5 },
2583b8ac464SStefano Babic { DRPAUSE,	RESET,		0xF8, 5 },	/* Transitions from DRPAUSE */
2593b8ac464SStefano Babic { DRPAUSE,	IDLE,		0xC0, 3 },
2603b8ac464SStefano Babic { DRPAUSE,	IRPAUSE,	0xF4, 7 },
2613b8ac464SStefano Babic { DRPAUSE,	DRPAUSE,	0xE8, 6 },/* 06/14/06 Support POLL STATUS LOOP*/
2623b8ac464SStefano Babic { IRPAUSE,	RESET,		0xF8, 5 },	/* Transitions from IRPAUSE */
2633b8ac464SStefano Babic { IRPAUSE,	IDLE,		0xC0, 3 },
2643b8ac464SStefano Babic { IRPAUSE,	DRPAUSE,	0xE8, 6 },
2653b8ac464SStefano Babic { DRPAUSE,	SHIFTDR,	0x80, 2 }, /* Extra transitions using SHIFTDR */
2663b8ac464SStefano Babic { IRPAUSE,	SHIFTDR,	0xE0, 5 },
2673b8ac464SStefano Babic { SHIFTDR,	DRPAUSE,	0x80, 2 },
2683b8ac464SStefano Babic { SHIFTDR,	IDLE,		0xC0, 3 },
2693b8ac464SStefano Babic { IRPAUSE,	SHIFTIR,	0x80, 2 },/* Extra transitions using SHIFTIR */
2703b8ac464SStefano Babic { SHIFTIR,	IRPAUSE,	0x80, 2 },
2713b8ac464SStefano Babic { SHIFTIR,	IDLE,		0xC0, 3 },
2723b8ac464SStefano Babic { DRPAUSE,	DRCAPTURE,	0xE0, 4 }, /* 11/15/05 Support DRCAPTURE*/
2733b8ac464SStefano Babic { DRCAPTURE, DRPAUSE,	0x80, 2 },
2743b8ac464SStefano Babic { IDLE,     DRCAPTURE,	0x80, 2 },
2753b8ac464SStefano Babic { IRPAUSE,  DRCAPTURE,  0xE0, 4 }
2763b8ac464SStefano Babic };
2773b8ac464SStefano Babic 
2783b8ac464SStefano Babic /*
2793b8ac464SStefano Babic  *
2803b8ac464SStefano Babic  * List to hold all LVDS pairs.
2813b8ac464SStefano Babic  *
2823b8ac464SStefano Babic  */
2833b8ac464SStefano Babic 
2843b8ac464SStefano Babic LVDSPair *g_pLVDSList;
2853b8ac464SStefano Babic unsigned short g_usLVDSPairCount;
2863b8ac464SStefano Babic 
2873b8ac464SStefano Babic /*
2883b8ac464SStefano Babic  *
2893b8ac464SStefano Babic  * Function prototypes.
2903b8ac464SStefano Babic  *
2913b8ac464SStefano Babic  */
2923b8ac464SStefano Babic 
2933b8ac464SStefano Babic static signed char ispVMDataCode(void);
2943b8ac464SStefano Babic static long int ispVMDataSize(void);
2953b8ac464SStefano Babic static void ispVMData(unsigned char *Data);
2963b8ac464SStefano Babic static signed char ispVMShift(signed char Code);
2973b8ac464SStefano Babic static signed char ispVMAmble(signed char Code);
2983b8ac464SStefano Babic static signed char ispVMLoop(unsigned short a_usLoopCount);
2993b8ac464SStefano Babic static signed char ispVMBitShift(signed char mode, unsigned short bits);
3003b8ac464SStefano Babic static void ispVMComment(unsigned short a_usCommentSize);
3013b8ac464SStefano Babic static void ispVMHeader(unsigned short a_usHeaderSize);
3023b8ac464SStefano Babic static signed char ispVMLCOUNT(unsigned short a_usCountSize);
3033b8ac464SStefano Babic static void ispVMClocks(unsigned short Clocks);
3043b8ac464SStefano Babic static void ispVMBypass(signed char ScanType, unsigned short Bits);
3053b8ac464SStefano Babic static void ispVMStateMachine(signed char NextState);
3063b8ac464SStefano Babic static signed char ispVMSend(unsigned short int);
3073b8ac464SStefano Babic static signed char ispVMRead(unsigned short int);
3083b8ac464SStefano Babic static signed char ispVMReadandSave(unsigned short int);
3093b8ac464SStefano Babic static signed char ispVMProcessLVDS(unsigned short a_usLVDSCount);
3103b8ac464SStefano Babic static void ispVMMemManager(signed char types, unsigned short size);
3113b8ac464SStefano Babic 
3123b8ac464SStefano Babic /*
3133b8ac464SStefano Babic  *
3143b8ac464SStefano Babic  * External variables and functions in hardware.c module
3153b8ac464SStefano Babic  *
3163b8ac464SStefano Babic  */
3173b8ac464SStefano Babic static signed char g_cCurrentJTAGState;
3183b8ac464SStefano Babic 
3193b8ac464SStefano Babic #ifdef DEBUG
3203b8ac464SStefano Babic 
3213b8ac464SStefano Babic /*
3223b8ac464SStefano Babic  *
3233b8ac464SStefano Babic  * GetState
3243b8ac464SStefano Babic  *
3253b8ac464SStefano Babic  * Returns the state as a string based on the opcode. Only used
3263b8ac464SStefano Babic  * for debugging purposes.
3273b8ac464SStefano Babic  *
3283b8ac464SStefano Babic  */
3293b8ac464SStefano Babic 
GetState(unsigned char a_ucState)3303b8ac464SStefano Babic const char *GetState(unsigned char a_ucState)
3313b8ac464SStefano Babic {
3323b8ac464SStefano Babic 	switch (a_ucState) {
3333b8ac464SStefano Babic 	case RESET:
3343b8ac464SStefano Babic 		return "RESET";
3353b8ac464SStefano Babic 	case IDLE:
3363b8ac464SStefano Babic 		return "IDLE";
3373b8ac464SStefano Babic 	case IRPAUSE:
3383b8ac464SStefano Babic 		return "IRPAUSE";
3393b8ac464SStefano Babic 	case DRPAUSE:
3403b8ac464SStefano Babic 		return "DRPAUSE";
3413b8ac464SStefano Babic 	case SHIFTIR:
3423b8ac464SStefano Babic 		return "SHIFTIR";
3433b8ac464SStefano Babic 	case SHIFTDR:
3443b8ac464SStefano Babic 		return "SHIFTDR";
3453b8ac464SStefano Babic 	case DRCAPTURE:/* 11/15/05 support DRCAPTURE*/
3463b8ac464SStefano Babic 		return "DRCAPTURE";
3473b8ac464SStefano Babic 	default:
3483b8ac464SStefano Babic 		break;
3493b8ac464SStefano Babic 	}
3503b8ac464SStefano Babic 
3513b8ac464SStefano Babic 	return 0;
3523b8ac464SStefano Babic }
3533b8ac464SStefano Babic 
3543b8ac464SStefano Babic /*
3553b8ac464SStefano Babic  *
3563b8ac464SStefano Babic  * PrintData
3573b8ac464SStefano Babic  *
3583b8ac464SStefano Babic  * Prints the data. Only used for debugging purposes.
3593b8ac464SStefano Babic  *
3603b8ac464SStefano Babic  */
3613b8ac464SStefano Babic 
PrintData(unsigned short a_iDataSize,unsigned char * a_pucData)3623b8ac464SStefano Babic void PrintData(unsigned short a_iDataSize, unsigned char *a_pucData)
3633b8ac464SStefano Babic {
3643b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
3653b8ac464SStefano Babic 	unsigned short usByteSize  = 0;
3663b8ac464SStefano Babic 	unsigned short usBitIndex  = 0;
3673b8ac464SStefano Babic 	signed short usByteIndex   = 0;
3683b8ac464SStefano Babic 	unsigned char ucByte       = 0;
3693b8ac464SStefano Babic 	unsigned char ucFlipByte   = 0;
3703b8ac464SStefano Babic 
3713b8ac464SStefano Babic 	if (a_iDataSize % 8) {
3723b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
3733b8ac464SStefano Babic 		usByteSize = (unsigned short)(a_iDataSize / 8 + 1);
3743b8ac464SStefano Babic 	} else {
3753b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
3763b8ac464SStefano Babic 		usByteSize = (unsigned short)(a_iDataSize / 8);
3773b8ac464SStefano Babic 	}
3783b8ac464SStefano Babic 	puts("(");
3793b8ac464SStefano Babic 	/* 09/11/07 NN Type cast mismatch variables */
3803b8ac464SStefano Babic 	for (usByteIndex = (signed short)(usByteSize - 1);
3813b8ac464SStefano Babic 		usByteIndex >= 0; usByteIndex--) {
3823b8ac464SStefano Babic 		ucByte = a_pucData[usByteIndex];
3833b8ac464SStefano Babic 		ucFlipByte = 0x00;
3843b8ac464SStefano Babic 
3853b8ac464SStefano Babic 		/*
3863b8ac464SStefano Babic 		*
3873b8ac464SStefano Babic 		* Flip each byte.
3883b8ac464SStefano Babic 		*
3893b8ac464SStefano Babic 		*/
3903b8ac464SStefano Babic 
3913b8ac464SStefano Babic 		for (usBitIndex = 0; usBitIndex < 8; usBitIndex++) {
3923b8ac464SStefano Babic 			ucFlipByte <<= 1;
3933b8ac464SStefano Babic 			if (ucByte & 0x1) {
3943b8ac464SStefano Babic 				ucFlipByte |= 0x1;
3953b8ac464SStefano Babic 			}
3963b8ac464SStefano Babic 
3973b8ac464SStefano Babic 			ucByte >>= 1;
3983b8ac464SStefano Babic 		}
3993b8ac464SStefano Babic 
4003b8ac464SStefano Babic 		/*
4013b8ac464SStefano Babic 		*
4023b8ac464SStefano Babic 		* Print the flipped byte.
4033b8ac464SStefano Babic 		*
4043b8ac464SStefano Babic 		*/
4053b8ac464SStefano Babic 
4063b8ac464SStefano Babic 		printf("%.02X", ucFlipByte);
4073b8ac464SStefano Babic 		if ((usByteSize - usByteIndex) % 40 == 39) {
4083b8ac464SStefano Babic 			puts("\n\t\t");
4093b8ac464SStefano Babic 		}
4103b8ac464SStefano Babic 		if (usByteIndex < 0)
4113b8ac464SStefano Babic 			break;
4123b8ac464SStefano Babic 	}
4133b8ac464SStefano Babic 	puts(")");
4143b8ac464SStefano Babic }
4153b8ac464SStefano Babic #endif /* DEBUG */
4163b8ac464SStefano Babic 
ispVMMemManager(signed char cTarget,unsigned short usSize)4173b8ac464SStefano Babic void ispVMMemManager(signed char cTarget, unsigned short usSize)
4183b8ac464SStefano Babic {
4193b8ac464SStefano Babic 	switch (cTarget) {
4203b8ac464SStefano Babic 	case XTDI:
4213b8ac464SStefano Babic 	case TDI:
4223b8ac464SStefano Babic 		if (g_pucInData != NULL) {
4233b8ac464SStefano Babic 			if (previous_size == usSize) {/*memory exist*/
4243b8ac464SStefano Babic 				break;
4253b8ac464SStefano Babic 			} else {
4263b8ac464SStefano Babic 				free(g_pucInData);
4273b8ac464SStefano Babic 				g_pucInData = NULL;
4283b8ac464SStefano Babic 			}
4293b8ac464SStefano Babic 		}
4303b8ac464SStefano Babic 		g_pucInData = (unsigned char *) malloc(usSize / 8 + 2);
4313b8ac464SStefano Babic 		previous_size = usSize;
4323b8ac464SStefano Babic 	case XTDO:
4333b8ac464SStefano Babic 	case TDO:
4343b8ac464SStefano Babic 		if (g_pucOutData != NULL) {
4353b8ac464SStefano Babic 			if (previous_size == usSize) { /*already exist*/
4363b8ac464SStefano Babic 				break;
4373b8ac464SStefano Babic 			} else {
4383b8ac464SStefano Babic 				free(g_pucOutData);
4393b8ac464SStefano Babic 				g_pucOutData = NULL;
4403b8ac464SStefano Babic 			}
4413b8ac464SStefano Babic 		}
4423b8ac464SStefano Babic 		g_pucOutData = (unsigned char *) malloc(usSize / 8 + 2);
4433b8ac464SStefano Babic 		previous_size = usSize;
4443b8ac464SStefano Babic 		break;
4453b8ac464SStefano Babic 	case MASK:
4463b8ac464SStefano Babic 		if (g_pucOutMaskData != NULL) {
4473b8ac464SStefano Babic 			if (previous_size == usSize) {/*already allocated*/
4483b8ac464SStefano Babic 				break;
4493b8ac464SStefano Babic 			} else {
4503b8ac464SStefano Babic 				free(g_pucOutMaskData);
4513b8ac464SStefano Babic 				g_pucOutMaskData = NULL;
4523b8ac464SStefano Babic 			}
4533b8ac464SStefano Babic 		}
4543b8ac464SStefano Babic 		g_pucOutMaskData = (unsigned char *) malloc(usSize / 8 + 2);
4553b8ac464SStefano Babic 		previous_size = usSize;
4563b8ac464SStefano Babic 		break;
4573b8ac464SStefano Babic 	case HIR:
4583b8ac464SStefano Babic 		if (g_pucHIRData != NULL) {
4593b8ac464SStefano Babic 			free(g_pucHIRData);
4603b8ac464SStefano Babic 			g_pucHIRData = NULL;
4613b8ac464SStefano Babic 		}
4623b8ac464SStefano Babic 		g_pucHIRData = (unsigned char *) malloc(usSize / 8 + 2);
4633b8ac464SStefano Babic 		break;
4643b8ac464SStefano Babic 	case TIR:
4653b8ac464SStefano Babic 		if (g_pucTIRData != NULL) {
4663b8ac464SStefano Babic 			free(g_pucTIRData);
4673b8ac464SStefano Babic 			g_pucTIRData = NULL;
4683b8ac464SStefano Babic 		}
4693b8ac464SStefano Babic 		g_pucTIRData = (unsigned char *) malloc(usSize / 8 + 2);
4703b8ac464SStefano Babic 		break;
4713b8ac464SStefano Babic 	case HDR:
4723b8ac464SStefano Babic 		if (g_pucHDRData != NULL) {
4733b8ac464SStefano Babic 			free(g_pucHDRData);
4743b8ac464SStefano Babic 			g_pucHDRData = NULL;
4753b8ac464SStefano Babic 		}
4763b8ac464SStefano Babic 		g_pucHDRData = (unsigned char *) malloc(usSize / 8 + 2);
4773b8ac464SStefano Babic 		break;
4783b8ac464SStefano Babic 	case TDR:
4793b8ac464SStefano Babic 		if (g_pucTDRData != NULL) {
4803b8ac464SStefano Babic 			free(g_pucTDRData);
4813b8ac464SStefano Babic 			g_pucTDRData = NULL;
4823b8ac464SStefano Babic 		}
4833b8ac464SStefano Babic 		g_pucTDRData = (unsigned char *) malloc(usSize / 8 + 2);
4843b8ac464SStefano Babic 		break;
4853b8ac464SStefano Babic 	case HEAP:
4863b8ac464SStefano Babic 		if (g_pucHeapMemory != NULL) {
4873b8ac464SStefano Babic 			free(g_pucHeapMemory);
4883b8ac464SStefano Babic 			g_pucHeapMemory = NULL;
4893b8ac464SStefano Babic 		}
4903b8ac464SStefano Babic 		g_pucHeapMemory = (unsigned char *) malloc(usSize + 2);
4913b8ac464SStefano Babic 		break;
4923b8ac464SStefano Babic 	case DMASK:
4933b8ac464SStefano Babic 		if (g_pucOutDMaskData != NULL) {
4943b8ac464SStefano Babic 			if (previous_size == usSize) { /*already allocated*/
4953b8ac464SStefano Babic 				break;
4963b8ac464SStefano Babic 			} else {
4973b8ac464SStefano Babic 				free(g_pucOutDMaskData);
4983b8ac464SStefano Babic 				g_pucOutDMaskData = NULL;
4993b8ac464SStefano Babic 			}
5003b8ac464SStefano Babic 		}
5013b8ac464SStefano Babic 		g_pucOutDMaskData = (unsigned char *) malloc(usSize / 8 + 2);
5023b8ac464SStefano Babic 		previous_size = usSize;
5033b8ac464SStefano Babic 		break;
5043b8ac464SStefano Babic 	case LHEAP:
5053b8ac464SStefano Babic 		if (g_pucIntelBuffer != NULL) {
5063b8ac464SStefano Babic 			free(g_pucIntelBuffer);
5073b8ac464SStefano Babic 			g_pucIntelBuffer = NULL;
5083b8ac464SStefano Babic 		}
5093b8ac464SStefano Babic 		g_pucIntelBuffer = (unsigned char *) malloc(usSize + 2);
5103b8ac464SStefano Babic 		break;
5113b8ac464SStefano Babic 	case LVDS:
5123b8ac464SStefano Babic 		if (g_pLVDSList != NULL) {
5133b8ac464SStefano Babic 			free(g_pLVDSList);
5143b8ac464SStefano Babic 			g_pLVDSList = NULL;
5153b8ac464SStefano Babic 		}
5163b8ac464SStefano Babic 		g_pLVDSList = (LVDSPair *) malloc(usSize * sizeof(LVDSPair));
5173b8ac464SStefano Babic 		if (g_pLVDSList)
5183b8ac464SStefano Babic 			memset(g_pLVDSList, 0, usSize * sizeof(LVDSPair));
5193b8ac464SStefano Babic 		break;
5203b8ac464SStefano Babic 	default:
5213b8ac464SStefano Babic 		return;
5223b8ac464SStefano Babic     }
5233b8ac464SStefano Babic }
5243b8ac464SStefano Babic 
ispVMFreeMem(void)5253b8ac464SStefano Babic void ispVMFreeMem(void)
5263b8ac464SStefano Babic {
5273b8ac464SStefano Babic 	if (g_pucHeapMemory != NULL) {
5283b8ac464SStefano Babic 		free(g_pucHeapMemory);
5293b8ac464SStefano Babic 		g_pucHeapMemory = NULL;
5303b8ac464SStefano Babic 	}
5313b8ac464SStefano Babic 
5323b8ac464SStefano Babic 	if (g_pucOutMaskData != NULL) {
5333b8ac464SStefano Babic 		free(g_pucOutMaskData);
5343b8ac464SStefano Babic 		g_pucOutMaskData = NULL;
5353b8ac464SStefano Babic 	}
5363b8ac464SStefano Babic 
5373b8ac464SStefano Babic 	if (g_pucInData != NULL) {
5383b8ac464SStefano Babic 		free(g_pucInData);
5393b8ac464SStefano Babic 		g_pucInData = NULL;
5403b8ac464SStefano Babic 	}
5413b8ac464SStefano Babic 
5423b8ac464SStefano Babic 	if (g_pucOutData != NULL) {
5433b8ac464SStefano Babic 		free(g_pucOutData);
5443b8ac464SStefano Babic 		g_pucOutData = NULL;
5453b8ac464SStefano Babic 	}
5463b8ac464SStefano Babic 
5473b8ac464SStefano Babic 	if (g_pucHIRData != NULL) {
5483b8ac464SStefano Babic 		free(g_pucHIRData);
5493b8ac464SStefano Babic 		g_pucHIRData = NULL;
5503b8ac464SStefano Babic 	}
5513b8ac464SStefano Babic 
5523b8ac464SStefano Babic 	if (g_pucTIRData != NULL) {
5533b8ac464SStefano Babic 		free(g_pucTIRData);
5543b8ac464SStefano Babic 		g_pucTIRData = NULL;
5553b8ac464SStefano Babic 	}
5563b8ac464SStefano Babic 
5573b8ac464SStefano Babic 	if (g_pucHDRData != NULL) {
5583b8ac464SStefano Babic 		free(g_pucHDRData);
5593b8ac464SStefano Babic 		g_pucHDRData = NULL;
5603b8ac464SStefano Babic 	}
5613b8ac464SStefano Babic 
5623b8ac464SStefano Babic 	if (g_pucTDRData != NULL) {
5633b8ac464SStefano Babic 		free(g_pucTDRData);
5643b8ac464SStefano Babic 		g_pucTDRData = NULL;
5653b8ac464SStefano Babic 	}
5663b8ac464SStefano Babic 
5673b8ac464SStefano Babic 	if (g_pucOutDMaskData != NULL) {
5683b8ac464SStefano Babic 		free(g_pucOutDMaskData);
5693b8ac464SStefano Babic 		g_pucOutDMaskData = NULL;
5703b8ac464SStefano Babic 	}
5713b8ac464SStefano Babic 
5723b8ac464SStefano Babic 	if (g_pucIntelBuffer != NULL) {
5733b8ac464SStefano Babic 		free(g_pucIntelBuffer);
5743b8ac464SStefano Babic 		g_pucIntelBuffer = NULL;
5753b8ac464SStefano Babic 	}
5763b8ac464SStefano Babic 
5773b8ac464SStefano Babic 	if (g_pLVDSList != NULL) {
5783b8ac464SStefano Babic 		free(g_pLVDSList);
5793b8ac464SStefano Babic 		g_pLVDSList = NULL;
5803b8ac464SStefano Babic 	}
5813b8ac464SStefano Babic }
5823b8ac464SStefano Babic 
5833b8ac464SStefano Babic 
5843b8ac464SStefano Babic /*
5853b8ac464SStefano Babic  *
5863b8ac464SStefano Babic  * ispVMDataSize
5873b8ac464SStefano Babic  *
5883b8ac464SStefano Babic  * Returns a VME-encoded number, usually used to indicate the
5893b8ac464SStefano Babic  * bit length of an SIR/SDR command.
5903b8ac464SStefano Babic  *
5913b8ac464SStefano Babic  */
5923b8ac464SStefano Babic 
ispVMDataSize()5933b8ac464SStefano Babic long int ispVMDataSize()
5943b8ac464SStefano Babic {
5953b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
5963b8ac464SStefano Babic 	long int iSize           = 0;
5973b8ac464SStefano Babic 	signed char cCurrentByte = 0;
5983b8ac464SStefano Babic 	signed char cIndex       = 0;
5993b8ac464SStefano Babic 	cIndex = 0;
6003b8ac464SStefano Babic 	while ((cCurrentByte = GetByte()) & 0x80) {
6013b8ac464SStefano Babic 		iSize |= ((long int) (cCurrentByte & 0x7F)) << cIndex;
6023b8ac464SStefano Babic 		cIndex += 7;
6033b8ac464SStefano Babic 	}
6043b8ac464SStefano Babic 	iSize |= ((long int) (cCurrentByte & 0x7F)) << cIndex;
6053b8ac464SStefano Babic 	return iSize;
6063b8ac464SStefano Babic }
6073b8ac464SStefano Babic 
6083b8ac464SStefano Babic /*
6093b8ac464SStefano Babic  *
6103b8ac464SStefano Babic  * ispVMCode
6113b8ac464SStefano Babic  *
6123b8ac464SStefano Babic  * This is the heart of the embedded engine. All the high-level opcodes
6133b8ac464SStefano Babic  * are extracted here. Once they have been identified, then it
6143b8ac464SStefano Babic  * will call other functions to handle the processing.
6153b8ac464SStefano Babic  *
6163b8ac464SStefano Babic  */
6173b8ac464SStefano Babic 
ispVMCode()6183b8ac464SStefano Babic signed char ispVMCode()
6193b8ac464SStefano Babic {
6203b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
6213b8ac464SStefano Babic 	unsigned short iRepeatSize = 0;
6223b8ac464SStefano Babic 	signed char cOpcode	   = 0;
6233b8ac464SStefano Babic 	signed char cRetCode       = 0;
6243b8ac464SStefano Babic 	unsigned char ucState      = 0;
6253b8ac464SStefano Babic 	unsigned short usDelay     = 0;
6263b8ac464SStefano Babic 	unsigned short usToggle    = 0;
6273b8ac464SStefano Babic 	unsigned char usByte       = 0;
6283b8ac464SStefano Babic 
6293b8ac464SStefano Babic 	/*
6303b8ac464SStefano Babic 	*
6313b8ac464SStefano Babic 	* Check the compression flag only if this is the first time
6323b8ac464SStefano Babic 	* this function is entered. Do not check the compression flag if
6333b8ac464SStefano Babic 	* it is being called recursively from other functions within
6343b8ac464SStefano Babic 	* the embedded engine.
6353b8ac464SStefano Babic 	*
6363b8ac464SStefano Babic 	*/
6373b8ac464SStefano Babic 
6383b8ac464SStefano Babic 	if (!(g_usDataType & LHEAP_IN) && !(g_usDataType & HEAP_IN)) {
6393b8ac464SStefano Babic 		usByte = GetByte();
6403b8ac464SStefano Babic 		if (usByte == 0xf1) {
6413b8ac464SStefano Babic 			g_usDataType |= COMPRESS;
6423b8ac464SStefano Babic 		} else if (usByte == 0xf2) {
6433b8ac464SStefano Babic 			g_usDataType &= ~COMPRESS;
6443b8ac464SStefano Babic 		} else {
6453b8ac464SStefano Babic 			return VME_INVALID_FILE;
6463b8ac464SStefano Babic 		}
6473b8ac464SStefano Babic 	}
6483b8ac464SStefano Babic 
6493b8ac464SStefano Babic 	/*
6503b8ac464SStefano Babic 	*
6513b8ac464SStefano Babic 	* Begin looping through all the VME opcodes.
6523b8ac464SStefano Babic 	*
6533b8ac464SStefano Babic 	*/
6543b8ac464SStefano Babic 
6553b8ac464SStefano Babic 	while ((cOpcode = GetByte()) >= 0) {
6563b8ac464SStefano Babic 
6573b8ac464SStefano Babic 		switch (cOpcode) {
6583b8ac464SStefano Babic 		case STATE:
6593b8ac464SStefano Babic 
6603b8ac464SStefano Babic 			/*
6613b8ac464SStefano Babic 			 * Step the JTAG state machine.
6623b8ac464SStefano Babic 			 */
6633b8ac464SStefano Babic 
6643b8ac464SStefano Babic 			ucState = GetByte();
6653b8ac464SStefano Babic 
6663b8ac464SStefano Babic 			/*
6673b8ac464SStefano Babic 			 * Step the JTAG state machine to DRCAPTURE
6683b8ac464SStefano Babic 			 * to support Looping.
6693b8ac464SStefano Babic 			 */
6703b8ac464SStefano Babic 
6713b8ac464SStefano Babic 			if ((g_usDataType & LHEAP_IN) &&
6723b8ac464SStefano Babic 				 (ucState == DRPAUSE) &&
6733b8ac464SStefano Babic 				 (g_cCurrentJTAGState == ucState)) {
6743b8ac464SStefano Babic 				ispVMStateMachine(DRCAPTURE);
6753b8ac464SStefano Babic 			}
6763b8ac464SStefano Babic 
6773b8ac464SStefano Babic 			ispVMStateMachine(ucState);
6783b8ac464SStefano Babic 
6793b8ac464SStefano Babic #ifdef DEBUG
6803b8ac464SStefano Babic 			if (g_usDataType & LHEAP_IN) {
6813b8ac464SStefano Babic 				debug("LDELAY %s ", GetState(ucState));
6823b8ac464SStefano Babic 			} else {
6833b8ac464SStefano Babic 				debug("STATE %s;\n", GetState(ucState));
6843b8ac464SStefano Babic 			}
6853b8ac464SStefano Babic #endif /* DEBUG */
6863b8ac464SStefano Babic 			break;
6873b8ac464SStefano Babic 		case SIR:
6883b8ac464SStefano Babic 		case SDR:
6893b8ac464SStefano Babic 		case XSDR:
6903b8ac464SStefano Babic 
6913b8ac464SStefano Babic #ifdef DEBUG
6923b8ac464SStefano Babic 			switch (cOpcode) {
6933b8ac464SStefano Babic 			case SIR:
6943b8ac464SStefano Babic 				puts("SIR ");
6953b8ac464SStefano Babic 				break;
6963b8ac464SStefano Babic 			case SDR:
6973b8ac464SStefano Babic 			case XSDR:
6983b8ac464SStefano Babic 				if (g_usDataType & LHEAP_IN) {
6993b8ac464SStefano Babic 					puts("LSDR ");
7003b8ac464SStefano Babic 				} else {
7013b8ac464SStefano Babic 					puts("SDR ");
7023b8ac464SStefano Babic 				}
7033b8ac464SStefano Babic 				break;
7043b8ac464SStefano Babic 			}
7053b8ac464SStefano Babic #endif /* DEBUG */
7063b8ac464SStefano Babic 			/*
7073b8ac464SStefano Babic 			*
7083b8ac464SStefano Babic 			* Shift in data into the device.
7093b8ac464SStefano Babic 			*
7103b8ac464SStefano Babic 			*/
7113b8ac464SStefano Babic 
7123b8ac464SStefano Babic 			cRetCode = ispVMShift(cOpcode);
7133b8ac464SStefano Babic 			if (cRetCode != 0) {
7143b8ac464SStefano Babic 				return cRetCode;
7153b8ac464SStefano Babic 			}
7163b8ac464SStefano Babic 			break;
7173b8ac464SStefano Babic 		case WAIT:
7183b8ac464SStefano Babic 
7193b8ac464SStefano Babic 			/*
7203b8ac464SStefano Babic 			*
7213b8ac464SStefano Babic 			* Observe delay.
7223b8ac464SStefano Babic 			*
7233b8ac464SStefano Babic 			*/
7243b8ac464SStefano Babic 
7253b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
7263b8ac464SStefano Babic 			usDelay = (unsigned short) ispVMDataSize();
7273b8ac464SStefano Babic 			ispVMDelay(usDelay);
7283b8ac464SStefano Babic 
7293b8ac464SStefano Babic #ifdef DEBUG
7303b8ac464SStefano Babic 			if (usDelay & 0x8000) {
7313b8ac464SStefano Babic 
7323b8ac464SStefano Babic 				/*
7333b8ac464SStefano Babic 				 * Since MSB is set, the delay time must be
7343b8ac464SStefano Babic 				 * decoded to millisecond. The SVF2VME encodes
7353b8ac464SStefano Babic 				 * the MSB to represent millisecond.
7363b8ac464SStefano Babic 				 */
7373b8ac464SStefano Babic 
7383b8ac464SStefano Babic 				usDelay &= ~0x8000;
7393b8ac464SStefano Babic 				if (g_usDataType & LHEAP_IN) {
7403b8ac464SStefano Babic 					printf("%.2E SEC;\n",
7413b8ac464SStefano Babic 						(float) usDelay / 1000);
7423b8ac464SStefano Babic 				} else {
7433b8ac464SStefano Babic 					printf("RUNTEST %.2E SEC;\n",
7443b8ac464SStefano Babic 						(float) usDelay / 1000);
7453b8ac464SStefano Babic 				}
7463b8ac464SStefano Babic 			} else {
7473b8ac464SStefano Babic 				/*
7483b8ac464SStefano Babic 				 * Since MSB is not set, the delay time
7493b8ac464SStefano Babic 				 * is given as microseconds.
7503b8ac464SStefano Babic 				 */
7513b8ac464SStefano Babic 
7523b8ac464SStefano Babic 				if (g_usDataType & LHEAP_IN) {
7533b8ac464SStefano Babic 					printf("%.2E SEC;\n",
7543b8ac464SStefano Babic 						(float) usDelay / 1000000);
7553b8ac464SStefano Babic 				} else {
7563b8ac464SStefano Babic 					printf("RUNTEST %.2E SEC;\n",
7573b8ac464SStefano Babic 						(float) usDelay / 1000000);
7583b8ac464SStefano Babic 				}
7593b8ac464SStefano Babic 			}
7603b8ac464SStefano Babic #endif /* DEBUG */
7613b8ac464SStefano Babic 			break;
7623b8ac464SStefano Babic 		case TCK:
7633b8ac464SStefano Babic 
7643b8ac464SStefano Babic 			/*
7653b8ac464SStefano Babic 			 * Issue clock toggles.
7663b8ac464SStefano Babic 			*/
7673b8ac464SStefano Babic 
7683b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
7693b8ac464SStefano Babic 			usToggle = (unsigned short) ispVMDataSize();
7703b8ac464SStefano Babic 			ispVMClocks(usToggle);
7713b8ac464SStefano Babic 
7723b8ac464SStefano Babic #ifdef DEBUG
7733b8ac464SStefano Babic 			printf("RUNTEST %d TCK;\n", usToggle);
7743b8ac464SStefano Babic #endif /* DEBUG */
7753b8ac464SStefano Babic 			break;
7763b8ac464SStefano Babic 		case ENDDR:
7773b8ac464SStefano Babic 
7783b8ac464SStefano Babic 			/*
7793b8ac464SStefano Babic 			*
7803b8ac464SStefano Babic 			* Set the ENDDR.
7813b8ac464SStefano Babic 			*
7823b8ac464SStefano Babic 			*/
7833b8ac464SStefano Babic 
7843b8ac464SStefano Babic 			g_ucEndDR = GetByte();
7853b8ac464SStefano Babic 
7863b8ac464SStefano Babic #ifdef DEBUG
7873b8ac464SStefano Babic 			printf("ENDDR %s;\n", GetState(g_ucEndDR));
7883b8ac464SStefano Babic #endif /* DEBUG */
7893b8ac464SStefano Babic 			break;
7903b8ac464SStefano Babic 		case ENDIR:
7913b8ac464SStefano Babic 
7923b8ac464SStefano Babic 			/*
7933b8ac464SStefano Babic 			*
7943b8ac464SStefano Babic 			* Set the ENDIR.
7953b8ac464SStefano Babic 			*
7963b8ac464SStefano Babic 			*/
7973b8ac464SStefano Babic 
7983b8ac464SStefano Babic 			g_ucEndIR = GetByte();
7993b8ac464SStefano Babic 
8003b8ac464SStefano Babic #ifdef DEBUG
8013b8ac464SStefano Babic 			printf("ENDIR %s;\n", GetState(g_ucEndIR));
8023b8ac464SStefano Babic #endif /* DEBUG */
8033b8ac464SStefano Babic 			break;
8043b8ac464SStefano Babic 		case HIR:
8053b8ac464SStefano Babic 		case TIR:
8063b8ac464SStefano Babic 		case HDR:
8073b8ac464SStefano Babic 		case TDR:
8083b8ac464SStefano Babic 
8093b8ac464SStefano Babic #ifdef DEBUG
8103b8ac464SStefano Babic 			switch (cOpcode) {
8113b8ac464SStefano Babic 			case HIR:
8123b8ac464SStefano Babic 				puts("HIR ");
8133b8ac464SStefano Babic 				break;
8143b8ac464SStefano Babic 			case TIR:
8153b8ac464SStefano Babic 				puts("TIR ");
8163b8ac464SStefano Babic 				break;
8173b8ac464SStefano Babic 			case HDR:
8183b8ac464SStefano Babic 				puts("HDR ");
8193b8ac464SStefano Babic 				break;
8203b8ac464SStefano Babic 			case TDR:
8213b8ac464SStefano Babic 				puts("TDR ");
8223b8ac464SStefano Babic 				break;
8233b8ac464SStefano Babic 			}
8243b8ac464SStefano Babic #endif /* DEBUG */
8253b8ac464SStefano Babic 			/*
8263b8ac464SStefano Babic 			 * Set the header/trailer of the device in order
8273b8ac464SStefano Babic 			 * to bypass
8283b8ac464SStefano Babic 			 * successfully.
8293b8ac464SStefano Babic 			 */
8303b8ac464SStefano Babic 
8313b8ac464SStefano Babic 			cRetCode = ispVMAmble(cOpcode);
8323b8ac464SStefano Babic 			if (cRetCode != 0) {
8333b8ac464SStefano Babic 				return cRetCode;
8343b8ac464SStefano Babic 			}
8353b8ac464SStefano Babic 
8363b8ac464SStefano Babic #ifdef DEBUG
8373b8ac464SStefano Babic 			puts(";\n");
8383b8ac464SStefano Babic #endif /* DEBUG */
8393b8ac464SStefano Babic 			break;
8403b8ac464SStefano Babic 		case MEM:
8413b8ac464SStefano Babic 
8423b8ac464SStefano Babic 			/*
8433b8ac464SStefano Babic 			 * The maximum RAM required to support
8443b8ac464SStefano Babic 			 * processing one row of the VME file.
8453b8ac464SStefano Babic 			 */
8463b8ac464SStefano Babic 
8473b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
8483b8ac464SStefano Babic 			g_usMaxSize = (unsigned short) ispVMDataSize();
8493b8ac464SStefano Babic 
8503b8ac464SStefano Babic #ifdef DEBUG
8513b8ac464SStefano Babic 			printf("// MEMSIZE %d\n", g_usMaxSize);
8523b8ac464SStefano Babic #endif /* DEBUG */
8533b8ac464SStefano Babic 			break;
8543b8ac464SStefano Babic 		case VENDOR:
8553b8ac464SStefano Babic 
8563b8ac464SStefano Babic 			/*
8573b8ac464SStefano Babic 			*
8583b8ac464SStefano Babic 			* Set the VENDOR type.
8593b8ac464SStefano Babic 			*
8603b8ac464SStefano Babic 			*/
8613b8ac464SStefano Babic 
8623b8ac464SStefano Babic 			cOpcode = GetByte();
8633b8ac464SStefano Babic 			switch (cOpcode) {
8643b8ac464SStefano Babic 			case LATTICE:
8653b8ac464SStefano Babic #ifdef DEBUG
8663b8ac464SStefano Babic 				puts("// VENDOR LATTICE\n");
8673b8ac464SStefano Babic #endif /* DEBUG */
8683b8ac464SStefano Babic 				g_cVendor = LATTICE;
8693b8ac464SStefano Babic 				break;
8703b8ac464SStefano Babic 			case ALTERA:
8713b8ac464SStefano Babic #ifdef DEBUG
8723b8ac464SStefano Babic 				puts("// VENDOR ALTERA\n");
8733b8ac464SStefano Babic #endif /* DEBUG */
8743b8ac464SStefano Babic 				g_cVendor = ALTERA;
8753b8ac464SStefano Babic 				break;
8763b8ac464SStefano Babic 			case XILINX:
8773b8ac464SStefano Babic #ifdef DEBUG
8783b8ac464SStefano Babic 				puts("// VENDOR XILINX\n");
8793b8ac464SStefano Babic #endif /* DEBUG */
8803b8ac464SStefano Babic 				g_cVendor = XILINX;
8813b8ac464SStefano Babic 				break;
8823b8ac464SStefano Babic 			default:
8833b8ac464SStefano Babic 				break;
8843b8ac464SStefano Babic 			}
8853b8ac464SStefano Babic 			break;
8863b8ac464SStefano Babic 		case SETFLOW:
8873b8ac464SStefano Babic 
8883b8ac464SStefano Babic 			/*
8893b8ac464SStefano Babic 			 * Set the flow control. Flow control determines
8903b8ac464SStefano Babic 			 * the personality of the embedded engine.
8913b8ac464SStefano Babic 			 */
8923b8ac464SStefano Babic 
8933b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
8943b8ac464SStefano Babic 			g_usFlowControl |= (unsigned short) ispVMDataSize();
8953b8ac464SStefano Babic 			break;
8963b8ac464SStefano Babic 		case RESETFLOW:
8973b8ac464SStefano Babic 
8983b8ac464SStefano Babic 			/*
8993b8ac464SStefano Babic 			*
9003b8ac464SStefano Babic 			* Unset the flow control.
9013b8ac464SStefano Babic 			*
9023b8ac464SStefano Babic 			*/
9033b8ac464SStefano Babic 
9043b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
9053b8ac464SStefano Babic 			g_usFlowControl &= (unsigned short) ~(ispVMDataSize());
9063b8ac464SStefano Babic 			break;
9073b8ac464SStefano Babic 		case HEAP:
9083b8ac464SStefano Babic 
9093b8ac464SStefano Babic 			/*
9103b8ac464SStefano Babic 			*
9113b8ac464SStefano Babic 			* Allocate heap size to store loops.
9123b8ac464SStefano Babic 			*
9133b8ac464SStefano Babic 			*/
9143b8ac464SStefano Babic 
9153b8ac464SStefano Babic 			cRetCode = GetByte();
9163b8ac464SStefano Babic 			if (cRetCode != SECUREHEAP) {
9173b8ac464SStefano Babic 				return VME_INVALID_FILE;
9183b8ac464SStefano Babic 			}
9193b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
9203b8ac464SStefano Babic 			g_iHEAPSize = (unsigned short) ispVMDataSize();
9213b8ac464SStefano Babic 
9223b8ac464SStefano Babic 			/*
9233b8ac464SStefano Babic 			 * Store the maximum size of the HEAP buffer.
9243b8ac464SStefano Babic 			 * Used to convert VME to HEX.
9253b8ac464SStefano Babic 			 */
9263b8ac464SStefano Babic 
9273b8ac464SStefano Babic 			if (g_iHEAPSize > g_usHeapSize) {
9283b8ac464SStefano Babic 				g_usHeapSize = g_iHEAPSize;
9293b8ac464SStefano Babic 			}
9303b8ac464SStefano Babic 
9313b8ac464SStefano Babic 			ispVMMemManager(HEAP, (unsigned short) g_iHEAPSize);
9323b8ac464SStefano Babic 			break;
9333b8ac464SStefano Babic 		case REPEAT:
9343b8ac464SStefano Babic 
9353b8ac464SStefano Babic 			/*
9363b8ac464SStefano Babic 			*
9373b8ac464SStefano Babic 			* Execute loops.
9383b8ac464SStefano Babic 			*
9393b8ac464SStefano Babic 			*/
9403b8ac464SStefano Babic 
9413b8ac464SStefano Babic 			g_usRepeatLoops = 0;
9423b8ac464SStefano Babic 
9433b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
9443b8ac464SStefano Babic 			iRepeatSize = (unsigned short) ispVMDataSize();
9453b8ac464SStefano Babic 
9463b8ac464SStefano Babic 			cRetCode = ispVMLoop((unsigned short) iRepeatSize);
9473b8ac464SStefano Babic 			if (cRetCode != 0) {
9483b8ac464SStefano Babic 				return cRetCode;
9493b8ac464SStefano Babic 			}
9503b8ac464SStefano Babic 			break;
9513b8ac464SStefano Babic 		case ENDLOOP:
9523b8ac464SStefano Babic 
9533b8ac464SStefano Babic 			/*
9543b8ac464SStefano Babic 			*
9553b8ac464SStefano Babic 			* Exit point from processing loops.
9563b8ac464SStefano Babic 			*
9573b8ac464SStefano Babic 			*/
9583b8ac464SStefano Babic 
9593b8ac464SStefano Babic 			return cRetCode;
9603b8ac464SStefano Babic 		case ENDVME:
9613b8ac464SStefano Babic 
9623b8ac464SStefano Babic 			/*
9633b8ac464SStefano Babic 			 * The only valid exit point that indicates
9643b8ac464SStefano Babic 			 * end of programming.
9653b8ac464SStefano Babic 			 */
9663b8ac464SStefano Babic 
9673b8ac464SStefano Babic 			return cRetCode;
9683b8ac464SStefano Babic 		case SHR:
9693b8ac464SStefano Babic 
9703b8ac464SStefano Babic 			/*
9713b8ac464SStefano Babic 			*
9723b8ac464SStefano Babic 			* Right-shift address.
9733b8ac464SStefano Babic 			*
9743b8ac464SStefano Babic 			*/
9753b8ac464SStefano Babic 
9763b8ac464SStefano Babic 			g_usFlowControl |= SHIFTRIGHT;
9773b8ac464SStefano Babic 
9783b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
9793b8ac464SStefano Babic 			g_usShiftValue = (unsigned short) (g_usRepeatLoops *
9803b8ac464SStefano Babic 				(unsigned short)GetByte());
9813b8ac464SStefano Babic 			break;
9823b8ac464SStefano Babic 		case SHL:
9833b8ac464SStefano Babic 
9843b8ac464SStefano Babic 			/*
9853b8ac464SStefano Babic 			 * Left-shift address.
9863b8ac464SStefano Babic 			 */
9873b8ac464SStefano Babic 
9883b8ac464SStefano Babic 			g_usFlowControl |= SHIFTLEFT;
9893b8ac464SStefano Babic 
9903b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
9913b8ac464SStefano Babic 			g_usShiftValue = (unsigned short) (g_usRepeatLoops *
9923b8ac464SStefano Babic 				(unsigned short)GetByte());
9933b8ac464SStefano Babic 			break;
9943b8ac464SStefano Babic 		case FREQUENCY:
9953b8ac464SStefano Babic 
9963b8ac464SStefano Babic 			/*
9973b8ac464SStefano Babic 			*
9983b8ac464SStefano Babic 			* Set the frequency.
9993b8ac464SStefano Babic 			*
10003b8ac464SStefano Babic 			*/
10013b8ac464SStefano Babic 
10023b8ac464SStefano Babic 			/* 09/11/07 NN Type cast mismatch variables */
10033b8ac464SStefano Babic 			g_iFrequency = (int) (ispVMDataSize() / 1000);
10043b8ac464SStefano Babic 			if (g_iFrequency == 1)
10053b8ac464SStefano Babic 				g_iFrequency = 1000;
10063b8ac464SStefano Babic 
10073b8ac464SStefano Babic #ifdef DEBUG
10083b8ac464SStefano Babic 			printf("FREQUENCY %.2E HZ;\n",
10093b8ac464SStefano Babic 				(float) g_iFrequency * 1000);
10103b8ac464SStefano Babic #endif /* DEBUG */
10113b8ac464SStefano Babic 			break;
10123b8ac464SStefano Babic 		case LCOUNT:
10133b8ac464SStefano Babic 
10143b8ac464SStefano Babic 			/*
10153b8ac464SStefano Babic 			*
10163b8ac464SStefano Babic 			* Process LCOUNT command.
10173b8ac464SStefano Babic 			*
10183b8ac464SStefano Babic 			*/
10193b8ac464SStefano Babic 
10203b8ac464SStefano Babic 			cRetCode = ispVMLCOUNT((unsigned short)ispVMDataSize());
10213b8ac464SStefano Babic 			if (cRetCode != 0) {
10223b8ac464SStefano Babic 				return cRetCode;
10233b8ac464SStefano Babic 			}
10243b8ac464SStefano Babic 			break;
10253b8ac464SStefano Babic 		case VUES:
10263b8ac464SStefano Babic 
10273b8ac464SStefano Babic 			/*
10283b8ac464SStefano Babic 			*
10293b8ac464SStefano Babic 			* Set the flow control to verify USERCODE.
10303b8ac464SStefano Babic 			*
10313b8ac464SStefano Babic 			*/
10323b8ac464SStefano Babic 
10333b8ac464SStefano Babic 			g_usFlowControl |= VERIFYUES;
10343b8ac464SStefano Babic 			break;
10353b8ac464SStefano Babic 		case COMMENT:
10363b8ac464SStefano Babic 
10373b8ac464SStefano Babic 			/*
10383b8ac464SStefano Babic 			*
10393b8ac464SStefano Babic 			* Display comment.
10403b8ac464SStefano Babic 			*
10413b8ac464SStefano Babic 			*/
10423b8ac464SStefano Babic 
10433b8ac464SStefano Babic 			ispVMComment((unsigned short) ispVMDataSize());
10443b8ac464SStefano Babic 			break;
10453b8ac464SStefano Babic 		case LVDS:
10463b8ac464SStefano Babic 
10473b8ac464SStefano Babic 			/*
10483b8ac464SStefano Babic 			*
10493b8ac464SStefano Babic 			* Process LVDS command.
10503b8ac464SStefano Babic 			*
10513b8ac464SStefano Babic 			*/
10523b8ac464SStefano Babic 
10533b8ac464SStefano Babic 			ispVMProcessLVDS((unsigned short) ispVMDataSize());
10543b8ac464SStefano Babic 			break;
10553b8ac464SStefano Babic 		case HEADER:
10563b8ac464SStefano Babic 
10573b8ac464SStefano Babic 			/*
10583b8ac464SStefano Babic 			*
10593b8ac464SStefano Babic 			* Discard header.
10603b8ac464SStefano Babic 			*
10613b8ac464SStefano Babic 			*/
10623b8ac464SStefano Babic 
10633b8ac464SStefano Babic 			ispVMHeader((unsigned short) ispVMDataSize());
10643b8ac464SStefano Babic 			break;
10653b8ac464SStefano Babic 		/* 03/14/06 Support Toggle ispENABLE signal*/
10663b8ac464SStefano Babic 		case ispEN:
10673b8ac464SStefano Babic 			ucState = GetByte();
10683b8ac464SStefano Babic 			if ((ucState == ON) || (ucState == 0x01))
10693b8ac464SStefano Babic 				writePort(g_ucPinENABLE, 0x01);
10703b8ac464SStefano Babic 			else
10713b8ac464SStefano Babic 				writePort(g_ucPinENABLE, 0x00);
10723b8ac464SStefano Babic 			ispVMDelay(1);
10733b8ac464SStefano Babic 			break;
10743b8ac464SStefano Babic 		/* 05/24/06 support Toggle TRST pin*/
10753b8ac464SStefano Babic 		case TRST:
10763b8ac464SStefano Babic 			ucState = GetByte();
10773b8ac464SStefano Babic 			if (ucState == 0x01)
10783b8ac464SStefano Babic 				writePort(g_ucPinTRST, 0x01);
10793b8ac464SStefano Babic 			else
10803b8ac464SStefano Babic 				writePort(g_ucPinTRST, 0x00);
10813b8ac464SStefano Babic 			ispVMDelay(1);
10823b8ac464SStefano Babic 			break;
10833b8ac464SStefano Babic 		default:
10843b8ac464SStefano Babic 
10853b8ac464SStefano Babic 			/*
10863b8ac464SStefano Babic 			*
10873b8ac464SStefano Babic 			* Invalid opcode encountered.
10883b8ac464SStefano Babic 			*
10893b8ac464SStefano Babic 			*/
10903b8ac464SStefano Babic 
10913b8ac464SStefano Babic #ifdef DEBUG
10923b8ac464SStefano Babic 			printf("\nINVALID OPCODE: 0x%.2X\n", cOpcode);
10933b8ac464SStefano Babic #endif /* DEBUG */
10943b8ac464SStefano Babic 
10953b8ac464SStefano Babic 			return VME_INVALID_FILE;
10963b8ac464SStefano Babic 		}
10973b8ac464SStefano Babic 	}
10983b8ac464SStefano Babic 
10993b8ac464SStefano Babic 	/*
11003b8ac464SStefano Babic 	*
11013b8ac464SStefano Babic 	* Invalid exit point. Processing the token 'ENDVME' is the only
11023b8ac464SStefano Babic 	* valid way to exit the embedded engine.
11033b8ac464SStefano Babic 	*
11043b8ac464SStefano Babic 	*/
11053b8ac464SStefano Babic 
11063b8ac464SStefano Babic 	return VME_INVALID_FILE;
11073b8ac464SStefano Babic }
11083b8ac464SStefano Babic 
11093b8ac464SStefano Babic /*
11103b8ac464SStefano Babic  *
11113b8ac464SStefano Babic  * ispVMDataCode
11123b8ac464SStefano Babic  *
11133b8ac464SStefano Babic  * Processes the TDI/TDO/MASK/DMASK etc of an SIR/SDR command.
11143b8ac464SStefano Babic  *
11153b8ac464SStefano Babic  */
11163b8ac464SStefano Babic 
ispVMDataCode()11173b8ac464SStefano Babic signed char ispVMDataCode()
11183b8ac464SStefano Babic {
11193b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
11203b8ac464SStefano Babic 	signed char cDataByte    = 0;
11213b8ac464SStefano Babic 	signed char siDataSource = 0;  /*source of data from file by default*/
11223b8ac464SStefano Babic 
11233b8ac464SStefano Babic 	if (g_usDataType & HEAP_IN) {
11243b8ac464SStefano Babic 		siDataSource = 1;  /*the source of data from memory*/
11253b8ac464SStefano Babic 	}
11263b8ac464SStefano Babic 
11273b8ac464SStefano Babic 	/*
11283b8ac464SStefano Babic 	*
11293b8ac464SStefano Babic 	* Clear the data type register.
11303b8ac464SStefano Babic 	*
11313b8ac464SStefano Babic 	**/
11323b8ac464SStefano Babic 
11333b8ac464SStefano Babic 	g_usDataType &= ~(MASK_DATA + TDI_DATA +
11343b8ac464SStefano Babic 		TDO_DATA + DMASK_DATA + CMASK_DATA);
11353b8ac464SStefano Babic 
11363b8ac464SStefano Babic 	/*
11373b8ac464SStefano Babic 	 * Iterate through SIR/SDR command and look for TDI,
11383b8ac464SStefano Babic 	 * TDO, MASK, etc.
11393b8ac464SStefano Babic 	 */
11403b8ac464SStefano Babic 
11413b8ac464SStefano Babic 	while ((cDataByte = GetByte()) >= 0) {
11423b8ac464SStefano Babic 			ispVMMemManager(cDataByte, g_usMaxSize);
11433b8ac464SStefano Babic 			switch (cDataByte) {
11443b8ac464SStefano Babic 			case TDI:
11453b8ac464SStefano Babic 
11463b8ac464SStefano Babic 				/*
11473b8ac464SStefano Babic 				 * Store the maximum size of the TDI buffer.
11483b8ac464SStefano Babic 				 * Used to convert VME to HEX.
11493b8ac464SStefano Babic 				 */
11503b8ac464SStefano Babic 
11513b8ac464SStefano Babic 				if (g_usiDataSize > g_usTDISize) {
11523b8ac464SStefano Babic 					g_usTDISize = g_usiDataSize;
11533b8ac464SStefano Babic 				}
11543b8ac464SStefano Babic 				/*
11553b8ac464SStefano Babic 				 * Updated data type register to indicate that
11563b8ac464SStefano Babic 				 * TDI data is currently being used. Process the
11573b8ac464SStefano Babic 				 * data in the VME file into the TDI buffer.
11583b8ac464SStefano Babic 				 */
11593b8ac464SStefano Babic 
11603b8ac464SStefano Babic 				g_usDataType |= TDI_DATA;
11613b8ac464SStefano Babic 				ispVMData(g_pucInData);
11623b8ac464SStefano Babic 				break;
11633b8ac464SStefano Babic 			case XTDO:
11643b8ac464SStefano Babic 
11653b8ac464SStefano Babic 				/*
11663b8ac464SStefano Babic 				 * Store the maximum size of the TDO buffer.
11673b8ac464SStefano Babic 				 * Used to convert VME to HEX.
11683b8ac464SStefano Babic 				 */
11693b8ac464SStefano Babic 
11703b8ac464SStefano Babic 				if (g_usiDataSize > g_usTDOSize) {
11713b8ac464SStefano Babic 					g_usTDOSize = g_usiDataSize;
11723b8ac464SStefano Babic 				}
11733b8ac464SStefano Babic 
11743b8ac464SStefano Babic 				/*
11753b8ac464SStefano Babic 				 * Updated data type register to indicate that
11763b8ac464SStefano Babic 				 * TDO data is currently being used.
11773b8ac464SStefano Babic 				 */
11783b8ac464SStefano Babic 
11793b8ac464SStefano Babic 				g_usDataType |= TDO_DATA;
11803b8ac464SStefano Babic 				break;
11813b8ac464SStefano Babic 			case TDO:
11823b8ac464SStefano Babic 
11833b8ac464SStefano Babic 				/*
11843b8ac464SStefano Babic 				 * Store the maximum size of the TDO buffer.
11853b8ac464SStefano Babic 				 * Used to convert VME to HEX.
11863b8ac464SStefano Babic 				 */
11873b8ac464SStefano Babic 
11883b8ac464SStefano Babic 				if (g_usiDataSize > g_usTDOSize) {
11893b8ac464SStefano Babic 					g_usTDOSize = g_usiDataSize;
11903b8ac464SStefano Babic 				}
11913b8ac464SStefano Babic 
11923b8ac464SStefano Babic 				/*
11933b8ac464SStefano Babic 				 * Updated data type register to indicate
11943b8ac464SStefano Babic 				 * that TDO data is currently being used.
11953b8ac464SStefano Babic 				 * Process the data in the VME file into the
11963b8ac464SStefano Babic 				 * TDO buffer.
11973b8ac464SStefano Babic 				 */
11983b8ac464SStefano Babic 
11993b8ac464SStefano Babic 				g_usDataType |= TDO_DATA;
12003b8ac464SStefano Babic 				ispVMData(g_pucOutData);
12013b8ac464SStefano Babic 				break;
12023b8ac464SStefano Babic 			case MASK:
12033b8ac464SStefano Babic 
12043b8ac464SStefano Babic 				/*
12053b8ac464SStefano Babic 				 * Store the maximum size of the MASK buffer.
12063b8ac464SStefano Babic 				 * Used to convert VME to HEX.
12073b8ac464SStefano Babic 				 */
12083b8ac464SStefano Babic 
12093b8ac464SStefano Babic 				if (g_usiDataSize > g_usMASKSize) {
12103b8ac464SStefano Babic 					g_usMASKSize = g_usiDataSize;
12113b8ac464SStefano Babic 				}
12123b8ac464SStefano Babic 
12133b8ac464SStefano Babic 				/*
12143b8ac464SStefano Babic 				 * Updated data type register to indicate that
12153b8ac464SStefano Babic 				 * MASK data is currently being used. Process
12163b8ac464SStefano Babic 				 * the data in the VME file into the MASK buffer
12173b8ac464SStefano Babic 				 */
12183b8ac464SStefano Babic 
12193b8ac464SStefano Babic 				g_usDataType |= MASK_DATA;
12203b8ac464SStefano Babic 				ispVMData(g_pucOutMaskData);
12213b8ac464SStefano Babic 				break;
12223b8ac464SStefano Babic 			case DMASK:
12233b8ac464SStefano Babic 
12243b8ac464SStefano Babic 				/*
12253b8ac464SStefano Babic 				 * Store the maximum size of the DMASK buffer.
12263b8ac464SStefano Babic 				 * Used to convert VME to HEX.
12273b8ac464SStefano Babic 				 */
12283b8ac464SStefano Babic 
12293b8ac464SStefano Babic 				if (g_usiDataSize > g_usDMASKSize) {
12303b8ac464SStefano Babic 					g_usDMASKSize = g_usiDataSize;
12313b8ac464SStefano Babic 				}
12323b8ac464SStefano Babic 
12333b8ac464SStefano Babic 				/*
12343b8ac464SStefano Babic 				 * Updated data type register to indicate that
12353b8ac464SStefano Babic 				 * DMASK data is currently being used. Process
12363b8ac464SStefano Babic 				 * the data in the VME file into the DMASK
12373b8ac464SStefano Babic 				 * buffer.
12383b8ac464SStefano Babic 				 */
12393b8ac464SStefano Babic 
12403b8ac464SStefano Babic 				g_usDataType |= DMASK_DATA;
12413b8ac464SStefano Babic 				ispVMData(g_pucOutDMaskData);
12423b8ac464SStefano Babic 				break;
12433b8ac464SStefano Babic 			case CMASK:
12443b8ac464SStefano Babic 
12453b8ac464SStefano Babic 				/*
12463b8ac464SStefano Babic 				 * Updated data type register to indicate that
12473b8ac464SStefano Babic 				 * MASK data is currently being used. Process
12483b8ac464SStefano Babic 				 * the data in the VME file into the MASK buffer
12493b8ac464SStefano Babic 				 */
12503b8ac464SStefano Babic 
12513b8ac464SStefano Babic 				g_usDataType |= CMASK_DATA;
12523b8ac464SStefano Babic 				ispVMData(g_pucOutMaskData);
12533b8ac464SStefano Babic 				break;
12543b8ac464SStefano Babic 			case CONTINUE:
12553b8ac464SStefano Babic 				return 0;
12563b8ac464SStefano Babic 			default:
12573b8ac464SStefano Babic 				/*
12583b8ac464SStefano Babic 				 * Encountered invalid opcode.
12593b8ac464SStefano Babic 				 */
12603b8ac464SStefano Babic 				return VME_INVALID_FILE;
12613b8ac464SStefano Babic 			}
12623b8ac464SStefano Babic 
12633b8ac464SStefano Babic 			switch (cDataByte) {
12643b8ac464SStefano Babic 			case TDI:
12653b8ac464SStefano Babic 
12663b8ac464SStefano Babic 				/*
12673b8ac464SStefano Babic 				 * Left bit shift. Used when performing
12683b8ac464SStefano Babic 				 * algorithm looping.
12693b8ac464SStefano Babic 				 */
12703b8ac464SStefano Babic 
12713b8ac464SStefano Babic 				if (g_usFlowControl & SHIFTLEFT) {
12723b8ac464SStefano Babic 					ispVMBitShift(SHL, g_usShiftValue);
12733b8ac464SStefano Babic 					g_usFlowControl &= ~SHIFTLEFT;
12743b8ac464SStefano Babic 				}
12753b8ac464SStefano Babic 
12763b8ac464SStefano Babic 				/*
12773b8ac464SStefano Babic 				 * Right bit shift. Used when performing
12783b8ac464SStefano Babic 				 * algorithm looping.
12793b8ac464SStefano Babic 				 */
12803b8ac464SStefano Babic 
12813b8ac464SStefano Babic 				if (g_usFlowControl & SHIFTRIGHT) {
12823b8ac464SStefano Babic 					ispVMBitShift(SHR, g_usShiftValue);
12833b8ac464SStefano Babic 					g_usFlowControl &= ~SHIFTRIGHT;
12843b8ac464SStefano Babic 				}
12853b8ac464SStefano Babic 			default:
12863b8ac464SStefano Babic 				break;
12873b8ac464SStefano Babic 			}
12883b8ac464SStefano Babic 
12893b8ac464SStefano Babic 			if (siDataSource) {
12903b8ac464SStefano Babic 				g_usDataType |= HEAP_IN; /*restore from memory*/
12913b8ac464SStefano Babic 			}
12923b8ac464SStefano Babic 	}
12933b8ac464SStefano Babic 
12943b8ac464SStefano Babic 	if (siDataSource) {  /*fetch data from heap memory upon return*/
12953b8ac464SStefano Babic 		g_usDataType |= HEAP_IN;
12963b8ac464SStefano Babic 	}
12973b8ac464SStefano Babic 
12983b8ac464SStefano Babic 	if (cDataByte < 0) {
12993b8ac464SStefano Babic 
13003b8ac464SStefano Babic 		/*
13013b8ac464SStefano Babic 		 * Encountered invalid opcode.
13023b8ac464SStefano Babic 		 */
13033b8ac464SStefano Babic 
13043b8ac464SStefano Babic 		return VME_INVALID_FILE;
13053b8ac464SStefano Babic 	} else {
13063b8ac464SStefano Babic 		return 0;
13073b8ac464SStefano Babic 	}
13083b8ac464SStefano Babic }
13093b8ac464SStefano Babic 
13103b8ac464SStefano Babic /*
13113b8ac464SStefano Babic  *
13123b8ac464SStefano Babic  * ispVMData
13133b8ac464SStefano Babic  * Extract one row of data operand from the current data type opcode. Perform
13143b8ac464SStefano Babic  * the decompression if necessary. Extra RAM is not required for the
13153b8ac464SStefano Babic  * decompression process. The decompression scheme employed in this module
13163b8ac464SStefano Babic  * is on row by row basis. The format of the data stream:
13173b8ac464SStefano Babic  * [compression code][compressed data stream]
13183b8ac464SStefano Babic  * 0x00    --No compression
13193b8ac464SStefano Babic  * 0x01    --Compress by 0x00.
13203b8ac464SStefano Babic  *           Example:
13213b8ac464SStefano Babic  *           Original stream:   0x000000000000000000000001
13223b8ac464SStefano Babic  *           Compressed stream: 0x01000901
13233b8ac464SStefano Babic  *           Detail:            0x01 is the code, 0x00 is the key,
13243b8ac464SStefano Babic  *                              0x09 is the count of 0x00 bytes,
13253b8ac464SStefano Babic  *                              0x01 is the uncompressed byte.
13263b8ac464SStefano Babic  * 0x02    --Compress by 0xFF.
13273b8ac464SStefano Babic  *           Example:
13283b8ac464SStefano Babic  *           Original stream:   0xFFFFFFFFFFFFFFFFFFFFFF01
13293b8ac464SStefano Babic  *           Compressed stream: 0x02FF0901
13303b8ac464SStefano Babic  *           Detail:            0x02 is the code, 0xFF is the key,
13313b8ac464SStefano Babic  *                              0x09 is the count of 0xFF bytes,
13323b8ac464SStefano Babic  *                              0x01 is the uncompressed byte.
13333b8ac464SStefano Babic  * 0x03
13343b8ac464SStefano Babic  * : :
13353b8ac464SStefano Babic  * 0xFE   -- Compress by nibble blocks.
13363b8ac464SStefano Babic  *           Example:
13373b8ac464SStefano Babic  *           Original stream:   0x84210842108421084210
13383b8ac464SStefano Babic  *           Compressed stream: 0x0584210
13393b8ac464SStefano Babic  *           Detail:            0x05 is the code, means 5 nibbles block.
13403b8ac464SStefano Babic  *                              0x84210 is the 5 nibble blocks.
13413b8ac464SStefano Babic  *                              The whole row is 80 bits given by g_usiDataSize.
13423b8ac464SStefano Babic  *                              The number of times the block repeat itself
13433b8ac464SStefano Babic  *                              is found by g_usiDataSize/(4*0x05) which is 4.
13443b8ac464SStefano Babic  * 0xFF   -- Compress by the most frequently happen byte.
13453b8ac464SStefano Babic  *           Example:
13463b8ac464SStefano Babic  *           Original stream:   0x04020401030904040404
13473b8ac464SStefano Babic  *           Compressed stream: 0xFF04(0,1,0x02,0,1,0x01,1,0x03,1,0x09,0,0,0)
13483b8ac464SStefano Babic  *                          or: 0xFF044090181C240
13493b8ac464SStefano Babic  *           Detail:            0xFF is the code, 0x04 is the key.
13503b8ac464SStefano Babic  *                              a bit of 0 represent the key shall be put into
13513b8ac464SStefano Babic  *                              the current bit position and a bit of 1
13523b8ac464SStefano Babic  *                              represent copying the next of 8 bits of data
13533b8ac464SStefano Babic  *                              in.
13543b8ac464SStefano Babic  *
13553b8ac464SStefano Babic  */
13563b8ac464SStefano Babic 
ispVMData(unsigned char * ByteData)13573b8ac464SStefano Babic void ispVMData(unsigned char *ByteData)
13583b8ac464SStefano Babic {
13593b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
13603b8ac464SStefano Babic 	unsigned short size               = 0;
13613b8ac464SStefano Babic 	unsigned short i, j, m, getData   = 0;
13623b8ac464SStefano Babic 	unsigned char cDataByte           = 0;
13633b8ac464SStefano Babic 	unsigned char compress            = 0;
13643b8ac464SStefano Babic 	unsigned short FFcount            = 0;
13653b8ac464SStefano Babic 	unsigned char compr_char          = 0xFF;
13663b8ac464SStefano Babic 	unsigned short index              = 0;
13673b8ac464SStefano Babic 	signed char compression           = 0;
13683b8ac464SStefano Babic 
13693b8ac464SStefano Babic 	/*convert number in bits to bytes*/
13703b8ac464SStefano Babic 	if (g_usiDataSize % 8 > 0) {
13713b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
13723b8ac464SStefano Babic 		size = (unsigned short)(g_usiDataSize / 8 + 1);
13733b8ac464SStefano Babic 	} else {
13743b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
13753b8ac464SStefano Babic 		size = (unsigned short)(g_usiDataSize / 8);
13763b8ac464SStefano Babic 	}
13773b8ac464SStefano Babic 
13783b8ac464SStefano Babic 	/*
13793b8ac464SStefano Babic 	 * If there is compression, then check if compress by key
13803b8ac464SStefano Babic 	 * of 0x00 or 0xFF or by other keys or by nibble blocks
13813b8ac464SStefano Babic 	 */
13823b8ac464SStefano Babic 
13833b8ac464SStefano Babic 	if (g_usDataType & COMPRESS) {
13843b8ac464SStefano Babic 		compression = 1;
13853b8ac464SStefano Babic 		compress = GetByte();
13863b8ac464SStefano Babic 		if ((compress  == VAR) && (g_usDataType & HEAP_IN)) {
13873b8ac464SStefano Babic 			getData = 1;
13883b8ac464SStefano Babic 			g_usDataType &= ~(HEAP_IN);
13893b8ac464SStefano Babic 			compress = GetByte();
13903b8ac464SStefano Babic 		}
13913b8ac464SStefano Babic 
13923b8ac464SStefano Babic 		switch (compress) {
13933b8ac464SStefano Babic 		case 0x00:
13943b8ac464SStefano Babic 			/* No compression */
13953b8ac464SStefano Babic 			compression = 0;
13963b8ac464SStefano Babic 			break;
13973b8ac464SStefano Babic 		case 0x01:
13983b8ac464SStefano Babic 			/* Compress by byte 0x00 */
13993b8ac464SStefano Babic 			compr_char = 0x00;
14003b8ac464SStefano Babic 			break;
14013b8ac464SStefano Babic 		case 0x02:
14023b8ac464SStefano Babic 			/* Compress by byte 0xFF */
14033b8ac464SStefano Babic 			compr_char = 0xFF;
14043b8ac464SStefano Babic 			break;
14053b8ac464SStefano Babic 		case 0xFF:
14063b8ac464SStefano Babic 			/* Huffman encoding */
14073b8ac464SStefano Babic 			compr_char = GetByte();
14083b8ac464SStefano Babic 			i = 8;
14093b8ac464SStefano Babic 			for (index = 0; index < size; index++) {
14103b8ac464SStefano Babic 				ByteData[index] = 0x00;
14113b8ac464SStefano Babic 				if (i > 7) {
14123b8ac464SStefano Babic 					cDataByte = GetByte();
14133b8ac464SStefano Babic 					i = 0;
14143b8ac464SStefano Babic 				}
14153b8ac464SStefano Babic 				if ((cDataByte << i++) & 0x80)
14163b8ac464SStefano Babic 					m = 8;
14173b8ac464SStefano Babic 				else {
14183b8ac464SStefano Babic 					ByteData[index] = compr_char;
14193b8ac464SStefano Babic 					m = 0;
14203b8ac464SStefano Babic 				}
14213b8ac464SStefano Babic 
14223b8ac464SStefano Babic 				for (j = 0; j < m; j++) {
14233b8ac464SStefano Babic 					if (i > 7) {
14243b8ac464SStefano Babic 						cDataByte = GetByte();
14253b8ac464SStefano Babic 						i = 0;
14263b8ac464SStefano Babic 					}
14273b8ac464SStefano Babic 					ByteData[index] |=
14283b8ac464SStefano Babic 					((cDataByte << i++) & 0x80) >> j;
14293b8ac464SStefano Babic 				}
14303b8ac464SStefano Babic 			}
14313b8ac464SStefano Babic 			size = 0;
14323b8ac464SStefano Babic 			break;
14333b8ac464SStefano Babic 		default:
14343b8ac464SStefano Babic 			for (index = 0; index < size; index++)
14353b8ac464SStefano Babic 				ByteData[index] = 0x00;
14363b8ac464SStefano Babic 			for (index = 0; index < compress; index++) {
14373b8ac464SStefano Babic 				if (index % 2 == 0)
14383b8ac464SStefano Babic 					cDataByte = GetByte();
14393b8ac464SStefano Babic 				for (i = 0; i < size * 2 / compress; i++) {
14403b8ac464SStefano Babic 					j = (unsigned short)(index +
14413b8ac464SStefano Babic 						(i * (unsigned short)compress));
14423b8ac464SStefano Babic 					/*clear the nibble to zero first*/
14433b8ac464SStefano Babic 					if (j%2) {
14443b8ac464SStefano Babic 						if (index % 2)
14453b8ac464SStefano Babic 							ByteData[j/2] |=
14463b8ac464SStefano Babic 								cDataByte & 0xF;
14473b8ac464SStefano Babic 						else
14483b8ac464SStefano Babic 							ByteData[j/2] |=
14493b8ac464SStefano Babic 								cDataByte >> 4;
14503b8ac464SStefano Babic 					} else {
14513b8ac464SStefano Babic 						if (index % 2)
14523b8ac464SStefano Babic 							ByteData[j/2] |=
14533b8ac464SStefano Babic 								cDataByte << 4;
14543b8ac464SStefano Babic 						else
14553b8ac464SStefano Babic 							ByteData[j/2] |=
14563b8ac464SStefano Babic 							cDataByte & 0xF0;
14573b8ac464SStefano Babic 					}
14583b8ac464SStefano Babic 				}
14593b8ac464SStefano Babic 			}
14603b8ac464SStefano Babic 			size = 0;
14613b8ac464SStefano Babic 			break;
14623b8ac464SStefano Babic 		}
14633b8ac464SStefano Babic 	}
14643b8ac464SStefano Babic 
14653b8ac464SStefano Babic 	FFcount = 0;
14663b8ac464SStefano Babic 
14673b8ac464SStefano Babic 	/* Decompress by byte 0x00 or 0xFF */
14683b8ac464SStefano Babic 	for (index = 0; index < size; index++) {
14693b8ac464SStefano Babic 		if (FFcount <= 0) {
14703b8ac464SStefano Babic 			cDataByte = GetByte();
14713b8ac464SStefano Babic 			if ((cDataByte == VAR) && (g_usDataType&HEAP_IN) &&
14723b8ac464SStefano Babic 				!getData && !(g_usDataType&COMPRESS)) {
14733b8ac464SStefano Babic 				getData = 1;
14743b8ac464SStefano Babic 				g_usDataType &= ~(HEAP_IN);
14753b8ac464SStefano Babic 				cDataByte = GetByte();
14763b8ac464SStefano Babic 			}
14773b8ac464SStefano Babic 			ByteData[index] = cDataByte;
14783b8ac464SStefano Babic 			if ((compression) && (cDataByte == compr_char))
14793b8ac464SStefano Babic 				/* 09/11/07 NN Type cast mismatch variables */
14803b8ac464SStefano Babic 				FFcount = (unsigned short) ispVMDataSize();
14813b8ac464SStefano Babic 				/*The number of 0xFF or 0x00 bytes*/
14823b8ac464SStefano Babic 		} else {
14833b8ac464SStefano Babic 			FFcount--; /*Use up the 0xFF chain first*/
14843b8ac464SStefano Babic 			ByteData[index] = compr_char;
14853b8ac464SStefano Babic 		}
14863b8ac464SStefano Babic 	}
14873b8ac464SStefano Babic 
14883b8ac464SStefano Babic 	if (getData) {
14893b8ac464SStefano Babic 		g_usDataType |= HEAP_IN;
14903b8ac464SStefano Babic 		getData = 0;
14913b8ac464SStefano Babic 	}
14923b8ac464SStefano Babic }
14933b8ac464SStefano Babic 
14943b8ac464SStefano Babic /*
14953b8ac464SStefano Babic  *
14963b8ac464SStefano Babic  * ispVMShift
14973b8ac464SStefano Babic  *
14983b8ac464SStefano Babic  * Processes the SDR/XSDR/SIR commands.
14993b8ac464SStefano Babic  *
15003b8ac464SStefano Babic  */
15013b8ac464SStefano Babic 
ispVMShift(signed char a_cCode)15023b8ac464SStefano Babic signed char ispVMShift(signed char a_cCode)
15033b8ac464SStefano Babic {
15043b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
15053b8ac464SStefano Babic 	unsigned short iDataIndex  = 0;
15063b8ac464SStefano Babic 	unsigned short iReadLoop   = 0;
15073b8ac464SStefano Babic 	signed char cRetCode       = 0;
15083b8ac464SStefano Babic 
15093b8ac464SStefano Babic 	cRetCode = 0;
15103b8ac464SStefano Babic 	/* 09/11/07 NN Type cast mismatch variables */
15113b8ac464SStefano Babic 	g_usiDataSize = (unsigned short) ispVMDataSize();
15123b8ac464SStefano Babic 
15133b8ac464SStefano Babic 	/*clear the flags first*/
15143b8ac464SStefano Babic 	g_usDataType &= ~(SIR_DATA + EXPRESS + SDR_DATA);
15153b8ac464SStefano Babic 	switch (a_cCode) {
15163b8ac464SStefano Babic 	case SIR:
15173b8ac464SStefano Babic 		g_usDataType |= SIR_DATA;
15183b8ac464SStefano Babic 		/*
15193b8ac464SStefano Babic 		 * 1/15/04 If performing cascading, then go directly to SHIFTIR.
15203b8ac464SStefano Babic 		 *  Else, go to IRPAUSE before going to SHIFTIR
15213b8ac464SStefano Babic 		 */
15223b8ac464SStefano Babic 		if (g_usFlowControl & CASCADE) {
15233b8ac464SStefano Babic 			ispVMStateMachine(SHIFTIR);
15243b8ac464SStefano Babic 		} else {
15253b8ac464SStefano Babic 			ispVMStateMachine(IRPAUSE);
15263b8ac464SStefano Babic 			ispVMStateMachine(SHIFTIR);
15273b8ac464SStefano Babic 			if (g_usHeadIR > 0) {
15283b8ac464SStefano Babic 				ispVMBypass(HIR, g_usHeadIR);
15293b8ac464SStefano Babic 				sclock();
15303b8ac464SStefano Babic 			}
15313b8ac464SStefano Babic 		}
15323b8ac464SStefano Babic 		break;
15333b8ac464SStefano Babic 	case XSDR:
15343b8ac464SStefano Babic 		g_usDataType |= EXPRESS; /*mark simultaneous in and out*/
15353b8ac464SStefano Babic 	case SDR:
15363b8ac464SStefano Babic 		g_usDataType |= SDR_DATA;
15373b8ac464SStefano Babic 		/*
15383b8ac464SStefano Babic 		 * 1/15/04 If already in SHIFTDR, then do not move state or
15393b8ac464SStefano Babic 		 * shift in header.  This would imply that the previously
15403b8ac464SStefano Babic 		 * shifted frame was a cascaded frame.
15413b8ac464SStefano Babic 		 */
15423b8ac464SStefano Babic 		if (g_cCurrentJTAGState != SHIFTDR) {
15433b8ac464SStefano Babic 			/*
15443b8ac464SStefano Babic 			 * 1/15/04 If performing cascading, then go directly
15453b8ac464SStefano Babic 			 * to SHIFTDR.  Else, go to DRPAUSE before going
15463b8ac464SStefano Babic 			 * to SHIFTDR
15473b8ac464SStefano Babic 			 */
15483b8ac464SStefano Babic 			if (g_usFlowControl & CASCADE) {
15493b8ac464SStefano Babic 				if (g_cCurrentJTAGState == DRPAUSE) {
15503b8ac464SStefano Babic 					ispVMStateMachine(SHIFTDR);
15513b8ac464SStefano Babic 					/*
15523b8ac464SStefano Babic 					 * 1/15/04 If cascade flag has been seat
15533b8ac464SStefano Babic 					 * and the current state is DRPAUSE,
15543b8ac464SStefano Babic 					 * this implies that the first cascaded
15553b8ac464SStefano Babic 					 * frame is about to be shifted in.  The
15563b8ac464SStefano Babic 					 * header must be shifted prior to
15573b8ac464SStefano Babic 					 * shifting the first cascaded frame.
15583b8ac464SStefano Babic 					 */
15593b8ac464SStefano Babic 					if (g_usHeadDR > 0) {
15603b8ac464SStefano Babic 						ispVMBypass(HDR, g_usHeadDR);
15613b8ac464SStefano Babic 						sclock();
15623b8ac464SStefano Babic 					}
15633b8ac464SStefano Babic 				} else {
15643b8ac464SStefano Babic 					ispVMStateMachine(SHIFTDR);
15653b8ac464SStefano Babic 				}
15663b8ac464SStefano Babic 			} else {
15673b8ac464SStefano Babic 				ispVMStateMachine(DRPAUSE);
15683b8ac464SStefano Babic 				ispVMStateMachine(SHIFTDR);
15693b8ac464SStefano Babic 				if (g_usHeadDR > 0) {
15703b8ac464SStefano Babic 					ispVMBypass(HDR, g_usHeadDR);
15713b8ac464SStefano Babic 					sclock();
15723b8ac464SStefano Babic 				}
15733b8ac464SStefano Babic 			}
15743b8ac464SStefano Babic 		}
15753b8ac464SStefano Babic 		break;
15763b8ac464SStefano Babic 	default:
15773b8ac464SStefano Babic 		return VME_INVALID_FILE;
15783b8ac464SStefano Babic 	}
15793b8ac464SStefano Babic 
15803b8ac464SStefano Babic 	cRetCode = ispVMDataCode();
15813b8ac464SStefano Babic 
15823b8ac464SStefano Babic 	if (cRetCode != 0) {
15833b8ac464SStefano Babic 		return VME_INVALID_FILE;
15843b8ac464SStefano Babic 	}
15853b8ac464SStefano Babic 
15863b8ac464SStefano Babic #ifdef DEBUG
15873b8ac464SStefano Babic 	printf("%d ", g_usiDataSize);
15883b8ac464SStefano Babic 
15893b8ac464SStefano Babic 	if (g_usDataType & TDI_DATA) {
15903b8ac464SStefano Babic 		puts("TDI ");
15913b8ac464SStefano Babic 		PrintData(g_usiDataSize, g_pucInData);
15923b8ac464SStefano Babic 	}
15933b8ac464SStefano Babic 
15943b8ac464SStefano Babic 	if (g_usDataType & TDO_DATA) {
15953b8ac464SStefano Babic 		puts("\n\t\tTDO ");
15963b8ac464SStefano Babic 		PrintData(g_usiDataSize, g_pucOutData);
15973b8ac464SStefano Babic 	}
15983b8ac464SStefano Babic 
15993b8ac464SStefano Babic 	if (g_usDataType & MASK_DATA) {
16003b8ac464SStefano Babic 		puts("\n\t\tMASK ");
16013b8ac464SStefano Babic 		PrintData(g_usiDataSize, g_pucOutMaskData);
16023b8ac464SStefano Babic 	}
16033b8ac464SStefano Babic 
16043b8ac464SStefano Babic 	if (g_usDataType & DMASK_DATA) {
16053b8ac464SStefano Babic 		puts("\n\t\tDMASK ");
16063b8ac464SStefano Babic 		PrintData(g_usiDataSize, g_pucOutDMaskData);
16073b8ac464SStefano Babic 	}
16083b8ac464SStefano Babic 
16093b8ac464SStefano Babic 	puts(";\n");
16103b8ac464SStefano Babic #endif /* DEBUG */
16113b8ac464SStefano Babic 
16123b8ac464SStefano Babic 	if (g_usDataType & TDO_DATA || g_usDataType & DMASK_DATA) {
16133b8ac464SStefano Babic 		if (g_usDataType & DMASK_DATA) {
16143b8ac464SStefano Babic 			cRetCode = ispVMReadandSave(g_usiDataSize);
16153b8ac464SStefano Babic 			if (!cRetCode) {
16163b8ac464SStefano Babic 				if (g_usTailDR > 0) {
16173b8ac464SStefano Babic 					sclock();
16183b8ac464SStefano Babic 					ispVMBypass(TDR, g_usTailDR);
16193b8ac464SStefano Babic 				}
16203b8ac464SStefano Babic 				ispVMStateMachine(DRPAUSE);
16213b8ac464SStefano Babic 				ispVMStateMachine(SHIFTDR);
16223b8ac464SStefano Babic 				if (g_usHeadDR > 0) {
16233b8ac464SStefano Babic 					ispVMBypass(HDR, g_usHeadDR);
16243b8ac464SStefano Babic 					sclock();
16253b8ac464SStefano Babic 				}
16263b8ac464SStefano Babic 				for (iDataIndex = 0;
16273b8ac464SStefano Babic 					iDataIndex < g_usiDataSize / 8 + 1;
16283b8ac464SStefano Babic 					iDataIndex++)
16293b8ac464SStefano Babic 					g_pucInData[iDataIndex] =
16303b8ac464SStefano Babic 						g_pucOutData[iDataIndex];
16313b8ac464SStefano Babic 				g_usDataType &= ~(TDO_DATA + DMASK_DATA);
16323b8ac464SStefano Babic 				cRetCode = ispVMSend(g_usiDataSize);
16333b8ac464SStefano Babic 			}
16343b8ac464SStefano Babic 		} else {
16353b8ac464SStefano Babic 			cRetCode = ispVMRead(g_usiDataSize);
16363b8ac464SStefano Babic 			if (cRetCode == -1 && g_cVendor == XILINX) {
16373b8ac464SStefano Babic 				for (iReadLoop = 0; iReadLoop < 30;
16383b8ac464SStefano Babic 					iReadLoop++) {
16393b8ac464SStefano Babic 					cRetCode = ispVMRead(g_usiDataSize);
16403b8ac464SStefano Babic 					if (!cRetCode) {
16413b8ac464SStefano Babic 						break;
16423b8ac464SStefano Babic 					} else {
16433b8ac464SStefano Babic 						/* Always DRPAUSE */
16443b8ac464SStefano Babic 						ispVMStateMachine(DRPAUSE);
16453b8ac464SStefano Babic 						/*
16463b8ac464SStefano Babic 						 * Bypass other devices
16473b8ac464SStefano Babic 						 * when appropriate
16483b8ac464SStefano Babic 						 */
16493b8ac464SStefano Babic 						ispVMBypass(TDR, g_usTailDR);
16503b8ac464SStefano Babic 						ispVMStateMachine(g_ucEndDR);
16513b8ac464SStefano Babic 						ispVMStateMachine(IDLE);
16523b8ac464SStefano Babic 						ispVMDelay(1000);
16533b8ac464SStefano Babic 					}
16543b8ac464SStefano Babic 				}
16553b8ac464SStefano Babic 			}
16563b8ac464SStefano Babic 		}
16573b8ac464SStefano Babic 	} else { /*TDI only*/
16583b8ac464SStefano Babic 		cRetCode = ispVMSend(g_usiDataSize);
16593b8ac464SStefano Babic 	}
16603b8ac464SStefano Babic 
16613b8ac464SStefano Babic 	/*transfer the input data to the output buffer for the next verify*/
16623b8ac464SStefano Babic 	if ((g_usDataType & EXPRESS) || (a_cCode == SDR)) {
16633b8ac464SStefano Babic 		if (g_pucOutData) {
16643b8ac464SStefano Babic 			for (iDataIndex = 0; iDataIndex < g_usiDataSize / 8 + 1;
16653b8ac464SStefano Babic 				iDataIndex++)
16663b8ac464SStefano Babic 				g_pucOutData[iDataIndex] =
16673b8ac464SStefano Babic 					g_pucInData[iDataIndex];
16683b8ac464SStefano Babic 		}
16693b8ac464SStefano Babic 	}
16703b8ac464SStefano Babic 
16713b8ac464SStefano Babic 	switch (a_cCode) {
16723b8ac464SStefano Babic 	case SIR:
16733b8ac464SStefano Babic 		/* 1/15/04 If not performing cascading, then shift ENDIR */
16743b8ac464SStefano Babic 		if (!(g_usFlowControl & CASCADE)) {
16753b8ac464SStefano Babic 			if (g_usTailIR > 0) {
16763b8ac464SStefano Babic 				sclock();
16773b8ac464SStefano Babic 				ispVMBypass(TIR, g_usTailIR);
16783b8ac464SStefano Babic 			}
16793b8ac464SStefano Babic 			ispVMStateMachine(g_ucEndIR);
16803b8ac464SStefano Babic 		}
16813b8ac464SStefano Babic 		break;
16823b8ac464SStefano Babic 	case XSDR:
16833b8ac464SStefano Babic 	case SDR:
16843b8ac464SStefano Babic 		/* 1/15/04 If not performing cascading, then shift ENDDR */
16853b8ac464SStefano Babic 		if (!(g_usFlowControl & CASCADE)) {
16863b8ac464SStefano Babic 			if (g_usTailDR > 0) {
16873b8ac464SStefano Babic 				sclock();
16883b8ac464SStefano Babic 				ispVMBypass(TDR, g_usTailDR);
16893b8ac464SStefano Babic 			}
16903b8ac464SStefano Babic 			ispVMStateMachine(g_ucEndDR);
16913b8ac464SStefano Babic 		}
16923b8ac464SStefano Babic 		break;
16933b8ac464SStefano Babic 	default:
16943b8ac464SStefano Babic 		break;
16953b8ac464SStefano Babic 	}
16963b8ac464SStefano Babic 
16973b8ac464SStefano Babic 	return cRetCode;
16983b8ac464SStefano Babic }
16993b8ac464SStefano Babic 
17003b8ac464SStefano Babic /*
17013b8ac464SStefano Babic  *
17023b8ac464SStefano Babic  * ispVMAmble
17033b8ac464SStefano Babic  *
17043b8ac464SStefano Babic  * This routine is to extract Header and Trailer parameter for SIR and
17053b8ac464SStefano Babic  * SDR operations.
17063b8ac464SStefano Babic  *
17073b8ac464SStefano Babic  * The Header and Trailer parameter are the pre-amble and post-amble bit
17083b8ac464SStefano Babic  * stream need to be shifted into TDI or out of TDO of the devices. Mostly
17093b8ac464SStefano Babic  * is for the purpose of bypassing the leading or trailing devices. ispVM
17103b8ac464SStefano Babic  * supports only shifting data into TDI to bypass the devices.
17113b8ac464SStefano Babic  *
17123b8ac464SStefano Babic  * For a single device, the header and trailer parameters are all set to 0
17133b8ac464SStefano Babic  * as default by ispVM. If it is for multiple devices, the header and trailer
17143b8ac464SStefano Babic  * value will change as specified by the VME file.
17153b8ac464SStefano Babic  *
17163b8ac464SStefano Babic  */
17173b8ac464SStefano Babic 
ispVMAmble(signed char Code)17183b8ac464SStefano Babic signed char ispVMAmble(signed char Code)
17193b8ac464SStefano Babic {
17203b8ac464SStefano Babic 	signed char compress = 0;
17213b8ac464SStefano Babic 	/* 09/11/07 NN Type cast mismatch variables */
17223b8ac464SStefano Babic 	g_usiDataSize = (unsigned short)ispVMDataSize();
17233b8ac464SStefano Babic 
17243b8ac464SStefano Babic #ifdef DEBUG
17253b8ac464SStefano Babic 	printf("%d", g_usiDataSize);
17263b8ac464SStefano Babic #endif /* DEBUG */
17273b8ac464SStefano Babic 
17283b8ac464SStefano Babic 	if (g_usiDataSize) {
17293b8ac464SStefano Babic 
17303b8ac464SStefano Babic 		/*
17313b8ac464SStefano Babic 		 * Discard the TDI byte and set the compression bit in the data
17323b8ac464SStefano Babic 		 * type register to false if compression is set because TDI data
17333b8ac464SStefano Babic 		 * after HIR/HDR/TIR/TDR is not compressed.
17343b8ac464SStefano Babic 		 */
17353b8ac464SStefano Babic 
17363b8ac464SStefano Babic 		GetByte();
17373b8ac464SStefano Babic 		if (g_usDataType & COMPRESS) {
17383b8ac464SStefano Babic 			g_usDataType &= ~(COMPRESS);
17393b8ac464SStefano Babic 			compress = 1;
17403b8ac464SStefano Babic 		}
17413b8ac464SStefano Babic 	}
17423b8ac464SStefano Babic 
17433b8ac464SStefano Babic 	switch (Code) {
17443b8ac464SStefano Babic 	case HIR:
17453b8ac464SStefano Babic 
17463b8ac464SStefano Babic 		/*
17473b8ac464SStefano Babic 		 * Store the maximum size of the HIR buffer.
17483b8ac464SStefano Babic 		 * Used to convert VME to HEX.
17493b8ac464SStefano Babic 		 */
17503b8ac464SStefano Babic 
17513b8ac464SStefano Babic 		if (g_usiDataSize > g_usHIRSize) {
17523b8ac464SStefano Babic 			g_usHIRSize = g_usiDataSize;
17533b8ac464SStefano Babic 		}
17543b8ac464SStefano Babic 
17553b8ac464SStefano Babic 		/*
17563b8ac464SStefano Babic 		 * Assign the HIR value and allocate memory.
17573b8ac464SStefano Babic 		 */
17583b8ac464SStefano Babic 
17593b8ac464SStefano Babic 		g_usHeadIR = g_usiDataSize;
17603b8ac464SStefano Babic 		if (g_usHeadIR) {
17613b8ac464SStefano Babic 			ispVMMemManager(HIR, g_usHeadIR);
17623b8ac464SStefano Babic 			ispVMData(g_pucHIRData);
17633b8ac464SStefano Babic 
17643b8ac464SStefano Babic #ifdef DEBUG
17653b8ac464SStefano Babic 			puts(" TDI ");
17663b8ac464SStefano Babic 			PrintData(g_usHeadIR, g_pucHIRData);
17673b8ac464SStefano Babic #endif /* DEBUG */
17683b8ac464SStefano Babic 		}
17693b8ac464SStefano Babic 		break;
17703b8ac464SStefano Babic 	case TIR:
17713b8ac464SStefano Babic 
17723b8ac464SStefano Babic 		/*
17733b8ac464SStefano Babic 		 * Store the maximum size of the TIR buffer.
17743b8ac464SStefano Babic 		 * Used to convert VME to HEX.
17753b8ac464SStefano Babic 		 */
17763b8ac464SStefano Babic 
17773b8ac464SStefano Babic 		if (g_usiDataSize > g_usTIRSize) {
17783b8ac464SStefano Babic 			g_usTIRSize = g_usiDataSize;
17793b8ac464SStefano Babic 		}
17803b8ac464SStefano Babic 
17813b8ac464SStefano Babic 		/*
17823b8ac464SStefano Babic 		 * Assign the TIR value and allocate memory.
17833b8ac464SStefano Babic 		 */
17843b8ac464SStefano Babic 
17853b8ac464SStefano Babic 		g_usTailIR = g_usiDataSize;
17863b8ac464SStefano Babic 		if (g_usTailIR) {
17873b8ac464SStefano Babic 			ispVMMemManager(TIR, g_usTailIR);
17883b8ac464SStefano Babic 			ispVMData(g_pucTIRData);
17893b8ac464SStefano Babic 
17903b8ac464SStefano Babic #ifdef DEBUG
17913b8ac464SStefano Babic 			puts(" TDI ");
17923b8ac464SStefano Babic 			PrintData(g_usTailIR, g_pucTIRData);
17933b8ac464SStefano Babic #endif /* DEBUG */
17943b8ac464SStefano Babic 		}
17953b8ac464SStefano Babic 		break;
17963b8ac464SStefano Babic 	case HDR:
17973b8ac464SStefano Babic 
17983b8ac464SStefano Babic 		/*
17993b8ac464SStefano Babic 		 * Store the maximum size of the HDR buffer.
18003b8ac464SStefano Babic 		 * Used to convert VME to HEX.
18013b8ac464SStefano Babic 		 */
18023b8ac464SStefano Babic 
18033b8ac464SStefano Babic 		if (g_usiDataSize > g_usHDRSize) {
18043b8ac464SStefano Babic 			g_usHDRSize = g_usiDataSize;
18053b8ac464SStefano Babic 		}
18063b8ac464SStefano Babic 
18073b8ac464SStefano Babic 		/*
18083b8ac464SStefano Babic 		 * Assign the HDR value and allocate memory.
18093b8ac464SStefano Babic 		 *
18103b8ac464SStefano Babic 		 */
18113b8ac464SStefano Babic 
18123b8ac464SStefano Babic 		g_usHeadDR = g_usiDataSize;
18133b8ac464SStefano Babic 		if (g_usHeadDR) {
18143b8ac464SStefano Babic 			ispVMMemManager(HDR, g_usHeadDR);
18153b8ac464SStefano Babic 			ispVMData(g_pucHDRData);
18163b8ac464SStefano Babic 
18173b8ac464SStefano Babic #ifdef DEBUG
18183b8ac464SStefano Babic 			puts(" TDI ");
18193b8ac464SStefano Babic 			PrintData(g_usHeadDR, g_pucHDRData);
18203b8ac464SStefano Babic #endif /* DEBUG */
18213b8ac464SStefano Babic 		}
18223b8ac464SStefano Babic 		break;
18233b8ac464SStefano Babic 	case TDR:
18243b8ac464SStefano Babic 
18253b8ac464SStefano Babic 		/*
18263b8ac464SStefano Babic 		 * Store the maximum size of the TDR buffer.
18273b8ac464SStefano Babic 		 * Used to convert VME to HEX.
18283b8ac464SStefano Babic 		 */
18293b8ac464SStefano Babic 
18303b8ac464SStefano Babic 		if (g_usiDataSize > g_usTDRSize) {
18313b8ac464SStefano Babic 			g_usTDRSize = g_usiDataSize;
18323b8ac464SStefano Babic 		}
18333b8ac464SStefano Babic 
18343b8ac464SStefano Babic 		/*
18353b8ac464SStefano Babic 		 * Assign the TDR value and allocate memory.
18363b8ac464SStefano Babic 		 *
18373b8ac464SStefano Babic 		 */
18383b8ac464SStefano Babic 
18393b8ac464SStefano Babic 		g_usTailDR = g_usiDataSize;
18403b8ac464SStefano Babic 		if (g_usTailDR) {
18413b8ac464SStefano Babic 			ispVMMemManager(TDR, g_usTailDR);
18423b8ac464SStefano Babic 			ispVMData(g_pucTDRData);
18433b8ac464SStefano Babic 
18443b8ac464SStefano Babic #ifdef DEBUG
18453b8ac464SStefano Babic 			puts(" TDI ");
18463b8ac464SStefano Babic 			PrintData(g_usTailDR, g_pucTDRData);
18473b8ac464SStefano Babic #endif /* DEBUG */
18483b8ac464SStefano Babic 		}
18493b8ac464SStefano Babic 		break;
18503b8ac464SStefano Babic 	default:
18513b8ac464SStefano Babic 		break;
18523b8ac464SStefano Babic 	}
18533b8ac464SStefano Babic 
18543b8ac464SStefano Babic 	/*
18553b8ac464SStefano Babic 	*
18563b8ac464SStefano Babic 	* Re-enable compression if it was previously set.
18573b8ac464SStefano Babic 	*
18583b8ac464SStefano Babic 	**/
18593b8ac464SStefano Babic 
18603b8ac464SStefano Babic 	if (compress) {
18613b8ac464SStefano Babic 		g_usDataType |= COMPRESS;
18623b8ac464SStefano Babic 	}
18633b8ac464SStefano Babic 
18643b8ac464SStefano Babic 	if (g_usiDataSize) {
18653b8ac464SStefano Babic 		Code = GetByte();
18663b8ac464SStefano Babic 		if (Code == CONTINUE) {
18673b8ac464SStefano Babic 			return 0;
18683b8ac464SStefano Babic 		} else {
18693b8ac464SStefano Babic 
18703b8ac464SStefano Babic 			/*
18713b8ac464SStefano Babic 			 * Encountered invalid opcode.
18723b8ac464SStefano Babic 			 */
18733b8ac464SStefano Babic 
18743b8ac464SStefano Babic 			return VME_INVALID_FILE;
18753b8ac464SStefano Babic 		}
18763b8ac464SStefano Babic 	}
18773b8ac464SStefano Babic 
18783b8ac464SStefano Babic 	return 0;
18793b8ac464SStefano Babic }
18803b8ac464SStefano Babic 
18813b8ac464SStefano Babic /*
18823b8ac464SStefano Babic  *
18833b8ac464SStefano Babic  * ispVMLoop
18843b8ac464SStefano Babic  *
18853b8ac464SStefano Babic  * Perform the function call upon by the REPEAT opcode.
18863b8ac464SStefano Babic  * Memory is to be allocated to store the entire loop from REPEAT to ENDLOOP.
18873b8ac464SStefano Babic  * After the loop is stored then execution begin. The REPEATLOOP flag is set
18883b8ac464SStefano Babic  * on the g_usFlowControl register to indicate the repeat loop is in session
18893b8ac464SStefano Babic  * and therefore fetch opcode from the memory instead of from the file.
18903b8ac464SStefano Babic  *
18913b8ac464SStefano Babic  */
18923b8ac464SStefano Babic 
ispVMLoop(unsigned short a_usLoopCount)18933b8ac464SStefano Babic signed char ispVMLoop(unsigned short a_usLoopCount)
18943b8ac464SStefano Babic {
18953b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
18963b8ac464SStefano Babic 	signed char cRetCode      = 0;
18973b8ac464SStefano Babic 	unsigned short iHeapIndex = 0;
18983b8ac464SStefano Babic 	unsigned short iLoopIndex = 0;
18993b8ac464SStefano Babic 
19003b8ac464SStefano Babic 	g_usShiftValue = 0;
19013b8ac464SStefano Babic 	for (iHeapIndex = 0; iHeapIndex < g_iHEAPSize; iHeapIndex++) {
19023b8ac464SStefano Babic 		g_pucHeapMemory[iHeapIndex] = GetByte();
19033b8ac464SStefano Babic 	}
19043b8ac464SStefano Babic 
19053b8ac464SStefano Babic 	if (g_pucHeapMemory[iHeapIndex - 1] != ENDLOOP) {
19063b8ac464SStefano Babic 		return VME_INVALID_FILE;
19073b8ac464SStefano Babic 	}
19083b8ac464SStefano Babic 
19093b8ac464SStefano Babic 	g_usFlowControl |= REPEATLOOP;
19103b8ac464SStefano Babic 	g_usDataType |= HEAP_IN;
19113b8ac464SStefano Babic 
19123b8ac464SStefano Babic 	for (iLoopIndex = 0; iLoopIndex < a_usLoopCount; iLoopIndex++) {
19133b8ac464SStefano Babic 		g_iHeapCounter = 0;
19143b8ac464SStefano Babic 		cRetCode = ispVMCode();
19153b8ac464SStefano Babic 		g_usRepeatLoops++;
19163b8ac464SStefano Babic 		if (cRetCode < 0) {
19173b8ac464SStefano Babic 			break;
19183b8ac464SStefano Babic 		}
19193b8ac464SStefano Babic 	}
19203b8ac464SStefano Babic 
19213b8ac464SStefano Babic 	g_usDataType &= ~(HEAP_IN);
19223b8ac464SStefano Babic 	g_usFlowControl &= ~(REPEATLOOP);
19233b8ac464SStefano Babic 	return cRetCode;
19243b8ac464SStefano Babic }
19253b8ac464SStefano Babic 
19263b8ac464SStefano Babic /*
19273b8ac464SStefano Babic  *
19283b8ac464SStefano Babic  * ispVMBitShift
19293b8ac464SStefano Babic  *
19303b8ac464SStefano Babic  * Shift the TDI stream left or right by the number of bits. The data in
19313b8ac464SStefano Babic  * *g_pucInData is of the VME format, so the actual shifting is the reverse of
19323b8ac464SStefano Babic  * IEEE 1532 or SVF format.
19333b8ac464SStefano Babic  *
19343b8ac464SStefano Babic  */
19353b8ac464SStefano Babic 
ispVMBitShift(signed char mode,unsigned short bits)19363b8ac464SStefano Babic signed char ispVMBitShift(signed char mode, unsigned short bits)
19373b8ac464SStefano Babic {
19383b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
19393b8ac464SStefano Babic 	unsigned short i       = 0;
19403b8ac464SStefano Babic 	unsigned short size    = 0;
19413b8ac464SStefano Babic 	unsigned short tmpbits = 0;
19423b8ac464SStefano Babic 
19433b8ac464SStefano Babic 	if (g_usiDataSize % 8 > 0) {
19443b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
19453b8ac464SStefano Babic 		size = (unsigned short)(g_usiDataSize / 8 + 1);
19463b8ac464SStefano Babic 	} else {
19473b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
19483b8ac464SStefano Babic 		size = (unsigned short)(g_usiDataSize / 8);
19493b8ac464SStefano Babic 	}
19503b8ac464SStefano Babic 
19513b8ac464SStefano Babic 	switch (mode) {
19523b8ac464SStefano Babic 	case SHR:
19533b8ac464SStefano Babic 		for (i = 0; i < size; i++) {
19543b8ac464SStefano Babic 			if (g_pucInData[i] != 0) {
19553b8ac464SStefano Babic 				tmpbits = bits;
19563b8ac464SStefano Babic 				while (tmpbits > 0) {
19573b8ac464SStefano Babic 					g_pucInData[i] <<= 1;
19583b8ac464SStefano Babic 					if (g_pucInData[i] == 0) {
19593b8ac464SStefano Babic 						i--;
19603b8ac464SStefano Babic 						g_pucInData[i] = 1;
19613b8ac464SStefano Babic 					}
19623b8ac464SStefano Babic 					tmpbits--;
19633b8ac464SStefano Babic 				}
19643b8ac464SStefano Babic 			}
19653b8ac464SStefano Babic 		}
19663b8ac464SStefano Babic 		break;
19673b8ac464SStefano Babic 	case SHL:
19683b8ac464SStefano Babic 		for (i = 0; i < size; i++) {
19693b8ac464SStefano Babic 			if (g_pucInData[i] != 0) {
19703b8ac464SStefano Babic 				tmpbits = bits;
19713b8ac464SStefano Babic 				while (tmpbits > 0) {
19723b8ac464SStefano Babic 					g_pucInData[i] >>= 1;
19733b8ac464SStefano Babic 					if (g_pucInData[i] == 0) {
19743b8ac464SStefano Babic 						i--;
19753b8ac464SStefano Babic 						g_pucInData[i] = 8;
19763b8ac464SStefano Babic 					}
19773b8ac464SStefano Babic 					tmpbits--;
19783b8ac464SStefano Babic 				}
19793b8ac464SStefano Babic 			}
19803b8ac464SStefano Babic 		}
19813b8ac464SStefano Babic 		break;
19823b8ac464SStefano Babic 	default:
19833b8ac464SStefano Babic 		return VME_INVALID_FILE;
19843b8ac464SStefano Babic 	}
19853b8ac464SStefano Babic 
19863b8ac464SStefano Babic 	return 0;
19873b8ac464SStefano Babic }
19883b8ac464SStefano Babic 
19893b8ac464SStefano Babic /*
19903b8ac464SStefano Babic  *
19913b8ac464SStefano Babic  * ispVMComment
19923b8ac464SStefano Babic  *
19933b8ac464SStefano Babic  * Displays the SVF comments.
19943b8ac464SStefano Babic  *
19953b8ac464SStefano Babic  */
19963b8ac464SStefano Babic 
ispVMComment(unsigned short a_usCommentSize)19973b8ac464SStefano Babic void ispVMComment(unsigned short a_usCommentSize)
19983b8ac464SStefano Babic {
19993b8ac464SStefano Babic 	char cCurByte = 0;
20003b8ac464SStefano Babic 	for (; a_usCommentSize > 0; a_usCommentSize--) {
20013b8ac464SStefano Babic 		/*
20023b8ac464SStefano Babic 		*
20033b8ac464SStefano Babic 		* Print character to the terminal.
20043b8ac464SStefano Babic 		*
20053b8ac464SStefano Babic 		**/
20063b8ac464SStefano Babic 		cCurByte = GetByte();
20073b8ac464SStefano Babic 		vme_out_char(cCurByte);
20083b8ac464SStefano Babic 	}
20093b8ac464SStefano Babic 	cCurByte = '\n';
20103b8ac464SStefano Babic 	vme_out_char(cCurByte);
20113b8ac464SStefano Babic }
20123b8ac464SStefano Babic 
20133b8ac464SStefano Babic /*
20143b8ac464SStefano Babic  *
20153b8ac464SStefano Babic  * ispVMHeader
20163b8ac464SStefano Babic  *
20173b8ac464SStefano Babic  * Iterate the length of the header and discard it.
20183b8ac464SStefano Babic  *
20193b8ac464SStefano Babic  */
20203b8ac464SStefano Babic 
ispVMHeader(unsigned short a_usHeaderSize)20213b8ac464SStefano Babic void ispVMHeader(unsigned short a_usHeaderSize)
20223b8ac464SStefano Babic {
20233b8ac464SStefano Babic 	for (; a_usHeaderSize > 0; a_usHeaderSize--) {
20243b8ac464SStefano Babic 		GetByte();
20253b8ac464SStefano Babic 	}
20263b8ac464SStefano Babic }
20273b8ac464SStefano Babic 
20283b8ac464SStefano Babic /*
20293b8ac464SStefano Babic  *
20303b8ac464SStefano Babic  * ispVMCalculateCRC32
20313b8ac464SStefano Babic  *
20323b8ac464SStefano Babic  * Calculate the 32-bit CRC.
20333b8ac464SStefano Babic  *
20343b8ac464SStefano Babic  */
20353b8ac464SStefano Babic 
ispVMCalculateCRC32(unsigned char a_ucData)20363b8ac464SStefano Babic void ispVMCalculateCRC32(unsigned char a_ucData)
20373b8ac464SStefano Babic {
20383b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
20393b8ac464SStefano Babic 	unsigned char ucIndex          = 0;
20403b8ac464SStefano Babic 	unsigned char ucFlipData       = 0;
20413b8ac464SStefano Babic 	unsigned short usCRCTableEntry = 0;
20423b8ac464SStefano Babic 	unsigned int crc_table[16] = {
20433b8ac464SStefano Babic 		0x0000, 0xCC01, 0xD801,
20443b8ac464SStefano Babic 		0x1400, 0xF001, 0x3C00,
20453b8ac464SStefano Babic 		0x2800, 0xE401, 0xA001,
20463b8ac464SStefano Babic 		0x6C00, 0x7800, 0xB401,
20473b8ac464SStefano Babic 		0x5000, 0x9C01, 0x8801,
20483b8ac464SStefano Babic 		0x4400
20493b8ac464SStefano Babic 	};
20503b8ac464SStefano Babic 
20513b8ac464SStefano Babic 	for (ucIndex = 0; ucIndex < 8; ucIndex++) {
20523b8ac464SStefano Babic 		ucFlipData <<= 1;
20533b8ac464SStefano Babic 		if (a_ucData & 0x01) {
20543b8ac464SStefano Babic 			ucFlipData |= 0x01;
20553b8ac464SStefano Babic 		}
20563b8ac464SStefano Babic 		a_ucData >>= 1;
20573b8ac464SStefano Babic 	}
20583b8ac464SStefano Babic 
20593b8ac464SStefano Babic 	/* 09/11/07 NN Type cast mismatch variables */
20603b8ac464SStefano Babic 	usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]);
20613b8ac464SStefano Babic 	g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF);
20623b8ac464SStefano Babic 	g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^
20633b8ac464SStefano Babic 			usCRCTableEntry ^ crc_table[ucFlipData & 0xF]);
20643b8ac464SStefano Babic 	usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]);
20653b8ac464SStefano Babic 	g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF);
20663b8ac464SStefano Babic 	g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^
20673b8ac464SStefano Babic 		usCRCTableEntry ^ crc_table[(ucFlipData >> 4) & 0xF]);
20683b8ac464SStefano Babic }
20693b8ac464SStefano Babic 
20703b8ac464SStefano Babic /*
20713b8ac464SStefano Babic  *
20723b8ac464SStefano Babic  * ispVMLCOUNT
20733b8ac464SStefano Babic  *
20743b8ac464SStefano Babic  * Process the intelligent programming loops.
20753b8ac464SStefano Babic  *
20763b8ac464SStefano Babic  */
20773b8ac464SStefano Babic 
ispVMLCOUNT(unsigned short a_usCountSize)20783b8ac464SStefano Babic signed char ispVMLCOUNT(unsigned short a_usCountSize)
20793b8ac464SStefano Babic {
20803b8ac464SStefano Babic 	unsigned short usContinue	  = 1;
20813b8ac464SStefano Babic 	unsigned short usIntelBufferIndex = 0;
20823b8ac464SStefano Babic 	unsigned short usCountIndex       = 0;
20833b8ac464SStefano Babic 	signed char cRetCode              = 0;
20843b8ac464SStefano Babic 	signed char cRepeatHeap           = 0;
20853b8ac464SStefano Babic 	signed char cOpcode               = 0;
20863b8ac464SStefano Babic 	unsigned char ucState             = 0;
20873b8ac464SStefano Babic 	unsigned short usDelay            = 0;
20883b8ac464SStefano Babic 	unsigned short usToggle           = 0;
20893b8ac464SStefano Babic 
20903b8ac464SStefano Babic 	g_usIntelBufferSize = (unsigned short)ispVMDataSize();
20913b8ac464SStefano Babic 
20923b8ac464SStefano Babic 	/*
20933b8ac464SStefano Babic 	 * Allocate memory for intel buffer.
20943b8ac464SStefano Babic 	 *
20953b8ac464SStefano Babic 	 */
20963b8ac464SStefano Babic 
20973b8ac464SStefano Babic 	ispVMMemManager(LHEAP, g_usIntelBufferSize);
20983b8ac464SStefano Babic 
20993b8ac464SStefano Babic 	/*
21003b8ac464SStefano Babic 	 * Store the maximum size of the intelligent buffer.
21013b8ac464SStefano Babic 	 * Used to convert VME to HEX.
21023b8ac464SStefano Babic 	 */
21033b8ac464SStefano Babic 
21043b8ac464SStefano Babic 	if (g_usIntelBufferSize > g_usLCOUNTSize) {
21053b8ac464SStefano Babic 		g_usLCOUNTSize = g_usIntelBufferSize;
21063b8ac464SStefano Babic 	}
21073b8ac464SStefano Babic 
21083b8ac464SStefano Babic 	/*
21093b8ac464SStefano Babic 	 * Copy intel data to the buffer.
21103b8ac464SStefano Babic 	 */
21113b8ac464SStefano Babic 
21123b8ac464SStefano Babic 	for (usIntelBufferIndex = 0; usIntelBufferIndex < g_usIntelBufferSize;
21133b8ac464SStefano Babic 		usIntelBufferIndex++) {
21143b8ac464SStefano Babic 		g_pucIntelBuffer[usIntelBufferIndex] = GetByte();
21153b8ac464SStefano Babic 	}
21163b8ac464SStefano Babic 
21173b8ac464SStefano Babic 	/*
21183b8ac464SStefano Babic 	 * Set the data type register to get data from the intelligent
21193b8ac464SStefano Babic 	 * data buffer.
21203b8ac464SStefano Babic 	 */
21213b8ac464SStefano Babic 
21223b8ac464SStefano Babic 	g_usDataType |= LHEAP_IN;
21233b8ac464SStefano Babic 
21243b8ac464SStefano Babic 	/*
21253b8ac464SStefano Babic 	*
21263b8ac464SStefano Babic 	* If the HEAP_IN flag is set, temporarily unset the flag so data will be
21273b8ac464SStefano Babic 	* retrieved from the status buffer.
21283b8ac464SStefano Babic 	*
21293b8ac464SStefano Babic 	**/
21303b8ac464SStefano Babic 
21313b8ac464SStefano Babic 	if (g_usDataType & HEAP_IN) {
21323b8ac464SStefano Babic 		g_usDataType &= ~HEAP_IN;
21333b8ac464SStefano Babic 		cRepeatHeap = 1;
21343b8ac464SStefano Babic 	}
21353b8ac464SStefano Babic 
21363b8ac464SStefano Babic #ifdef DEBUG
21373b8ac464SStefano Babic 	printf("LCOUNT %d;\n", a_usCountSize);
21383b8ac464SStefano Babic #endif /* DEBUG */
21393b8ac464SStefano Babic 
21403b8ac464SStefano Babic 	/*
21413b8ac464SStefano Babic 	 * Iterate through the intelligent programming command.
21423b8ac464SStefano Babic 	*/
21433b8ac464SStefano Babic 
21443b8ac464SStefano Babic 	for (usCountIndex = 0; usCountIndex < a_usCountSize; usCountIndex++) {
21453b8ac464SStefano Babic 
21463b8ac464SStefano Babic 		/*
21473b8ac464SStefano Babic 		*
21483b8ac464SStefano Babic 		* Initialize the intel data index to 0 before each iteration.
21493b8ac464SStefano Babic 		*
21503b8ac464SStefano Babic 		**/
21513b8ac464SStefano Babic 
21523b8ac464SStefano Babic 		g_usIntelDataIndex = 0;
21533b8ac464SStefano Babic 		cOpcode            = 0;
21543b8ac464SStefano Babic 		ucState            = 0;
21553b8ac464SStefano Babic 		usDelay            = 0;
21563b8ac464SStefano Babic 		usToggle           = 0;
21573b8ac464SStefano Babic 		usContinue		   = 1;
21583b8ac464SStefano Babic 
21593b8ac464SStefano Babic 		/*
21603b8ac464SStefano Babic 		*
21613b8ac464SStefano Babic 		* Begin looping through all the VME opcodes.
21623b8ac464SStefano Babic 		*
21633b8ac464SStefano Babic 		*/
21643b8ac464SStefano Babic 		/*
21653b8ac464SStefano Babic 		* 4/1/09 Nguyen replaced the recursive function call codes on
21663b8ac464SStefano Babic 		*        the ispVMLCOUNT function
21673b8ac464SStefano Babic 		*
21683b8ac464SStefano Babic 		*/
21693b8ac464SStefano Babic 		while (usContinue) {
21703b8ac464SStefano Babic 			cOpcode = GetByte();
21713b8ac464SStefano Babic 			switch (cOpcode) {
21723b8ac464SStefano Babic 			case HIR:
21733b8ac464SStefano Babic 			case TIR:
21743b8ac464SStefano Babic 			case HDR:
21753b8ac464SStefano Babic 			case TDR:
21763b8ac464SStefano Babic 				/*
21773b8ac464SStefano Babic 				 * Set the header/trailer of the device in order
21783b8ac464SStefano Babic 				 * to bypass successfully.
21793b8ac464SStefano Babic 				 */
21803b8ac464SStefano Babic 
21813b8ac464SStefano Babic 				ispVMAmble(cOpcode);
21823b8ac464SStefano Babic 			break;
21833b8ac464SStefano Babic 			case STATE:
21843b8ac464SStefano Babic 
21853b8ac464SStefano Babic 				/*
21863b8ac464SStefano Babic 				 * Step the JTAG state machine.
21873b8ac464SStefano Babic 				 */
21883b8ac464SStefano Babic 
21893b8ac464SStefano Babic 				ucState = GetByte();
21903b8ac464SStefano Babic 				/*
21913b8ac464SStefano Babic 				 * Step the JTAG state machine to DRCAPTURE
21923b8ac464SStefano Babic 				 * to support Looping.
21933b8ac464SStefano Babic 				 */
21943b8ac464SStefano Babic 
21953b8ac464SStefano Babic 				if ((g_usDataType & LHEAP_IN) &&
21963b8ac464SStefano Babic 					 (ucState == DRPAUSE) &&
21973b8ac464SStefano Babic 					 (g_cCurrentJTAGState == ucState)) {
21983b8ac464SStefano Babic 					ispVMStateMachine(DRCAPTURE);
21993b8ac464SStefano Babic 				}
22003b8ac464SStefano Babic 				ispVMStateMachine(ucState);
22013b8ac464SStefano Babic #ifdef DEBUG
22023b8ac464SStefano Babic 				printf("LDELAY %s ", GetState(ucState));
22033b8ac464SStefano Babic #endif /* DEBUG */
22043b8ac464SStefano Babic 				break;
22053b8ac464SStefano Babic 			case SIR:
22063b8ac464SStefano Babic #ifdef DEBUG
22073b8ac464SStefano Babic 				printf("SIR ");
22083b8ac464SStefano Babic #endif /* DEBUG */
22093b8ac464SStefano Babic 				/*
22103b8ac464SStefano Babic 				 * Shift in data into the device.
22113b8ac464SStefano Babic 				 */
22123b8ac464SStefano Babic 
22133b8ac464SStefano Babic 				cRetCode = ispVMShift(cOpcode);
22143b8ac464SStefano Babic 				break;
22153b8ac464SStefano Babic 			case SDR:
22163b8ac464SStefano Babic 
22173b8ac464SStefano Babic #ifdef DEBUG
22183b8ac464SStefano Babic 				printf("LSDR ");
22193b8ac464SStefano Babic #endif /* DEBUG */
22203b8ac464SStefano Babic 				/*
22213b8ac464SStefano Babic 				 * Shift in data into the device.
22223b8ac464SStefano Babic 				 */
22233b8ac464SStefano Babic 
22243b8ac464SStefano Babic 				cRetCode = ispVMShift(cOpcode);
22253b8ac464SStefano Babic 				break;
22263b8ac464SStefano Babic 			case WAIT:
22273b8ac464SStefano Babic 
22283b8ac464SStefano Babic 				/*
22293b8ac464SStefano Babic 				*
22303b8ac464SStefano Babic 				* Observe delay.
22313b8ac464SStefano Babic 				*
22323b8ac464SStefano Babic 				*/
22333b8ac464SStefano Babic 
22343b8ac464SStefano Babic 				usDelay = (unsigned short)ispVMDataSize();
22353b8ac464SStefano Babic 				ispVMDelay(usDelay);
22363b8ac464SStefano Babic 
22373b8ac464SStefano Babic #ifdef DEBUG
22383b8ac464SStefano Babic 				if (usDelay & 0x8000) {
22393b8ac464SStefano Babic 
22403b8ac464SStefano Babic 					/*
22413b8ac464SStefano Babic 					 * Since MSB is set, the delay time must
22423b8ac464SStefano Babic 					 * be decoded to millisecond. The
22433b8ac464SStefano Babic 					 * SVF2VME encodes the MSB to represent
22443b8ac464SStefano Babic 					 * millisecond.
22453b8ac464SStefano Babic 					 */
22463b8ac464SStefano Babic 
22473b8ac464SStefano Babic 					usDelay &= ~0x8000;
22483b8ac464SStefano Babic 					printf("%.2E SEC;\n",
22493b8ac464SStefano Babic 						(float) usDelay / 1000);
22503b8ac464SStefano Babic 				} else {
22513b8ac464SStefano Babic 					/*
22523b8ac464SStefano Babic 					 * Since MSB is not set, the delay time
22533b8ac464SStefano Babic 					 * is given as microseconds.
22543b8ac464SStefano Babic 					 */
22553b8ac464SStefano Babic 
22563b8ac464SStefano Babic 					printf("%.2E SEC;\n",
22573b8ac464SStefano Babic 						(float) usDelay / 1000000);
22583b8ac464SStefano Babic 				}
22593b8ac464SStefano Babic #endif /* DEBUG */
22603b8ac464SStefano Babic 				break;
22613b8ac464SStefano Babic 			case TCK:
22623b8ac464SStefano Babic 
22633b8ac464SStefano Babic 				/*
22643b8ac464SStefano Babic 				 * Issue clock toggles.
22653b8ac464SStefano Babic 				 */
22663b8ac464SStefano Babic 
22673b8ac464SStefano Babic 				usToggle = (unsigned short)ispVMDataSize();
22683b8ac464SStefano Babic 				ispVMClocks(usToggle);
22693b8ac464SStefano Babic 
22703b8ac464SStefano Babic #ifdef DEBUG
22713b8ac464SStefano Babic 				printf("RUNTEST %d TCK;\n", usToggle);
22723b8ac464SStefano Babic #endif /* DEBUG */
22733b8ac464SStefano Babic 				break;
22743b8ac464SStefano Babic 			case ENDLOOP:
22753b8ac464SStefano Babic 
22763b8ac464SStefano Babic 				/*
22773b8ac464SStefano Babic 				 * Exit point from processing loops.
22783b8ac464SStefano Babic 				 */
22793b8ac464SStefano Babic 				usContinue = 0;
22803b8ac464SStefano Babic 				break;
22813b8ac464SStefano Babic 
22823b8ac464SStefano Babic 			case COMMENT:
22833b8ac464SStefano Babic 
22843b8ac464SStefano Babic 				/*
22853b8ac464SStefano Babic 				 * Display comment.
22863b8ac464SStefano Babic 				 */
22873b8ac464SStefano Babic 
22883b8ac464SStefano Babic 				ispVMComment((unsigned short) ispVMDataSize());
22893b8ac464SStefano Babic 				break;
22903b8ac464SStefano Babic 			case ispEN:
22913b8ac464SStefano Babic 				ucState = GetByte();
22923b8ac464SStefano Babic 				if ((ucState == ON) || (ucState == 0x01))
22933b8ac464SStefano Babic 					writePort(g_ucPinENABLE, 0x01);
22943b8ac464SStefano Babic 				else
22953b8ac464SStefano Babic 					writePort(g_ucPinENABLE, 0x00);
22963b8ac464SStefano Babic 				ispVMDelay(1);
22973b8ac464SStefano Babic 				break;
22983b8ac464SStefano Babic 			case TRST:
22993b8ac464SStefano Babic 				if (GetByte() == 0x01)
23003b8ac464SStefano Babic 					writePort(g_ucPinTRST, 0x01);
23013b8ac464SStefano Babic 				else
23023b8ac464SStefano Babic 					writePort(g_ucPinTRST, 0x00);
23033b8ac464SStefano Babic 				ispVMDelay(1);
23043b8ac464SStefano Babic 				break;
23053b8ac464SStefano Babic 			default:
23063b8ac464SStefano Babic 
23073b8ac464SStefano Babic 				/*
23083b8ac464SStefano Babic 				 * Invalid opcode encountered.
23093b8ac464SStefano Babic 				 */
23103b8ac464SStefano Babic 
23113b8ac464SStefano Babic 				debug("\nINVALID OPCODE: 0x%.2X\n", cOpcode);
23123b8ac464SStefano Babic 
23133b8ac464SStefano Babic 				return VME_INVALID_FILE;
23143b8ac464SStefano Babic 			}
23153b8ac464SStefano Babic 		}
23163b8ac464SStefano Babic 		if (cRetCode >= 0) {
23173b8ac464SStefano Babic 			/*
23183b8ac464SStefano Babic 			 * Break if intelligent programming is successful.
23193b8ac464SStefano Babic 			 */
23203b8ac464SStefano Babic 
23213b8ac464SStefano Babic 			break;
23223b8ac464SStefano Babic 		}
23233b8ac464SStefano Babic 
23243b8ac464SStefano Babic 	}
23253b8ac464SStefano Babic 	/*
23263b8ac464SStefano Babic 	 * If HEAP_IN flag was temporarily disabled,
23273b8ac464SStefano Babic 	 * re-enable it before exiting
23283b8ac464SStefano Babic 	 */
23293b8ac464SStefano Babic 
23303b8ac464SStefano Babic 	if (cRepeatHeap) {
23313b8ac464SStefano Babic 		g_usDataType |= HEAP_IN;
23323b8ac464SStefano Babic 	}
23333b8ac464SStefano Babic 
23343b8ac464SStefano Babic 	/*
23353b8ac464SStefano Babic 	 * Set the data type register to not get data from the
23363b8ac464SStefano Babic 	 * intelligent data buffer.
23373b8ac464SStefano Babic 	 */
23383b8ac464SStefano Babic 
23393b8ac464SStefano Babic 	g_usDataType &= ~LHEAP_IN;
23403b8ac464SStefano Babic 	return cRetCode;
23413b8ac464SStefano Babic }
23423b8ac464SStefano Babic /*
23433b8ac464SStefano Babic  *
23443b8ac464SStefano Babic  * ispVMClocks
23453b8ac464SStefano Babic  *
23463b8ac464SStefano Babic  * Applies the specified number of pulses to TCK.
23473b8ac464SStefano Babic  *
23483b8ac464SStefano Babic  */
23493b8ac464SStefano Babic 
ispVMClocks(unsigned short Clocks)23503b8ac464SStefano Babic void ispVMClocks(unsigned short Clocks)
23513b8ac464SStefano Babic {
23523b8ac464SStefano Babic 	unsigned short iClockIndex = 0;
23533b8ac464SStefano Babic 	for (iClockIndex = 0; iClockIndex < Clocks; iClockIndex++) {
23543b8ac464SStefano Babic 		sclock();
23553b8ac464SStefano Babic 	}
23563b8ac464SStefano Babic }
23573b8ac464SStefano Babic 
23583b8ac464SStefano Babic /*
23593b8ac464SStefano Babic  *
23603b8ac464SStefano Babic  * ispVMBypass
23613b8ac464SStefano Babic  *
23623b8ac464SStefano Babic  * This procedure takes care of the HIR, HDR, TIR, TDR for the
23633b8ac464SStefano Babic  * purpose of putting the other devices into Bypass mode. The
23643b8ac464SStefano Babic  * current state is checked to find out if it is at DRPAUSE or
23653b8ac464SStefano Babic  * IRPAUSE. If it is at DRPAUSE, perform bypass register scan.
23663b8ac464SStefano Babic  * If it is at IRPAUSE, scan into instruction registers the bypass
23673b8ac464SStefano Babic  * instruction.
23683b8ac464SStefano Babic  *
23693b8ac464SStefano Babic  */
23703b8ac464SStefano Babic 
ispVMBypass(signed char ScanType,unsigned short Bits)23713b8ac464SStefano Babic void ispVMBypass(signed char ScanType, unsigned short Bits)
23723b8ac464SStefano Babic {
23733b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
23743b8ac464SStefano Babic 	unsigned short iIndex       = 0;
23753b8ac464SStefano Babic 	unsigned short iSourceIndex = 0;
23763b8ac464SStefano Babic 	unsigned char cBitState     = 0;
23773b8ac464SStefano Babic 	unsigned char cCurByte      = 0;
23783b8ac464SStefano Babic 	unsigned char *pcSource    = NULL;
23793b8ac464SStefano Babic 
23803b8ac464SStefano Babic 	if (Bits <= 0) {
23813b8ac464SStefano Babic 		return;
23823b8ac464SStefano Babic 	}
23833b8ac464SStefano Babic 
23843b8ac464SStefano Babic 	switch (ScanType) {
23853b8ac464SStefano Babic 	case HIR:
23863b8ac464SStefano Babic 		pcSource = g_pucHIRData;
23873b8ac464SStefano Babic 		break;
23883b8ac464SStefano Babic 	case TIR:
23893b8ac464SStefano Babic 		pcSource = g_pucTIRData;
23903b8ac464SStefano Babic 		break;
23913b8ac464SStefano Babic 	case HDR:
23923b8ac464SStefano Babic 		pcSource = g_pucHDRData;
23933b8ac464SStefano Babic 		break;
23943b8ac464SStefano Babic 	case TDR:
23953b8ac464SStefano Babic 		pcSource = g_pucTDRData;
23963b8ac464SStefano Babic 		break;
23973b8ac464SStefano Babic 	default:
23983b8ac464SStefano Babic 		break;
23993b8ac464SStefano Babic 	}
24003b8ac464SStefano Babic 
24013b8ac464SStefano Babic 	iSourceIndex = 0;
24023b8ac464SStefano Babic 	cBitState = 0;
24033b8ac464SStefano Babic 	for (iIndex = 0; iIndex < Bits - 1; iIndex++) {
24043b8ac464SStefano Babic 		/* Scan instruction or bypass register */
24053b8ac464SStefano Babic 		if (iIndex % 8 == 0) {
24063b8ac464SStefano Babic 			cCurByte = pcSource[iSourceIndex++];
24073b8ac464SStefano Babic 		}
24083b8ac464SStefano Babic 		cBitState = (unsigned char) (((cCurByte << iIndex % 8) & 0x80)
24093b8ac464SStefano Babic 			? 0x01 : 0x00);
24103b8ac464SStefano Babic 		writePort(g_ucPinTDI, cBitState);
24113b8ac464SStefano Babic 		sclock();
24123b8ac464SStefano Babic 	}
24133b8ac464SStefano Babic 
24143b8ac464SStefano Babic 	if (iIndex % 8 == 0)  {
24153b8ac464SStefano Babic 		cCurByte = pcSource[iSourceIndex++];
24163b8ac464SStefano Babic 	}
24173b8ac464SStefano Babic 
24183b8ac464SStefano Babic 	cBitState = (unsigned char) (((cCurByte << iIndex % 8) & 0x80)
24193b8ac464SStefano Babic 		? 0x01 : 0x00);
24203b8ac464SStefano Babic 	writePort(g_ucPinTDI, cBitState);
24213b8ac464SStefano Babic }
24223b8ac464SStefano Babic 
24233b8ac464SStefano Babic /*
24243b8ac464SStefano Babic  *
24253b8ac464SStefano Babic  * ispVMStateMachine
24263b8ac464SStefano Babic  *
24273b8ac464SStefano Babic  * This procedure steps all devices in the daisy chain from a given
24283b8ac464SStefano Babic  * JTAG state to the next desirable state. If the next state is TLR,
24293b8ac464SStefano Babic  * the JTAG state machine is brute forced into TLR by driving TMS
24303b8ac464SStefano Babic  * high and pulse TCK 6 times.
24313b8ac464SStefano Babic  *
24323b8ac464SStefano Babic  */
24333b8ac464SStefano Babic 
ispVMStateMachine(signed char cNextJTAGState)24343b8ac464SStefano Babic void ispVMStateMachine(signed char cNextJTAGState)
24353b8ac464SStefano Babic {
24363b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
24373b8ac464SStefano Babic 	signed char cPathIndex  = 0;
24383b8ac464SStefano Babic 	signed char cStateIndex = 0;
24393b8ac464SStefano Babic 
24403b8ac464SStefano Babic 	if ((g_cCurrentJTAGState == cNextJTAGState) &&
24413b8ac464SStefano Babic 		(cNextJTAGState != RESET)) {
24423b8ac464SStefano Babic 		return;
24433b8ac464SStefano Babic 	}
24443b8ac464SStefano Babic 
24453b8ac464SStefano Babic 	for (cStateIndex = 0; cStateIndex < 25; cStateIndex++) {
24463b8ac464SStefano Babic 		if ((g_cCurrentJTAGState ==
24473b8ac464SStefano Babic 			 g_JTAGTransistions[cStateIndex].CurState) &&
24483b8ac464SStefano Babic 			(cNextJTAGState ==
24493b8ac464SStefano Babic 				 g_JTAGTransistions[cStateIndex].NextState)) {
24503b8ac464SStefano Babic 			break;
24513b8ac464SStefano Babic 		}
24523b8ac464SStefano Babic 	}
24533b8ac464SStefano Babic 
24543b8ac464SStefano Babic 	g_cCurrentJTAGState = cNextJTAGState;
24553b8ac464SStefano Babic 	for (cPathIndex = 0;
24563b8ac464SStefano Babic 		cPathIndex < g_JTAGTransistions[cStateIndex].Pulses;
24573b8ac464SStefano Babic 		cPathIndex++) {
24583b8ac464SStefano Babic 		if ((g_JTAGTransistions[cStateIndex].Pattern << cPathIndex)
24593b8ac464SStefano Babic 			& 0x80) {
24603b8ac464SStefano Babic 			writePort(g_ucPinTMS, (unsigned char) 0x01);
24613b8ac464SStefano Babic 		} else {
24623b8ac464SStefano Babic 			writePort(g_ucPinTMS, (unsigned char) 0x00);
24633b8ac464SStefano Babic 		}
24643b8ac464SStefano Babic 		sclock();
24653b8ac464SStefano Babic 	}
24663b8ac464SStefano Babic 
24673b8ac464SStefano Babic 	writePort(g_ucPinTDI, 0x00);
24683b8ac464SStefano Babic 	writePort(g_ucPinTMS, 0x00);
24693b8ac464SStefano Babic }
24703b8ac464SStefano Babic 
24713b8ac464SStefano Babic /*
24723b8ac464SStefano Babic  *
24733b8ac464SStefano Babic  * ispVMStart
24743b8ac464SStefano Babic  *
24753b8ac464SStefano Babic  * Enable the port to the device and set the state to RESET (TLR).
24763b8ac464SStefano Babic  *
24773b8ac464SStefano Babic  */
24783b8ac464SStefano Babic 
ispVMStart()24793b8ac464SStefano Babic void ispVMStart()
24803b8ac464SStefano Babic {
24813b8ac464SStefano Babic #ifdef DEBUG
24823b8ac464SStefano Babic 	printf("// ISPVM EMBEDDED ADDED\n");
24833b8ac464SStefano Babic 	printf("STATE RESET;\n");
24843b8ac464SStefano Babic #endif
24853b8ac464SStefano Babic 	g_usFlowControl	= 0;
24863b8ac464SStefano Babic 	g_usDataType = g_uiChecksumIndex = g_cCurrentJTAGState = 0;
24873b8ac464SStefano Babic 	g_usHeadDR = g_usHeadIR = g_usTailDR = g_usTailIR = 0;
24883b8ac464SStefano Babic 	g_usMaxSize = g_usShiftValue = g_usRepeatLoops = 0;
24893b8ac464SStefano Babic 	g_usTDOSize =  g_usMASKSize = g_usTDISize = 0;
24903b8ac464SStefano Babic 	g_usDMASKSize = g_usLCOUNTSize = g_usHDRSize = 0;
24913b8ac464SStefano Babic 	g_usTDRSize = g_usHIRSize = g_usTIRSize =  g_usHeapSize	= 0;
24923b8ac464SStefano Babic 	g_pLVDSList = NULL;
24933b8ac464SStefano Babic 	g_usLVDSPairCount = 0;
24943b8ac464SStefano Babic 	previous_size = 0;
24953b8ac464SStefano Babic 
24963b8ac464SStefano Babic 	ispVMStateMachine(RESET);    /*step devices to RESET state*/
24973b8ac464SStefano Babic }
24983b8ac464SStefano Babic 
24993b8ac464SStefano Babic /*
25003b8ac464SStefano Babic  *
25013b8ac464SStefano Babic  * ispVMEnd
25023b8ac464SStefano Babic  *
25033b8ac464SStefano Babic  * Set the state of devices to RESET to enable the devices and disable
25043b8ac464SStefano Babic  * the port.
25053b8ac464SStefano Babic  *
25063b8ac464SStefano Babic  */
25073b8ac464SStefano Babic 
ispVMEnd()25083b8ac464SStefano Babic void ispVMEnd()
25093b8ac464SStefano Babic {
25103b8ac464SStefano Babic #ifdef DEBUG
25113b8ac464SStefano Babic 	printf("// ISPVM EMBEDDED ADDED\n");
25123b8ac464SStefano Babic 	printf("STATE RESET;\n");
25133b8ac464SStefano Babic 	printf("RUNTEST 1.00E-001 SEC;\n");
25143b8ac464SStefano Babic #endif
25153b8ac464SStefano Babic 
25163b8ac464SStefano Babic 	ispVMStateMachine(RESET);   /*step devices to RESET state */
25173b8ac464SStefano Babic 	ispVMDelay(1000);              /*wake up devices*/
25183b8ac464SStefano Babic }
25193b8ac464SStefano Babic 
25203b8ac464SStefano Babic /*
25213b8ac464SStefano Babic  *
25223b8ac464SStefano Babic  * ispVMSend
25233b8ac464SStefano Babic  *
25243b8ac464SStefano Babic  * Send the TDI data stream to devices. The data stream can be
25253b8ac464SStefano Babic  * instructions or data.
25263b8ac464SStefano Babic  *
25273b8ac464SStefano Babic  */
25283b8ac464SStefano Babic 
ispVMSend(unsigned short a_usiDataSize)25293b8ac464SStefano Babic signed char ispVMSend(unsigned short a_usiDataSize)
25303b8ac464SStefano Babic {
25313b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
25323b8ac464SStefano Babic 	unsigned short iIndex       = 0;
25333b8ac464SStefano Babic 	unsigned short iInDataIndex = 0;
25343b8ac464SStefano Babic 	unsigned char cCurByte      = 0;
25353b8ac464SStefano Babic 	unsigned char cBitState     = 0;
25363b8ac464SStefano Babic 
25373b8ac464SStefano Babic 	for (iIndex = 0; iIndex < a_usiDataSize - 1; iIndex++) {
25383b8ac464SStefano Babic 		if (iIndex % 8 == 0) {
25393b8ac464SStefano Babic 			cCurByte = g_pucInData[iInDataIndex++];
25403b8ac464SStefano Babic 		}
25413b8ac464SStefano Babic 		cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80)
25423b8ac464SStefano Babic 			? 0x01 : 0x00);
25433b8ac464SStefano Babic 		writePort(g_ucPinTDI, cBitState);
25443b8ac464SStefano Babic 		sclock();
25453b8ac464SStefano Babic 	}
25463b8ac464SStefano Babic 
25473b8ac464SStefano Babic 	if (iIndex % 8 == 0) {
25483b8ac464SStefano Babic 		/* Take care of the last bit */
25493b8ac464SStefano Babic 		cCurByte = g_pucInData[iInDataIndex];
25503b8ac464SStefano Babic 	}
25513b8ac464SStefano Babic 
25523b8ac464SStefano Babic 	cBitState = (unsigned char) (((cCurByte << iIndex % 8) & 0x80)
25533b8ac464SStefano Babic 		? 0x01 : 0x00);
25543b8ac464SStefano Babic 
25553b8ac464SStefano Babic 	writePort(g_ucPinTDI, cBitState);
25563b8ac464SStefano Babic 	if (g_usFlowControl & CASCADE) {
25573b8ac464SStefano Babic 		/*1/15/04 Clock in last bit for the first n-1 cascaded frames */
25583b8ac464SStefano Babic 		sclock();
25593b8ac464SStefano Babic 	}
25603b8ac464SStefano Babic 
25613b8ac464SStefano Babic 	return 0;
25623b8ac464SStefano Babic }
25633b8ac464SStefano Babic 
25643b8ac464SStefano Babic /*
25653b8ac464SStefano Babic  *
25663b8ac464SStefano Babic  * ispVMRead
25673b8ac464SStefano Babic  *
25683b8ac464SStefano Babic  * Read the data stream from devices and verify.
25693b8ac464SStefano Babic  *
25703b8ac464SStefano Babic  */
25713b8ac464SStefano Babic 
ispVMRead(unsigned short a_usiDataSize)25723b8ac464SStefano Babic signed char ispVMRead(unsigned short a_usiDataSize)
25733b8ac464SStefano Babic {
25743b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
25753b8ac464SStefano Babic 	unsigned short usDataSizeIndex    = 0;
25763b8ac464SStefano Babic 	unsigned short usErrorCount       = 0;
25773b8ac464SStefano Babic 	unsigned short usLastBitIndex     = 0;
25783b8ac464SStefano Babic 	unsigned char cDataByte           = 0;
25793b8ac464SStefano Babic 	unsigned char cMaskByte           = 0;
25803b8ac464SStefano Babic 	unsigned char cInDataByte         = 0;
25813b8ac464SStefano Babic 	unsigned char cCurBit             = 0;
25823b8ac464SStefano Babic 	unsigned char cByteIndex          = 0;
25833b8ac464SStefano Babic 	unsigned short usBufferIndex      = 0;
25843b8ac464SStefano Babic 	unsigned char ucDisplayByte       = 0x00;
25853b8ac464SStefano Babic 	unsigned char ucDisplayFlag       = 0x01;
25863b8ac464SStefano Babic 	char StrChecksum[256]            = {0};
25873b8ac464SStefano Babic 	unsigned char g_usCalculateChecksum = 0x00;
25883b8ac464SStefano Babic 
25893b8ac464SStefano Babic 	/* 09/11/07 NN Type cast mismatch variables */
25903b8ac464SStefano Babic 	usLastBitIndex = (unsigned short)(a_usiDataSize - 1);
25913b8ac464SStefano Babic 
25923b8ac464SStefano Babic #ifndef DEBUG
25933b8ac464SStefano Babic 	/*
25943b8ac464SStefano Babic 	 * If mask is not all zeros, then set the display flag to 0x00,
25953b8ac464SStefano Babic 	 * otherwise it shall be set to 0x01 to indicate that data read
25963b8ac464SStefano Babic 	 * from the device shall be displayed. If DEBUG is defined,
25973b8ac464SStefano Babic 	 * always display data.
25983b8ac464SStefano Babic 	 */
25993b8ac464SStefano Babic 
26003b8ac464SStefano Babic 	for (usDataSizeIndex = 0; usDataSizeIndex < (a_usiDataSize + 7) / 8;
26013b8ac464SStefano Babic 		usDataSizeIndex++) {
26023b8ac464SStefano Babic 		if (g_usDataType & MASK_DATA) {
26033b8ac464SStefano Babic 			if (g_pucOutMaskData[usDataSizeIndex] != 0x00) {
26043b8ac464SStefano Babic 				ucDisplayFlag = 0x00;
26053b8ac464SStefano Babic 				break;
26063b8ac464SStefano Babic 			}
26073b8ac464SStefano Babic 		} else if (g_usDataType & CMASK_DATA) {
26083b8ac464SStefano Babic 			g_usCalculateChecksum = 0x01;
26093b8ac464SStefano Babic 			ucDisplayFlag = 0x00;
26103b8ac464SStefano Babic 			break;
26113b8ac464SStefano Babic 		} else {
26123b8ac464SStefano Babic 			ucDisplayFlag = 0x00;
26133b8ac464SStefano Babic 			break;
26143b8ac464SStefano Babic 		}
26153b8ac464SStefano Babic 	}
26163b8ac464SStefano Babic #endif /* DEBUG */
26173b8ac464SStefano Babic 
26183b8ac464SStefano Babic 	/*
26193b8ac464SStefano Babic 	*
26203b8ac464SStefano Babic 	* Begin shifting data in and out of the device.
26213b8ac464SStefano Babic 	*
26223b8ac464SStefano Babic 	**/
26233b8ac464SStefano Babic 
26243b8ac464SStefano Babic 	for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize;
26253b8ac464SStefano Babic 		usDataSizeIndex++) {
26263b8ac464SStefano Babic 		if (cByteIndex == 0) {
26273b8ac464SStefano Babic 
26283b8ac464SStefano Babic 			/*
26293b8ac464SStefano Babic 			 * Grab byte from TDO buffer.
26303b8ac464SStefano Babic 			 */
26313b8ac464SStefano Babic 
26323b8ac464SStefano Babic 			if (g_usDataType & TDO_DATA) {
26333b8ac464SStefano Babic 				cDataByte = g_pucOutData[usBufferIndex];
26343b8ac464SStefano Babic 			}
26353b8ac464SStefano Babic 
26363b8ac464SStefano Babic 			/*
26373b8ac464SStefano Babic 			 * Grab byte from MASK buffer.
26383b8ac464SStefano Babic 			 */
26393b8ac464SStefano Babic 
26403b8ac464SStefano Babic 			if (g_usDataType & MASK_DATA) {
26413b8ac464SStefano Babic 				cMaskByte = g_pucOutMaskData[usBufferIndex];
26423b8ac464SStefano Babic 			} else {
26433b8ac464SStefano Babic 				cMaskByte = 0xFF;
26443b8ac464SStefano Babic 			}
26453b8ac464SStefano Babic 
26463b8ac464SStefano Babic 			/*
26473b8ac464SStefano Babic 			 * Grab byte from CMASK buffer.
26483b8ac464SStefano Babic 			 */
26493b8ac464SStefano Babic 
26503b8ac464SStefano Babic 			if (g_usDataType & CMASK_DATA) {
26513b8ac464SStefano Babic 				cMaskByte = 0x00;
26523b8ac464SStefano Babic 				g_usCalculateChecksum = 0x01;
26533b8ac464SStefano Babic 			}
26543b8ac464SStefano Babic 
26553b8ac464SStefano Babic 			/*
26563b8ac464SStefano Babic 			 * Grab byte from TDI buffer.
26573b8ac464SStefano Babic 			 */
26583b8ac464SStefano Babic 
26593b8ac464SStefano Babic 			if (g_usDataType & TDI_DATA) {
26603b8ac464SStefano Babic 				cInDataByte = g_pucInData[usBufferIndex];
26613b8ac464SStefano Babic 			}
26623b8ac464SStefano Babic 
26633b8ac464SStefano Babic 			usBufferIndex++;
26643b8ac464SStefano Babic 		}
26653b8ac464SStefano Babic 
26663b8ac464SStefano Babic 		cCurBit = readPort();
26673b8ac464SStefano Babic 
26683b8ac464SStefano Babic 		if (ucDisplayFlag) {
26693b8ac464SStefano Babic 			ucDisplayByte <<= 1;
26703b8ac464SStefano Babic 			ucDisplayByte |= cCurBit;
26713b8ac464SStefano Babic 		}
26723b8ac464SStefano Babic 
26733b8ac464SStefano Babic 		/*
26743b8ac464SStefano Babic 		 * Check if data read from port matches with expected TDO.
26753b8ac464SStefano Babic 		 */
26763b8ac464SStefano Babic 
26773b8ac464SStefano Babic 		if (g_usDataType & TDO_DATA) {
26783b8ac464SStefano Babic 			/* 08/28/08 NN Added Calculate checksum support. */
26793b8ac464SStefano Babic 			if (g_usCalculateChecksum) {
26803b8ac464SStefano Babic 				if (cCurBit == 0x01)
26813b8ac464SStefano Babic 					g_usChecksum +=
26823b8ac464SStefano Babic 						(1 << (g_uiChecksumIndex % 8));
26833b8ac464SStefano Babic 				g_uiChecksumIndex++;
26843b8ac464SStefano Babic 			} else {
26853b8ac464SStefano Babic 				if ((((cMaskByte << cByteIndex) & 0x80)
26863b8ac464SStefano Babic 					? 0x01 : 0x00)) {
26873b8ac464SStefano Babic 					if (cCurBit != (unsigned char)
26883b8ac464SStefano Babic 					(((cDataByte << cByteIndex) & 0x80)
26893b8ac464SStefano Babic 						? 0x01 : 0x00)) {
26903b8ac464SStefano Babic 						usErrorCount++;
26913b8ac464SStefano Babic 					}
26923b8ac464SStefano Babic 				}
26933b8ac464SStefano Babic 			}
26943b8ac464SStefano Babic 		}
26953b8ac464SStefano Babic 
26963b8ac464SStefano Babic 		/*
26973b8ac464SStefano Babic 		 * Write TDI data to the port.
26983b8ac464SStefano Babic 		 */
26993b8ac464SStefano Babic 
27003b8ac464SStefano Babic 		writePort(g_ucPinTDI,
27013b8ac464SStefano Babic 			(unsigned char)(((cInDataByte << cByteIndex) & 0x80)
27023b8ac464SStefano Babic 				? 0x01 : 0x00));
27033b8ac464SStefano Babic 
27043b8ac464SStefano Babic 		if (usDataSizeIndex < usLastBitIndex) {
27053b8ac464SStefano Babic 
27063b8ac464SStefano Babic 			/*
27073b8ac464SStefano Babic 			 * Clock data out from the data shift register.
27083b8ac464SStefano Babic 			 */
27093b8ac464SStefano Babic 
27103b8ac464SStefano Babic 			sclock();
27113b8ac464SStefano Babic 		} else if (g_usFlowControl & CASCADE) {
27123b8ac464SStefano Babic 
27133b8ac464SStefano Babic 			/*
27143b8ac464SStefano Babic 			 * Clock in last bit for the first N - 1 cascaded frames
27153b8ac464SStefano Babic 			 */
27163b8ac464SStefano Babic 
27173b8ac464SStefano Babic 			sclock();
27183b8ac464SStefano Babic 		}
27193b8ac464SStefano Babic 
27203b8ac464SStefano Babic 		/*
27213b8ac464SStefano Babic 		 * Increment the byte index. If it exceeds 7, then reset it back
27223b8ac464SStefano Babic 		 * to zero.
27233b8ac464SStefano Babic 		 */
27243b8ac464SStefano Babic 
27253b8ac464SStefano Babic 		cByteIndex++;
27263b8ac464SStefano Babic 		if (cByteIndex >= 8) {
27273b8ac464SStefano Babic 			if (ucDisplayFlag) {
27283b8ac464SStefano Babic 
27293b8ac464SStefano Babic 			/*
27303b8ac464SStefano Babic 			 * Store displayed data in the TDO buffer. By reusing
27313b8ac464SStefano Babic 			 * the TDO buffer to store displayed data, there is no
27323b8ac464SStefano Babic 			 * need to allocate a buffer simply to hold display
27333b8ac464SStefano Babic 			 * data. This will not cause any false verification
27343b8ac464SStefano Babic 			 * errors because the true TDO byte has already
27353b8ac464SStefano Babic 			 * been consumed.
27363b8ac464SStefano Babic 			 */
27373b8ac464SStefano Babic 
27383b8ac464SStefano Babic 				g_pucOutData[usBufferIndex - 1] = ucDisplayByte;
27393b8ac464SStefano Babic 				ucDisplayByte = 0;
27403b8ac464SStefano Babic 			}
27413b8ac464SStefano Babic 
27423b8ac464SStefano Babic 			cByteIndex = 0;
27433b8ac464SStefano Babic 		}
27443b8ac464SStefano Babic 		/* 09/12/07 Nguyen changed to display the 1 bit expected data */
27453b8ac464SStefano Babic 		else if (a_usiDataSize == 1) {
27463b8ac464SStefano Babic 			if (ucDisplayFlag) {
27473b8ac464SStefano Babic 
27483b8ac464SStefano Babic 				/*
27493b8ac464SStefano Babic 				 * Store displayed data in the TDO buffer.
27503b8ac464SStefano Babic 				 * By reusing the TDO buffer to store displayed
27513b8ac464SStefano Babic 				 * data, there is no need to allocate
27523b8ac464SStefano Babic 				 * a buffer simply to hold display data. This
27533b8ac464SStefano Babic 				 * will not cause any false verification errors
27543b8ac464SStefano Babic 				 * because the true TDO byte has already
27553b8ac464SStefano Babic 				 * been consumed.
27563b8ac464SStefano Babic 				 */
27573b8ac464SStefano Babic 
27583b8ac464SStefano Babic 				/*
27593b8ac464SStefano Babic 				 * Flip ucDisplayByte and store it in cDataByte.
27603b8ac464SStefano Babic 				 */
27613b8ac464SStefano Babic 				cDataByte = 0x00;
27623b8ac464SStefano Babic 				for (usBufferIndex = 0; usBufferIndex < 8;
27633b8ac464SStefano Babic 					usBufferIndex++) {
27643b8ac464SStefano Babic 					cDataByte <<= 1;
27653b8ac464SStefano Babic 					if (ucDisplayByte & 0x01) {
27663b8ac464SStefano Babic 						cDataByte |= 0x01;
27673b8ac464SStefano Babic 					}
27683b8ac464SStefano Babic 					ucDisplayByte >>= 1;
27693b8ac464SStefano Babic 				}
27703b8ac464SStefano Babic 				g_pucOutData[0] = cDataByte;
27713b8ac464SStefano Babic 				ucDisplayByte = 0;
27723b8ac464SStefano Babic 			}
27733b8ac464SStefano Babic 
27743b8ac464SStefano Babic 			cByteIndex = 0;
27753b8ac464SStefano Babic 		}
27763b8ac464SStefano Babic 	}
27773b8ac464SStefano Babic 
27783b8ac464SStefano Babic 	if (ucDisplayFlag) {
27793b8ac464SStefano Babic 
27803b8ac464SStefano Babic #ifdef DEBUG
27813b8ac464SStefano Babic 		debug("RECEIVED TDO (");
27823b8ac464SStefano Babic #else
27833b8ac464SStefano Babic 		vme_out_string("Display Data: 0x");
27843b8ac464SStefano Babic #endif /* DEBUG */
27853b8ac464SStefano Babic 
27863b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
27873b8ac464SStefano Babic 		for (usDataSizeIndex = (unsigned short)
27883b8ac464SStefano Babic 				((a_usiDataSize + 7) / 8);
27893b8ac464SStefano Babic 			usDataSizeIndex > 0 ; usDataSizeIndex--) {
27903b8ac464SStefano Babic 			cMaskByte = g_pucOutData[usDataSizeIndex - 1];
27913b8ac464SStefano Babic 			cDataByte = 0x00;
27923b8ac464SStefano Babic 
27933b8ac464SStefano Babic 			/*
27943b8ac464SStefano Babic 			 * Flip cMaskByte and store it in cDataByte.
27953b8ac464SStefano Babic 			 */
27963b8ac464SStefano Babic 
27973b8ac464SStefano Babic 			for (usBufferIndex = 0; usBufferIndex < 8;
27983b8ac464SStefano Babic 				usBufferIndex++) {
27993b8ac464SStefano Babic 				cDataByte <<= 1;
28003b8ac464SStefano Babic 				if (cMaskByte & 0x01) {
28013b8ac464SStefano Babic 					cDataByte |= 0x01;
28023b8ac464SStefano Babic 				}
28033b8ac464SStefano Babic 				cMaskByte >>= 1;
28043b8ac464SStefano Babic 			}
28053b8ac464SStefano Babic #ifdef DEBUG
28063b8ac464SStefano Babic 			printf("%.2X", cDataByte);
28073b8ac464SStefano Babic 			if ((((a_usiDataSize + 7) / 8) - usDataSizeIndex)
28083b8ac464SStefano Babic 				% 40 == 39) {
28093b8ac464SStefano Babic 				printf("\n\t\t");
28103b8ac464SStefano Babic 			}
28113b8ac464SStefano Babic #else
28123b8ac464SStefano Babic 			vme_out_hex(cDataByte);
28133b8ac464SStefano Babic #endif /* DEBUG */
28143b8ac464SStefano Babic 		}
28153b8ac464SStefano Babic 
28163b8ac464SStefano Babic #ifdef DEBUG
28173b8ac464SStefano Babic 		printf(")\n\n");
28183b8ac464SStefano Babic #else
28193b8ac464SStefano Babic 		vme_out_string("\n\n");
28203b8ac464SStefano Babic #endif /* DEBUG */
28213b8ac464SStefano Babic 		/* 09/02/08 Nguyen changed to display the data Checksum */
28223b8ac464SStefano Babic 		if (g_usChecksum != 0) {
28233b8ac464SStefano Babic 			g_usChecksum &= 0xFFFF;
28243b8ac464SStefano Babic 			sprintf(StrChecksum, "Data Checksum: %.4lX\n\n",
28253b8ac464SStefano Babic 				g_usChecksum);
28263b8ac464SStefano Babic 			vme_out_string(StrChecksum);
28273b8ac464SStefano Babic 			g_usChecksum = 0;
28283b8ac464SStefano Babic 		}
28293b8ac464SStefano Babic 	}
28303b8ac464SStefano Babic 
28313b8ac464SStefano Babic 	if (usErrorCount > 0) {
28323b8ac464SStefano Babic 		if (g_usFlowControl & VERIFYUES) {
28333b8ac464SStefano Babic 			vme_out_string(
28343b8ac464SStefano Babic 				"USERCODE verification failed.   "
28353b8ac464SStefano Babic 				"Continue programming......\n\n");
28363b8ac464SStefano Babic 			g_usFlowControl &= ~(VERIFYUES);
28373b8ac464SStefano Babic 			return 0;
28383b8ac464SStefano Babic 		} else {
28393b8ac464SStefano Babic 
28403b8ac464SStefano Babic #ifdef DEBUG
28413b8ac464SStefano Babic 			printf("TOTAL ERRORS: %d\n", usErrorCount);
28423b8ac464SStefano Babic #endif /* DEBUG */
28433b8ac464SStefano Babic 
28443b8ac464SStefano Babic 			return VME_VERIFICATION_FAILURE;
28453b8ac464SStefano Babic 		}
28463b8ac464SStefano Babic 	} else {
28473b8ac464SStefano Babic 		if (g_usFlowControl & VERIFYUES) {
28483b8ac464SStefano Babic 			vme_out_string("USERCODE verification passed.    "
28493b8ac464SStefano Babic 				"Programming aborted.\n\n");
28503b8ac464SStefano Babic 			g_usFlowControl &= ~(VERIFYUES);
28513b8ac464SStefano Babic 			return 1;
28523b8ac464SStefano Babic 		} else {
28533b8ac464SStefano Babic 			return 0;
28543b8ac464SStefano Babic 		}
28553b8ac464SStefano Babic 	}
28563b8ac464SStefano Babic }
28573b8ac464SStefano Babic 
28583b8ac464SStefano Babic /*
28593b8ac464SStefano Babic  *
28603b8ac464SStefano Babic  * ispVMReadandSave
28613b8ac464SStefano Babic  *
28623b8ac464SStefano Babic  * Support dynamic I/O.
28633b8ac464SStefano Babic  *
28643b8ac464SStefano Babic  */
28653b8ac464SStefano Babic 
ispVMReadandSave(unsigned short int a_usiDataSize)28663b8ac464SStefano Babic signed char ispVMReadandSave(unsigned short int a_usiDataSize)
28673b8ac464SStefano Babic {
28683b8ac464SStefano Babic 	/* 09/11/07 NN added local variables initialization */
28693b8ac464SStefano Babic 	unsigned short int usDataSizeIndex = 0;
28703b8ac464SStefano Babic 	unsigned short int usLastBitIndex  = 0;
28713b8ac464SStefano Babic 	unsigned short int usBufferIndex   = 0;
28723b8ac464SStefano Babic 	unsigned short int usOutBitIndex   = 0;
28733b8ac464SStefano Babic 	unsigned short int usLVDSIndex     = 0;
28743b8ac464SStefano Babic 	unsigned char cDataByte            = 0;
28753b8ac464SStefano Babic 	unsigned char cDMASKByte           = 0;
28763b8ac464SStefano Babic 	unsigned char cInDataByte          = 0;
28773b8ac464SStefano Babic 	unsigned char cCurBit              = 0;
28783b8ac464SStefano Babic 	unsigned char cByteIndex           = 0;
28793b8ac464SStefano Babic 	signed char cLVDSByteIndex         = 0;
28803b8ac464SStefano Babic 
28813b8ac464SStefano Babic 	/* 09/11/07 NN Type cast mismatch variables */
28823b8ac464SStefano Babic 	usLastBitIndex = (unsigned short) (a_usiDataSize - 1);
28833b8ac464SStefano Babic 
28843b8ac464SStefano Babic 	/*
28853b8ac464SStefano Babic 	*
28863b8ac464SStefano Babic 	* Iterate through the data bits.
28873b8ac464SStefano Babic 	*
28883b8ac464SStefano Babic 	*/
28893b8ac464SStefano Babic 
28903b8ac464SStefano Babic 	for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize;
28913b8ac464SStefano Babic 		usDataSizeIndex++) {
28923b8ac464SStefano Babic 		if (cByteIndex == 0) {
28933b8ac464SStefano Babic 
28943b8ac464SStefano Babic 			/*
28953b8ac464SStefano Babic 			 * Grab byte from DMASK buffer.
28963b8ac464SStefano Babic 			 */
28973b8ac464SStefano Babic 
28983b8ac464SStefano Babic 			if (g_usDataType & DMASK_DATA) {
28993b8ac464SStefano Babic 				cDMASKByte = g_pucOutDMaskData[usBufferIndex];
29003b8ac464SStefano Babic 			} else {
29013b8ac464SStefano Babic 				cDMASKByte = 0x00;
29023b8ac464SStefano Babic 			}
29033b8ac464SStefano Babic 
29043b8ac464SStefano Babic 			/*
29053b8ac464SStefano Babic 			 * Grab byte from TDI buffer.
29063b8ac464SStefano Babic 			 */
29073b8ac464SStefano Babic 
29083b8ac464SStefano Babic 			if (g_usDataType & TDI_DATA) {
29093b8ac464SStefano Babic 				cInDataByte = g_pucInData[usBufferIndex];
29103b8ac464SStefano Babic 			}
29113b8ac464SStefano Babic 
29123b8ac464SStefano Babic 			usBufferIndex++;
29133b8ac464SStefano Babic 		}
29143b8ac464SStefano Babic 
29153b8ac464SStefano Babic 		cCurBit = readPort();
29163b8ac464SStefano Babic 		cDataByte = (unsigned char)(((cInDataByte << cByteIndex) & 0x80)
29173b8ac464SStefano Babic 			? 0x01 : 0x00);
29183b8ac464SStefano Babic 
29193b8ac464SStefano Babic 		/*
29203b8ac464SStefano Babic 		 * Initialize the byte to be zero.
29213b8ac464SStefano Babic 		 */
29223b8ac464SStefano Babic 
29233b8ac464SStefano Babic 		if (usOutBitIndex % 8 == 0) {
29243b8ac464SStefano Babic 			g_pucOutData[usOutBitIndex / 8] = 0x00;
29253b8ac464SStefano Babic 		}
29263b8ac464SStefano Babic 
29273b8ac464SStefano Babic 		/*
29283b8ac464SStefano Babic 		 * Use TDI, DMASK, and device TDO to create new TDI (actually
29293b8ac464SStefano Babic 		 * stored in g_pucOutData).
29303b8ac464SStefano Babic 		 */
29313b8ac464SStefano Babic 
29323b8ac464SStefano Babic 		if ((((cDMASKByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) {
29333b8ac464SStefano Babic 
29343b8ac464SStefano Babic 			if (g_pLVDSList) {
29353b8ac464SStefano Babic 				for (usLVDSIndex = 0;
29363b8ac464SStefano Babic 					 usLVDSIndex < g_usLVDSPairCount;
29373b8ac464SStefano Babic 					usLVDSIndex++) {
29383b8ac464SStefano Babic 					if (g_pLVDSList[usLVDSIndex].
29393b8ac464SStefano Babic 						usNegativeIndex ==
29403b8ac464SStefano Babic 						usDataSizeIndex) {
29413b8ac464SStefano Babic 						g_pLVDSList[usLVDSIndex].
29423b8ac464SStefano Babic 							ucUpdate = 0x01;
29433b8ac464SStefano Babic 						break;
29443b8ac464SStefano Babic 					}
29453b8ac464SStefano Babic 				}
29463b8ac464SStefano Babic 			}
29473b8ac464SStefano Babic 
29483b8ac464SStefano Babic 			/*
29493b8ac464SStefano Babic 			 * DMASK bit is 1, use TDI.
29503b8ac464SStefano Babic 			 */
29513b8ac464SStefano Babic 
29523b8ac464SStefano Babic 			g_pucOutData[usOutBitIndex / 8] |= (unsigned char)
29533b8ac464SStefano Babic 				(((cDataByte & 0x1) ? 0x01 : 0x00) <<
29543b8ac464SStefano Babic 				(7 - usOutBitIndex % 8));
29553b8ac464SStefano Babic 		} else {
29563b8ac464SStefano Babic 
29573b8ac464SStefano Babic 			/*
29583b8ac464SStefano Babic 			 * DMASK bit is 0, use device TDO.
29593b8ac464SStefano Babic 			 */
29603b8ac464SStefano Babic 
29613b8ac464SStefano Babic 			g_pucOutData[usOutBitIndex / 8] |= (unsigned char)
29623b8ac464SStefano Babic 				(((cCurBit & 0x1) ? 0x01 : 0x00) <<
29633b8ac464SStefano Babic 				(7 - usOutBitIndex % 8));
29643b8ac464SStefano Babic 		}
29653b8ac464SStefano Babic 
29663b8ac464SStefano Babic 		/*
29673b8ac464SStefano Babic 		 * Shift in TDI in order to get TDO out.
29683b8ac464SStefano Babic 		 */
29693b8ac464SStefano Babic 
29703b8ac464SStefano Babic 		usOutBitIndex++;
29713b8ac464SStefano Babic 		writePort(g_ucPinTDI, cDataByte);
29723b8ac464SStefano Babic 		if (usDataSizeIndex < usLastBitIndex) {
29733b8ac464SStefano Babic 			sclock();
29743b8ac464SStefano Babic 		}
29753b8ac464SStefano Babic 
29763b8ac464SStefano Babic 		/*
29773b8ac464SStefano Babic 		 * Increment the byte index. If it exceeds 7, then reset it back
29783b8ac464SStefano Babic 		 * to zero.
29793b8ac464SStefano Babic 		 */
29803b8ac464SStefano Babic 
29813b8ac464SStefano Babic 		cByteIndex++;
29823b8ac464SStefano Babic 		if (cByteIndex >= 8) {
29833b8ac464SStefano Babic 			cByteIndex = 0;
29843b8ac464SStefano Babic 		}
29853b8ac464SStefano Babic 	}
29863b8ac464SStefano Babic 
29873b8ac464SStefano Babic 	/*
29883b8ac464SStefano Babic 	 * If g_pLVDSList exists and pairs need updating, then update
29893b8ac464SStefano Babic 	 * the negative-pair to receive the flipped positive-pair value.
29903b8ac464SStefano Babic 	 */
29913b8ac464SStefano Babic 
29923b8ac464SStefano Babic 	if (g_pLVDSList) {
29933b8ac464SStefano Babic 		for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount;
29943b8ac464SStefano Babic 			usLVDSIndex++) {
29953b8ac464SStefano Babic 			if (g_pLVDSList[usLVDSIndex].ucUpdate) {
29963b8ac464SStefano Babic 
29973b8ac464SStefano Babic 				/*
29983b8ac464SStefano Babic 				 * Read the positive value and flip it.
29993b8ac464SStefano Babic 				 */
30003b8ac464SStefano Babic 
30013b8ac464SStefano Babic 				cDataByte = (unsigned char)
30023b8ac464SStefano Babic 				 (((g_pucOutData[g_pLVDSList[usLVDSIndex].
30033b8ac464SStefano Babic 					usPositiveIndex / 8]
30043b8ac464SStefano Babic 					<< (g_pLVDSList[usLVDSIndex].
30053b8ac464SStefano Babic 					usPositiveIndex % 8)) & 0x80) ?
30063b8ac464SStefano Babic 					0x01 : 0x00);
30073b8ac464SStefano Babic 				/* 09/11/07 NN Type cast mismatch variables */
30083b8ac464SStefano Babic 				cDataByte = (unsigned char) (!cDataByte);
30093b8ac464SStefano Babic 
30103b8ac464SStefano Babic 				/*
30113b8ac464SStefano Babic 				 * Get the byte that needs modification.
30123b8ac464SStefano Babic 				 */
30133b8ac464SStefano Babic 
30143b8ac464SStefano Babic 				cInDataByte =
30153b8ac464SStefano Babic 				g_pucOutData[g_pLVDSList[usLVDSIndex].
30163b8ac464SStefano Babic 					usNegativeIndex / 8];
30173b8ac464SStefano Babic 
30183b8ac464SStefano Babic 				if (cDataByte) {
30193b8ac464SStefano Babic 
30203b8ac464SStefano Babic 					/*
30213b8ac464SStefano Babic 					 * Copy over the current byte and
30223b8ac464SStefano Babic 					 * set the negative bit to 1.
30233b8ac464SStefano Babic 					 */
30243b8ac464SStefano Babic 
30253b8ac464SStefano Babic 					cDataByte = 0x00;
30263b8ac464SStefano Babic 					for (cLVDSByteIndex = 7;
30273b8ac464SStefano Babic 						cLVDSByteIndex >= 0;
30283b8ac464SStefano Babic 						cLVDSByteIndex--) {
30293b8ac464SStefano Babic 						cDataByte <<= 1;
30303b8ac464SStefano Babic 						if (7 -
30313b8ac464SStefano Babic 						(g_pLVDSList[usLVDSIndex].
30323b8ac464SStefano Babic 							usNegativeIndex % 8) ==
30333b8ac464SStefano Babic 							cLVDSByteIndex) {
30343b8ac464SStefano Babic 
30353b8ac464SStefano Babic 							/*
30363b8ac464SStefano Babic 							 * Set negative bit to 1
30373b8ac464SStefano Babic 							 */
30383b8ac464SStefano Babic 
30393b8ac464SStefano Babic 							cDataByte |= 0x01;
30403b8ac464SStefano Babic 						} else if (cInDataByte & 0x80) {
30413b8ac464SStefano Babic 							cDataByte |= 0x01;
30423b8ac464SStefano Babic 						}
30433b8ac464SStefano Babic 
30443b8ac464SStefano Babic 						cInDataByte <<= 1;
30453b8ac464SStefano Babic 					}
30463b8ac464SStefano Babic 
30473b8ac464SStefano Babic 					/*
30483b8ac464SStefano Babic 					 * Store the modified byte.
30493b8ac464SStefano Babic 					 */
30503b8ac464SStefano Babic 
30513b8ac464SStefano Babic 					g_pucOutData[g_pLVDSList[usLVDSIndex].
30523b8ac464SStefano Babic 					usNegativeIndex / 8] = cDataByte;
30533b8ac464SStefano Babic 				} else {
30543b8ac464SStefano Babic 
30553b8ac464SStefano Babic 					/*
30563b8ac464SStefano Babic 					 * Copy over the current byte and set
30573b8ac464SStefano Babic 					 * the negative bit to 0.
30583b8ac464SStefano Babic 					 */
30593b8ac464SStefano Babic 
30603b8ac464SStefano Babic 					cDataByte = 0x00;
30613b8ac464SStefano Babic 					for (cLVDSByteIndex = 7;
30623b8ac464SStefano Babic 						cLVDSByteIndex >= 0;
30633b8ac464SStefano Babic 						cLVDSByteIndex--) {
30643b8ac464SStefano Babic 						cDataByte <<= 1;
30653b8ac464SStefano Babic 						if (7 -
30663b8ac464SStefano Babic 						(g_pLVDSList[usLVDSIndex].
30673b8ac464SStefano Babic 						usNegativeIndex % 8) ==
30683b8ac464SStefano Babic 						cLVDSByteIndex) {
30693b8ac464SStefano Babic 
30703b8ac464SStefano Babic 							/*
30713b8ac464SStefano Babic 							 * Set negative bit to 0
30723b8ac464SStefano Babic 							 */
30733b8ac464SStefano Babic 
30743b8ac464SStefano Babic 							cDataByte |= 0x00;
30753b8ac464SStefano Babic 						} else if (cInDataByte & 0x80) {
30763b8ac464SStefano Babic 							cDataByte |= 0x01;
30773b8ac464SStefano Babic 						}
30783b8ac464SStefano Babic 
30793b8ac464SStefano Babic 						cInDataByte <<= 1;
30803b8ac464SStefano Babic 					}
30813b8ac464SStefano Babic 
30823b8ac464SStefano Babic 					/*
30833b8ac464SStefano Babic 					 * Store the modified byte.
30843b8ac464SStefano Babic 					 */
30853b8ac464SStefano Babic 
30863b8ac464SStefano Babic 					g_pucOutData[g_pLVDSList[usLVDSIndex].
30873b8ac464SStefano Babic 					usNegativeIndex / 8] = cDataByte;
30883b8ac464SStefano Babic 				}
30893b8ac464SStefano Babic 
30903b8ac464SStefano Babic 				break;
30913b8ac464SStefano Babic 			}
30923b8ac464SStefano Babic 		}
30933b8ac464SStefano Babic 	}
30943b8ac464SStefano Babic 
30953b8ac464SStefano Babic 	return 0;
30963b8ac464SStefano Babic }
30973b8ac464SStefano Babic 
ispVMProcessLVDS(unsigned short a_usLVDSCount)30983b8ac464SStefano Babic signed char ispVMProcessLVDS(unsigned short a_usLVDSCount)
30993b8ac464SStefano Babic {
31003b8ac464SStefano Babic 	unsigned short usLVDSIndex = 0;
31013b8ac464SStefano Babic 
31023b8ac464SStefano Babic 	/*
31033b8ac464SStefano Babic 	 * Allocate memory to hold LVDS pairs.
31043b8ac464SStefano Babic 	 */
31053b8ac464SStefano Babic 
31063b8ac464SStefano Babic 	ispVMMemManager(LVDS, a_usLVDSCount);
31073b8ac464SStefano Babic 	g_usLVDSPairCount = a_usLVDSCount;
31083b8ac464SStefano Babic 
31093b8ac464SStefano Babic #ifdef DEBUG
31103b8ac464SStefano Babic 	printf("LVDS %d (", a_usLVDSCount);
31113b8ac464SStefano Babic #endif /* DEBUG */
31123b8ac464SStefano Babic 
31133b8ac464SStefano Babic 	/*
31143b8ac464SStefano Babic 	 * Iterate through each given LVDS pair.
31153b8ac464SStefano Babic 	 */
31163b8ac464SStefano Babic 
31173b8ac464SStefano Babic 	for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) {
31183b8ac464SStefano Babic 
31193b8ac464SStefano Babic 		/*
31203b8ac464SStefano Babic 		 * Assign the positive and negative indices of the LVDS pair.
31213b8ac464SStefano Babic 		 */
31223b8ac464SStefano Babic 
31233b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
31243b8ac464SStefano Babic 		g_pLVDSList[usLVDSIndex].usPositiveIndex =
31253b8ac464SStefano Babic 			(unsigned short) ispVMDataSize();
31263b8ac464SStefano Babic 		/* 09/11/07 NN Type cast mismatch variables */
31273b8ac464SStefano Babic 		g_pLVDSList[usLVDSIndex].usNegativeIndex =
31283b8ac464SStefano Babic 			(unsigned short)ispVMDataSize();
31293b8ac464SStefano Babic 
31303b8ac464SStefano Babic #ifdef DEBUG
31313b8ac464SStefano Babic 		if (usLVDSIndex < g_usLVDSPairCount - 1) {
31323b8ac464SStefano Babic 			printf("%d:%d, ",
31333b8ac464SStefano Babic 				g_pLVDSList[usLVDSIndex].usPositiveIndex,
31343b8ac464SStefano Babic 				g_pLVDSList[usLVDSIndex].usNegativeIndex);
31353b8ac464SStefano Babic 		} else {
31363b8ac464SStefano Babic 			printf("%d:%d",
31373b8ac464SStefano Babic 				g_pLVDSList[usLVDSIndex].usPositiveIndex,
31383b8ac464SStefano Babic 				g_pLVDSList[usLVDSIndex].usNegativeIndex);
31393b8ac464SStefano Babic 		}
31403b8ac464SStefano Babic #endif /* DEBUG */
31413b8ac464SStefano Babic 
31423b8ac464SStefano Babic 	}
31433b8ac464SStefano Babic 
31443b8ac464SStefano Babic #ifdef DEBUG
3145ea1e3f96Sxypron.glpk@gmx.de 	printf(");\n");
31463b8ac464SStefano Babic #endif /* DEBUG */
31473b8ac464SStefano Babic 
31483b8ac464SStefano Babic 	return 0;
31493b8ac464SStefano Babic }
3150