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
25 #define HAVE_PS_MODE 1
\r
26 #define HAVE_AS_MODE 1
\r
27 #define HAVE_OE_LED 1
\r
29 //-----------------------------------------------------------------------------
\r
31 /* JTAG TCK, AS/PS DCLK */
\r
33 sbit at 0xA2 TCK; /* Port C.0 */
\r
34 #define bmTCKOE bmBIT2
\r
35 #define SetTCK(x) do{TCK=(x);}while(0)
\r
37 /* JTAG TDI, AS ASDI, PS DATA0 */
\r
39 sbit at 0xA0 TDI; /* Port C.2 */
\r
40 #define bmTDIOE bmBIT0
\r
41 #define SetTDI(x) do{TDI=(x);}while(0)
\r
43 /* JTAG TMS, AS/PS nCONFIG */
\r
45 sbit at 0xA3 TMS; /* Port C.3 */
\r
46 #define bmTMSOE bmBIT3
\r
47 #define SetTMS(x) do{TMS=(x);}while(0)
\r
49 /* JTAG TDO, AS/PS CONF_DONE */
\r
51 sbit at 0xA1 TDO; /* Port C.1 */
\r
52 #define bmTDOOE bmBIT1
\r
53 #define GetTDO(x) TDO
\r
56 sbit JTAG_EN = 0xA0+7;
\r
57 #define bmJTAG_EN bmBIT7
\r
59 //-----------------------------------------------------------------------------
\r
61 #if defined(HAVE_PS_MODE) || defined(HAVE_AS_MODE)
\r
63 /* AS DATAOUT, PS nSTATUS */
\r
65 sbit at 0xA6 ASDO; /* Port C.6 */
\r
66 #define bmASDOOE bmBIT6
\r
67 #define GetASDO(x) ASDO
\r
72 #define GetASDO(x) 0
\r
76 //-----------------------------------------------------------------------------
\r
78 #if defined(HAVE_AS_MODE)
\r
82 sbit at 0xA4 NCS; /* Port C.4 */
\r
83 #define bmNCSOE bmBIT4
\r
84 #define SetNCS(x) do{NCS=(x);}while(0)
\r
85 #define GetNCS(x) NCS
\r
89 sbit at 0xA5 NCE; /* Port C.5 */
\r
90 #define bmNCEOE bmBIT5
\r
91 #define SetNCE(x) do{NCE=(x);}while(0)
\r
93 unsigned char ProgIO_ShiftInOut_AS(unsigned char x);
\r
98 #define SetNCS(x) while(0){}
\r
101 #define SetNCE(x) while(0){}
\r
103 #define ProgIO_ShiftInOut_AS(x) ProgIO_ShiftInOut(x)
\r
107 //-----------------------------------------------------------------------------
\r
111 sbit at 0xA7 OELED; /* Port C.7 */
\r
112 #define bmOELEDOE bmBIT7
\r
113 #define SetOELED(x) do{OELED=(x);}while(0)
\r
117 #define bmOELEDOE 0
\r
118 #define SetOELED(x) while(0){}
\r
122 //-----------------------------------------------------------------------------
\r
124 #define bmPROGOUTOE (bmTCKOE|bmTDIOE|bmTMSOE|bmNCEOE|bmNCSOE|bmOELEDOE)
\r
125 #define bmPROGINOE (bmTDOOE|bmASDOOE)
\r
127 //-----------------------------------------------------------------------------
\r
129 void ProgIO_Poll(void) {}
\r
130 // These aren't called anywhere in usbjtag.c, but I plan to do so...
\r
131 void ProgIO_Enable(void) {}
\r
132 void ProgIO_Disable(void) {}
\r
133 void ProgIO_Deinit(void) {}
\r
136 void ProgIO_Init(void)
\r
138 /* The following code depends on your actual circuit design.
\r
139 Make required changes _before_ you try the code! */
\r
141 // set port C output enable (so we can handle the JTAG enable signal)
\r
144 // 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
147 // disconnect the 1.2V converter (in the configuration process, we can not draw
\r
148 // more than 100ma)
\r
151 // set the CPU clock to 48MHz
\r
154 // activate JTAG outputs on Port C
\r
155 OEC = bmTDIOE | bmTCKOE | bmTMSOE | bmJTAG_EN;
\r
157 // put the system in FIFO mode by default
\r
158 // internal clock source at 48Mhz, drive output pin, synchronous mode
\r
159 // NOTE: Altera USB-Blaster does not work in another mode
\r
160 IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE;
\r
161 IFCONFIG |= bmASYNC | bmIFCFG1 | bmIFCFG0;
\r
164 void ProgIO_Set_State(unsigned char d)
\r
166 /* Set state of output pins:
\r
170 * d.2 => nCE (only #ifdef HAVE_AS_MODE)
\r
171 * d.3 => nCS (only #ifdef HAVE_AS_MODE)
\r
173 * d.6 => LED / Output Enable
\r
176 SetTCK((d & bmBIT0) ? 1 : 0);
\r
177 SetTMS((d & bmBIT1) ? 1 : 0);
\r
178 #ifdef HAVE_AS_MODE
\r
179 SetNCE((d & bmBIT2) ? 1 : 0);
\r
180 SetNCS((d & bmBIT3) ? 1 : 0);
\r
182 SetTDI((d & bmBIT4) ? 1 : 0);
\r
184 SetOELED((d & bmBIT5) ? 1 : 0);
\r
188 unsigned char ProgIO_Set_Get_State(unsigned char d)
\r
190 ProgIO_Set_State(d);
\r
192 /* Read state of input pins:
\r
195 * DATAOUT => d.1 (only #ifdef HAVE_AS_MODE)
\r
198 return (GetASDO()<<1)|GetTDO();
\r
201 //-----------------------------------------------------------------------------
\r
203 void ProgIO_ShiftOut(unsigned char c)
\r
205 /* Shift out byte C:
\r
208 * Output least significant bit on TDI
\r
215 (void)c; /* argument passed in DPL */
\r
265 ;; For ShiftInOut, the timing is a little more
\r
266 ;; critical because we have to read _TDO/shift/set _TDI
\r
267 ;; when _TCK is low. But 20% duty cycle at 48/4/5 MHz
\r
268 ;; is just like 50% at 6 Mhz, and that's still acceptable
\r
273 unsigned char ProgIO_ShiftInOut_JTAG(unsigned char c);
\r
274 unsigned char ProgIO_ShiftInOut_AS(unsigned char c);
\r
276 unsigned char ProgIO_ShiftInOut(unsigned char c)
\r
278 if(GetNCS(x)) return ProgIO_ShiftInOut_JTAG(c);
\r
279 return ProgIO_ShiftInOut_AS(c);
\r
282 #else /* HAVE_AS_MODE */
\r
284 #define ProgIO_ShiftInOut_JTAG(x) ProgIO_ShiftInOut(x)
\r
288 unsigned char ProgIO_ShiftInOut_JTAG(unsigned char c)
\r
290 /* Shift out byte C, shift in from TDO:
\r
293 * Read carry from TDO
\r
294 * Output least significant bit on TDI
\r
296 * Shift c right, append carry (TDO) at left
\r
302 (void)c; /* argument passed in DPL */
\r
360 /* return value in DPL */
\r
365 #ifdef HAVE_AS_MODE
\r
367 unsigned char ProgIO_ShiftInOut_AS(unsigned char c)
\r
369 /* Shift out byte C, shift in from TDO:
\r
372 * Read carry from TDO
\r
373 * Output least significant bit on TDI
\r
375 * Shift c right, append carry (TDO) at left
\r
381 (void)c; /* argument passed in DPL */
\r
441 #endif /* HAVE_AS_MODE */
\r