diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2009-10-21 13:24:35 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2009-10-21 13:24:35 +0000 |
commit | 60e5832e232bb788b67bc1f7678dbde6bdf9f306 (patch) | |
tree | 44c0c807bd09ebad3a3924d0738a6201f0b575c3 /c/src/lib/libbsp/shared | |
parent | * rtems/powerpc/registers.h: Added defines DEAR_BOOKE and DEAR_405. (diff) | |
download | rtems-60e5832e232bb788b67bc1f7678dbde6bdf9f306.tar.bz2 |
interrupt handler type change
Diffstat (limited to 'c/src/lib/libbsp/shared')
-rw-r--r-- | c/src/lib/libbsp/shared/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/shared/include/irq-generic.h | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/shared/src/irq-generic.c | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/shared/src/irq-legacy.c | 98 |
4 files changed, 20 insertions, 90 deletions
diff --git a/c/src/lib/libbsp/shared/ChangeLog b/c/src/lib/libbsp/shared/ChangeLog index 7043dac3a7..f0d3427e7c 100644 --- a/c/src/lib/libbsp/shared/ChangeLog +++ b/c/src/lib/libbsp/shared/ChangeLog @@ -1,3 +1,8 @@ +2009-10-21 Sebastian Huber <sebastian.huber@embedded-brains.de> + + * include/irq-generic.h, src/irq-generic.c, src/irq-legacy.c: Update + for interrupt handler type change. + 2009-10-09 Sebastian Huber <sebastian.huber@embedded-brains.de> * bootcard: Update for heap API changes. diff --git a/c/src/lib/libbsp/shared/include/irq-generic.h b/c/src/lib/libbsp/shared/include/irq-generic.h index 2386587ccb..555e3e3ed5 100644 --- a/c/src/lib/libbsp/shared/include/irq-generic.h +++ b/c/src/lib/libbsp/shared/include/irq-generic.h @@ -226,7 +226,7 @@ static inline void bsp_interrupt_handler_dispatch(rtems_vector_number vector) &bsp_interrupt_handler_table [bsp_interrupt_handler_index(vector)]; do { - (*e->handler)(vector, e->arg); + (*e->handler)(e->arg); e = e->next; } while (e != NULL); } else { diff --git a/c/src/lib/libbsp/shared/src/irq-generic.c b/c/src/lib/libbsp/shared/src/irq-generic.c index 8356728f41..2acd6b81f1 100644 --- a/c/src/lib/libbsp/shared/src/irq-generic.c +++ b/c/src/lib/libbsp/shared/src/irq-generic.c @@ -39,8 +39,10 @@ static uint8_t bsp_interrupt_handler_unique_table static rtems_id bsp_interrupt_mutex = RTEMS_ID_NONE; -static void bsp_interrupt_handler_empty(rtems_vector_number vector, void *arg) +static void bsp_interrupt_handler_empty(void *arg) { + rtems_vector_number vector = (rtems_vector_number) arg; + bsp_interrupt_handler_default(vector); } @@ -219,6 +221,7 @@ rtems_status_code bsp_interrupt_initialize(void) /* Initialize handler table */ for (i = 0; i < BSP_INTERRUPT_HANDLER_TABLE_SIZE; ++i) { bsp_interrupt_handler_table [i].handler = bsp_interrupt_handler_empty; + bsp_interrupt_handler_table [i].arg = (void *) i; } sc = bsp_interrupt_facility_initialize(); diff --git a/c/src/lib/libbsp/shared/src/irq-legacy.c b/c/src/lib/libbsp/shared/src/irq-legacy.c index b864541b8b..37853bae3d 100644 --- a/c/src/lib/libbsp/shared/src/irq-legacy.c +++ b/c/src/lib/libbsp/shared/src/irq-legacy.c @@ -19,62 +19,21 @@ * http://www.rtems.com/license/LICENSE. */ -#include <stdbool.h> -#include <stdlib.h> +#include <string.h> #define BSP_SHARED_HANDLER_SUPPORT +#include <rtems.h> #include <rtems/irq.h> #include <bsp/irq-generic.h> -typedef struct { - rtems_irq_hdl handler; - void *arg; -} bsp_interrupt_legacy_entry; - -typedef struct { - rtems_irq_hdl handler; - void *handler_arg; - bsp_interrupt_legacy_entry *legacy_handler_arg; -} bsp_interrupt_legacy_iterate_entry; - -static void bsp_interrupt_legacy_dispatch(rtems_vector_number vector, void *arg) -{ - bsp_interrupt_legacy_entry *e = (bsp_interrupt_legacy_entry *) arg; - e->handler(e->arg); -} - -static void bsp_interrupt_legacy_per_handler_routine( - void *arg, - const char *info, - rtems_option options, - rtems_interrupt_handler handler, - void *handler_arg -) -{ - bsp_interrupt_legacy_iterate_entry *ie = - (bsp_interrupt_legacy_iterate_entry *) arg; - bsp_interrupt_legacy_entry *e = NULL; - - if (handler == bsp_interrupt_legacy_dispatch) { - e = (bsp_interrupt_legacy_entry *) handler_arg; - if (e->handler == ie->handler && e->arg == ie->handler_arg) { - ie->legacy_handler_arg = e; - } - } -} - /** * @deprecated Obsolete. */ int BSP_get_current_rtems_irq_handler(rtems_irq_connect_data *cd) { - cd->hdl = NULL; - cd->handle = NULL; - cd->on = NULL; - cd->off = NULL; - cd->isOn = NULL; + memset(cd, 0, sizeof(*cd)); return 1; } @@ -85,24 +44,15 @@ int BSP_get_current_rtems_irq_handler(rtems_irq_connect_data *cd) int BSP_install_rtems_irq_handler(const rtems_irq_connect_data *cd) { rtems_status_code sc = RTEMS_SUCCESSFUL; - bsp_interrupt_legacy_entry *e = malloc(sizeof(bsp_interrupt_legacy_entry)); - - if (e == NULL) { - return 0; - } - - e->handler = cd->hdl; - e->arg = cd->handle; sc = rtems_interrupt_handler_install( cd->name, "LEGACY INSTALLED", RTEMS_INTERRUPT_UNIQUE, - bsp_interrupt_legacy_dispatch, - e + cd->hdl, + cd->handle ); if (sc != RTEMS_SUCCESSFUL) { - free(e); return 0; } @@ -119,29 +69,20 @@ int BSP_install_rtems_irq_handler(const rtems_irq_connect_data *cd) int BSP_install_rtems_shared_irq_handler(const rtems_irq_connect_data *cd) { rtems_status_code sc = RTEMS_SUCCESSFUL; - bsp_interrupt_legacy_entry *e = malloc(sizeof(bsp_interrupt_legacy_entry)); - - if (e == NULL) { - return 0; - } - - e->handler = cd->hdl; - e->arg = cd->handle; sc = rtems_interrupt_handler_install( cd->name, "LEGACY INSTALLED", RTEMS_INTERRUPT_SHARED, - bsp_interrupt_legacy_dispatch, - e + cd->hdl, + cd->handle ); if (sc != RTEMS_SUCCESSFUL) { - free(e); return 0; } if (cd->on != NULL) { - cd->on(cd); + (*cd->on)(cd); } return 1; @@ -153,31 +94,12 @@ int BSP_install_rtems_shared_irq_handler(const rtems_irq_connect_data *cd) int BSP_remove_rtems_irq_handler(const rtems_irq_connect_data *cd) { rtems_status_code sc = RTEMS_SUCCESSFUL; - bsp_interrupt_legacy_iterate_entry e = { - .handler = cd->hdl, - .handler_arg = cd->handle, - .legacy_handler_arg = NULL - }; - - sc = rtems_interrupt_handler_iterate( - cd->name, bsp_interrupt_legacy_per_handler_routine, &e); - if (sc != RTEMS_SUCCESSFUL) { - return 0; - } - - if (e.legacy_handler_arg == NULL) { - return 0; - } if (cd->off != NULL) { - cd->off(cd); + (*cd->off)(cd); } - sc = rtems_interrupt_handler_remove( - cd->name, bsp_interrupt_legacy_dispatch, e.legacy_handler_arg); - - free(e.legacy_handler_arg); - + sc = rtems_interrupt_handler_remove(cd->name, cd->hdl, cd->handle); if (sc != RTEMS_SUCCESSFUL) { return 0; } |