1 /*-----------------------------------------------------------------------------
\r
2 * Hardware-dependent code for usb_jtag
\r
3 *-----------------------------------------------------------------------------
\r
4 * Copyright (C) 2007 Kolja Waschk, ixo.de
\r
5 *-----------------------------------------------------------------------------
\r
6 * This code is part of usbjtag. usbjtag is free software; you can redistribute
\r
7 * it and/or modify it under the terms of the GNU General Public License as
\r
8 * published by the Free Software Foundation; either version 2 of the License,
\r
9 * or (at your option) any later version. usbjtag is distributed in the hope
\r
10 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
\r
11 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
12 * GNU General Public License for more details. You should have received a
\r
13 * copy of the GNU General Public License along with this program in the file
\r
14 * COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin
\r
15 * St, Fifth Floor, Boston, MA 02110-1301 USA
\r
16 *-----------------------------------------------------------------------------
\r
19 #include <fx2regs.h>
\r
20 #include "hardware.h"
\r
23 //-----------------------------------------------------------------------------
\r
24 // comment out (undefine!) if you don't want PS, AS or OE signals
\r
26 #define HAVE_PS_MODE 1
\r
27 #define HAVE_AS_MODE 1
\r
28 #define HAVE_OE_LED 1
\r
30 // comment in (define!) if you want outputs disabled when possible
\r
31 //#define HAVE_OENABLE 1
\r
33 //-----------------------------------------------------------------------------
\r
35 /* JTAG TCK, AS/PS DCLK */
\r
37 sbit at 0xA2 TCK; /* Port C.2 */
\r
38 #define bmTCKOE bmBIT2
\r
39 #define SetTCK(x) do{TCK=(x);}while(0)
\r
41 /* JTAG TDI, AS ASDI, PS DATA0 */
\r
43 sbit at 0xA0 TDI; /* Port C.0 */
\r
44 #define bmTDIOE bmBIT0
\r
45 #define SetTDI(x) do{TDI=(x);}while(0)
\r
47 /* JTAG TMS, AS/PS nCONFIG */
\r
49 sbit at 0xA3 TMS; /* Port C.3 */
\r
50 #define bmTMSOE bmBIT3
\r
51 #define SetTMS(x) do{TMS=(x);}while(0)
\r
53 /* JTAG TDO, AS/PS CONF_DONE */
\r
55 sbit at 0xA1 TDO; /* Port C.1 */
\r
56 #define bmTDOOE bmBIT1
\r
57 #define GetTDO(x) TDO
\r
60 sbit JTAG_EN = 0xA7; /* Port C.7 */
\r
61 #define bmJTAG_EN bmBIT7
\r
63 //-----------------------------------------------------------------------------
\r
65 #if defined(HAVE_PS_MODE) || defined(HAVE_AS_MODE)
\r
67 /* AS DATAOUT, PS nSTATUS */
\r
69 sbit at 0xA6 ASDO; /* Port C.6 */
\r
70 #define bmASDOOE bmBIT6
\r
71 #define GetASDO(x) ASDO
\r
76 #define GetASDO(x) 1
\r
80 //-----------------------------------------------------------------------------
\r
82 #if defined(HAVE_AS_MODE)
\r
86 sbit at 0xA4 NCS; /* Port C.4 */
\r
87 #define bmNCSOE bmBIT4
\r
88 #define SetNCS(x) do{NCS=(x);}while(0)
\r
89 #define GetNCS(x) NCS
\r
93 sbit at 0xA5 NCE; /* Port C.5 */
\r
94 #define bmNCEOE bmBIT5
\r
95 #define SetNCE(x) do{NCE=(x);}while(0)
\r
97 unsigned char ProgIO_ShiftInOut_AS(unsigned char x);
\r
102 #define SetNCS(x) while(0){}
\r
103 #define GetNCS(x) 1
\r
105 #define SetNCE(x) while(0){}
\r
107 #define ProgIO_ShiftInOut_AS(x) ProgIO_ShiftInOut(x)
\r
111 //-----------------------------------------------------------------------------
\r
115 sbit at 0xA7 OELED; /* Port C.7 */
\r
116 #define bmOELEDOE bmBIT7
\r
117 #define SetOELED(x) do{OELED=(x);}while(0)
\r
121 #define bmOELEDOE 0
\r
122 #define SetOELED(x) while(0){}
\r
126 //-----------------------------------------------------------------------------
\r
128 #define bmPROGOUTOE (bmTCKOE|bmTDIOE|bmTMSOE|bmNCEOE|bmNCSOE|bmOELEDOE)
\r
129 #define bmPROGINOE (bmTDOOE|bmASDOOE)
\r
131 //-----------------------------------------------------------------------------
\r
133 void ProgIO_Poll(void) {}
\r
134 // These aren't called anywhere in usbjtag.c, but I plan to do so...
\r
135 void ProgIO_Enable(void) {}
\r
136 void ProgIO_Disable(void) {}
\r
137 void ProgIO_Deinit(void) {}
\r
140 void ProgIO_Init(void)
\r
142 /* The following code depends on your actual circuit design.
\r
143 Make required changes _before_ you try the code! */
\r
145 // set the CPU clock to 48MHz, enable clock output to FPGA
\r
146 CPUCS = bmCLKOE | bmCLKSPD1;
\r
148 // put the system in FIFO mode by default
\r
149 // internal clock source at 48Mhz, drive output pin, synchronous mode
\r
150 // NOTE: Altera USB-Blaster does not work in another mode
\r
151 IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE;
\r
152 IFCONFIG |= bmASYNC | bmIFCFG1 | bmIFCFG0;
\r
154 // set port C output enable (so we can handle the JTAG enable signal)
\r
157 // set port E output enable (actually only PE6 is used to enable/disable the 1.2V regulator, but for strange reasons we also have to enable PE1-5)
\r
160 // disconnect the 1.2V converter (in the configuration process, we can not draw
\r
161 // more than 100ma)
\r
164 // activate JTAG outputs on Port C
\r
165 OEC = bmTDIOE | bmTCKOE | bmTMSOE | bmJTAG_EN;
\r
168 void ProgIO_Set_State(unsigned char d)
\r
170 /* Set state of output pins:
\r
174 * d.2 => nCE (only #ifdef HAVE_AS_MODE)
\r
175 * d.3 => nCS (only #ifdef HAVE_AS_MODE)
\r
177 * d.5 => LED / Output Enable
\r
180 SetTCK((d & bmBIT0) ? 1 : 0);
\r
181 SetTMS((d & bmBIT1) ? 1 : 0);
\r
182 #ifdef HAVE_AS_MODE
\r
183 SetNCE((d & bmBIT2) ? 1 : 0);
\r
184 SetNCS((d & bmBIT3) ? 1 : 0);
\r
186 SetTDI((d & bmBIT4) ? 1 : 0);
\r
188 SetOELED((d & bmBIT5) ? 1 : 0);
\r
192 unsigned char ProgIO_Set_Get_State(unsigned char d)
\r
194 /* Set state of output pins (s.a.)
\r
195 * then read state of input pins:
\r
198 * DATAOUT => d.1 (only #ifdef HAVE_AS_MODE)
\r
201 ProgIO_Set_State(d);
\r
202 return (GetASDO()<<1)|GetTDO();
\r
205 //-----------------------------------------------------------------------------
\r
207 void ProgIO_ShiftOut(unsigned char c)
\r
209 /* Shift out byte C:
\r
212 * Output least significant bit on TDI
\r
219 (void)c; /* argument passed in DPL */
\r
269 ;; For ShiftInOut, the timing is a little more
\r
270 ;; critical because we have to read _TDO/shift/set _TDI
\r
271 ;; when _TCK is low. But 20% duty cycle at 48/4/5 MHz
\r
272 ;; is just like 50% at 6 Mhz, and that's still acceptable
\r
277 unsigned char ProgIO_ShiftInOut_JTAG(unsigned char c);
\r
278 unsigned char ProgIO_ShiftInOut_AS(unsigned char c);
\r
280 unsigned char ProgIO_ShiftInOut(unsigned char c)
\r
282 if(GetNCS(x)) return ProgIO_ShiftInOut_JTAG(c);
\r
283 return ProgIO_ShiftInOut_AS(c);
\r
286 #else /* HAVE_AS_MODE */
\r
288 #define ProgIO_ShiftInOut_JTAG(x) ProgIO_ShiftInOut(x)
\r
292 unsigned char ProgIO_ShiftInOut_JTAG(unsigned char c)
\r
294 /* Shift out byte C, shift in from TDO:
\r
297 * Read carry from TDO
\r
298 * Output least significant bit on TDI
\r
300 * Shift c right, append carry (TDO) at left
\r
306 (void)c; /* argument passed in DPL */
\r
364 /* return value in DPL */
\r
369 #ifdef HAVE_AS_MODE
\r
371 unsigned char ProgIO_ShiftInOut_AS(unsigned char c)
\r
373 /* Shift out byte C, shift in from TDO:
\r
376 * Read carry from TDO
\r
377 * Output least significant bit on TDI
\r
379 * Shift c right, append carry (TDO) at left
\r
385 (void)c; /* argument passed in DPL */
\r
445 #endif /* HAVE_AS_MODE */
\r