[PATCH] Updated Legacy code in arm csb336
Joel Sherrill
joel.sherrill at OARcorp.com
Mon Jul 8 17:09:14 UTC 2013
I think you addressed Sebastian's comments.
Sebastian .. anything else?
Vipul.. I hope you are keeping notes. They will get easier
and easier. :)
--joel
On 7/8/2013 12:05 PM, Vipul Nayyar wrote:
> ---
> c/src/lib/libbsp/arm/csb336/console/uart.c | 134 +++++++++++++++-----------
> c/src/lib/libbsp/arm/csb336/network/network.c | 46 +++------
> 2 files changed, 92 insertions(+), 88 deletions(-)
>
> diff --git a/c/src/lib/libbsp/arm/csb336/console/uart.c b/c/src/lib/libbsp/arm/csb336/console/uart.c
> index 4dc409b..d1b4e72 100644
> --- a/c/src/lib/libbsp/arm/csb336/console/uart.c
> +++ b/c/src/lib/libbsp/arm/csb336/console/uart.c
> @@ -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,18 +34,21 @@ 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)
> 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)
> rtems_termios_callbacks imx_uart_cbacks = {
> @@ -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,13 +219,31 @@ 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 defined(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
>
> @@ -259,8 +253,23 @@ 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]);
> + 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;
> @@ -317,22 +326,13 @@ static int imx_uart_set_attrs(int minor, const struct termios *t)
> }
>
> #if defined(USE_INTERRUPTS)
> -static void imx_uart_isr_on(const rtems_irq_connect_data *irq)
> +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)
> @@ -369,6 +369,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
>
> /*
> @@ -417,7 +439,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);
> }
> @@ -425,7 +447,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);
> }
> @@ -433,7 +455,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') {
> @@ -443,7 +465,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();
> }
> diff --git a/c/src/lib/libbsp/arm/csb336/network/network.c b/c/src/lib/libbsp/arm/csb336/network/network.c
> index e513595..f93fcc8 100644
> --- a/c/src/lib/libbsp/arm/csb336/network/network.c
> +++ b/c/src/lib/libbsp/arm/csb336/network/network.c
> @@ -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);
> -
> -/* 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,
> -};
> +static void enet_isr_on(void);
> +
> 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)
> --
> 1.7.11.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill at OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the devel
mailing list