OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.61/] [tools/] [fx2/] [src/] [lib/] [isr.c] - Blame information for rev 26

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 17 wfjm
/* -*- c++ -*- */
2
/* $Id: isr.c 395 2011-07-17 22:02:55Z mueller $ */
3
/*-----------------------------------------------------------------------------
4
 * Interrupt handling for FX2
5
 *-----------------------------------------------------------------------------
6
 * Code taken from USRP2 firmware (GNU Radio Project), version 3.0.2,
7
 * Copyright 2003 Free Software Foundation, Inc.
8
 *-----------------------------------------------------------------------------
9
 * This code is part of usbjtag. usbjtag is free software; you can redistribute
10
 * it and/or modify it under the terms of the GNU General Public License as
11
 * published by the Free Software Foundation; either version 2 of the License,
12
 * or (at your option) any later version. usbjtag is distributed in the hope
13
 * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
14
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.  You should have received a
16
 * copy of the GNU General Public License along with this program in the file
17
 * COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin
18
 * St, Fifth Floor, Boston, MA  02110-1301  USA
19
 *-----------------------------------------------------------------------------
20
 */
21
 
22
#include "isr.h"
23
#include "fx2regs.h"
24
#include "syncdelay.h"
25
 
26
extern xdata unsigned char _standard_interrupt_vector[];
27
extern xdata unsigned char _usb_autovector[];
28
extern xdata unsigned char _fifo_gpif_autovector[];
29
 
30
#define LJMP_OPCODE     0x02
31
 
32
/*
33
 * Hook standard interrupt vector.
34
 *
35
 * vector_number is from the SV_<foo> list.
36
 * addr is the address of the interrupt service routine.
37
 */
38
void
39
hook_sv (unsigned char vector_number, unsigned short addr)
40
{
41
  bit   t;
42
 
43
  // sanity checks
44
 
45
  if (vector_number < SV_MIN || vector_number > SV_MAX)
46
    return;
47
 
48
  if ((vector_number & 0x0f) != 0x03 && (vector_number & 0x0f) != 0x0b)
49
    return;
50
 
51
  t = EA;
52
  EA = 0;
53
  _standard_interrupt_vector[vector_number] = LJMP_OPCODE;
54
  _standard_interrupt_vector[vector_number + 1] = addr >> 8;
55
  _standard_interrupt_vector[vector_number + 2] = addr & 0xff;
56
  EA = t;
57
}
58
 
59
/*
60
 * Hook usb interrupt vector.
61
 *
62
 * vector_number is from the UV_<foo> list.
63
 * addr is the address of the interrupt service routine.
64
 */
65
void
66
hook_uv (unsigned char vector_number, unsigned short addr)
67
{
68
  bit   t;
69
 
70
  // sanity checks
71
 
72
#if UV_MIN>0
73
  if (vector_number < UV_MIN) return;
74
#endif
75
  if (vector_number > UV_MAX)
76
    return;
77
 
78
  if ((vector_number & 0x3) != 0)
79
    return;
80
 
81
  t = EA;
82
  EA = 0;
83
  _usb_autovector[vector_number] = LJMP_OPCODE;
84
  _usb_autovector[vector_number + 1] = addr >> 8;
85
  _usb_autovector[vector_number + 2] = addr & 0xff;
86
  EA = t;
87
}
88
 
89
/*
90
 * Hook fifo/gpif interrupt vector.
91
 *
92
 * vector_number is from the FGV_<foo> list.
93
 * addr is the address of the interrupt service routine.
94
 */
95
void
96
hook_fgv (unsigned char vector_number, unsigned short addr)
97
{
98
  bit   t;
99
 
100
  // sanity checks
101
 
102
  if (vector_number < FGV_MIN || vector_number > FGV_MAX)
103
    return;
104
 
105
  if ((vector_number & 0x3) != 0)
106
    return;
107
 
108
  t = EA;
109
  EA = 0;
110
  _fifo_gpif_autovector[vector_number] = LJMP_OPCODE;
111
  _fifo_gpif_autovector[vector_number + 1] = addr >> 8;
112
  _fifo_gpif_autovector[vector_number + 2] = addr & 0xff;
113
  EA = t;
114
}
115
 
116
/*
117
 * One time call to enable autovectoring for both USB and FIFO/GPIF.
118
 *
119
 * This disables all USB and FIFO/GPIF interrupts and clears
120
 * any pending interrupts too.  It leaves the master USB and FIFO/GPIF
121
 * interrupts enabled.
122
 */
123
void
124
setup_autovectors (void)
125
{
126
  // disable master usb and fifo/gpif interrupt enables
127
  EIUSB = 0;
128
  EIEX4 = 0;
129
 
130
  hook_sv (SV_INT_2, (unsigned short) _usb_autovector);
131
  hook_sv (SV_INT_4, (unsigned short) _fifo_gpif_autovector);
132
 
133
  // disable all fifo interrupt enables
134
  SYNCDELAY;
135
  EP2FIFOIE = 0; SYNCDELAY;
136
  EP4FIFOIE = 0; SYNCDELAY;
137
  EP6FIFOIE = 0; SYNCDELAY;
138
  EP8FIFOIE = 0; SYNCDELAY;
139
 
140
  // clear all pending fifo irqs        
141
  EP2FIFOIRQ = 0xff;    SYNCDELAY;
142
  EP4FIFOIRQ = 0xff;    SYNCDELAY;
143
  EP6FIFOIRQ = 0xff;    SYNCDELAY;
144
  EP8FIFOIRQ = 0xff;    SYNCDELAY;
145
 
146
  IBNIE  = 0;
147
  IBNIRQ = 0xff;
148
  NAKIE  = 0;
149
  NAKIRQ = 0xff;
150
  USBIE  = 0;
151
  USBIRQ = 0xff;
152
  EPIE   = 0;
153
  EPIRQ  = 0xff;
154
  SYNCDELAY;    GPIFIE = 0;
155
  SYNCDELAY;    GPIFIRQ = 0xff;
156
  USBERRIE = 0;
157
  USBERRIRQ = 0xff;
158
  CLRERRCNT = 0;
159
 
160
  INTSETUP = bmAV2EN | bmAV4EN | bmINT4IN;
161
 
162
  // clear master irq's for usb and fifo/gpif
163
  EXIF &= ~bmEXIF_USBINT;
164
  EXIF &= ~bmEXIF_IE4;
165
 
166
  // enable master usb and fifo/gpif interrrupts
167
  EIUSB = 1;
168
  EIEX4 = 1;
169
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.