3 /*-----------------------------------------------------------------------------
\r
5 * Interrupt handling for FX2
\r
7 *-----------------------------------------------------------------------------
\r
9 * Code taken from USRP2 firmware (GNU Radio Project), version 3.0.2,
\r
11 * Copyright 2003 Free Software Foundation, Inc.
\r
13 *-----------------------------------------------------------------------------
\r
15 * This code is part of usbjtag. usbjtag is free software; you can redistribute
\r
17 * it and/or modify it under the terms of the GNU General Public License as
\r
19 * published by the Free Software Foundation; either version 2 of the License,
\r
21 * or (at your option) any later version. usbjtag is distributed in the hope
\r
23 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
\r
25 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
27 * GNU General Public License for more details. You should have received a
\r
29 * copy of the GNU General Public License along with this program in the file
\r
31 * COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin
\r
33 * St, Fifth Floor, Boston, MA 02110-1301 USA
\r
35 *-----------------------------------------------------------------------------
\r
43 #include "fx2regs.h"
\r
45 #include "syncdelay.h"
\r
49 extern xdata unsigned char _standard_interrupt_vector[];
\r
51 extern xdata unsigned char _usb_autovector[];
\r
53 extern xdata unsigned char _fifo_gpif_autovector[];
\r
57 #define LJMP_OPCODE 0x02
\r
63 * Hook standard interrupt vector.
\r
67 * vector_number is from the SV_<foo> list.
\r
69 * addr is the address of the interrupt service routine.
\r
75 hook_sv (unsigned char vector_number, unsigned short addr)
\r
87 if (vector_number < SV_MIN || vector_number > SV_MAX)
\r
93 if ((vector_number & 0x0f) != 0x03 && (vector_number & 0x0f) != 0x0b)
\r
103 _standard_interrupt_vector[vector_number] = LJMP_OPCODE;
\r
105 _standard_interrupt_vector[vector_number + 1] = addr >> 8;
\r
107 _standard_interrupt_vector[vector_number + 2] = addr & 0xff;
\r
117 * Hook usb interrupt vector.
\r
121 * vector_number is from the UV_<foo> list.
\r
123 * addr is the address of the interrupt service routine.
\r
129 hook_uv (unsigned char vector_number, unsigned short addr)
\r
143 if (vector_number < UV_MIN) return;
\r
147 if (vector_number > UV_MAX)
\r
153 if ((vector_number & 0x3) != 0)
\r
163 _usb_autovector[vector_number] = LJMP_OPCODE;
\r
165 _usb_autovector[vector_number + 1] = addr >> 8;
\r
167 _usb_autovector[vector_number + 2] = addr & 0xff;
\r
177 * Hook fifo/gpif interrupt vector.
\r
181 * vector_number is from the FGV_<foo> list.
\r
183 * addr is the address of the interrupt service routine.
\r
189 hook_fgv (unsigned char vector_number, unsigned short addr)
\r
201 if (vector_number < FGV_MIN || vector_number > FGV_MAX)
\r
207 if ((vector_number & 0x3) != 0)
\r
217 _fifo_gpif_autovector[vector_number] = LJMP_OPCODE;
\r
219 _fifo_gpif_autovector[vector_number + 1] = addr >> 8;
\r
221 _fifo_gpif_autovector[vector_number + 2] = addr & 0xff;
\r
231 * One time call to enable autovectoring for both USB and FIFO/GPIF.
\r
235 * This disables all USB and FIFO/GPIF interrupts and clears
\r
237 * any pending interrupts too. It leaves the master USB and FIFO/GPIF
\r
239 * interrupts enabled.
\r
245 setup_autovectors (void)
\r
249 // disable master usb and fifo/gpif interrupt enables
\r
257 hook_sv (SV_INT_2, (unsigned short) _usb_autovector);
\r
259 hook_sv (SV_INT_4, (unsigned short) _fifo_gpif_autovector);
\r
263 // disable all fifo interrupt enables
\r
267 EP2FIFOIE = 0; SYNCDELAY;
\r
269 EP4FIFOIE = 0; SYNCDELAY;
\r
271 EP6FIFOIE = 0; SYNCDELAY;
\r
273 EP8FIFOIE = 0; SYNCDELAY;
\r
277 // clear all pending fifo irqs
\r
279 EP2FIFOIRQ = 0xff; SYNCDELAY;
\r
281 EP4FIFOIRQ = 0xff; SYNCDELAY;
\r
283 EP6FIFOIRQ = 0xff; SYNCDELAY;
\r
285 EP8FIFOIRQ = 0xff; SYNCDELAY;
\r
305 SYNCDELAY; GPIFIE = 0;
\r
307 SYNCDELAY; GPIFIRQ = 0xff;
\r
317 INTSETUP = bmAV2EN | bmAV4EN | bmINT4IN;
\r
321 // clear master irq's for usb and fifo/gpif
\r
323 EXIF &= ~bmEXIF_USBINT;
\r
325 EXIF &= ~bmEXIF_IE4;
\r
329 // enable master usb and fifo/gpif interrrupts
\r