[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 2/3] cdi/core: Mehrere IRQ-Handler pro Treiber



Am Samstag, 2. Mai 2009 16:21 schrieb Antoine Kaufmann:
> ! cdi/core: Jetzt funktioniert das mit den IRQs auch, wenn man mal auf
>             absurde Idee kommt, mehrere IRQs in einem Treiber benutzen
>             zu wollen. ;-)
> ---
>  src/modules/cdi/lib/misc.c |   43
> +++++++++++++++++++++++++++++++++++-------- 1 files changed, 35
> insertions(+), 8 deletions(-)
>
> diff --git a/src/modules/cdi/lib/misc.c b/src/modules/cdi/lib/misc.c
> index d30d1b4..39047d7 100644
> --- a/src/modules/cdi/lib/misc.c
> +++ b/src/modules/cdi/lib/misc.c
> @@ -12,20 +12,35 @@
>  #include <syscall.h>
>  #include <rpc.h>
>  #include <sleep.h>
> +#include <stdio.h>
>
>  #include "cdi.h"
>  #include "cdi/misc.h"
>
> -// TODO Bei mehr als einem registrierten IRQ geht das so nicht mehr
> -static void (*driver_irq_handler)(struct cdi_device*) = NULL;
> -static struct cdi_device* driver_irq_device = NULL;
> +/** Ab diesem Interrupt fangen bei tyndur die IRQs an */
> +#define TYNDUR_IRQ_OFFSET   0x20
> +/** Anzahl der verfuegbaren IRQs */
> +#define IRQ_COUNT           0x10
> +
> +/** Array mit allen IRQ-Handlern; Als index wird die Nummer benutzt */
> +static void (*driver_irq_handler[IRQ_COUNT])(struct cdi_device*) = { NULL
> }; +/** Array mit den passenden Geraeten zu den registrierten IRQs */
> +static struct cdi_device* driver_irq_device[IRQ_COUNT] = { NULL };
>
>  /**
>   * Interner IRQ-Handler, der den IRQ-Handler des Treibers aufruft
>   */
>  static void irq_handler(uint8_t irq)
>  {
> -    driver_irq_handler(driver_irq_device);
> +    // Ups, das war wohl kein IRQ, den wollen wir nicht.
> +    if ((irq < TYNDUR_IRQ_OFFSET) || (irq >= TYNDUR_IRQ_OFFSET +
> IRQ_COUNT)) { +        return;
> +    }
> +
> +    irq -= TYNDUR_IRQ_OFFSET;
> +    if (driver_irq_handler[irq]) {
> +        driver_irq_handler[irq](driver_irq_device[irq]);
> +    }
>  }
>
>  /**
> @@ -35,13 +50,25 @@ static void irq_handler(uint8_t irq)
>   * @param handler Handlerfunktion
>   * @param device Geraet, das dem Handler als Parameter uebergeben werden
> soll */
> -void cdi_register_irq(uint8_t irq, void (*handler)(struct cdi_device*),
> +void cdi_register_irq(uint8_t irq, void (*handler)(struct cdi_device*),
>      struct cdi_device* device)
>  {
> -    driver_irq_handler = handler;
> -    driver_irq_device = device;
> +    if (irq > IRQ_COUNT) {

irq >= IRQ_COUNT

Ansonsten kann das rein.