13b8ac464SStefano Babic /* 23b8ac464SStefano Babic * Porting to U-Boot: 33b8ac464SStefano Babic * 43b8ac464SStefano Babic * (C) Copyright 2010 53b8ac464SStefano Babic * Stefano Babic, DENX Software Engineering, sbabic@denx.de. 63b8ac464SStefano Babic * 73b8ac464SStefano Babic * Lattice's ispVME Embedded Tool to load Lattice's FPGA: 83b8ac464SStefano Babic * 93b8ac464SStefano Babic * Lattice Semiconductor Corp. Copyright 2009 103b8ac464SStefano Babic * 11*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 123b8ac464SStefano Babic */ 133b8ac464SStefano Babic 143b8ac464SStefano Babic #ifndef _VME_OPCODE_H 153b8ac464SStefano Babic #define _VME_OPCODE_H 163b8ac464SStefano Babic 173b8ac464SStefano Babic #define VME_VERSION_NUMBER "12.1" 183b8ac464SStefano Babic 193b8ac464SStefano Babic /* Maximum declarations. */ 203b8ac464SStefano Babic 213b8ac464SStefano Babic #define VMEHEXMAX 60000L /* The hex file is split 60K per file. */ 223b8ac464SStefano Babic #define SCANMAX 64000L /* The maximum SDR/SIR burst. */ 233b8ac464SStefano Babic 243b8ac464SStefano Babic /* 253b8ac464SStefano Babic * 263b8ac464SStefano Babic * Supported JTAG state transitions. 273b8ac464SStefano Babic * 283b8ac464SStefano Babic */ 293b8ac464SStefano Babic 303b8ac464SStefano Babic #define RESET 0x00 313b8ac464SStefano Babic #define IDLE 0x01 323b8ac464SStefano Babic #define IRPAUSE 0x02 333b8ac464SStefano Babic #define DRPAUSE 0x03 343b8ac464SStefano Babic #define SHIFTIR 0x04 353b8ac464SStefano Babic #define SHIFTDR 0x05 363b8ac464SStefano Babic /* 11/15/05 Nguyen changed to support DRCAPTURE*/ 373b8ac464SStefano Babic #define DRCAPTURE 0x06 383b8ac464SStefano Babic 393b8ac464SStefano Babic /* 403b8ac464SStefano Babic * Flow control register bit definitions. A set bit indicates 413b8ac464SStefano Babic * that the register currently exhibits the corresponding mode. 423b8ac464SStefano Babic */ 433b8ac464SStefano Babic 443b8ac464SStefano Babic #define INTEL_PRGM 0x0001 /* Intelligent programming is in effect. */ 453b8ac464SStefano Babic #define CASCADE 0x0002 /* Currently splitting large SDR. */ 463b8ac464SStefano Babic #define REPEATLOOP 0x0008 /* Currently executing a repeat loop. */ 473b8ac464SStefano Babic #define SHIFTRIGHT 0x0080 /* The next data stream needs a right shift. */ 483b8ac464SStefano Babic #define SHIFTLEFT 0x0100 /* The next data stream needs a left shift. */ 493b8ac464SStefano Babic #define VERIFYUES 0x0200 /* Continue if fail is in effect. */ 503b8ac464SStefano Babic 513b8ac464SStefano Babic /* 523b8ac464SStefano Babic * DataType register bit definitions. A set bit indicates 533b8ac464SStefano Babic * that the register currently holds the corresponding type of data. 543b8ac464SStefano Babic */ 553b8ac464SStefano Babic 563b8ac464SStefano Babic #define EXPRESS 0x0001 /* Simultaneous program and verify. */ 573b8ac464SStefano Babic #define SIR_DATA 0x0002 /* SIR is the active SVF command. */ 583b8ac464SStefano Babic #define SDR_DATA 0x0004 /* SDR is the active SVF command. */ 593b8ac464SStefano Babic #define COMPRESS 0x0008 /* Data is compressed. */ 603b8ac464SStefano Babic #define TDI_DATA 0x0010 /* TDI data is present. */ 613b8ac464SStefano Babic #define TDO_DATA 0x0020 /* TDO data is present. */ 623b8ac464SStefano Babic #define MASK_DATA 0x0040 /* MASK data is present. */ 633b8ac464SStefano Babic #define HEAP_IN 0x0080 /* Data is from the heap. */ 643b8ac464SStefano Babic #define LHEAP_IN 0x0200 /* Data is from intel data buffer. */ 653b8ac464SStefano Babic #define VARIABLE 0x0400 /* Data is from a declared variable. */ 663b8ac464SStefano Babic #define CRC_DATA 0x0800 /* CRC data is pressent. */ 673b8ac464SStefano Babic #define CMASK_DATA 0x1000 /* CMASK data is pressent. */ 683b8ac464SStefano Babic #define RMASK_DATA 0x2000 /* RMASK data is pressent. */ 693b8ac464SStefano Babic #define READ_DATA 0x4000 /* READ data is pressent. */ 703b8ac464SStefano Babic #define DMASK_DATA 0x8000 /* DMASK data is pressent. */ 713b8ac464SStefano Babic 723b8ac464SStefano Babic /* 733b8ac464SStefano Babic * 743b8ac464SStefano Babic * Pin opcodes. 753b8ac464SStefano Babic * 763b8ac464SStefano Babic */ 773b8ac464SStefano Babic 783b8ac464SStefano Babic #define signalENABLE 0x1C /* ispENABLE pin. */ 793b8ac464SStefano Babic #define signalTMS 0x1D /* TMS pin. */ 803b8ac464SStefano Babic #define signalTCK 0x1E /* TCK pin. */ 813b8ac464SStefano Babic #define signalTDI 0x1F /* TDI pin. */ 823b8ac464SStefano Babic #define signalTRST 0x20 /* TRST pin. */ 833b8ac464SStefano Babic 843b8ac464SStefano Babic /* 853b8ac464SStefano Babic * 863b8ac464SStefano Babic * Supported vendors. 873b8ac464SStefano Babic * 883b8ac464SStefano Babic */ 893b8ac464SStefano Babic 903b8ac464SStefano Babic #define VENDOR 0x56 913b8ac464SStefano Babic #define LATTICE 0x01 923b8ac464SStefano Babic #define ALTERA 0x02 933b8ac464SStefano Babic #define XILINX 0x03 943b8ac464SStefano Babic 953b8ac464SStefano Babic /* 963b8ac464SStefano Babic * Opcode definitions. 973b8ac464SStefano Babic * 983b8ac464SStefano Babic * Note: opcodes must be unique. 993b8ac464SStefano Babic */ 1003b8ac464SStefano Babic 1013b8ac464SStefano Babic #define ENDDATA 0x00 /* The end of the current SDR data stream. */ 1023b8ac464SStefano Babic #define RUNTEST 0x01 /* The duration to stay at the stable state. */ 1033b8ac464SStefano Babic #define ENDDR 0x02 /* The stable state after SDR. */ 1043b8ac464SStefano Babic #define ENDIR 0x03 /* The stable state after SIR. */ 1053b8ac464SStefano Babic #define ENDSTATE 0x04 /* The stable state after RUNTEST. */ 1063b8ac464SStefano Babic #define TRST 0x05 /* Assert the TRST pin. */ 1073b8ac464SStefano Babic #define HIR 0x06 /* 1083b8ac464SStefano Babic * The sum of the IR bits of the 1093b8ac464SStefano Babic * leading devices. 1103b8ac464SStefano Babic */ 1113b8ac464SStefano Babic #define TIR 0x07 /* 1123b8ac464SStefano Babic * The sum of the IR bits of the trailing 1133b8ac464SStefano Babic * devices. 1143b8ac464SStefano Babic */ 1153b8ac464SStefano Babic #define HDR 0x08 /* The number of leading devices. */ 1163b8ac464SStefano Babic #define TDR 0x09 /* The number of trailing devices. */ 1173b8ac464SStefano Babic #define ispEN 0x0A /* Assert the ispEN pin. */ 1183b8ac464SStefano Babic #define FREQUENCY 0x0B /* 1193b8ac464SStefano Babic * The maximum clock rate to run the JTAG state 1203b8ac464SStefano Babic * machine. 1213b8ac464SStefano Babic */ 1223b8ac464SStefano Babic #define STATE 0x10 /* Move to the next stable state. */ 1233b8ac464SStefano Babic #define SIR 0x11 /* The instruction stream follows. */ 1243b8ac464SStefano Babic #define SDR 0x12 /* The data stream follows. */ 1253b8ac464SStefano Babic #define TDI 0x13 /* The following data stream feeds into 1263b8ac464SStefano Babic the device. */ 1273b8ac464SStefano Babic #define TDO 0x14 /* 1283b8ac464SStefano Babic * The following data stream is compared against 1293b8ac464SStefano Babic * the device. 1303b8ac464SStefano Babic */ 1313b8ac464SStefano Babic #define MASK 0x15 /* The following data stream is used as mask. */ 1323b8ac464SStefano Babic #define XSDR 0x16 /* 1333b8ac464SStefano Babic * The following data stream is for simultaneous 1343b8ac464SStefano Babic * program and verify. 1353b8ac464SStefano Babic */ 1363b8ac464SStefano Babic #define XTDI 0x17 /* The following data stream is for shift in 1373b8ac464SStefano Babic * only. It must be stored for the next 1383b8ac464SStefano Babic * XSDR. 1393b8ac464SStefano Babic */ 1403b8ac464SStefano Babic #define XTDO 0x18 /* 1413b8ac464SStefano Babic * There is not data stream. The data stream 1423b8ac464SStefano Babic * was stored from the previous XTDI. 1433b8ac464SStefano Babic */ 1443b8ac464SStefano Babic #define MEM 0x19 /* 1453b8ac464SStefano Babic * The maximum memory needed to allocate in 1463b8ac464SStefano Babic * order hold one row of data. 1473b8ac464SStefano Babic */ 1483b8ac464SStefano Babic #define WAIT 0x1A /* The duration of delay to observe. */ 1493b8ac464SStefano Babic #define TCK 0x1B /* The number of TCK pulses. */ 1503b8ac464SStefano Babic #define SHR 0x23 /* 1513b8ac464SStefano Babic * Set the flow control register for 1523b8ac464SStefano Babic * right shift 1533b8ac464SStefano Babic */ 1543b8ac464SStefano Babic #define SHL 0x24 /* 1553b8ac464SStefano Babic * Set the flow control register for left shift. 1563b8ac464SStefano Babic */ 1573b8ac464SStefano Babic #define HEAP 0x32 /* The memory size needed to hold one loop. */ 1583b8ac464SStefano Babic #define REPEAT 0x33 /* The beginning of the loop. */ 1593b8ac464SStefano Babic #define LEFTPAREN 0x35 /* The beginning of data following the loop. */ 1603b8ac464SStefano Babic #define VAR 0x55 /* Plac holder for loop data. */ 1613b8ac464SStefano Babic #define SEC 0x1C /* 1623b8ac464SStefano Babic * The delay time in seconds that must be 1633b8ac464SStefano Babic * observed. 1643b8ac464SStefano Babic */ 1653b8ac464SStefano Babic #define SMASK 0x1D /* The mask for TDI data. */ 1663b8ac464SStefano Babic #define MAX_WAIT 0x1E /* The absolute maximum wait time. */ 1673b8ac464SStefano Babic #define ON 0x1F /* Assert the targeted pin. */ 1683b8ac464SStefano Babic #define OFF 0x20 /* Dis-assert the targeted pin. */ 1693b8ac464SStefano Babic #define SETFLOW 0x30 /* Change the flow control register. */ 1703b8ac464SStefano Babic #define RESETFLOW 0x31 /* Clear the flow control register. */ 1713b8ac464SStefano Babic 1723b8ac464SStefano Babic #define CRC 0x47 /* 1733b8ac464SStefano Babic * The following data stream is used for CRC 1743b8ac464SStefano Babic * calculation. 1753b8ac464SStefano Babic */ 1763b8ac464SStefano Babic #define CMASK 0x48 /* 1773b8ac464SStefano Babic * The following data stream is used as mask 1783b8ac464SStefano Babic * for CRC calculation. 1793b8ac464SStefano Babic */ 1803b8ac464SStefano Babic #define RMASK 0x49 /* 1813b8ac464SStefano Babic * The following data stream is used as mask 1823b8ac464SStefano Babic * for read and save. 1833b8ac464SStefano Babic */ 1843b8ac464SStefano Babic #define READ 0x50 /* 1853b8ac464SStefano Babic * The following data stream is used for read 1863b8ac464SStefano Babic * and save. 1873b8ac464SStefano Babic */ 1883b8ac464SStefano Babic #define ENDLOOP 0x59 /* The end of the repeat loop. */ 1893b8ac464SStefano Babic #define SECUREHEAP 0x60 /* Used to secure the HEAP opcode. */ 1903b8ac464SStefano Babic #define VUES 0x61 /* Support continue if fail. */ 1913b8ac464SStefano Babic #define DMASK 0x62 /* 1923b8ac464SStefano Babic * The following data stream is used for dynamic 1933b8ac464SStefano Babic * I/O. 1943b8ac464SStefano Babic */ 1953b8ac464SStefano Babic #define COMMENT 0x63 /* Support SVF comments in the VME file. */ 1963b8ac464SStefano Babic #define HEADER 0x64 /* Support header in VME file. */ 1973b8ac464SStefano Babic #define FILE_CRC 0x65 /* Support crc-protected VME file. */ 1983b8ac464SStefano Babic #define LCOUNT 0x66 /* Support intelligent programming. */ 1993b8ac464SStefano Babic #define LDELAY 0x67 /* Support intelligent programming. */ 2003b8ac464SStefano Babic #define LSDR 0x68 /* Support intelligent programming. */ 2013b8ac464SStefano Babic #define LHEAP 0x69 /* 2023b8ac464SStefano Babic * Memory needed to hold intelligent data 2033b8ac464SStefano Babic * buffer 2043b8ac464SStefano Babic */ 2053b8ac464SStefano Babic #define CONTINUE 0x70 /* Allow continuation. */ 2063b8ac464SStefano Babic #define LVDS 0x71 /* Support LVDS. */ 2073b8ac464SStefano Babic #define ENDVME 0x7F /* End of the VME file. */ 2083b8ac464SStefano Babic #define ENDFILE 0xFF /* End of file. */ 2093b8ac464SStefano Babic 2103b8ac464SStefano Babic /* 2113b8ac464SStefano Babic * 2123b8ac464SStefano Babic * ispVM Embedded Return Codes. 2133b8ac464SStefano Babic * 2143b8ac464SStefano Babic */ 2153b8ac464SStefano Babic 2163b8ac464SStefano Babic #define VME_VERIFICATION_FAILURE -1 2173b8ac464SStefano Babic #define VME_FILE_READ_FAILURE -2 2183b8ac464SStefano Babic #define VME_VERSION_FAILURE -3 2193b8ac464SStefano Babic #define VME_INVALID_FILE -4 2203b8ac464SStefano Babic #define VME_ARGUMENT_FAILURE -5 2213b8ac464SStefano Babic #define VME_CRC_FAILURE -6 2223b8ac464SStefano Babic 2233b8ac464SStefano Babic #define g_ucPinTDI 0x01 2243b8ac464SStefano Babic #define g_ucPinTCK 0x02 2253b8ac464SStefano Babic #define g_ucPinTMS 0x04 2263b8ac464SStefano Babic #define g_ucPinENABLE 0x08 2273b8ac464SStefano Babic #define g_ucPinTRST 0x10 2283b8ac464SStefano Babic 2293b8ac464SStefano Babic /* 2303b8ac464SStefano Babic * 2313b8ac464SStefano Babic * Type definitions. 2323b8ac464SStefano Babic * 2333b8ac464SStefano Babic */ 2343b8ac464SStefano Babic 2353b8ac464SStefano Babic /* Support LVDS */ 2363b8ac464SStefano Babic typedef struct { 2373b8ac464SStefano Babic unsigned short usPositiveIndex; 2383b8ac464SStefano Babic unsigned short usNegativeIndex; 2393b8ac464SStefano Babic unsigned char ucUpdate; 2403b8ac464SStefano Babic } LVDSPair; 2413b8ac464SStefano Babic 2423b8ac464SStefano Babic typedef enum { 2433b8ac464SStefano Babic min_lattice_iface_type, /* insert all new types after this */ 2443b8ac464SStefano Babic lattice_jtag_mode, /* jtag/tap */ 2453b8ac464SStefano Babic max_lattice_iface_type /* insert all new types before this */ 2463b8ac464SStefano Babic } Lattice_iface; 2473b8ac464SStefano Babic 2483b8ac464SStefano Babic typedef enum { 2493b8ac464SStefano Babic min_lattice_type, 2503b8ac464SStefano Babic Lattice_XP2, /* Lattice XP2 Family */ 2513b8ac464SStefano Babic max_lattice_type /* insert all new types before this */ 2523b8ac464SStefano Babic } Lattice_Family; 2533b8ac464SStefano Babic 2543b8ac464SStefano Babic typedef struct { 2553b8ac464SStefano Babic Lattice_Family family; /* part type */ 2563b8ac464SStefano Babic Lattice_iface iface; /* interface type */ 2573b8ac464SStefano Babic size_t size; /* bytes of data part can accept */ 2583b8ac464SStefano Babic void *iface_fns; /* interface function table */ 2593b8ac464SStefano Babic void *base; /* base interface address */ 2603b8ac464SStefano Babic int cookie; /* implementation specific cookie */ 2613b8ac464SStefano Babic char *desc; /* description string */ 2623b8ac464SStefano Babic } Lattice_desc; /* end, typedef Altera_desc */ 2633b8ac464SStefano Babic 2643b8ac464SStefano Babic /* Board specific implementation specific function types */ 2653b8ac464SStefano Babic typedef void (*Lattice_jtag_init)(void); 2663b8ac464SStefano Babic typedef void (*Lattice_jtag_set_tdi)(int v); 2673b8ac464SStefano Babic typedef void (*Lattice_jtag_set_tms)(int v); 2683b8ac464SStefano Babic typedef void (*Lattice_jtag_set_tck)(int v); 2693b8ac464SStefano Babic typedef int (*Lattice_jtag_get_tdo)(void); 2703b8ac464SStefano Babic 2713b8ac464SStefano Babic typedef struct { 2723b8ac464SStefano Babic Lattice_jtag_init jtag_init; 2733b8ac464SStefano Babic Lattice_jtag_set_tdi jtag_set_tdi; 2743b8ac464SStefano Babic Lattice_jtag_set_tms jtag_set_tms; 2753b8ac464SStefano Babic Lattice_jtag_set_tck jtag_set_tck; 2763b8ac464SStefano Babic Lattice_jtag_get_tdo jtag_get_tdo; 2773b8ac464SStefano Babic } lattice_board_specific_func; 2783b8ac464SStefano Babic 2793b8ac464SStefano Babic void writePort(unsigned char pins, unsigned char value); 2803b8ac464SStefano Babic unsigned char readPort(void); 2813b8ac464SStefano Babic void sclock(void); 2823b8ac464SStefano Babic void ispVMDelay(unsigned short int a_usMicroSecondDelay); 2833b8ac464SStefano Babic void calibration(void); 2843b8ac464SStefano Babic 285fb2d6efbSWolfgang Denk int lattice_load(Lattice_desc *desc, const void *buf, size_t bsize); 286fb2d6efbSWolfgang Denk int lattice_dump(Lattice_desc *desc, const void *buf, size_t bsize); 2873b8ac464SStefano Babic int lattice_info(Lattice_desc *desc); 2883b8ac464SStefano Babic 2893b8ac464SStefano Babic void ispVMStart(void); 2903b8ac464SStefano Babic void ispVMEnd(void); 291c56ded6aSStefano Babic extern void ispVMFreeMem(void); 2923b8ac464SStefano Babic signed char ispVMCode(void); 2933b8ac464SStefano Babic void ispVMDelay(unsigned short int a_usMicroSecondDelay); 2943b8ac464SStefano Babic void ispVMCalculateCRC32(unsigned char a_ucData); 2953b8ac464SStefano Babic unsigned char GetByte(void); 2963b8ac464SStefano Babic void writePort(unsigned char pins, unsigned char value); 2973b8ac464SStefano Babic unsigned char readPort(void); 2983b8ac464SStefano Babic void sclock(void); 2993b8ac464SStefano Babic #endif 300