intvects.c
00001 /*
00002  * $Id: intvects.c,v 1.18 2008/01/06 21:34:16 joerg_wunsch Exp $
00003  *
00004  ****************************************************************************
00005  *
00006  * simulavr - A simulator for the Atmel AVR family of microcontrollers.
00007  * Copyright (C) 2001, 2002, 2003, 2004  Theodore A. Roth
00008  *
00009  * This program is free software; you can redistribute it and/or modify
00010  * it under the terms of the GNU General Public License as published by
00011  * the Free Software Foundation; either version 2 of the License, or
00012  * (at your option) any later version.
00013  *
00014  * This program is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  * GNU General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU General Public License
00020  * along with this program; if not, write to the Free Software
00021  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022  *
00023  ****************************************************************************
00024  */
00025 
00026 #include <config.h>
00027 
00028 #include <stdio.h>
00029 #include <stdlib.h>
00030 
00031 #include "intvects.h"
00032 
00033 /****************************************************************************\
00034  *
00035  * Interrupt Vector Tables:
00036  *
00037  *   Since each device could have a different set of available interrupts, the
00038  *   following tables map all interrupts to the addr to jump to when the
00039  *   interrupt happens. If the device doesn't support an interrupt, the table
00040  *   will contain a NULL entry. Only one table will be installed into the core
00041  *   for a given device.
00042  *
00043  \****************************************************************************/
00044 
00045 /* *INDENT-OFF* */
00046 
00047 /*
00048  * Vector Table for devices:
00049  *   at90s1200
00050  */
00051 static IntVectTable vtab_at90s1200 = {
00052     .RESET          = { "IRQ_RESET",
00053                         0x00, 0x00, NO_BIT, NO_BIT },
00054     .INT0           = { "IRQ_INT0",
00055                         0x01, 0x00, { 0x5b, 1<<6 }, NO_BIT },
00056     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00057                         0x02, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00058     .ANA_COMP       = { "IRQ_ANA_COMP",
00059                         0x03, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } }
00060 };
00061 
00062 /*
00063  * Vector Table for devices:
00064  *   at90s2313
00065  */
00066 static IntVectTable vtab_at90s2313 = {
00067     .RESET          = { "IRQ_RESET",
00068                         0x00, 0x00, NO_BIT, NO_BIT },
00069     .INT0           = { "IRQ_INT0",
00070                         0x01, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00071     .INT1           = { "IRQ_INT1",
00072                         0x02, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00073     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00074                         0x03, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00075     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00076                         0x04, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00077     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00078                         0x05, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00079     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00080                         0x06, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00081     .UART_RX        = { "IRQ_UART_RX",
00082                         0x07, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00083     .UART_UDRE      = { "IRQ_UART_UDRE",
00084                         0x08, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00085     .UART_TX        = { "IRQ_UART_TX",
00086                         0x09, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00087     .ANA_COMP       = { "IRQ_ANA_COMP",
00088                         0x0a, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } }
00089 };
00090 
00091 /*
00092  * Vector Table for devices:
00093  *   at90s4414, at90s8515
00094  */
00095 static IntVectTable vtab_at90s4414 = {
00096     .RESET          = { "IRQ_RESET",
00097                         0x00, 0x00, NO_BIT, NO_BIT },
00098     .INT0           = { "IRQ_INT0",
00099                         0x01, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00100     .INT1           = { "IRQ_INT1",
00101                         0x02, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00102     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00103                         0x03, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00104     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00105                         0x04, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00106     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00107                         0x05, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00108     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00109                         0x06, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00110     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00111                         0x07, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00112     .SPI_STC        = { "IRQ_SPI_STC",
00113                         0x08, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00114     .UART_RX        = { "IRQ_UART_RX",
00115                         0x09, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00116     .UART_UDRE      = { "IRQ_UART_UDRE",
00117                         0x0a, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00118     .UART_TX        = { "IRQ_UART_TX",
00119                         0x0b, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00120     .ANA_COMP       = { "IRQ_ANA_COMP",
00121                         0x0c, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } }
00122 };
00123 
00124 /*
00125  * Vector Table for devices:
00126  *   atmega8
00127  */
00128 
00129 static IntVectTable vtab_atmega8 = {
00130     .RESET          = { "IRQ_RESET",
00131                         0x00, 0x00, NO_BIT, NO_BIT },
00132     .INT0           = { "IRQ_INT0",
00133                         0x01, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00134     .INT1           = { "IRQ_INT1",
00135                         0x02, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00136     .TIMER2_COMP    = { "IRQ_TIMER2_COMP",
00137                         0x03, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00138     .TIMER2_OVF     = { "IRQ_TIMER2_OVF",
00139                         0x04, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00140     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00141                         0x05, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00142     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00143                         0x06, 0x00, { 0x59, 1<<4 }, { 0x58, 1<<4 } },
00144     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00145                         0x07, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00146     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00147                         0x08, 0x00, { 0x59, 1<<2 }, { 0x58, 1<<2 } },
00148     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00149                         0x09, 0x00, { 0x59, 1<<0 }, { 0x58, 1<<0 } },
00150     .SPI_STC        = { "IRQ_SPI_STC",
00151                         0x0a, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00152     .UART_RX        = { "IRQ_UART_RX",
00153                         0x0b, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00154     .UART_UDRE      = { "IRQ_UART_UDRE",
00155                         0x0c, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00156     .UART_TX        = { "IRQ_UART_TX",
00157                         0x0d, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00158     .ADC            = { "IRQ_ADC",
00159                         0x0e, 0x00, { 0x26, 1<<3 }, { 0x26, 1<<4 } },
00160     .EE_READY       = { "IRQ_EE_READY",
00161                         0x0f, 0x00, { 0x3c, 1<<3 }, NO_BIT },
00162     .ANA_COMP       = { "IRQ_ANA_COMP",
00163                         0x10, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } },
00164     .TWI            = { "IRQ_TWI",
00165                         0x11, 0x00, { 0x56, 1<<0 }, { 0x56, 1<<7 } },
00166     .SPM_READY      = { "IRQ_SPM_READY",
00167                         0x12, 0x00, { 0x57, 1<<7 }, NO_BIT }
00168 };
00169 
00170 
00171 
00172 /*
00173  * Vector Table for devices:
00174  *   atmega16
00175  */
00176 
00177 static IntVectTable vtab_atmega16 = {
00178     .RESET          = { "IRQ_RESET",
00179                         0x00, 0x00, NO_BIT, NO_BIT },
00180     .INT0           = { "IRQ_INT0",
00181                         0x02, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00182     .INT1           = { "IRQ_INT1",
00183                         0x04, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00184     .TIMER2_COMP    = { "IRQ_TIMER2_COMP",
00185                         0x06, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00186     .TIMER2_OVF     = { "IRQ_TIMER2_OVF",
00187                         0x08, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00188     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00189                         0x0a, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00190     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00191                         0x0c, 0x00, { 0x59, 1<<4 }, { 0x58, 1<<4 } },
00192     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00193                         0x0e, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00194     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00195                         0x10, 0x00, { 0x59, 1<<2 }, { 0x58, 1<<2 } },
00196     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00197                         0x12, 0x00, { 0x59, 1<<0 }, { 0x58, 1<<0 } },
00198     .SPI_STC        = { "IRQ_SPI_STC",
00199                         0x14, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00200     .UART_RX        = { "IRQ_UART_RX",
00201                         0x16, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00202     .UART_UDRE      = { "IRQ_UART_UDRE",
00203                         0x18, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00204     .UART_TX        = { "IRQ_UART_TX",
00205                         0x1a, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00206     .ADC            = { "IRQ_ADC",
00207                         0x1c, 0x00, { 0x26, 1<<3 }, { 0x26, 1<<4 } },
00208     .EE_READY       = { "IRQ_EE_READY",
00209                         0x1e, 0x00, { 0x3c, 1<<3 }, NO_BIT },
00210     .ANA_COMP       = { "IRQ_ANA_COMP",
00211                         0x20, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } },
00212     .TWI            = { "IRQ_TWI",
00213                         0x22, 0x00, { 0x57, 1<<0 }, { 0x56, 1<<7 } },
00214     .INT2           = { "IRQ_INT2",
00215                         0x24, 0x00, { 0x5b, 1<<5 }, { 0x5a, 1<<5 } },
00216     .TIMER0_COMP    = { "IRQ_TIMER0_COMP",
00217                         0x26, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00218     .SPM_READY      = { "IRQ_SPM_READY",
00219                         0x28, 0x00, { 0x57, 1<<7 }, NO_BIT }
00220 };
00221 
00222 /*
00223  * Vector Table for devices:
00224  *   atmega32
00225  */
00226 
00227 static IntVectTable vtab_atmega32 = {
00228     .RESET          = { "IRQ_RESET",
00229                         0x00, 0x00, NO_BIT, NO_BIT },
00230     .INT0           = { "IRQ_INT0",
00231                         0x02, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00232     .INT1           = { "IRQ_INT1",
00233                         0x04, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00234     .TIMER2_COMP    = { "IRQ_TIMER2_COMP",
00235                         0x06, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00236     .TIMER2_OVF     = { "IRQ_TIMER2_OVF",
00237                         0x08, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00238     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00239                         0x0a, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00240     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00241                         0x0c, 0x00, { 0x59, 1<<4 }, { 0x58, 1<<4 } },
00242     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00243                         0x0e, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00244     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00245                         0x10, 0x00, { 0x59, 1<<2 }, { 0x58, 1<<2 } },
00246     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00247                         0x12, 0x00, { 0x59, 1<<0 }, { 0x58, 1<<0 } },
00248     .SPI_STC        = { "IRQ_SPI_STC",
00249                         0x14, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00250     .UART_RX        = { "IRQ_UART_RX",
00251                         0x16, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00252     .UART_UDRE      = { "IRQ_UART_UDRE",
00253                         0x18, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00254     .UART_TX        = { "IRQ_UART_TX",
00255                         0x1a, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00256     .ADC            = { "IRQ_ADC",
00257                         0x1c, 0x00, { 0x26, 1<<3 }, { 0x26, 1<<4 } },
00258     .EE_READY       = { "IRQ_EE_READY",
00259                         0x1e, 0x00, { 0x3c, 1<<3 }, NO_BIT },
00260     .ANA_COMP       = { "IRQ_ANA_COMP",
00261                         0x20, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } },
00262     .TWI            = { "IRQ_TWI",
00263                         0x22, 0x00, { 0x57, 1<<0 }, { 0x56, 1<<7 } },
00264     .INT2           = { "IRQ_INT2",
00265                         0x24, 0x00, { 0x5b, 1<<5 }, { 0x5a, 1<<5 } },
00266     .TIMER0_COMP    = { "IRQ_TIMER0_COMP",
00267                         0x26, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00268     .SPM_READY      = { "IRQ_SPM_READY",
00269                         0x28, 0x00, { 0x57, 1<<7 }, NO_BIT }
00270 };
00271 
00272 
00273 /*
00274  * Vector Table for devices:
00275  *   atmega103
00276  */
00277 
00278 static IntVectTable vtab_atmega103 = {
00279     .RESET          = { "IRQ_RESET",
00280                         0x00, 0x00, NO_BIT, NO_BIT },
00281     .INT0           = { "IRQ_INT0",
00282                         0x02, 0x00, { 0x59, 1<<0 }, NO_BIT },
00283     .INT1           = { "IRQ_INT1",
00284                         0x04, 0x00, { 0x59, 1<<1 }, NO_BIT },
00285     .INT2           = { "IRQ_INT2",
00286                         0x06, 0x00, { 0x59, 1<<2 }, NO_BIT },
00287     .INT3           = { "IRQ_INT3",
00288                         0x08, 0x00, { 0x59, 1<<3 }, NO_BIT },
00289     .INT4           = { "IRQ_INT4",
00290                         0x0a, 0x00, { 0x59, 1<<4 }, { 0x58, 1<<4 } },
00291     .INT5           = { "IRQ_INT5",
00292                         0x0c, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00293     .INT6           = { "IRQ_INT6",
00294                         0x0e, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00295     .INT7           = { "IRQ_INT7",
00296                         0x10, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00297     .TIMER2_COMP    = { "IRQ_TIMER2_COMP",
00298                         0x12, 0x00, { 0x57, 1<<7 }, { 0x56, 1<<7 } },
00299     .TIMER2_OVF     = { "IRQ_TIMER2_OVF",
00300                         0x14, 0x00, { 0x57, 1<<6 }, { 0x56, 1<<6 } },
00301     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00302                         0x16, 0x00, { 0x57, 1<<5 }, { 0x56, 1<<5 } },
00303     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00304                         0x18, 0x00, { 0x57, 1<<4 }, { 0x56, 1<<4 } },
00305     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00306                         0x1a, 0x00, { 0x57, 1<<3 }, { 0x56, 1<<3 } },
00307     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00308                         0x1c, 0x00, { 0x57, 1<<2 }, { 0x56, 1<<2 } },
00309     .TIMER0_COMP    = { "IRQ_TIMER0_COMP",
00310                         0x1e, 0x00, { 0x57, 1<<1 }, { 0x56, 1<<1 } },
00311     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00312                         0x20, 0x00, { 0x57, 1<<0 }, { 0x56, 1<<0 } },
00313     .SPI_STC        = { "IRQ_SPI_STC",
00314                         0x22, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00315     .UART_RX        = { "IRQ_UART_RX",
00316                         0x24, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00317     .UART_UDRE      = { "IRQ_UART_UDRE",
00318                         0x26, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00319     .UART_TX        = { "IRQ_UART_TX",
00320                         0x28, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00321     .ADC            = { "IRQ_ADC",
00322                         0x2a, 0x00, { 0x26, 1<<3 }, { 0x26, 1<<4 } },
00323     .ANA_COMP       = { "IRQ_ANA_COMP",
00324                         0x2e, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } },
00325     .EE_READY       = { "IRQ_EE_READY",
00326                         0x2c, 0x00, { 0x3c, 1<<3 }, NO_BIT }
00327 };
00328 
00329 /*
00330  * Vector Table for devices:
00331  *   atmega128
00332  */
00333 
00334 /* Note that the mega128 has BOOTRST and IVSEL fuses which can be used to
00335    change the interrupt vectors. If used, the new vectors are just the
00336    following plus some Boot Reset Address. This could be implemented just as
00337    we vector to handler. */
00338 
00339 /* Note that the vectors address for mega128 are two insn's. This is needed
00340    since they can use jmp (32-bit) insn at the vector address. */
00341 
00342 static IntVectTable vtab_atmega128 = {
00343     .RESET          = { "IRQ_RESET",
00344                         0x00, 0x00, NO_BIT, NO_BIT },
00345     .INT0           = { "IRQ_INT0",
00346                         0x02, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00347     .INT1           = { "IRQ_INT1",
00348                         0x04, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00349     .INT2           = { "IRQ_INT2",
00350                         0x06, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00351     .INT3           = { "IRQ_INT3",
00352                         0x08, 0x00, { 0x59, 1<<4 }, { 0x58, 1<<4 } },
00353     .INT4           = { "IRQ_INT4",
00354                         0x0a, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00355     .INT5           = { "IRQ_INT5",
00356                         0x0c, 0x00, { 0x59, 1<<2 }, { 0x58, 1<<2 } },
00357     .INT6           = { "IRQ_INT6",
00358                         0x0e, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00359     .INT7           = { "IRQ_INT7",
00360                         0x10, 0x00, { 0x59, 1<<0 }, { 0x58, 1<<0 } },
00361     .TIMER2_COMP    = { "IRQ_TIMER2_COMP",
00362                         0x12, 0x00, { 0x57, 1<<7 }, { 0x56, 1<<7 } },
00363     .TIMER2_OVF     = { "IRQ_TIMER2_OVF",
00364                         0x14, 0x00, { 0x57, 1<<6 }, { 0x56, 1<<6 } },
00365     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00366                         0x16, 0x00, { 0x57, 1<<5 }, { 0x56, 1<<5 } },
00367     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00368                         0x18, 0x00, { 0x57, 1<<4 }, { 0x56, 1<<4 } },
00369     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00370                         0x1a, 0x00, { 0x57, 1<<3 }, { 0x56, 1<<3 } },
00371     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00372                         0x1c, 0x00, { 0x57, 1<<2 }, { 0x56, 1<<2 } },
00373     .TIMER0_COMP    = { "IRQ_TIMER0_COMP",
00374                         0x1e, 0x00, { 0x57, 1<<1 }, { 0x56, 1<<1 } },
00375     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00376                         0x20, 0x00, { 0x57, 1<<0 }, { 0x56, 1<<0 } },
00377     .SPI_STC        = { "IRQ_SPI_STC",
00378                         0x22, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00379     .USART0_RX      = { "IRQ_USART0_RX",
00380                         0x24, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00381     .USART0_UDRE    = { "IRQ_USART0_UDRE",
00382                         0x26, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00383     .USART0_TX      = { "IRQ_USART0_TX",
00384                         0x28, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00385     .ADC            = { "IRQ_ADC",
00386                         0x2a, 0x00, { 0x26, 1<<3 }, { 0x26, 1<<4 } },
00387     .EE_READY       = { "IRQ_EE_READY",
00388                         0x2c, 0x00, { 0x3c, 1<<3 }, NO_BIT },
00389     .ANA_COMP       = { "IRQ_ANA_COMP",
00390                         0x2e, 0x00, { 0x28, 1<<3 }, { 0x28, 1<<4 } },
00391     .TIMER1_COMPC   = { "IRQ_TIMER1_COMPC",
00392                         0x30, 0x00, { 0x7d, 1<<0 }, { 0x7c, 1<<0 } },
00393     .TIMER3_CAPT    = { "IRQ_TIMER3_CAPT",
00394                         0x32, 0x00, { 0x7d, 1<<5 }, { 0x7c, 1<<5 } },
00395     .TIMER3_COMPA   = { "IRQ_TIMER3_COMPA",
00396                         0x34, 0x00, { 0x7d, 1<<4 }, { 0x7c, 1<<4 } },
00397     .TIMER3_COMPB   = { "IRQ_TIMER3_COMPB",
00398                         0x36, 0x00, { 0x7d, 1<<3 }, { 0x7c, 1<<3 } },
00399     .TIMER3_COMPC   = { "IRQ_TIMER3_COMPC",
00400                         0x38, 0x00, { 0x7d, 1<<1 }, { 0x7c, 1<<1 } },
00401     .TIMER3_OVF     = { "IRQ_TIMER3_OVF",
00402                         0x3a, 0x00, { 0x7d, 1<<2 }, { 0x7c, 1<<2 } },
00403     .USART1_RX      = { "IRQ_USART1_RX",
00404                         0x3c, 0x00, { 0x9a, 1<<7 }, { 0x9b, 1<<7 } },
00405     .USART1_UDRE    = { "IRQ_USART1_UDRE",
00406                         0x3e, 0x00, { 0x9a, 1<<5 }, { 0x9b, 1<<5 } },
00407     .USART1_TX      = { "IRQ_USART1_TX",
00408                         0x40, 0x00, { 0x9a, 1<<6 }, { 0x9b, 1<<6 } },
00409     .TWI            = { "IRQ_TWI",
00410                         0x42, 0x00, { 0x74, 1<<0 }, { 0x74, 1<<7 } },
00411     .SPM_READY      = { "IRQ_SPM_READY",
00412                         0x44, 0x00, { 0x68, 1<<7 }, NO_BIT }
00413 };
00414 
00415 /* supports 355, 353, 351
00416    NOTE: The vector addresses are not sequential. */
00417 static IntVectTable vtab_at43usb355 = {
00418     .RESET          = { "IRQ_RESET",
00419                         0x00, 0x00, NO_BIT, NO_BIT },
00420     .INT0           = { "IRQ_INT0",
00421                         0x02, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00422     .INT1           = { "IRQ_INT1",
00423                         0x04, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00424     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00425                         0x06, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00426     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00427                         0x08, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00428     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00429                         0x0a, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00430     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00431                         0x0c, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00432     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00433                         0x0e, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00434     .SPI_STC        = { "IRQ_SPI_STC",
00435                         0x10, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00436     .ADC            = { "IRQ_ADC",
00437                         0x16, 0x00, { 0x27, 1<<3 }, { 0x27, 1<<4 } },
00438     .USB_HW         = { "IRQ_USB_HW",
00439                         0x18, 0x00, NO_BIT, NO_BIT } /* TODO */
00440 };
00441 
00442 /* supports 320 */
00443 static IntVectTable vtab_at43usb320 = {
00444     .RESET          = { "IRQ_RESET",
00445                         0x00, 0x00, NO_BIT, NO_BIT },
00446     .INT0           = { "IRQ_INT0",
00447                         0x02, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00448     .INT1           = { "IRQ_INT1",
00449                         0x04, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00450     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00451                         0x06, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00452     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00453                         0x08, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00454     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00455                         0x0a, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00456     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00457                         0x0c, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00458     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00459                         0x0e, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00460     .SPI_STC        = { "IRQ_SPI_STC",
00461                         0x10, 0x00, { 0x2d, 1<<7 }, NO_BIT },
00462     .UART_RX        = { "IRQ_UART_RX",
00463                         0x12, 0x00, { 0x2a, 1<<7 }, { 0x2b, 1<<7 } },
00464     .UART_UDRE      = { "IRQ_UART_UDRE",
00465                         0x14, 0x00, { 0x2a, 1<<5 }, { 0x2b, 1<<5 } },
00466     .UART_TX        = { "IRQ_UART_TX",
00467                         0x16, 0x00, { 0x2a, 1<<6 }, { 0x2b, 1<<6 } },
00468     .USB_HW         = { "IRQ_USB",
00469                         0x18, 0x00, NO_BIT, NO_BIT } /* TODO */
00470 };
00471 
00472 /* supports 325
00473    NOTE: The vector addresses are not sequential. */
00474 static IntVectTable vtab_at43usb325 = {
00475     .RESET          = { "IRQ_RESET",
00476                         0x00, 0x00, NO_BIT, NO_BIT },
00477     .INT0           = { "IRQ_INT0",
00478                         0x02, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00479     .INT1           = { "IRQ_INT1",
00480                         0x04, 0x00, { 0x5b, 1<<7 }, { 0x5a, 1<<7 } },
00481     .TIMER1_CAPT    = { "IRQ_TIMER1_CAPT",
00482                         0x06, 0x00, { 0x59, 1<<3 }, { 0x58, 1<<3 } },
00483     .TIMER1_COMPA   = { "IRQ_TIMER1_COMPA",
00484                         0x08, 0x00, { 0x59, 1<<6 }, { 0x58, 1<<6 } },
00485     .TIMER1_COMPB   = { "IRQ_TIMER1_COMPB",
00486                         0x0a, 0x00, { 0x59, 1<<5 }, { 0x58, 1<<5 } },
00487     .TIMER1_OVF     = { "IRQ_TIMER1_OVF",
00488                         0x0c, 0x00, { 0x59, 1<<7 }, { 0x58, 1<<7 } },
00489     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00490                         0x0e, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00491     .USB_HW         = { "IRQ_USB_HW",
00492                         0x18, 0x00, NO_BIT, NO_BIT } /* TODO */
00493 };
00494 
00495 /* supports 326
00496    NOTE: The vector addresses are not sequential. */
00497 static IntVectTable vtab_at43usb326 = {
00498     .RESET          = { "IRQ_RESET",
00499                         0x00, 0x00, NO_BIT, NO_BIT },
00500     .INT0           = { "IRQ_INT0",
00501                         0x02, 0x00, { 0x5b, 1<<6 }, { 0x5a, 1<<6 } },
00502     .TIMER0_OVF     = { "IRQ_TIMER0_OVF",
00503                         0x0e, 0x00, { 0x59, 1<<1 }, { 0x58, 1<<1 } },
00504     .USB_HW         = { "IRQ_USB_HW",
00505                         0x18, 0x00, NO_BIT, NO_BIT } /* TODO */
00506 };
00507 
00508 /* *INDENT-ON* */
00509 
00510 /*
00511  * Vector Table Lookup List.
00512  *
00513  * Maps a _vector_table_name to a device vector table.
00514  */
00515 IntVectTable *global_vtable_list[] = {
00516     &vtab_at90s1200,
00517     &vtab_at90s2313,
00518     &vtab_at90s4414,
00519     &vtab_atmega8,
00520     &vtab_atmega16,
00521     &vtab_atmega32,
00522     &vtab_atmega103,
00523     &vtab_atmega128,
00524     &vtab_at43usb355,
00525     &vtab_at43usb320,
00526     &vtab_at43usb325,
00527     &vtab_at43usb326,
00528     NULL
00529 };