bsp/atsam: Use PIO for SC16IS752.

This allows to mix SC16IS752 chips with other interrupts.
This commit is contained in:
Christian Mauderer
2019-10-15 17:10:01 +02:00
parent d60b6d7c33
commit 9620dfa49e
2 changed files with 26 additions and 21 deletions

View File

@@ -15,6 +15,7 @@
#ifndef LIBBSP_ARM_ATSAM_SC16IS752_H #ifndef LIBBSP_ARM_ATSAM_SC16IS752_H
#define LIBBSP_ARM_ATSAM_SC16IS752_H #define LIBBSP_ARM_ATSAM_SC16IS752_H
#include <rtems/irq-extension.h>
#include <libchip/chip.h> #include <libchip/chip.h>
#include <dev/serial/sc16is752.h> #include <dev/serial/sc16is752.h>
@@ -26,6 +27,8 @@ extern "C" {
typedef struct { typedef struct {
sc16is752_spi_context base; sc16is752_spi_context base;
Pin irq_pin; Pin irq_pin;
rtems_interrupt_server_entry irqs_entry; /* Internal. Don't touch. */
rtems_interrupt_server_action irqs_action; /* Internal. Don't touch. */
} atsam_sc16is752_spi_context; } atsam_sc16is752_spi_context;
/** /**

View File

@@ -17,34 +17,40 @@
#include <rtems/irq-extension.h> #include <rtems/irq-extension.h>
static void atsam_sc16i752_interrupt(void *arg) static void atsam_sc16i752_irqs_handler(void *arg)
{ {
atsam_sc16is752_spi_context *ctx = arg; atsam_sc16is752_spi_context *ctx = arg;
sc16is752_interrupt_handler(&ctx->base.base); sc16is752_interrupt_handler(&ctx->base.base);
PIO_EnableIt(&ctx->irq_pin);
}
/* Interrupt Status Register shall be read to clear the interrupt flag */ static void atsam_sc16i752_interrupt(const Pin *pin, void *arg)
ctx->irq_pin.pio->PIO_ISR; {
atsam_sc16is752_spi_context *ctx = arg;
if(PIO_ItIsActive(&ctx->irq_pin)) {
PIO_DisableIt(&ctx->irq_pin);
rtems_interrupt_server_entry_submit(&ctx->irqs_entry);
}
} }
static bool atsam_sc16is752_install_interrupt(sc16is752_context *base) static bool atsam_sc16is752_install_interrupt(sc16is752_context *base)
{ {
atsam_sc16is752_spi_context *ctx = (atsam_sc16is752_spi_context *)base; atsam_sc16is752_spi_context *ctx = (atsam_sc16is752_spi_context *)base;
rtems_status_code sc; rtems_status_code sc;
uint8_t rv;
PIO_Configure(&ctx->irq_pin, 1); sc = rtems_interrupt_server_entry_initialize(RTEMS_INTERRUPT_SERVER_DEFAULT,
&ctx->irqs_entry);
rtems_interrupt_server_action_prepend(&ctx->irqs_entry,
&ctx->irqs_action, atsam_sc16i752_irqs_handler, ctx);
rv = PIO_Configure(&ctx->irq_pin, 1);
PIO_ConfigureIt(&ctx->irq_pin, atsam_sc16i752_interrupt, ctx);
PIO_EnableIt(&ctx->irq_pin); PIO_EnableIt(&ctx->irq_pin);
sc = rtems_interrupt_server_handler_install( return (sc == RTEMS_SUCCESSFUL) && (rv == 1);
RTEMS_ID_NONE,
ctx->irq_pin.id,
"Test",
RTEMS_INTERRUPT_SHARED,
atsam_sc16i752_interrupt,
ctx
);
return sc == RTEMS_SUCCESSFUL;
} }
static void atsam_sc16is752_remove_interrupt(sc16is752_context *base) static void atsam_sc16is752_remove_interrupt(sc16is752_context *base)
@@ -52,12 +58,8 @@ static void atsam_sc16is752_remove_interrupt(sc16is752_context *base)
atsam_sc16is752_spi_context *ctx = (atsam_sc16is752_spi_context *)base; atsam_sc16is752_spi_context *ctx = (atsam_sc16is752_spi_context *)base;
rtems_status_code sc; rtems_status_code sc;
sc = rtems_interrupt_server_handler_remove( PIO_DisableIt(&ctx->irq_pin);
RTEMS_ID_NONE, sc = PIO_RemoveIt(&ctx->irq_pin, atsam_sc16i752_interrupt, ctx);
ctx->irq_pin.id,
atsam_sc16i752_interrupt,
ctx
);
assert(sc == RTEMS_SUCCESSFUL); assert(sc == RTEMS_SUCCESSFUL);
} }