1*3b8ac464SStefano Babic /* 2*3b8ac464SStefano Babic * Porting to U-Boot: 3*3b8ac464SStefano Babic * 4*3b8ac464SStefano Babic * (C) Copyright 2010 5*3b8ac464SStefano Babic * Stefano Babic, DENX Software Engineering, sbabic@denx.de. 6*3b8ac464SStefano Babic * 7*3b8ac464SStefano Babic * Lattice's ispVME Embedded Tool to load Lattice's FPGA: 8*3b8ac464SStefano Babic * 9*3b8ac464SStefano Babic * Lattice Semiconductor Corp. Copyright 2009 10*3b8ac464SStefano Babic * 11*3b8ac464SStefano Babic * See file CREDITS for list of people who contributed to this 12*3b8ac464SStefano Babic * project. 13*3b8ac464SStefano Babic * 14*3b8ac464SStefano Babic * This program is free software; you can redistribute it and/or 15*3b8ac464SStefano Babic * modify it under the terms of the GNU General Public License as 16*3b8ac464SStefano Babic * published by the Free Software Foundation; either version 2 of 17*3b8ac464SStefano Babic * the License, or (at your option) any later version. 18*3b8ac464SStefano Babic * 19*3b8ac464SStefano Babic * This program is distributed in the hope that it will be useful, 20*3b8ac464SStefano Babic * but WITHOUT ANY WARRANTY; without even the implied warranty of 21*3b8ac464SStefano Babic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22*3b8ac464SStefano Babic * GNU General Public License for more details. 23*3b8ac464SStefano Babic * 24*3b8ac464SStefano Babic * You should have received a copy of the GNU General Public License 25*3b8ac464SStefano Babic * along with this program; if not, write to the Free Software 26*3b8ac464SStefano Babic * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 27*3b8ac464SStefano Babic * MA 02111-1307 USA 28*3b8ac464SStefano Babic * 29*3b8ac464SStefano Babic */ 30*3b8ac464SStefano Babic 31*3b8ac464SStefano Babic #ifndef _VME_OPCODE_H 32*3b8ac464SStefano Babic #define _VME_OPCODE_H 33*3b8ac464SStefano Babic 34*3b8ac464SStefano Babic #define VME_VERSION_NUMBER "12.1" 35*3b8ac464SStefano Babic 36*3b8ac464SStefano Babic /* Maximum declarations. */ 37*3b8ac464SStefano Babic 38*3b8ac464SStefano Babic #define VMEHEXMAX 60000L /* The hex file is split 60K per file. */ 39*3b8ac464SStefano Babic #define SCANMAX 64000L /* The maximum SDR/SIR burst. */ 40*3b8ac464SStefano Babic 41*3b8ac464SStefano Babic /* 42*3b8ac464SStefano Babic * 43*3b8ac464SStefano Babic * Supported JTAG state transitions. 44*3b8ac464SStefano Babic * 45*3b8ac464SStefano Babic */ 46*3b8ac464SStefano Babic 47*3b8ac464SStefano Babic #define RESET 0x00 48*3b8ac464SStefano Babic #define IDLE 0x01 49*3b8ac464SStefano Babic #define IRPAUSE 0x02 50*3b8ac464SStefano Babic #define DRPAUSE 0x03 51*3b8ac464SStefano Babic #define SHIFTIR 0x04 52*3b8ac464SStefano Babic #define SHIFTDR 0x05 53*3b8ac464SStefano Babic /* 11/15/05 Nguyen changed to support DRCAPTURE*/ 54*3b8ac464SStefano Babic #define DRCAPTURE 0x06 55*3b8ac464SStefano Babic 56*3b8ac464SStefano Babic /* 57*3b8ac464SStefano Babic * Flow control register bit definitions. A set bit indicates 58*3b8ac464SStefano Babic * that the register currently exhibits the corresponding mode. 59*3b8ac464SStefano Babic */ 60*3b8ac464SStefano Babic 61*3b8ac464SStefano Babic #define INTEL_PRGM 0x0001 /* Intelligent programming is in effect. */ 62*3b8ac464SStefano Babic #define CASCADE 0x0002 /* Currently splitting large SDR. */ 63*3b8ac464SStefano Babic #define REPEATLOOP 0x0008 /* Currently executing a repeat loop. */ 64*3b8ac464SStefano Babic #define SHIFTRIGHT 0x0080 /* The next data stream needs a right shift. */ 65*3b8ac464SStefano Babic #define SHIFTLEFT 0x0100 /* The next data stream needs a left shift. */ 66*3b8ac464SStefano Babic #define VERIFYUES 0x0200 /* Continue if fail is in effect. */ 67*3b8ac464SStefano Babic 68*3b8ac464SStefano Babic /* 69*3b8ac464SStefano Babic * DataType register bit definitions. A set bit indicates 70*3b8ac464SStefano Babic * that the register currently holds the corresponding type of data. 71*3b8ac464SStefano Babic */ 72*3b8ac464SStefano Babic 73*3b8ac464SStefano Babic #define EXPRESS 0x0001 /* Simultaneous program and verify. */ 74*3b8ac464SStefano Babic #define SIR_DATA 0x0002 /* SIR is the active SVF command. */ 75*3b8ac464SStefano Babic #define SDR_DATA 0x0004 /* SDR is the active SVF command. */ 76*3b8ac464SStefano Babic #define COMPRESS 0x0008 /* Data is compressed. */ 77*3b8ac464SStefano Babic #define TDI_DATA 0x0010 /* TDI data is present. */ 78*3b8ac464SStefano Babic #define TDO_DATA 0x0020 /* TDO data is present. */ 79*3b8ac464SStefano Babic #define MASK_DATA 0x0040 /* MASK data is present. */ 80*3b8ac464SStefano Babic #define HEAP_IN 0x0080 /* Data is from the heap. */ 81*3b8ac464SStefano Babic #define LHEAP_IN 0x0200 /* Data is from intel data buffer. */ 82*3b8ac464SStefano Babic #define VARIABLE 0x0400 /* Data is from a declared variable. */ 83*3b8ac464SStefano Babic #define CRC_DATA 0x0800 /* CRC data is pressent. */ 84*3b8ac464SStefano Babic #define CMASK_DATA 0x1000 /* CMASK data is pressent. */ 85*3b8ac464SStefano Babic #define RMASK_DATA 0x2000 /* RMASK data is pressent. */ 86*3b8ac464SStefano Babic #define READ_DATA 0x4000 /* READ data is pressent. */ 87*3b8ac464SStefano Babic #define DMASK_DATA 0x8000 /* DMASK data is pressent. */ 88*3b8ac464SStefano Babic 89*3b8ac464SStefano Babic /* 90*3b8ac464SStefano Babic * 91*3b8ac464SStefano Babic * Pin opcodes. 92*3b8ac464SStefano Babic * 93*3b8ac464SStefano Babic */ 94*3b8ac464SStefano Babic 95*3b8ac464SStefano Babic #define signalENABLE 0x1C /* ispENABLE pin. */ 96*3b8ac464SStefano Babic #define signalTMS 0x1D /* TMS pin. */ 97*3b8ac464SStefano Babic #define signalTCK 0x1E /* TCK pin. */ 98*3b8ac464SStefano Babic #define signalTDI 0x1F /* TDI pin. */ 99*3b8ac464SStefano Babic #define signalTRST 0x20 /* TRST pin. */ 100*3b8ac464SStefano Babic 101*3b8ac464SStefano Babic /* 102*3b8ac464SStefano Babic * 103*3b8ac464SStefano Babic * Supported vendors. 104*3b8ac464SStefano Babic * 105*3b8ac464SStefano Babic */ 106*3b8ac464SStefano Babic 107*3b8ac464SStefano Babic #define VENDOR 0x56 108*3b8ac464SStefano Babic #define LATTICE 0x01 109*3b8ac464SStefano Babic #define ALTERA 0x02 110*3b8ac464SStefano Babic #define XILINX 0x03 111*3b8ac464SStefano Babic 112*3b8ac464SStefano Babic /* 113*3b8ac464SStefano Babic * Opcode definitions. 114*3b8ac464SStefano Babic * 115*3b8ac464SStefano Babic * Note: opcodes must be unique. 116*3b8ac464SStefano Babic */ 117*3b8ac464SStefano Babic 118*3b8ac464SStefano Babic #define ENDDATA 0x00 /* The end of the current SDR data stream. */ 119*3b8ac464SStefano Babic #define RUNTEST 0x01 /* The duration to stay at the stable state. */ 120*3b8ac464SStefano Babic #define ENDDR 0x02 /* The stable state after SDR. */ 121*3b8ac464SStefano Babic #define ENDIR 0x03 /* The stable state after SIR. */ 122*3b8ac464SStefano Babic #define ENDSTATE 0x04 /* The stable state after RUNTEST. */ 123*3b8ac464SStefano Babic #define TRST 0x05 /* Assert the TRST pin. */ 124*3b8ac464SStefano Babic #define HIR 0x06 /* 125*3b8ac464SStefano Babic * The sum of the IR bits of the 126*3b8ac464SStefano Babic * leading devices. 127*3b8ac464SStefano Babic */ 128*3b8ac464SStefano Babic #define TIR 0x07 /* 129*3b8ac464SStefano Babic * The sum of the IR bits of the trailing 130*3b8ac464SStefano Babic * devices. 131*3b8ac464SStefano Babic */ 132*3b8ac464SStefano Babic #define HDR 0x08 /* The number of leading devices. */ 133*3b8ac464SStefano Babic #define TDR 0x09 /* The number of trailing devices. */ 134*3b8ac464SStefano Babic #define ispEN 0x0A /* Assert the ispEN pin. */ 135*3b8ac464SStefano Babic #define FREQUENCY 0x0B /* 136*3b8ac464SStefano Babic * The maximum clock rate to run the JTAG state 137*3b8ac464SStefano Babic * machine. 138*3b8ac464SStefano Babic */ 139*3b8ac464SStefano Babic #define STATE 0x10 /* Move to the next stable state. */ 140*3b8ac464SStefano Babic #define SIR 0x11 /* The instruction stream follows. */ 141*3b8ac464SStefano Babic #define SDR 0x12 /* The data stream follows. */ 142*3b8ac464SStefano Babic #define TDI 0x13 /* The following data stream feeds into 143*3b8ac464SStefano Babic the device. */ 144*3b8ac464SStefano Babic #define TDO 0x14 /* 145*3b8ac464SStefano Babic * The following data stream is compared against 146*3b8ac464SStefano Babic * the device. 147*3b8ac464SStefano Babic */ 148*3b8ac464SStefano Babic #define MASK 0x15 /* The following data stream is used as mask. */ 149*3b8ac464SStefano Babic #define XSDR 0x16 /* 150*3b8ac464SStefano Babic * The following data stream is for simultaneous 151*3b8ac464SStefano Babic * program and verify. 152*3b8ac464SStefano Babic */ 153*3b8ac464SStefano Babic #define XTDI 0x17 /* The following data stream is for shift in 154*3b8ac464SStefano Babic * only. It must be stored for the next 155*3b8ac464SStefano Babic * XSDR. 156*3b8ac464SStefano Babic */ 157*3b8ac464SStefano Babic #define XTDO 0x18 /* 158*3b8ac464SStefano Babic * There is not data stream. The data stream 159*3b8ac464SStefano Babic * was stored from the previous XTDI. 160*3b8ac464SStefano Babic */ 161*3b8ac464SStefano Babic #define MEM 0x19 /* 162*3b8ac464SStefano Babic * The maximum memory needed to allocate in 163*3b8ac464SStefano Babic * order hold one row of data. 164*3b8ac464SStefano Babic */ 165*3b8ac464SStefano Babic #define WAIT 0x1A /* The duration of delay to observe. */ 166*3b8ac464SStefano Babic #define TCK 0x1B /* The number of TCK pulses. */ 167*3b8ac464SStefano Babic #define SHR 0x23 /* 168*3b8ac464SStefano Babic * Set the flow control register for 169*3b8ac464SStefano Babic * right shift 170*3b8ac464SStefano Babic */ 171*3b8ac464SStefano Babic #define SHL 0x24 /* 172*3b8ac464SStefano Babic * Set the flow control register for left shift. 173*3b8ac464SStefano Babic */ 174*3b8ac464SStefano Babic #define HEAP 0x32 /* The memory size needed to hold one loop. */ 175*3b8ac464SStefano Babic #define REPEAT 0x33 /* The beginning of the loop. */ 176*3b8ac464SStefano Babic #define LEFTPAREN 0x35 /* The beginning of data following the loop. */ 177*3b8ac464SStefano Babic #define VAR 0x55 /* Plac holder for loop data. */ 178*3b8ac464SStefano Babic #define SEC 0x1C /* 179*3b8ac464SStefano Babic * The delay time in seconds that must be 180*3b8ac464SStefano Babic * observed. 181*3b8ac464SStefano Babic */ 182*3b8ac464SStefano Babic #define SMASK 0x1D /* The mask for TDI data. */ 183*3b8ac464SStefano Babic #define MAX_WAIT 0x1E /* The absolute maximum wait time. */ 184*3b8ac464SStefano Babic #define ON 0x1F /* Assert the targeted pin. */ 185*3b8ac464SStefano Babic #define OFF 0x20 /* Dis-assert the targeted pin. */ 186*3b8ac464SStefano Babic #define SETFLOW 0x30 /* Change the flow control register. */ 187*3b8ac464SStefano Babic #define RESETFLOW 0x31 /* Clear the flow control register. */ 188*3b8ac464SStefano Babic 189*3b8ac464SStefano Babic #define CRC 0x47 /* 190*3b8ac464SStefano Babic * The following data stream is used for CRC 191*3b8ac464SStefano Babic * calculation. 192*3b8ac464SStefano Babic */ 193*3b8ac464SStefano Babic #define CMASK 0x48 /* 194*3b8ac464SStefano Babic * The following data stream is used as mask 195*3b8ac464SStefano Babic * for CRC calculation. 196*3b8ac464SStefano Babic */ 197*3b8ac464SStefano Babic #define RMASK 0x49 /* 198*3b8ac464SStefano Babic * The following data stream is used as mask 199*3b8ac464SStefano Babic * for read and save. 200*3b8ac464SStefano Babic */ 201*3b8ac464SStefano Babic #define READ 0x50 /* 202*3b8ac464SStefano Babic * The following data stream is used for read 203*3b8ac464SStefano Babic * and save. 204*3b8ac464SStefano Babic */ 205*3b8ac464SStefano Babic #define ENDLOOP 0x59 /* The end of the repeat loop. */ 206*3b8ac464SStefano Babic #define SECUREHEAP 0x60 /* Used to secure the HEAP opcode. */ 207*3b8ac464SStefano Babic #define VUES 0x61 /* Support continue if fail. */ 208*3b8ac464SStefano Babic #define DMASK 0x62 /* 209*3b8ac464SStefano Babic * The following data stream is used for dynamic 210*3b8ac464SStefano Babic * I/O. 211*3b8ac464SStefano Babic */ 212*3b8ac464SStefano Babic #define COMMENT 0x63 /* Support SVF comments in the VME file. */ 213*3b8ac464SStefano Babic #define HEADER 0x64 /* Support header in VME file. */ 214*3b8ac464SStefano Babic #define FILE_CRC 0x65 /* Support crc-protected VME file. */ 215*3b8ac464SStefano Babic #define LCOUNT 0x66 /* Support intelligent programming. */ 216*3b8ac464SStefano Babic #define LDELAY 0x67 /* Support intelligent programming. */ 217*3b8ac464SStefano Babic #define LSDR 0x68 /* Support intelligent programming. */ 218*3b8ac464SStefano Babic #define LHEAP 0x69 /* 219*3b8ac464SStefano Babic * Memory needed to hold intelligent data 220*3b8ac464SStefano Babic * buffer 221*3b8ac464SStefano Babic */ 222*3b8ac464SStefano Babic #define CONTINUE 0x70 /* Allow continuation. */ 223*3b8ac464SStefano Babic #define LVDS 0x71 /* Support LVDS. */ 224*3b8ac464SStefano Babic #define ENDVME 0x7F /* End of the VME file. */ 225*3b8ac464SStefano Babic #define ENDFILE 0xFF /* End of file. */ 226*3b8ac464SStefano Babic 227*3b8ac464SStefano Babic /* 228*3b8ac464SStefano Babic * 229*3b8ac464SStefano Babic * ispVM Embedded Return Codes. 230*3b8ac464SStefano Babic * 231*3b8ac464SStefano Babic */ 232*3b8ac464SStefano Babic 233*3b8ac464SStefano Babic #define VME_VERIFICATION_FAILURE -1 234*3b8ac464SStefano Babic #define VME_FILE_READ_FAILURE -2 235*3b8ac464SStefano Babic #define VME_VERSION_FAILURE -3 236*3b8ac464SStefano Babic #define VME_INVALID_FILE -4 237*3b8ac464SStefano Babic #define VME_ARGUMENT_FAILURE -5 238*3b8ac464SStefano Babic #define VME_CRC_FAILURE -6 239*3b8ac464SStefano Babic 240*3b8ac464SStefano Babic #define g_ucPinTDI 0x01 241*3b8ac464SStefano Babic #define g_ucPinTCK 0x02 242*3b8ac464SStefano Babic #define g_ucPinTMS 0x04 243*3b8ac464SStefano Babic #define g_ucPinENABLE 0x08 244*3b8ac464SStefano Babic #define g_ucPinTRST 0x10 245*3b8ac464SStefano Babic 246*3b8ac464SStefano Babic /* 247*3b8ac464SStefano Babic * 248*3b8ac464SStefano Babic * Type definitions. 249*3b8ac464SStefano Babic * 250*3b8ac464SStefano Babic */ 251*3b8ac464SStefano Babic 252*3b8ac464SStefano Babic /* Support LVDS */ 253*3b8ac464SStefano Babic typedef struct { 254*3b8ac464SStefano Babic unsigned short usPositiveIndex; 255*3b8ac464SStefano Babic unsigned short usNegativeIndex; 256*3b8ac464SStefano Babic unsigned char ucUpdate; 257*3b8ac464SStefano Babic } LVDSPair; 258*3b8ac464SStefano Babic 259*3b8ac464SStefano Babic typedef enum { 260*3b8ac464SStefano Babic min_lattice_iface_type, /* insert all new types after this */ 261*3b8ac464SStefano Babic lattice_jtag_mode, /* jtag/tap */ 262*3b8ac464SStefano Babic max_lattice_iface_type /* insert all new types before this */ 263*3b8ac464SStefano Babic } Lattice_iface; 264*3b8ac464SStefano Babic 265*3b8ac464SStefano Babic typedef enum { 266*3b8ac464SStefano Babic min_lattice_type, 267*3b8ac464SStefano Babic Lattice_XP2, /* Lattice XP2 Family */ 268*3b8ac464SStefano Babic max_lattice_type /* insert all new types before this */ 269*3b8ac464SStefano Babic } Lattice_Family; 270*3b8ac464SStefano Babic 271*3b8ac464SStefano Babic typedef struct { 272*3b8ac464SStefano Babic Lattice_Family family; /* part type */ 273*3b8ac464SStefano Babic Lattice_iface iface; /* interface type */ 274*3b8ac464SStefano Babic size_t size; /* bytes of data part can accept */ 275*3b8ac464SStefano Babic void *iface_fns; /* interface function table */ 276*3b8ac464SStefano Babic void *base; /* base interface address */ 277*3b8ac464SStefano Babic int cookie; /* implementation specific cookie */ 278*3b8ac464SStefano Babic char *desc; /* description string */ 279*3b8ac464SStefano Babic } Lattice_desc; /* end, typedef Altera_desc */ 280*3b8ac464SStefano Babic 281*3b8ac464SStefano Babic /* Lattice Model Type */ 282*3b8ac464SStefano Babic #define CONFIG_SYS_XP2 CONFIG_SYS_FPGA_DEV(0x1) 283*3b8ac464SStefano Babic 284*3b8ac464SStefano Babic /* Board specific implementation specific function types */ 285*3b8ac464SStefano Babic typedef void (*Lattice_jtag_init)(void); 286*3b8ac464SStefano Babic typedef void (*Lattice_jtag_set_tdi)(int v); 287*3b8ac464SStefano Babic typedef void (*Lattice_jtag_set_tms)(int v); 288*3b8ac464SStefano Babic typedef void (*Lattice_jtag_set_tck)(int v); 289*3b8ac464SStefano Babic typedef int (*Lattice_jtag_get_tdo)(void); 290*3b8ac464SStefano Babic 291*3b8ac464SStefano Babic typedef struct { 292*3b8ac464SStefano Babic Lattice_jtag_init jtag_init; 293*3b8ac464SStefano Babic Lattice_jtag_set_tdi jtag_set_tdi; 294*3b8ac464SStefano Babic Lattice_jtag_set_tms jtag_set_tms; 295*3b8ac464SStefano Babic Lattice_jtag_set_tck jtag_set_tck; 296*3b8ac464SStefano Babic Lattice_jtag_get_tdo jtag_get_tdo; 297*3b8ac464SStefano Babic } lattice_board_specific_func; 298*3b8ac464SStefano Babic 299*3b8ac464SStefano Babic void writePort(unsigned char pins, unsigned char value); 300*3b8ac464SStefano Babic unsigned char readPort(void); 301*3b8ac464SStefano Babic void sclock(void); 302*3b8ac464SStefano Babic void ispVMDelay(unsigned short int a_usMicroSecondDelay); 303*3b8ac464SStefano Babic void calibration(void); 304*3b8ac464SStefano Babic 305*3b8ac464SStefano Babic int lattice_load(Lattice_desc *desc, void *buf, size_t bsize); 306*3b8ac464SStefano Babic int lattice_dump(Lattice_desc *desc, void *buf, size_t bsize); 307*3b8ac464SStefano Babic int lattice_info(Lattice_desc *desc); 308*3b8ac464SStefano Babic 309*3b8ac464SStefano Babic void ispVMStart(void); 310*3b8ac464SStefano Babic void ispVMEnd(void); 311*3b8ac464SStefano Babic signed char ispVMCode(void); 312*3b8ac464SStefano Babic void ispVMDelay(unsigned short int a_usMicroSecondDelay); 313*3b8ac464SStefano Babic void ispVMCalculateCRC32(unsigned char a_ucData); 314*3b8ac464SStefano Babic unsigned char GetByte(void); 315*3b8ac464SStefano Babic void writePort(unsigned char pins, unsigned char value); 316*3b8ac464SStefano Babic unsigned char readPort(void); 317*3b8ac464SStefano Babic void sclock(void); 318*3b8ac464SStefano Babic #endif 319*3b8ac464SStefano Babic 320