I hadn't really intended this to be part of the series, but rather a stand-alone addition, but apparently I stod on the wrong commit when generating the series and didn't notice before sending out the first e-mail. Oh well, it's late on a Saturday... ;)
/Jakob Jakob Viketoft Senior Engineer in RTL and embedded software ÅAC Microtec AB Dag Hammarskjölds väg 48 SE-751 83 Uppsala, Sweden T: +46 702 80 95 97 http://www.aacmicrotec.com ________________________________________ From: jakob.viket...@gmail.com [jakob.viket...@gmail.com] Sent: Sunday, February 21, 2016 00:02 To: devel@rtems.org Cc: Jakob Viketoft Subject: [PATCH 8/8] Added an interrupt handler to generic_or1k BSP From: Jakob Viketoft <jakob.viket...@aacmicrotec.com> Update #2603 --- c/src/lib/libbsp/or1k/generic_or1k/irq/irq.c | 61 ++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/c/src/lib/libbsp/or1k/generic_or1k/irq/irq.c b/c/src/lib/libbsp/or1k/generic_or1k/irq/irq.c index c3c4d6d..ef69f54 100644 --- a/c/src/lib/libbsp/or1k/generic_or1k/irq/irq.c +++ b/c/src/lib/libbsp/or1k/generic_or1k/irq/irq.c @@ -8,6 +8,8 @@ /* * Copyright (c) 2014 Hesham ALMatary + * Copyright (c) 2015 ÅAC Microtec AB <www.aacmicrotec.com> + * Jakob Viketoft <jakob.viket...@aacmicrotec.com> * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -16,27 +18,72 @@ #include <bsp/irq.h> #include <bsp/irq-generic.h> +#include <assert.h> -/* Almost all of the jobs that the following functions should - * do are implemented in cpukit - */ +static int or1k_external_interrupt_handler(rtems_vector_number vector) +{ + uint32_t picsr; + uint32_t int_num; + + /* Get picsr */ + picsr = _OR1K_mfspr(CPU_OR1K_SPR_PICSR); + + /* Make sure we have a pending interrupt */ + assert(picsr != 0); + + /* Go through all set interrupts in a round-robin style */ + while (picsr) { + /* Find pending interrupt with lowest number */ + int_num = _OR1K_Find_first_one(picsr); + + /* Adjust vector number with a start from 0 */ + int_num--; + + /* Call the interrupt handler */ + bsp_interrupt_handler_dispatch((rtems_vector_number) int_num); + + /* Clear the interrupt */ + picsr &= ~(1 << int_num); + _OR1K_mtspr(CPU_OR1K_SPR_PICSR, picsr); + } + + return 0; +} void bsp_interrupt_handler_default(rtems_vector_number vector) { - printk("spurious interrupt: %u\n", vector); + printk("Unhandled interrupt, number: %u\n", vector); } rtems_status_code bsp_interrupt_facility_initialize() { - return 0; + /* Install exception handler for external interrupt exception */ + _CPU_ISR_install_vector(OR1K_EXCEPTION_IRQ, or1k_external_interrupt_handler, NULL); + + /* Clear all pending interrupts */ + _OR1K_mtspr(CPU_OR1K_SPR_PICSR, 0); + + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) { - return 0; + uint32_t picmr; + + picmr = _OR1K_mfspr(CPU_OR1K_SPR_PICMR); + picmr |= (1 << vector); + _OR1K_mtspr(CPU_OR1K_SPR_PICMR, picmr); + + return RTEMS_SUCCESSFUL; } rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector) { - return 0; + uint32_t picmr; + + picmr = _OR1K_mfspr(CPU_OR1K_SPR_PICMR); + picmr &= ~(1 << vector); + _OR1K_mtspr(CPU_OR1K_SPR_PICMR, picmr); + + return RTEMS_SUCCESSFUL; } -- 2.1.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel