[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, 25. April 2009 17:07 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 | 34 +++++++++++++++++++++++++---------
> 1 files changed, 25 insertions(+), 9 deletions(-)
>
> diff --git a/src/modules/cdi/lib/misc.c b/src/modules/cdi/lib/misc.c
> index 4a22f78..ae66a9e 100644
> --- a/src/modules/cdi/lib/misc.c
> +++ b/src/modules/cdi/lib/misc.c
> @@ -16,16 +16,26 @@
> #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;
> +#define LOST_IRQ_OFFSET 0x20
> +#define IRQ_COUNT 0x10
Fehlende Kommentare.
> +
> +static void (*driver_irq_handler[IRQ_COUNT])(struct cdi_device*) = { NULL
> }; +static struct cdi_device* driver_irq_device[IRQ_COUNT] = { NULL };
>
> /**
> * Interner IRQ-Handler, der den IRQ-Handler des Treibers aufruft
> */
> -static void irq_handler(byte irq)
> +static void irq_handler(uint8_t irq)
> {
> - driver_irq_handler(driver_irq_device);
> + // Oops, das war wohl kein IRQ, den wollen wir nicht.
s/Oops/Ups/ ;-)
> + if ((irq < LOST_IRQ_OFFSET) || (irq > LOST_IRQ_OFFSET + IRQ_COUNT)) {
Das sollte ein >= sein, glaube ich. Auf jeden Fall off by one.
> + return;
> + }
> +
> + irq -= LOST_IRQ_OFFSET;
> + if (driver_irq_handler[irq]) {
> + driver_irq_handler[irq](driver_irq_device[irq]);
> + }
> }
>
> /**
> @@ -35,13 +45,19 @@ static void irq_handler(byte 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) {
> + // FIXME: Eigentlich sollte diese Funktion etwas weniger
> optimistisch + // sein, und einen Rueckgabewert haben.
> + return;
> + }
> +
> + driver_irq_handler[irq] = handler;
> + driver_irq_device[irq] = device;
Eine Prüfung, ob der IRQ schon registriert ist, wäre noch ganz nett. Wobei das
Verhalten in dem Fall eh undefiniert ist. Vielleicht ein fprintf(stderr) in
diesem Fall.