fxload fx2lp dev board
[fx2fw-sdcc] / hw_basic.c
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
17  */\r
18 \r
19 #include <fx2regs.h>\r
20 #include "hardware.h"\r
21 #include "delay.h"\r
22 \r
23 //-----------------------------------------------------------------------------\r
24 // comment out (undefine!) if you don't want PS, AS or OE signals\r
25 \r
26 #define HAVE_PS_MODE 1\r
27 #define HAVE_AS_MODE 1\r
28 #define HAVE_OE_LED  1\r
29 \r
30 // comment in (define!) if you want outputs disabled when possible\r
31 //#define HAVE_OENABLE 1\r
32 \r
33 //-----------------------------------------------------------------------------\r
34 \r
35 /* JTAG TCK, AS/PS DCLK */\r
36 \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
40 \r
41 /* JTAG TDI, AS ASDI, PS DATA0 */\r
42 \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
46 \r
47 /* JTAG TMS, AS/PS nCONFIG */\r
48 \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
52 \r
53 /* JTAG TDO, AS/PS CONF_DONE */\r
54 \r
55 sbit at 0xA1          TDO; /* Port C.1 */\r
56 #define bmTDOOE       bmBIT1\r
57 #define GetTDO(x)     TDO\r
58 \r
59 /* JTAG ENABLE */\r
60 sbit JTAG_EN = 0xA7; /* Port C.7 */\r
61 #define bmJTAG_EN bmBIT7\r
62 \r
63 //-----------------------------------------------------------------------------\r
64 \r
65 #if defined(HAVE_PS_MODE) || defined(HAVE_AS_MODE)\r
66 \r
67   /* AS DATAOUT, PS nSTATUS */\r
68 \r
69   sbit at 0xA6        ASDO; /* Port C.6 */\r
70   #define bmASDOOE    bmBIT6\r
71   #define GetASDO(x)  ASDO\r
72 \r
73 #else\r
74 \r
75   #define bmASDOOE    0\r
76   #define GetASDO(x)  1\r
77 \r
78 #endif\r
79 \r
80 //-----------------------------------------------------------------------------\r
81 \r
82 #if defined(HAVE_AS_MODE)\r
83 \r
84   /* AS Mode nCS */\r
85 \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
90 \r
91   /* AS Mode nCE */\r
92 \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
96 \r
97   unsigned char ProgIO_ShiftInOut_AS(unsigned char x);\r
98 \r
99 #else\r
100 \r
101   #define bmNCSOE     0\r
102   #define SetNCS(x)   while(0){}\r
103   #define GetNCS(x)   1\r
104   #define bmNCEOE     0\r
105   #define SetNCE(x)   while(0){}\r
106 \r
107   #define ProgIO_ShiftInOut_AS(x) ProgIO_ShiftInOut(x)\r
108 \r
109 #endif\r
110 \r
111 //-----------------------------------------------------------------------------\r
112 \r
113 #ifdef HAVE_OE_LED\r
114 \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
118 \r
119 #else\r
120 \r
121   #define bmOELEDOE   0\r
122   #define SetOELED(x) while(0){}\r
123 \r
124 #endif\r
125 \r
126 //-----------------------------------------------------------------------------\r
127 \r
128 #define bmPROGOUTOE (bmTCKOE|bmTDIOE|bmTMSOE|bmNCEOE|bmNCSOE|bmOELEDOE)\r
129 #define bmPROGINOE  (bmTDOOE|bmASDOOE)\r
130 \r
131 //-----------------------------------------------------------------------------\r
132 \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
138 \r
139 \r
140 void ProgIO_Init(void)\r
141 {\r
142   /* The following code depends on your actual circuit design.\r
143      Make required changes _before_ you try the code! */\r
144   \r
145   // set the CPU clock to 48MHz, enable clock output to FPGA\r
146   CPUCS = bmCLKOE | bmCLKSPD1;\r
147 \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
153 \r
154    // set port C output enable (so we can handle the JTAG enable signal)\r
155    OEC = (1 << 7);\r
156 \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
158    OEE = 0x7F;\r
159 \r
160    // disconnect the 1.2V converter (in the configuration process, we can not draw\r
161    // more than 100ma)\r
162    IOE = (1 << 6);\r
163 \r
164    // activate JTAG outputs on Port C\r
165    OEC = bmTDIOE | bmTCKOE | bmTMSOE | bmJTAG_EN;\r
166 }\r
167 \r
168 void ProgIO_Set_State(unsigned char d)\r
169 {\r
170   /* Set state of output pins:\r
171    *\r
172    * d.0 => TCK\r
173    * d.1 => TMS\r
174    * d.2 => nCE (only #ifdef HAVE_AS_MODE)\r
175    * d.3 => nCS (only #ifdef HAVE_AS_MODE)\r
176    * d.4 => TDI\r
177    * d.5 => LED / Output Enable\r
178    */\r
179 \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
185 #endif\r
186   SetTDI((d & bmBIT4) ? 1 : 0);\r
187 #ifdef HAVE_OE_LED\r
188   SetOELED((d & bmBIT5) ? 1 : 0);\r
189 #endif\r
190 }\r
191 \r
192 unsigned char ProgIO_Set_Get_State(unsigned char d)\r
193 {\r
194   /* Set state of output pins (s.a.)\r
195    * then read state of input pins:\r
196    *\r
197    * TDO => d.0\r
198    * DATAOUT => d.1 (only #ifdef HAVE_AS_MODE)\r
199    */\r
200 \r
201   ProgIO_Set_State(d);\r
202    return (GetASDO()<<1)|GetTDO();\r
203 }\r
204 \r
205 //-----------------------------------------------------------------------------\r
206 \r
207 void ProgIO_ShiftOut(unsigned char c)\r
208 {\r
209   /* Shift out byte C: \r
210    *\r
211    * 8x {\r
212    *   Output least significant bit on TDI\r
213    *   Raise TCK\r
214    *   Shift c right\r
215    *   Lower TCK\r
216    * }\r
217    */\r
218  \r
219   (void)c; /* argument passed in DPL */\r
220 \r
221   _asm\r
222         MOV  A,DPL\r
223         ;; Bit0\r
224         RRC  A\r
225         MOV  _TDI,C\r
226         SETB _TCK\r
227         ;; Bit1\r
228         RRC  A\r
229         CLR  _TCK\r
230         MOV  _TDI,C\r
231         SETB _TCK\r
232         ;; Bit2\r
233         RRC  A\r
234         CLR  _TCK\r
235         MOV  _TDI,C\r
236         SETB _TCK\r
237         ;; Bit3\r
238         RRC  A\r
239         CLR  _TCK\r
240         MOV  _TDI,C\r
241         SETB _TCK\r
242         ;; Bit4\r
243         RRC  A\r
244         CLR  _TCK\r
245         MOV  _TDI,C\r
246         SETB _TCK\r
247         ;; Bit5\r
248         RRC  A\r
249         CLR  _TCK\r
250         MOV  _TDI,C\r
251         SETB _TCK\r
252         ;; Bit6\r
253         RRC  A\r
254         CLR  _TCK\r
255         MOV  _TDI,C\r
256         SETB _TCK\r
257         ;; Bit7\r
258         RRC  A\r
259         CLR  _TCK\r
260         MOV  _TDI,C\r
261         SETB _TCK\r
262         NOP \r
263         CLR  _TCK\r
264         ret\r
265   _endasm;\r
266 }\r
267 \r
268 /*\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
273 */\r
274 \r
275 #if HAVE_AS_MODE\r
276 \r
277 unsigned char ProgIO_ShiftInOut_JTAG(unsigned char c);\r
278 unsigned char ProgIO_ShiftInOut_AS(unsigned char c);\r
279 \r
280 unsigned char ProgIO_ShiftInOut(unsigned char c)\r
281 {\r
282   if(GetNCS(x)) return ProgIO_ShiftInOut_JTAG(c);\r
283   return ProgIO_ShiftInOut_AS(c);\r
284 }\r
285 \r
286 #else /* HAVE_AS_MODE */\r
287 \r
288 #define ProgIO_ShiftInOut_JTAG(x) ProgIO_ShiftInOut(x)\r
289 \r
290 #endif\r
291 \r
292 unsigned char ProgIO_ShiftInOut_JTAG(unsigned char c)\r
293 {\r
294   /* Shift out byte C, shift in from TDO:\r
295    *\r
296    * 8x {\r
297    *   Read carry from TDO\r
298    *   Output least significant bit on TDI\r
299    *   Raise TCK\r
300    *   Shift c right, append carry (TDO) at left\r
301    *   Lower TCK\r
302    * }\r
303    * Return c.\r
304    */\r
305 \r
306    (void)c; /* argument passed in DPL */\r
307 \r
308   _asm\r
309         MOV  A,DPL\r
310 \r
311         ;; Bit0\r
312         MOV  C,_TDO\r
313         RRC  A\r
314         MOV  _TDI,C\r
315         SETB _TCK\r
316         CLR  _TCK\r
317         ;; Bit1\r
318         MOV  C,_TDO\r
319         RRC  A\r
320         MOV  _TDI,C\r
321         SETB _TCK\r
322         CLR  _TCK\r
323         ;; Bit2\r
324         MOV  C,_TDO\r
325         RRC  A\r
326         MOV  _TDI,C\r
327         SETB _TCK\r
328         CLR  _TCK\r
329         ;; Bit3\r
330         MOV  C,_TDO\r
331         RRC  A\r
332         MOV  _TDI,C\r
333         SETB _TCK\r
334         CLR  _TCK\r
335         ;; Bit4\r
336         MOV  C,_TDO\r
337         RRC  A\r
338         MOV  _TDI,C\r
339         SETB _TCK\r
340         CLR  _TCK\r
341         ;; Bit5\r
342         MOV  C,_TDO\r
343         RRC  A\r
344         MOV  _TDI,C\r
345         SETB _TCK\r
346         CLR  _TCK\r
347         ;; Bit6\r
348         MOV  C,_TDO\r
349         RRC  A\r
350         MOV  _TDI,C\r
351         SETB _TCK\r
352         CLR  _TCK\r
353         ;; Bit7\r
354         MOV  C,_TDO\r
355         RRC  A\r
356         MOV  _TDI,C\r
357         SETB _TCK\r
358         CLR  _TCK\r
359 \r
360         MOV  DPL,A\r
361         ret\r
362   _endasm;\r
363 \r
364   /* return value in DPL */\r
365 \r
366   return c;\r
367 }\r
368 \r
369 #ifdef HAVE_AS_MODE\r
370 \r
371 unsigned char ProgIO_ShiftInOut_AS(unsigned char c)\r
372 {\r
373   /* Shift out byte C, shift in from TDO:\r
374    *\r
375    * 8x {\r
376    *   Read carry from TDO\r
377    *   Output least significant bit on TDI\r
378    *   Raise TCK\r
379    *   Shift c right, append carry (TDO) at left\r
380    *   Lower TCK\r
381    * }\r
382    * Return c.\r
383    */\r
384 \r
385   (void)c; /* argument passed in DPL */\r
386 \r
387   _asm\r
388         MOV  A,DPL\r
389 \r
390         ;; Bit0\r
391         MOV  C,_ASDO\r
392         RRC  A\r
393         MOV  _TDI,C\r
394         SETB _TCK\r
395         CLR  _TCK\r
396         ;; Bit1\r
397         MOV  C,_ASDO\r
398         RRC  A\r
399         MOV  _TDI,C\r
400         SETB _TCK\r
401         CLR  _TCK\r
402         ;; Bit2\r
403         MOV  C,_ASDO\r
404         RRC  A\r
405         MOV  _TDI,C\r
406         SETB _TCK\r
407         CLR  _TCK\r
408         ;; Bit3\r
409         MOV  C,_ASDO\r
410         RRC  A\r
411         MOV  _TDI,C\r
412         SETB _TCK\r
413         CLR  _TCK\r
414         ;; Bit4\r
415         MOV  C,_ASDO\r
416         RRC  A\r
417         MOV  _TDI,C\r
418         SETB _TCK\r
419         CLR  _TCK\r
420         ;; Bit5\r
421         MOV  C,_ASDO\r
422         RRC  A\r
423         MOV  _TDI,C\r
424         SETB _TCK\r
425         CLR  _TCK\r
426         ;; Bit6\r
427         MOV  C,_ASDO\r
428         RRC  A\r
429         MOV  _TDI,C\r
430         SETB _TCK\r
431         CLR  _TCK\r
432         ;; Bit7\r
433         MOV  C,_ASDO\r
434         RRC  A\r
435         MOV  _TDI,C\r
436         SETB _TCK\r
437         CLR  _TCK\r
438 \r
439         MOV  DPL,A\r
440         ret\r
441   _endasm;\r
442   return c;\r
443 }\r
444 \r
445 #endif /* HAVE_AS_MODE */\r
446 \r
447 \r