USB-BDI
|
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 }