/* -*- c++ -*- */\r
-\r
/*-----------------------------------------------------------------------------\r
-\r
* Interrupt handling for FX2\r
-\r
*-----------------------------------------------------------------------------\r
-\r
* Code taken from USRP2 firmware (GNU Radio Project), version 3.0.2,\r
-\r
* Copyright 2003 Free Software Foundation, Inc.\r
-\r
*-----------------------------------------------------------------------------\r
-\r
* This code is part of usbjtag. usbjtag is free software; you can redistribute\r
-\r
* it and/or modify it under the terms of the GNU General Public License as\r
-\r
* published by the Free Software Foundation; either version 2 of the License,\r
-\r
* or (at your option) any later version. usbjtag is distributed in the hope\r
-\r
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied\r
-\r
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-\r
* GNU General Public License for more details. You should have received a\r
-\r
* copy of the GNU General Public License along with this program in the file\r
-\r
* COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin\r
-\r
* St, Fifth Floor, Boston, MA 02110-1301 USA\r
-\r
*-----------------------------------------------------------------------------\r
-\r
*/\r
\r
-\r
-\r
#include "isr.h"\r
-\r
#include "fx2regs.h"\r
-\r
#include "syncdelay.h"\r
\r
-\r
-\r
extern xdata unsigned char _standard_interrupt_vector[];\r
-\r
extern xdata unsigned char _usb_autovector[];\r
-\r
extern xdata unsigned char _fifo_gpif_autovector[];\r
\r
-\r
-\r
#define LJMP_OPCODE 0x02\r
\r
-\r
-\r
/*\r
-\r
* Hook standard interrupt vector.\r
-\r
*\r
-\r
* vector_number is from the SV_<foo> list.\r
-\r
* addr is the address of the interrupt service routine.\r
-\r
*/\r
-\r
void \r
-\r
hook_sv (unsigned char vector_number, unsigned short addr)\r
-\r
{\r
-\r
bit t;\r
-\r
\r
-\r
// sanity checks\r
\r
-\r
-\r
if (vector_number < SV_MIN || vector_number > SV_MAX)\r
-\r
return;\r
\r
-\r
-\r
if ((vector_number & 0x0f) != 0x03 && (vector_number & 0x0f) != 0x0b)\r
-\r
return;\r
\r
-\r
-\r
t = EA;\r
-\r
EA = 0;\r
-\r
_standard_interrupt_vector[vector_number] = LJMP_OPCODE;\r
-\r
_standard_interrupt_vector[vector_number + 1] = addr >> 8;\r
-\r
_standard_interrupt_vector[vector_number + 2] = addr & 0xff;\r
-\r
EA = t;\r
-\r
}\r
\r
-\r
-\r
/*\r
-\r
* Hook usb interrupt vector.\r
-\r
*\r
-\r
* vector_number is from the UV_<foo> list.\r
-\r
* addr is the address of the interrupt service routine.\r
-\r
*/\r
-\r
void \r
-\r
hook_uv (unsigned char vector_number, unsigned short addr)\r
-\r
{\r
-\r
bit t;\r
-\r
\r
-\r
// sanity checks\r
\r
-\r
-\r
#if UV_MIN>0\r
-\r
if (vector_number < UV_MIN) return;\r
-\r
#endif\r
-\r
if (vector_number > UV_MAX)\r
-\r
return;\r
\r
-\r
-\r
if ((vector_number & 0x3) != 0)\r
-\r
return;\r
\r
-\r
-\r
t = EA;\r
-\r
EA = 0;\r
-\r
_usb_autovector[vector_number] = LJMP_OPCODE;\r
-\r
_usb_autovector[vector_number + 1] = addr >> 8;\r
-\r
_usb_autovector[vector_number + 2] = addr & 0xff;\r
-\r
EA = t;\r
-\r
}\r
\r
-\r
-\r
/*\r
-\r
* Hook fifo/gpif interrupt vector.\r
-\r
*\r
-\r
* vector_number is from the FGV_<foo> list.\r
-\r
* addr is the address of the interrupt service routine.\r
-\r
*/\r
-\r
void \r
-\r
hook_fgv (unsigned char vector_number, unsigned short addr)\r
-\r
{\r
-\r
bit t;\r
-\r
\r
-\r
// sanity checks\r
\r
-\r
-\r
if (vector_number < FGV_MIN || vector_number > FGV_MAX)\r
-\r
return;\r
\r
-\r
-\r
if ((vector_number & 0x3) != 0)\r
-\r
return;\r
\r
-\r
-\r
t = EA;\r
-\r
EA = 0;\r
-\r
_fifo_gpif_autovector[vector_number] = LJMP_OPCODE;\r
-\r
_fifo_gpif_autovector[vector_number + 1] = addr >> 8;\r
-\r
_fifo_gpif_autovector[vector_number + 2] = addr & 0xff;\r
-\r
EA = t;\r
-\r
}\r
\r
-\r
-\r
/*\r
-\r
* One time call to enable autovectoring for both USB and FIFO/GPIF.\r
-\r
*\r
-\r
* This disables all USB and FIFO/GPIF interrupts and clears\r
-\r
* any pending interrupts too. It leaves the master USB and FIFO/GPIF\r
-\r
* interrupts enabled.\r
-\r
*/\r
-\r
void\r
-\r
setup_autovectors (void)\r
-\r
{\r
-\r
// disable master usb and fifo/gpif interrupt enables\r
-\r
EIUSB = 0;\r
-\r
EIEX4 = 0;\r
\r
-\r
-\r
hook_sv (SV_INT_2, (unsigned short) _usb_autovector);\r
-\r
hook_sv (SV_INT_4, (unsigned short) _fifo_gpif_autovector);\r
\r
-\r
-\r
// disable all fifo interrupt enables\r
-\r
SYNCDELAY;\r
-\r
EP2FIFOIE = 0; SYNCDELAY;\r
-\r
EP4FIFOIE = 0; SYNCDELAY;\r
-\r
EP6FIFOIE = 0; SYNCDELAY;\r
-\r
EP8FIFOIE = 0; SYNCDELAY;\r
\r
-\r
-\r
// clear all pending fifo irqs \r
-\r
EP2FIFOIRQ = 0xff; SYNCDELAY;\r
-\r
EP4FIFOIRQ = 0xff; SYNCDELAY;\r
-\r
EP6FIFOIRQ = 0xff; SYNCDELAY;\r
-\r
EP8FIFOIRQ = 0xff; SYNCDELAY;\r
\r
-\r
-\r
IBNIE = 0;\r
-\r
IBNIRQ = 0xff;\r
-\r
NAKIE = 0;\r
-\r
NAKIRQ = 0xff;\r
-\r
USBIE = 0;\r
-\r
USBIRQ = 0xff;\r
-\r
EPIE = 0;\r
-\r
EPIRQ = 0xff;\r
-\r
SYNCDELAY; GPIFIE = 0; \r
-\r
SYNCDELAY; GPIFIRQ = 0xff;\r
-\r
USBERRIE = 0;\r
-\r
USBERRIRQ = 0xff;\r
-\r
CLRERRCNT = 0;\r
-\r
\r
-\r
INTSETUP = bmAV2EN | bmAV4EN | bmINT4IN;\r
\r
-\r
-\r
// clear master irq's for usb and fifo/gpif\r
-\r
EXIF &= ~bmEXIF_USBINT;\r
-\r
EXIF &= ~bmEXIF_IE4;\r
-\r
\r
-\r
// enable master usb and fifo/gpif interrrupts\r
-\r
EIUSB = 1;\r
-\r
EIEX4 = 1;\r
-\r
}\r
-\r