forked from Imagelibrary/rtems
bsp/csb336: Use IRQ extensions API
Fix warnings.
This commit is contained in:
committed by
Sebastian Huber
parent
48a22edb4a
commit
52e44630e5
@@ -13,12 +13,12 @@
|
||||
#include <libchip/sersupp.h>
|
||||
#include <rtems/error.h>
|
||||
#include <rtems/bspIo.h>
|
||||
#include <assert.h>
|
||||
#include <termios.h>
|
||||
#include <rtems/irq.h>
|
||||
#include <bsp/irq.h>
|
||||
#include <mc9328mxl.h>
|
||||
|
||||
|
||||
/* Define this to use interrupt driver UART driver */
|
||||
#define USE_INTERRUPTS 1
|
||||
|
||||
@@ -34,20 +34,23 @@ static int imx_uart_set_attrs(int, const struct termios *);
|
||||
static void imx_uart_init(int minor);
|
||||
static void imx_uart_set_baud(int, int);
|
||||
static ssize_t imx_uart_poll_write(int, const char *, size_t);
|
||||
static int imx_uart_poll_read_char(int minor);
|
||||
static void imx_uart_poll_write_char(int minor, char c);
|
||||
static void _BSP_output_char(char c);
|
||||
static int _BSP_poll_char(void);
|
||||
|
||||
#if defined(USE_INTERRUPTS)
|
||||
#if USE_INTERRUPTS
|
||||
static void imx_uart_tx_isr(rtems_irq_hdl_param);
|
||||
static void imx_uart_rx_isr(rtems_irq_hdl_param);
|
||||
static void imx_uart_isr_on(const rtems_irq_connect_data *irq);
|
||||
static void imx_uart_isr_off(const rtems_irq_connect_data *irq);
|
||||
static int imx_uart_isr_is_on(const rtems_irq_connect_data *irq);
|
||||
static void imx_uart_isr_on(const rtems_irq_number);
|
||||
static void imx_uart_isr_off(const rtems_irq_number);
|
||||
static ssize_t imx_uart_intr_write(int, const char *, size_t);
|
||||
static rtems_vector_number imx_uart_name_transmit(int minor);
|
||||
static rtems_vector_number imx_uart_name_receive(int minor);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* TERMIOS callbacks */
|
||||
#if defined(USE_INTERRUPTS)
|
||||
#if USE_INTERRUPTS
|
||||
rtems_termios_callbacks imx_uart_cbacks = {
|
||||
.firstOpen = imx_uart_first_open,
|
||||
.lastClose = imx_uart_last_close,
|
||||
@@ -71,11 +74,6 @@ rtems_termios_callbacks imx_uart_cbacks = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(USE_INTERRUPTS)
|
||||
static rtems_irq_connect_data imx_uart_tx_isr_data[NUM_DEVS];
|
||||
static rtems_irq_connect_data imx_uart_rx_isr_data[NUM_DEVS];
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
int minor;
|
||||
mc9328mxl_uart_regs_t * regs;
|
||||
@@ -184,17 +182,9 @@ static void imx_uart_init(int minor)
|
||||
imx_uart_data[minor].idx = 0;
|
||||
|
||||
if (minor == 0) {
|
||||
#if defined(USE_INTERRUPTS)
|
||||
imx_uart_tx_isr_data[minor].name = BSP_INT_UART1_TX;
|
||||
imx_uart_rx_isr_data[minor].name = BSP_INT_UART1_RX;
|
||||
#endif
|
||||
imx_uart_data[minor].regs =
|
||||
(mc9328mxl_uart_regs_t *) MC9328MXL_UART1_BASE;
|
||||
} else if (minor == 1) {
|
||||
#if defined(USE_INTERRUPTS)
|
||||
imx_uart_tx_isr_data[minor].name = BSP_INT_UART2_TX;
|
||||
imx_uart_rx_isr_data[minor].name = BSP_INT_UART2_RX;
|
||||
#endif
|
||||
imx_uart_data[minor].regs =
|
||||
(mc9328mxl_uart_regs_t *) MC9328MXL_UART2_BASE;
|
||||
} else {
|
||||
@@ -202,20 +192,6 @@ static void imx_uart_init(int minor)
|
||||
__FUNCTION__, __LINE__, minor);
|
||||
}
|
||||
|
||||
#if defined(USE_INTERRUPTS)
|
||||
imx_uart_tx_isr_data[minor].hdl = imx_uart_tx_isr;
|
||||
imx_uart_tx_isr_data[minor].handle = &imx_uart_data[minor];
|
||||
imx_uart_tx_isr_data[minor].on = imx_uart_isr_on;
|
||||
imx_uart_tx_isr_data[minor].off = imx_uart_isr_off;
|
||||
imx_uart_tx_isr_data[minor].isOn = imx_uart_isr_is_on;
|
||||
|
||||
imx_uart_rx_isr_data[minor].hdl = imx_uart_rx_isr;
|
||||
imx_uart_rx_isr_data[minor].handle = &imx_uart_data[minor];
|
||||
imx_uart_rx_isr_data[minor].on = imx_uart_isr_on;
|
||||
imx_uart_rx_isr_data[minor].off = imx_uart_isr_off;
|
||||
imx_uart_rx_isr_data[minor].isOn = imx_uart_isr_is_on;
|
||||
#endif
|
||||
|
||||
imx_uart_data[minor].regs->cr1 = (
|
||||
MC9328MXL_UART_CR1_UARTCLKEN |
|
||||
MC9328MXL_UART_CR1_UARTEN);
|
||||
@@ -243,12 +219,30 @@ static void imx_uart_init(int minor)
|
||||
static int imx_uart_first_open(int major, int minor, void *arg)
|
||||
{
|
||||
rtems_libio_open_close_args_t *args = arg;
|
||||
rtems_status_code status = RTEMS_SUCCESSFUL;
|
||||
|
||||
imx_uart_data[minor].tty = args->iop->data1;
|
||||
|
||||
#if defined(USE_INTERRUPTS)
|
||||
BSP_install_rtems_irq_handler(&imx_uart_tx_isr_data[minor]);
|
||||
BSP_install_rtems_irq_handler(&imx_uart_rx_isr_data[minor]);
|
||||
#if USE_INTERRUPTS
|
||||
status = rtems_interrupt_handler_install(
|
||||
imx_uart_name_transmit(minor),
|
||||
"UART",
|
||||
RTEMS_INTERRUPT_UNIQUE,
|
||||
imx_uart_tx_isr,
|
||||
&imx_uart_data[minor]
|
||||
);
|
||||
assert(status == RTEMS_SUCCESSFUL);
|
||||
imx_uart_isr_on(imx_uart_name_transmit(minor));
|
||||
|
||||
status = rtems_interrupt_handler_install(
|
||||
imx_uart_name_receive(minor),
|
||||
"UART",
|
||||
RTEMS_INTERRUPT_UNIQUE,
|
||||
imx_uart_rx_isr,
|
||||
&imx_uart_data[minor]
|
||||
);
|
||||
assert(status == RTEMS_SUCCESSFUL);
|
||||
imx_uart_isr_on(imx_uart_name_receive(minor));
|
||||
|
||||
imx_uart_data[minor].regs->cr1 |= MC9328MXL_UART_CR1_RRDYEN;
|
||||
#endif
|
||||
@@ -258,9 +252,24 @@ static int imx_uart_first_open(int major, int minor, void *arg)
|
||||
|
||||
static int imx_uart_last_close(int major, int minor, void *arg)
|
||||
{
|
||||
#if defined(USE_INTERRUPTS)
|
||||
BSP_remove_rtems_irq_handler(&imx_uart_tx_isr_data[minor]);
|
||||
BSP_remove_rtems_irq_handler(&imx_uart_rx_isr_data[minor]);
|
||||
#if USE_INTERRUPTS
|
||||
rtems_status_code status = RTEMS_SUCCESSFUL;
|
||||
|
||||
imx_uart_isr_off(imx_uart_name_transmit(minor));
|
||||
status = rtems_interrupt_handler_remove(
|
||||
imx_uart_name_transmit(minor),
|
||||
imx_uart_tx_isr,
|
||||
&imx_uart_data[minor]
|
||||
);
|
||||
assert(status == RTEMS_SUCCESSFUL);
|
||||
|
||||
imx_uart_isr_off(imx_uart_name_receive(minor));
|
||||
status = rtems_interrupt_handler_remove(
|
||||
imx_uart_name_receive(minor),
|
||||
imx_uart_rx_isr,
|
||||
&imx_uart_data[minor]
|
||||
);
|
||||
assert(status == RTEMS_SUCCESSFUL);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
@@ -291,7 +300,7 @@ static ssize_t imx_uart_poll_write(int minor, const char *buf, size_t len)
|
||||
|
||||
}
|
||||
|
||||
#if defined(USE_INTERRUPTS)
|
||||
#if USE_INTERRUPTS
|
||||
static ssize_t imx_uart_intr_write(int minor, const char *buf, size_t len)
|
||||
{
|
||||
if (len > 0) {
|
||||
@@ -318,23 +327,14 @@ static int imx_uart_set_attrs(int minor, const struct termios *t)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(USE_INTERRUPTS)
|
||||
static void imx_uart_isr_on(const rtems_irq_connect_data *irq)
|
||||
#if USE_INTERRUPTS
|
||||
static void imx_uart_isr_on(const rtems_irq_number name)
|
||||
{
|
||||
MC9328MXL_AITC_INTENNUM = irq->name;
|
||||
MC9328MXL_AITC_INTENNUM = name;
|
||||
}
|
||||
static void imx_uart_isr_off(const rtems_irq_connect_data *irq)
|
||||
static void imx_uart_isr_off(const rtems_irq_number name)
|
||||
{
|
||||
MC9328MXL_AITC_INTDISNUM = irq->name;
|
||||
}
|
||||
static int imx_uart_isr_is_on(const rtems_irq_connect_data *irq)
|
||||
{
|
||||
int irq_num = (int)irq->name;
|
||||
if (irq_num < 32) {
|
||||
return MC9328MXL_AITC_INTENABLEL & (1 << irq_num);
|
||||
} else {
|
||||
return MC9328MXL_AITC_INTENABLEH & (1 << (irq_num - 32));
|
||||
}
|
||||
MC9328MXL_AITC_INTDISNUM = name;
|
||||
}
|
||||
|
||||
static void imx_uart_rx_isr(rtems_irq_hdl_param param)
|
||||
@@ -371,6 +371,28 @@ static void imx_uart_tx_isr(rtems_irq_hdl_param param)
|
||||
rtems_termios_dequeue_characters(uart_data->tty, len);
|
||||
}
|
||||
}
|
||||
|
||||
static rtems_vector_number imx_uart_name_transmit(int minor)
|
||||
{
|
||||
if (minor == 0) {
|
||||
return BSP_INT_UART1_TX;
|
||||
} else if (minor == 1) {
|
||||
return BSP_INT_UART2_TX;
|
||||
}
|
||||
|
||||
assert(0);
|
||||
}
|
||||
|
||||
static rtems_vector_number imx_uart_name_receive(int minor)
|
||||
{
|
||||
if (minor == 0) {
|
||||
return BSP_INT_UART1_RX;
|
||||
} else if (minor == 1) {
|
||||
return BSP_INT_UART2_RX;
|
||||
}
|
||||
|
||||
assert(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -419,7 +441,7 @@ static void imx_uart_set_baud(int minor, int baud)
|
||||
/*
|
||||
* Polled, non-blocking read from UART
|
||||
*/
|
||||
int imx_uart_poll_read_char(int minor)
|
||||
static int imx_uart_poll_read_char(int minor)
|
||||
{
|
||||
return imx_uart_poll_read(minor);
|
||||
}
|
||||
@@ -427,7 +449,7 @@ int imx_uart_poll_read_char(int minor)
|
||||
/*
|
||||
* Polled, blocking write from UART
|
||||
*/
|
||||
void imx_uart_poll_write_char(int minor, char c)
|
||||
static void imx_uart_poll_write_char(int minor, char c)
|
||||
{
|
||||
imx_uart_poll_write(minor, &c, 1);
|
||||
}
|
||||
@@ -435,7 +457,7 @@ void imx_uart_poll_write_char(int minor, char c)
|
||||
/*
|
||||
* Functions for printk() and friends.
|
||||
*/
|
||||
void _BSP_output_char(char c)
|
||||
static void _BSP_output_char(char c)
|
||||
{
|
||||
poll_write(c);
|
||||
if (c == '\n') {
|
||||
@@ -445,7 +467,7 @@ void _BSP_output_char(char c)
|
||||
|
||||
BSP_output_char_function_type BSP_output_char = _BSP_output_char;
|
||||
|
||||
int _BSP_poll_char(void)
|
||||
static int _BSP_poll_char(void)
|
||||
{
|
||||
return poll_read();
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <errno.h>
|
||||
#include <rtems/error.h>
|
||||
#include <rtems/bspIo.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/mbuf.h>
|
||||
@@ -39,19 +40,8 @@
|
||||
#define START_TRANSMIT_EVENT RTEMS_EVENT_2
|
||||
|
||||
static void enet_isr(rtems_irq_hdl_param);
|
||||
static void enet_isr_on(const rtems_irq_connect_data *unused);
|
||||
static void enet_isr_off(const rtems_irq_connect_data *unused);
|
||||
static int enet_isr_is_on(const rtems_irq_connect_data *irq);
|
||||
static void enet_isr_on(void);
|
||||
|
||||
/* Replace the first value with the clock's interrupt name. */
|
||||
rtems_irq_connect_data mc9328mxl_enet_isr_data = {
|
||||
.name = BSP_INT_GPIO_PORTA,
|
||||
.hdl = enet_isr,
|
||||
.handle = (void *)BSP_INT_GPIO_PORTA,
|
||||
.on = enet_isr_on,
|
||||
.off = enet_isr_off,
|
||||
.isOn = enet_isr_is_on,
|
||||
};
|
||||
typedef struct {
|
||||
unsigned long rx_packets; /* total packets received */
|
||||
unsigned long tx_packets; /* total packets transmitted */
|
||||
@@ -238,6 +228,7 @@ void mc9328mxl_enet_init_hw(mc9328mxl_enet_softc_t *sc)
|
||||
{
|
||||
uint16_t stat;
|
||||
uint16_t my = 0;
|
||||
rtems_status_code status = RTEMS_SUCCESSFUL;
|
||||
|
||||
lan91c11x_write_reg(LAN91C11X_RCR, LAN91C11X_RCR_RST);
|
||||
lan91c11x_write_reg(LAN91C11X_RCR, 0);
|
||||
@@ -334,7 +325,15 @@ void mc9328mxl_enet_init_hw(mc9328mxl_enet_softc_t *sc)
|
||||
MC9328MXL_GPIOA_IMR |= bit(3);
|
||||
|
||||
/* Install the interrupt handler */
|
||||
BSP_install_rtems_irq_handler(&mc9328mxl_enet_isr_data);
|
||||
status = rtems_interrupt_handler_install(
|
||||
BSP_INT_GPIO_PORTA,
|
||||
"Network",
|
||||
RTEMS_INTERRUPT_UNIQUE,
|
||||
enet_isr,
|
||||
(void *)BSP_INT_GPIO_PORTA
|
||||
);
|
||||
assert(status == RTEMS_SUCCESSFUL);
|
||||
enet_isr_on();
|
||||
|
||||
} /* mc9328mxl_enet_init_hw() */
|
||||
|
||||
@@ -602,7 +601,7 @@ void mc9328mxl_enet_stats (mc9328mxl_enet_softc_t *sc)
|
||||
|
||||
|
||||
/* Enables mc9328mxl_enet interrupts. */
|
||||
static void enet_isr_on(const rtems_irq_connect_data *unused)
|
||||
static void enet_isr_on(void)
|
||||
{
|
||||
/* Enable interrupts */
|
||||
MC9328MXL_AITC_INTENNUM = MC9328MXL_INT_GPIO_PORTA;
|
||||
@@ -610,23 +609,6 @@ static void enet_isr_on(const rtems_irq_connect_data *unused)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Disables enet interrupts */
|
||||
static void enet_isr_off(const rtems_irq_connect_data *unused)
|
||||
{
|
||||
/* disable all various TX/RX interrupts */
|
||||
MC9328MXL_AITC_INTDISNUM = MC9328MXL_INT_GPIO_PORTA;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Tests to see if mc9328mxl_enet interrupts are enabled, and returns non-0 if so.
|
||||
* If interrupt is not enabled, returns 0.
|
||||
*/
|
||||
static int enet_isr_is_on(const rtems_irq_connect_data *irq)
|
||||
{
|
||||
return MC9328MXL_AITC_INTENABLEL & (1 << MC9328MXL_INT_GPIO_PORTA);
|
||||
}
|
||||
|
||||
/* Driver ioctl handler */
|
||||
static int
|
||||
mc9328mxl_enet_ioctl (struct ifnet *ifp, ioctl_command_t command, caddr_t data)
|
||||
|
||||
Reference in New Issue
Block a user