USB-BDI
M:/USB-BDI/USB-BDI/Firmware/MPC555-USB-BDI/lib/isr.c
Go to the documentation of this file.
00001 /*      USB-BDI Used for programming and debugging a MPC555 over USB
00002  * 
00003  *  Copyright 2005 NTB Interstate University of Applied Sciences of Technology Buchs
00004  *
00005  *  This program is free software: you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation, either version 3 of the License, or
00008  *  (at your option) any later version.
00009  *
00010  *  This program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  *  GNU General Public License for more details.
00014  */
00015 
00024 #include "isr.h"
00025 #include "fx2regs.h"
00026 #include "syncdelay.h"
00027 
00029 extern __xdata unsigned char _standard_interrupt_vector[];
00031 extern __xdata unsigned char _usb_autovector[];
00033 extern __xdata unsigned char _fifo_gpif_autovector[];
00034 
00038 #define LJMP_OPCODE     0x02
00039 
00040 
00049 void hook_sv (unsigned char vector_number, unsigned short addr){
00050   __bit t;
00051   
00052   // sanity checks
00053 
00054   if (vector_number < SV_MIN || vector_number > SV_MAX)
00055     return;
00056 
00057   if ((vector_number & 0x0f) != 0x03 && (vector_number & 0x0f) != 0x0b)
00058     return;
00059 
00060   t = EA;
00061   EA = 0;
00062   _standard_interrupt_vector[vector_number] = LJMP_OPCODE;
00063   _standard_interrupt_vector[vector_number + 1] = addr >> 8;
00064   _standard_interrupt_vector[vector_number + 2] = addr & 0xff;
00065   EA = t;
00066 }
00067 
00076 void hook_uv (unsigned char vector_number, unsigned short addr){
00077   __bit t;
00078   
00079   // sanity checks
00080 
00081 /*  if (vector_number < UV_MIN || vector_number > UV_MAX)
00082     return;*/
00083 
00084   if ((vector_number & 0x3) != 0)
00085     return;
00086 
00087   t = EA;
00088   EA = 0;
00089   _usb_autovector[vector_number] = LJMP_OPCODE;
00090   _usb_autovector[vector_number + 1] = addr >> 8;
00091   _usb_autovector[vector_number + 2] = addr & 0xff;
00092   EA = t;
00093 }
00094 
00103 void hook_fgv (unsigned char vector_number, unsigned short addr){
00104   __bit t;
00105   
00106   // sanity checks
00107 
00108   if (vector_number < FGV_MIN || vector_number > FGV_MAX)
00109     return;
00110 
00111   if ((vector_number & 0x3) != 0)
00112     return;
00113 
00114   t = EA;
00115   EA = 0;
00116   _fifo_gpif_autovector[vector_number] = LJMP_OPCODE;
00117   _fifo_gpif_autovector[vector_number + 1] = addr >> 8;
00118   _fifo_gpif_autovector[vector_number + 2] = addr & 0xff;
00119   EA = t;
00120 }
00121 
00129 void setup_autovectors (void) {
00130   // disable master usb and fifo/gpif interrupt enables
00131   EIUSB = 0;
00132   EIEX4 = 0;
00133 
00134   hook_sv (SV_INT_2, (unsigned short) _usb_autovector);
00135   hook_sv (SV_INT_4, (unsigned short) _fifo_gpif_autovector);
00136 
00137   // disable all fifo interrupt enables
00138   SYNCDELAY;
00139   EP2FIFOIE = 0;        SYNCDELAY;
00140   EP4FIFOIE = 0;        SYNCDELAY;
00141   EP6FIFOIE = 0;        SYNCDELAY;
00142   EP8FIFOIE = 0;        SYNCDELAY;
00143 
00144   // clear all pending fifo irqs        
00145   EP2FIFOIRQ = 0xff;    SYNCDELAY;
00146   EP4FIFOIRQ = 0xff;    SYNCDELAY;
00147   EP6FIFOIRQ = 0xff;    SYNCDELAY;
00148   EP8FIFOIRQ = 0xff;    SYNCDELAY;
00149 
00150   IBNIE  = 0;
00151   IBNIRQ = 0xff;
00152   NAKIE  = 0;
00153   NAKIRQ = 0xff;
00154   USBIE  = 0;
00155   USBIRQ = 0xff;
00156   EPIE   = 0;
00157   EPIRQ  = 0xff;
00158   SYNCDELAY;    GPIFIE = 0;             
00159   SYNCDELAY;    GPIFIRQ = 0xff;
00160   USBERRIE = 0;
00161   USBERRIRQ = 0xff;
00162   CLRERRCNT = 0;
00163   
00164   INTSETUP = bmAV2EN | bmAV4EN | bmINT4IN;
00165 
00166   // clear master irq's for usb and fifo/gpif
00167   EXIF &= ~bmEXIF_USBINT;
00168   EXIF &= ~bmEXIF_IE4;
00169   
00170   // enable master usb and fifo/gpif interrrupts
00171   EIUSB = 1;
00172   EIEX4 = 1;
00173 }
 All Files Functions Variables Defines