1 /*-----------------------------------------------------------------------------
\r
3 * Hardware-dependent code for usb_jtag
\r
5 *-----------------------------------------------------------------------------
\r
7 * Copyright (C) 2007 Kolja Waschk, ixo.de
\r
9 *-----------------------------------------------------------------------------
\r
11 * This code is part of usbjtag. usbjtag is free software; you can redistribute
\r
13 * it and/or modify it under the terms of the GNU General Public License as
\r
15 * published by the Free Software Foundation; either version 2 of the License,
\r
17 * or (at your option) any later version. usbjtag is distributed in the hope
\r
19 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
\r
21 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
23 * GNU General Public License for more details. You should have received a
\r
25 * copy of the GNU General Public License along with this program in the file
\r
27 * COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin
\r
29 * St, Fifth Floor, Boston, MA 02110-1301 USA
\r
31 *-----------------------------------------------------------------------------
\r
39 #include "syncdelay.h"
\r
41 #include "hardware.h"
\r
51 #include "fx2regs.h"
\r
53 #include "fx2utils.h"
\r
55 #include "usb_common.h"
\r
57 #include "usb_descriptors.h"
\r
59 #include "usb_requests.h"
\r
61 #include "syncdelay.h"
\r
67 #define HAVE_OE_LED 1
\r
69 sbit at 0x80+1 OELED; // red LED on S3E Starter Kit (0x80+0 is green one)
\r
71 #define SetOELED(x) do{OELED=(x);}while(0)
\r
75 void ProgIO_Poll(void) {}
\r
77 void ProgIO_Enable(void) {}
\r
79 void ProgiO_Disable(void) {}
\r
81 void ProgiO_Deinit(void) {}
\r
85 static unsigned char curios;
\r
89 const unsigned char wavedata[64] =
\r
95 s0: BITS=D0 NEXT/SGLCRC DATA WAIT 4
\r
97 s1: BITS= DATA WAIT 4
\r
99 s2: BITS=D1|D0 DATA WAIT 4
\r
101 s3: BITS=D1 DATA WAIT 3
\r
103 s4: BITS=D1 DATA DP IF(RDY0) THEN 5 ELSE 2
\r
105 s5: BITS=D1|D0 DATA WAIT 4
\r
107 s6: BITS=D1 DATA WAIT 3
\r
109 s7: BITS=D1 DATA FIN */
\r
113 4, 4, 4, 3, 0x2A, 4, 3, 7,
\r
115 6, 2, 2, 2, 3, 2, 2, 2,
\r
117 1, 0, 3, 2, 2, 3, 2, 2,
\r
119 0, 0, 0, 0, 0, 0, 0, 0x3F,
\r
129 s2: BITS=D1|D0 WAIT 4
\r
133 s4: BITS=D1|D0 WAIT 3
\r
135 s5: BITS=D1|D0 DP IF(RDY0) THEN 6 ELSE 3
\r
137 s6: BITS=D1 DATA WAIT 4
\r
143 4, 4, 4, 4, 3, 0x33, 4, 7,
\r
145 0, 0, 0, 0, 0, 1, 2, 0,
\r
147 1, 0, 3, 2, 3, 3, 2, 2,
\r
149 0, 0, 0, 0, 0, 0, 0, 0x3F
\r
155 void ProgIO_Init(void)
\r
163 /* The following code depends on your actual circuit design.
\r
165 Make required changes _before_ you try the code! */
\r
169 // set the CPU clock to 48MHz, enable clock output to FPGA
\r
171 CPUCS = bmCLKOE | bmCLKSPD1;
\r
175 // Use internal 48 MHz, enable output, GPIF Master mode
\r
177 IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE | bmIFGPIF;
\r
181 PORTACFG = 0x00; OEA = 0xFB; IOA = 0x20;
\r
183 PORTCCFG = 0x00; OEC = 0xFF; IOC = 0x10;
\r
185 PORTECFG = 0x00; OEE = 0xFC; IOE = 0xC0;
\r
193 GPIFREADYCFG = 0xA0;
\r
199 GPIFIDLECTL = 0x00;
\r
201 GPIFWFSELECT = 0x01;
\r
205 // Copy waveform data
\r
207 AUTOPTRSETUP = 0x07;
\r
209 APTR1H = MSB( &wavedata );
\r
211 APTR1L = LSB( &wavedata );
\r
217 for ( i = 0; i < 64; i++ ) EXTAUTODAT2 = EXTAUTODAT1;
\r
239 FLOWHOLDOFF = 0x00;
\r
243 FLOWSTBEDGE = 0x00;
\r
245 FLOWSTBHPERIOD = 0x00;
\r
255 unsigned char GetTDO(unsigned char r)
\r
265 while(!(GPIFTRIG & 0x80)); x = XGPIFSGLDATLX;
\r
267 while(!(GPIFTRIG & 0x80)); x = XGPIFSGLDATLNOX;
\r
271 if(IOA & 0x20) IOA |= 0x40; else IOA &= ~0x40;
\r
275 return (x&1) ? r : 0;
\r
281 #define SetPins(x) while(!(GPIFTRIG & 0x80)); XGPIFSGLDATLX = (x)
\r
285 void ProgIO_Set_State(unsigned char d)
\r
289 /* Set state of output pins:
\r
293 * d.0 => TCK (PE.6)
\r
295 * d.1 => TMS (PE.5)
\r
297 * d.4 => TDI (PE.4)
\r
299 * d.6 => LED / Output Enable
\r
305 curios = (d & bmBIT0) ? 0x40 : 0; // TCK
\r
307 curios |= (d & bmBIT1) ? 0x20 : 0; // TMS
\r
309 curios |= (d & bmBIT4) ? 0x10 : 0; // TDI
\r
319 if(d & bmBIT6) IOA=(IOA&~3)|1; else IOA=(IOA&~3)|2;
\r
325 unsigned char ProgIO_Set_Get_State(unsigned char d)
\r
329 ProgIO_Set_State(d);
\r
333 /* Read state of input pins:
\r
339 * DATAOUT => d.1 (only #ifdef HAVE_AS_MODE)
\r
345 return 2|GetTDO(0x01);
\r
351 void ProgIO_ShiftOut(unsigned char c)
\r
357 unsigned char locios = curios & ~0x50;
\r
365 for(i=0,r=1;i<8;i++)
\r
369 unsigned char t = locios;
\r
371 if(c & r) t |= 0x10;
\r
393 unsigned char ProgIO_ShiftInOut(unsigned char c)
\r
397 unsigned char r,i,n;
\r
399 unsigned char locios = curios & ~0x50;
\r
403 for(i=0,r=1,n=0;i<8;i++)
\r
407 unsigned char t = locios;
\r
417 if(c & r) t |= 0x10;
\r