diff options
Diffstat (limited to 'firmware/zpu/lib/pic.c')
-rw-r--r-- | firmware/zpu/lib/pic.c | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/firmware/zpu/lib/pic.c b/firmware/zpu/lib/pic.c deleted file mode 100644 index bd627ce6b..000000000 --- a/firmware/zpu/lib/pic.c +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- c -*- */ -/* - * Copyright 2007 Free Software Foundation, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "pic.h" -#include "hal_io.h" -#include "memory_map.h" - - -#define NVECTORS 8 - -/* - * Our secondary interrupt vector. - */ -irq_handler_t pic_vector[NVECTORS]; - -void -pic_init(void) -{ - // uP is level triggered - - pic_regs->mask = ~0; // mask all interrupts - pic_regs->edge_enable = PIC_ONETIME_INT | PIC_UNDERRUN_INT | PIC_OVERRUN_INT | PIC_PPS_INT; - pic_regs->polarity = ~0 & ~PIC_PHY_INT; // rising edge - pic_regs->pending = ~0; // clear all pending ints - - for (int i = 0; i < NVECTORS; i++){ - pic_vector[i] = pic_nop_handler; - } -} - -/* - * This magic gets pic_interrupt_handler wired into the - * system interrupt handler with the appropriate prologue and - * epilogue. - */ -//FIXME zpu-gcc does not install interrupt_handler like this -//void pic_interrupt_handler() __attribute__ ((interrupt_handler)); - -void pic_interrupt_handler() -{ - // pending and not masked interrupts - int live = pic_regs->pending & ~pic_regs->mask; - - // FIXME loop while there are interrupts to service. - // That will reduce our overhead. - - // handle the first one set - int i; - int mask; - for (i=0, mask=1; i < NVECTORS; i++, mask <<= 1){ - if (mask & live){ // handle this one - // puthex_nl(i); - (*pic_vector[i])(i); - pic_regs->pending = mask; // clear pending interrupt - return; - } - } -} - -void -pic_register_handler(unsigned irq, irq_handler_t handler) -{ - if (irq >= NVECTORS) - return; - pic_vector[irq] = handler; - - pic_regs->mask &= ~IRQ_TO_MASK(irq); -} - -void -pic_nop_handler(unsigned irq) -{ - // nop -} |