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