[PATCH 2/8] Move Mongoose-V specific devices into BSP.
Joel Sherrill
joel.sherrill at oarcorp.com
Fri Oct 10 14:10:27 UTC 2014
On October 10, 2014 7:26:39 AM CDT, "Cudmore, Alan P. (GSFC-5820)" <alan.p.cudmore at nasa.gov> wrote:
>If it helps, I have not heard of anyone using the Mongoose V in years.
>If it's still around and being used in a new project, I'm not aware of
>it .
We have discussed cleaning out old bsps after 4.11. This would put the Mongoose high on the list to me.
Thanks
>Alan
>
>
>On 10/9/14 3:50 PM, "Joel Sherrill" <joel.sherrill at oarcorp.com> wrote:
>
>>
>>On 10/9/2014 2:47 PM, Gedare Bloom wrote:
>>> I didn't read this, but you should consider doing some style cleanup
>>> too (as a separate commit)
>>Noted.
>>
>>FWIW I didn't change any code file contents except to note that a .h
>>file moved from libcpu/ to bsp/.
>>
>>The big problem here is that when we did the BSP, we thought the
>>Mongoose-V on-CPU IP modules might show up again. They haven't
>>and moving them makes it clear they were specific to this single case.
>>
>>--joel
>>> On Thu, Oct 9, 2014 at 2:39 PM, Joel Sherrill
>>><joel.sherrill at oarcorp.com> wrote:
>>>> Putting the duart in libcpu was very optimistic and presumptuous.
>>>> It has never been used again on another SoC and is BSP specific.
>>>> ---
>>>> c/src/lib/libbsp/mips/genmongoosev/Makefile.am | 7 +-
>>>> c/src/lib/libbsp/mips/genmongoosev/README | 54 +-
>>>> .../libbsp/mips/genmongoosev/consoe/README.mguart | 100 +++
>>>> .../lib/libbsp/mips/genmongoosev/console/conscfg.c | 2 +-
>>>> .../lib/libbsp/mips/genmongoosev/console/mg5uart.c | 917
>>>>+++++++++++++++++++++
>>>> .../lib/libbsp/mips/genmongoosev/console/mg5uart.h | 98 +++
>>>> .../libbsp/mips/genmongoosev/console/mg5uart_reg.c | 58 ++
>>>> c/src/lib/libbsp/mips/genmongoosev/include/bsp.h | 2 +-
>>>> .../libbsp/mips/genmongoosev/include/mongoose-v.h | 306 +++++++
>>>> .../lib/libbsp/mips/genmongoosev/irq/vectorisrs.c | 2 +-
>>>> c/src/lib/libbsp/mips/genmongoosev/preinstall.am | 20 +
>>>> .../libbsp/mips/genmongoosev/startup/bspstart.c | 2 +-
>>>> .../libbsp/mips/genmongoosev/startup/gdb-support.c | 2 +-
>>>> c/src/lib/libcpu/mips/Makefile.am | 21 -
>>>> .../lib/libcpu/mips/mongoosev/duart/README.mguart | 101 ---
>>>> c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c | 917
>>>>---------------------
>>>> c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.h | 98 ---
>>>> .../lib/libcpu/mips/mongoosev/duart/mg5uart_reg.c | 58 --
>>>> .../lib/libcpu/mips/mongoosev/include/mongoose-v.h | 306 -------
>>>> c/src/lib/libcpu/mips/preinstall.am | 14 -
>>>> 20 files changed, 1562 insertions(+), 1523 deletions(-)
>>>> create mode 100644
>>>>c/src/lib/libbsp/mips/genmongoosev/console/README.mguart
>>>> create mode 100644
>>>>c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.c
>>>> create mode 100644
>>>>c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.h
>>>> create mode 100644
>>>>c/src/lib/libbsp/mips/genmongoosev/console/mg5uart_reg.c
>>>> create mode 100644
>>>>c/src/lib/libbsp/mips/genmongoosev/include/mongoose-v.h
>>>> delete mode 100644
>c/src/lib/libcpu/mips/mongoosev/duar/README.mguart
>>>> delete mode 100644 c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c
>>>> delete mode 100644 c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.h
>>>> delete mode 100644
>c/src/lib/libcpu/mips/mongoosev/duart/mg5uart_reg.c
>>>> delete mode 100644
>>>>c/src/lib/libcpu/mips/mongoosev/include/mongoose-v.h
>>>>
>>>> diff --git a/c/src/lib/libbsp/mips/genmongoosev/Makefile.am
>>>>b/c/src/lib/libbsp/mips/genmongoosev/Makefile.am
>>>> index fe21df4..a99fd56 100644
>>>> --- a/c/src/lib/libbsp/mips/genmongoosev/Makefile.am
>>>> ++ b/c/src/lib/libbsp/mips/genmongoosev/Makefile.am
>>>> @@ -16,6 +16,11 @@ include_bsp_HEADERS += include/irq.h
>>>>
>>>> nodist_include_HEADERS = include/bspopts.h
>>>> nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h
>>>> +nodist_include_bsp_HEADERS += include/lr33000.h
>>>> +nodist_include_bsp_HEADERS += include/lr333x0.h
>>>> +nodist_include_bsp_HEADERS += include/mongoose-v.h
>>>> +nodist_include_bsp_HEADERS += include/r3000.h
>>>> +nodist_include_bsp_HEADERS += console/mg5uart.h
>>>> DISTCLEANFILES = include/bspopts.h
>>>> noinst_PROGRAMS =
>>>>
>>>> @@ -47,6 +52,7 @@ libbsp_a_SOURCES += clock/clockdrv.c
>>>> libbsp_a_SOURCES += ../../shared/clockdrv_shell.h
>>>> # console
>>>> libbsp_a_SOURCES += console/conscfg.c
>>>> +libbsp_a_SOURCES += console/mg5uart.c
>>>> libbsp_a_SOURCES += ../../shared/console.c
>>>> libbsp_a_SOURCES += ../../shared/console_select.c
>>>> libbsp_a_SOURCES += ../../shared/console_control.c
>>>> @@ -75,7 +81,6 @@ gdbstub_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
>>>>
>>>> libbsp_a_LIBADD = ../../../libcpu/@RTEMS_CPU@/shared/cache.rel
>>>> libbsp_a_LIBADD +=
>../../../libcpu/@RTEMS_CPU@/shared/interrupts.rel
>>>> -libbsp_a_LIBADD += ../../../libcpu/@RTEMS_CPU@/mongoosev/duart.rel
>>>>
>>>> include $(srcdir)/preinstall.am
>>>> include $(top_srcdir)/../../../../automake/local.am
>>>> diff --git a/c/src/lib/libbsp/mips/genmongoosev/README
>>>>b/c/src/lib/libbsp/mips/genmongoosev/README
>>>> index 97db696..87f57a9 100644
>>>> --- a/c/src/lib/libbsp/mips/genmongoosev/README
>>>> +++ b/c/src/lib/libbsp/mips/genmongoosev/README
>>>> @@ -1,6 +1,56 @@
>>>> BSP supporting the on-CPU capabilities of the Synova Mongoose-V.
>>>> -This BSP assumes that basic HW initialization is performed by
>>>> -PMON.
>>>> +The Synova Mongoose-V is a radiation hardened derivative of the
>>>> +LSI 33K with on-CPU peripherals.
>>>> +
>>>> +This BSP assumes that basic HW initialization is performed by
>PMON.
>>>> +
>>>> +Status
>>>> +======
>>>> +Per-task floating point enable/disable is supported for both
>immediate
>>>> +and deferred FPU context swaps.
>>>> +
>>>> +Interrupt Levels are adapted reasonably well to the MIPS interrupt
>>>> +model. Bit 0 of the int level is a global enable/disable,
>>>>corresponding
>>>> +to bit 0 of the processor's SR register. Bits 1 thru 6 are
>configured
>>>> +as masks for the Int0 thru Int5 interrupts. The 2 software
>interrupt
>>>> +bits are always enabled by default. Each task maintains its own
>>>> +Interrupt Level setting, reconfiguring the SR register's interrupt
>>>>bits
>>>> +whenever scheduled in. The software ints, though not addressable
>via
>>>> +the various Interrupt Level functions, are maintained on a
>per-task
>>>> +basis, so if software manipulates them drectly, things should
>behave
>>>>as
>>>> +expected. At the time of these udpates, the Interrupt Level was
>only
>>>>8
>>>> +bits, and completely supporting the global enable, software ints
>and
>>>>the
>>>> +hardware ints would require 9 bits. When more than 8 bits are
>>>> +available, there is no reason the software interrupts could not be
>>>>added
>>>> +to the Interrupt Level.
>>>> +
>>>> +While supporting the Int0 thru Int5 bits in this way doesn't seem
>>>> +wonderfully useful, it does increase the level of compliance with
>the
>>>> +RTEMS spec.
>>>> +
>>>> +Interrupt Level 0 corresponds to interrupts globally enabled,
>software
>>>> +ints enabled and Int0 thru Int5 enabled. If values other than 0
>are
>>>> +supplied, they should be formulated to impose the desired bitmask.
>>>> +Interrupt priority is not a strong concept on this bsp, it is
>provided
>>>> +only by the order in which interrupts are checked.
>>>> +
>>>> +If during the vectoring of an interrupt, others arrive, they will
>all
>>>>be
>>>> +processed in accordance with their ordering in SR & the peripheral
>>>> +register. For example, if while we're vectoring Int4, Int3 and
>Int5
>>>>are
>>>> +asserted, Int3 ill be serviced before Int5. The peripheral
>>>>interrupts
>>>> +are individually vectored as a consequence of Int5 being asserted,
>>>> +however Int5 is not itself vectored. Within the set of peripheral
>>>> +interrupts, bit 0 is vectored first, 31 is last.
>>>> +
>>>> +Interrupts are not nested for MIPS1 or MIPS3 processors, but are
>>>> +processed serially as possible. On an unloaded 50 task RTEMS
>program,
>>>> +runnning on a 12mhz MIPS1 processor, worst-case latencies of 100us
>>>>were
>>>> +observed, the average being down at 60us or below.
>>>> +
>>>> +
>>>> +These features are principally a consequence of fixes and tweaks
>to
>>>>the
>>>> +MIPS1and MIPS3 processor support, and should be equally effective
>on
>>>> +both levels of MIPS processors for any of their bsp's.
>>>>
>>>> Address Map
>>>> ===========
>>>> diff --git
>a/c/src/lib/libbsp/mips/genmongoosev/console/README.mguart
>>>>b/c/src/lib/libbsp/mips/genmongoosev/console/README.mguart
>>>> new file mode 100644
>>>> index 0000000..7c6a290
>>>> --- /dev/null
>>>> +++ b/c/src/lib/libbsp/mips/genmongoosev/console/README.mguart
>>>> @@ -0,0 +1,100 @@
>>>> +Configuration Table Use
>>>> +=======================
>>>> +
>>>> +sDeviceName
>>>> +
>>>> + The name of this device.
>>>> +
>>>> +deviceType
>>>> +
>>>> + This field must be SERIAL_MG5UART.
>>>> +
>>>> +pDeviceFns
>>>> +
>>>> + The device interface control table. This may be:
>>>> + + mg5uart_fns for interrupt driven IO
>>>> + + mg5uart_fns_polled for polled IO
>>>> +
>>>> +deviceProbe
>>>> +
>>>> + This is the address of the routine which probes to see if the
>>>>device
>>>> + is present.
>>>> +
>>>> +pDeviceFlow
>>>> +
>>>> + This field is ignored as hardware flow control is not currently
>>>>supported.
>>>> +
>>>> +ulMargin
>>>> +
>>>> + This is currently unused.
>>>> +
>>>> +ulHysteresis
>>>> +
>>>> + This is currently unused.
>>>> +
>>>> +pDeviceParams
>>>> +
>>>> + This is set to the default settings.
>>>> +
>>>> +ulCtrlPort1
>>>> +
>>>> + This field is the address of the command register shared by
>both
>>>>ports.
>>>> +
>>>> +ulCtrlPort2
>>>> +
>>>> + This field is the address of the port being used.
>>>> +
>>>> +ulDataPort
>>>> +
>>>> + This field is set to MG5UART_PORTA or MG5UART_PORTB.
>>>> +
>>>> +getRegister
>>>> +setRegister
>>>> +
>>>> + These do NOT follow standard conventions and are ignored.
>>>> + The register address routines are hard-coded as this is
>>>> + an on-CPU part and assumed to provide a 32-bit wide interface.
>>>> +
>>>> +getData
>>>> +
>>>> + This is address of the RX buffer register.
>>>> +
>>>> +setData
>>>> +
>>> + This is address of the TX buffer register.
>>>> +
>>>> +ulClock
>>>> +
>>>> + baudRate Clock
>>>> +
>>>> +ulIntVector
>>>> +
>>>> + This is the interrupt vector number associated with this chip.
>>>> +
>>>> +Example:
>>>> +
>>>> +#if (CONSOLE_USE_INTERRUPTS)
>>>> +#define MG5UART_FUNCTIONS &mg5uart_fns
>>>> +#else
>>>> +#define MG5UART_FUNCTIONS &mg5uart_fns_polled
>>>> +#endif
>>>> +
>>>> +{
>>>> + "/dev/com0", /* sDeviceName */
>>>> + SERIAL_MG5UART, /* deviceType */
>>>> + MG5UART_FUNCTIONS, /* pDeviceFns */
>>>> + NULL, /* deviceProbe, assume
>it
>>>>is there */
>>>> + NULL, /* pDeviceFlw */
>>>> + 16, /* ulMargin */
>>>> + 8, /* ulHysteresis */
>>>> + (void *) NULL, /* NULL */ /* pDeviceParams */
>>>> + MONGOOSEV_PERIPHERAL_COMMAND_REGISTER, /* ulCtrlPort1 */
>>>> + MONGOOSEV_UART0_BASE, /* ulCtrlPort2 */
>>>> + MG5UART_UART0, /* ulDataPort */
>>>> + mg5uart_get_register, /* getRegister */
>>>> + mg5uart_set_register, /* setRegister */
>>>> + NULL, /* unused */ /* getData */
>>>> NULL, /* unused */ /* setData */
>>>> + 12000000, /* ulClock */
>>>> + MONGOOSEV_IRQ_UART0_RX_FRAME_ERROR /* ulIntVector -- base
>for
>>>>port */
>>>> +}
>>>> diff --git a/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c
>>>>b/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c
>>>> index 61ac56e..87df736 100644
>>>> --- a/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c
>>>> +++ b/c/src/lib/libbsp/mips/genmongoosev/console/conscfg.c
>>>> @@ -21,7 +21,7 @@
>>>> #include <bsp/irq.h>
>>>>
>>>> #include <libchip/serial.h>
>>>> -#include <libchip/mg5uart.h>
>>>> +#include <bsp/mg5uart.h>
>>>>
>>>> /* #define CONSOLE_USE_INTERRUPTS */
>>>>
>>>> diff --git a/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.c
>>>>b/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.c
>>>> new file mode 100644
>>>> index 0000000..8c4177a
>>>> --- /dev/null
>>>> +++ b/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.c
>>>> @@ -0,0 +1,917 @@
>>>> +/**
>>>> + * @file
>>>> + *
>>>> + * This file contains the termios TTY driver for the UART foun
>>>> + * on the Synova Mongoose-V.
>>>> + */
>>>> +
>>>> +/*
>>>> + * COPYRIGHT () 1989-2012.
>>>> + * On-Line Applications Research Corporation (OAR).
>>>> + *
>>>> + * The license and distribution terms for this file may be
>>>> + * found in the file LICENSE in this ditribution or at
>>>> + * http://www.rtems.org/license/LICENSE.
>>>> + */
>>>> +
>>>> +#include <rtems.h>
>>>> +#include <rtems/libio.h>
>>>> +#include <rtems/score/sysstate.h>
>>>> +#include <stdlib.h>
>>>> +
>>>> +#include <libchip/serial.h>
>>>> +#include <libchip/sersupp.h>
>>>> +#include <bsp/mg5uart.h>
>>>> +#include <bsp/mongoose-v.h>
>>>> +
>>>> +#include <bsp/irq.h>
>>>> +#include <bsp.h>
>>>> +
>>>> +/*
>>>> + * Indices of registers
>>>> + */
>>>> +
>>>> +/*
>>>> + * Per chip context control
>>>> + */
>>>> +
>>>> +typedef struct _mg5uart_context
>>>> +{
>>>> + int mate;
>>>> +} mg5uart_context;
>>>> +
>>>> +/*
>>>> + * Define MG5UART_STATIC to nothing while debugging so the entry
>>>>points
>>>> + * will show up in the symbol table.
>>>> + */
>>>> +
>>>> +#define MG5UART_STATIC
>>>> +
>>>> +/* #define MG5UART_STATIC static */
>>>> +
>>>> +
>>>> +
>>>> +#define MG5UART_SETREG( _base, _register, _value ) \
>>>> + MONGOOSEV_WRITE_REGISTER( _base, _register, _value )
>>>> +
>>>> +#define MG5UART_GETREG( _base, _register ) \
>>>> + MONGOOSEV_READ_REGISTER( _base, _register )
>>>> +
>>>> +
>>>> +/*
>>>> + * Console Device Driver Support Functions
>>>> + */
>>>> +
>>>> +MG5UART_STATIC int mg5art_baud_rate(
>>>> + int minor,
>>>> + uint32_t baud,
>>>> + uint32_t *code
>>>> +);
>>>> +
>>>> +MG5UART_STATIC void mg5uart_enable_interrupts(
>>>> + int minor,
>>>> + int mask
>>>> +);
>>>> +
>>>> +/*
>>>> + * mg5uart_isr_XXX
>>>> + *
>>>> + * This is the single interrupt entry point which parcels
>interrupts
>>>> + * out to the handlers for specific sources and makes sure that
>the
>>>> + * shared handler gets the right arguments.
>>>> + *
>>>> + * NOTE: Yes .. this is ugly but it provides 5 interrupt source
>>>> + * wrappers which are nearly functionally identical.
>>>> + */
>>>> +
>>>> +
>>>> +extern void mips_default_isr(int vector);
>>>> +
>>>> +#define __ISR(_TYPE, _OFFSET) \
>>>> + MG5UART_STATIC void mg5uart_process_isr_ ## _TYPE ( \
>>>> + int minor \
>>>> + ); \
>>>> + \
>>>> + MG5UART_STATIC rtems_isr mg5uart_isr_ ## _TYPE ( \
>>>> + void *arg \
>>>> + ) \
>>>> + { \
>>>> + rtems_vector_number vectr = (rtems_vector_number) arg; \
>>>> + int minor; \
>>>> + \
>>>> + for(minor=0 ; minor<Console_Port_Count ; minor++) { \
>>>> + if( Console_Port_Tbl[minor]->deviceType == SERIAL_MG5UART &&
>\
>>>> + vector == Console_Por_Tbl[minor]->ulIntVector + _OFFSET
>)
>>>>{ \
>>>> + mg5uart_process_isr_ ## _TYPE (mino); \
>>>> + return; \
>>>> + } \
>>>> + } \
>>>> + mips_default_isr( vector ); \
>>>> + }
>>>> +
>>>> +__ISR(rx_frame_error, MG5UART_IRQ_RX_FRAME_ERRO)
>>>> +__ISR(rx_overrun_error, MG5UART_IRQ_RX_OVERRUN_ERROR)
>>>> +__ISR(tx_empty, MG5UART_IRQ_TX_EMPTY)
>>>> +__ISR(tx_ready, MG5UART_IRQ_TX_READY)
>>>> +__ISR(rx_ready, MG5UART_IRQ_RX_READY)
>>>> +
>>>> +/*
>>>> + * mg5uart_set_attributes
>>>> + *
>>>> + * This function sets the UART channel to reflect the requested
>>>>termios
>>>> + * port settings.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC int mg5uart_set_attributes(
>>>> + int minor,
>>>> + const struct termios *t
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART_port;
>>>> + uint32_t pMG5UART;
>>>> + uint32_t cmd, cmdSave;
>>>> + uint32_t baudcmd;
>>>> + uint32_t shift;
>>>> + rtems_interrupt_level Irql;
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1;
>>>> + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
>>>> +
>>>> + /*
>>>> + * Set the baud rate
>>>> + */
>>>> +
>>>> + if (mg5uart_baud_rate( minor, t->c_cflag, &baudcmd ) == -1)
>>>> + return -1;
>>>> +
>>>> + /*
>>>> + * Base settings
>>>> + */
>>>> +
>>>> + /*
>>>> + * Base settings
>>>> + */
>>>> +
>>>> + cmd = MONGOOSEV_UART_CMD_RX_ENABLE |
>MONGOOSEV_UART_CMD_TX_ENABLE;
>>>> +
>>>> + /*
>>>> + * Parity
>>>> + */
>>>> +
>>>> + if (t->c_cflag & PARENB) {
>>>> + cmd |= MONGOOSEV_UART_CMD_PARITY_ENABLE;
>>>> + if (t->c_cflag & PARODD)
>>>> + cmd |= MONGOOSEV_UART_CMD_PARITY_ODD;
>>>> + else
>>>> + cmd |= MONGOOSEV_UART_CMD_PARITY_EVEN;
>>>> + } else {
>>>> + cmd |= MONGOOSEV_UART_CMD_PARITY_DISABLE;
>>>> + }
>>>> +
>>>> + /*
>>>> + * Character Size
>>>> + */
>>>> +
>>>> + if (t->c_cflag & CSIZE) {
>>>> + switch (t->c_cflag & CSIZE) {
>>>> + case CS5:
>>>> + case CS6:
>>>> + case CS7:
>>>> + return -1;
>>>> + break;
>>>> + case CS8:
>>>> + /* Mongoose-V only supports CS8 */
>>>> + break;
>>>> +
>>>> + }
>>>> + } /* else default to CS8 */
>>>> +
>>>> + /*
>>>> + * Stop Bits
>>>> + */
>>>> +
>>>> +#if 0
>>>> + if (t->c_cflag & CSTOPB) {
>>>> + /* 2 stop bits not supported by Mongoose-V uart */
>>>> + return -1;
>>>> + }
>>>> +#endif
>>>> +
>>>> + /*
>>>> + * XXX what about CTS/RTS
>>>> + */
>>>> +
>>>> + /* XXX */
>>>> +
>>>> + /*
>>>> + * Now write the registers
>>>> + */
>>>> +
>>>> + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 )
>>>> + shift = MONGOOSEV_UART0_CMD_SHIFT;
>>>> + else
>>>> + shift = MONGOOSEV_UART1_CMD_SHIFT;
>>>> +
>>>> +
>>>> +
>>>> + rtems_interrupt_disable(Irql);
>>>> +
>>>> + cmdSave = MG5UART_GETREG( pMG5UART, MG5UART_COMMAND_REISTER );
>>>> +
>>>> + MG5UART_SETREG( pMG5UART,
>>>> + MG5UART_COMMAND_REGISTER,
>>>> + (cmdSave & ~(MONGOOSEV_UART_ALL_STATUS_BITS <<
>>>>shift)) | (cmd << shift) );
>>>> +
>>>> + MG5UART_SETREG( pMG5UART_port, MG5UART_BAUD_RATE, baudcmd );
>>>> +
>>>> + rtems_interrupt_enable(Irql);
>>>> + return 0;
>>>> +}
>>>> +
>>>> +/*
>>>> + * mg5uart_initialize_context
>>> + *
>>>> + * This function sets the default values of the per port context
>>>>structure.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC void mg5uart_initialize_context(
>>>> + int minor,
>>>> + mg5uart_context *pmg5uartContext
>>>> +)
>>>> +{
>>>> + int port;
>>>> + unsigned int pMG5UART;
>>> + unsigned int pMG5UART_port;
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->uCtrlPort1;
>>>> + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
>>>> +
>>>> + pmg5uatContext->mate = -1;
>>>> +
>>>> + for (port=0 ; port<Console_Port_Count ; port++ )
>>>> + if ( Console_Port_Tbl[port]->ulCtrlPort1 == pMG5UART &&
>>>> + Conole_Port_Tbl[port]->ulCtrlPort2 != pMG5UART_port ) {
>>>> + pmg5uartContext->mate = port;
>>>> + break;
>>>> + }
>>>> + }
>>>> +
>>>> +}
>>>> +
>>>> +/*
>>>> + * mg5uart_init
>>>> + *
>>>> + * This function initializes the DUART to a quiecsent state.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC void mg5uart_init(int minor)
>>>> +{
>>>> + uint32_t pMG5UART_port;
>>>> + uint32_t pMG5UART;
>>>> + uint32_t cmdSave;
>>>> + uint32_t shift;
>>>> +
>>>> + mg5uart_context *pmg5uartContext;
>>>> +
>>>> + pmg5uartContext = (mg5uart_contxt *)
>>>>malloc(sizeof(mg5uart_context));
>>>> +
>>>> + Console_Port_Data[minor].pDeviceContext = (void
>*)pmg5uartContext;
>>>> +
>>>> + mg5uart_initialize_context( minor, pmg5uartContext );
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1;
>>>> + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
>>>> +
>>>> + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 )
>>>> + shift = MONGOOSEV_UART0_CMD_SHIFT;
>>>> + else
>>>> + shift = MONGOOSEV_UART1_CMD_SHIFT;
>>>> +
>>>> + /*
>>>> + * Disable the uart and leave this port disabled.
>>>> + */
>>>> +
>>>> + cmdSave = MG5UART_GETREG(pMG5UART, MG5UART_COMMAND_REGISTER) &
>>>>~(MONGOOSEV_UART_ALL_STATUS_BITS << shift);
>>>> +
>>>> + MG5UART_SETREG( pMG5UART, MG5UART_COMMAND_REGISTER, cmdSave );
>>>> +
>>>> + /*
>>>> + * Disable interrupts on RX and TX for this port
>>>> + */
>>>> + mg5uart_enable_interrupts( minor, MG5UART_DISABLE_ALL );
>>>> +}
>>>> +
>>>> +/*
>>>> + * mg5uart_open
>>>> + *
>>>> + * This function opens a port for communication.
>>>> + *
>>>> + * Default state is 9600 baud, 8 bits, No parity, and 1 stop bit.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC int mg5uart_open(
>>>> + int major,
>>>> + int minor,
>>>> + void *arg
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART;
>>>> + uint32_t pMG5UART_port;
>>>> + uint32_t vector;
>>>> + uint32_t cmd, cmdSave;
>>>> + uint32_t baudcmd;
>>>> + uint32_t shift;
>>>> +
>>>> + rtems_interrupt_level Irql;
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1;
>>>> + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
>>>> + vector = Console_Port_Tbl[minor]->ulIntVector;
>>>> +
>>>> + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 )
>>>> + shift = MONGOOSEV_UART0_CMD_SHIFT;
>>>> + else
>>>> + shift = MONGOOSEV_UART1_CMD_SHIFT;
>>>> +
>>>> +
>>>> + /* XXX default baud rate could be from configuration table */
>>>> +
>>>> + (void) mg5uart_baud_rate( minor, B19200, &baudcmd );
>>>> +
>>>> + /*
>>>> + * Set the DUART channel to a default useable state
>>>> + * B19200, 8Nx since there is no stop bit control.
>>>> + */
>>>> +
>>>> + cmd = MONGOOSEV_UART_CMD_TX_ENABLE |
>MONGOOSEV_UART_CMD_RX_ENABLE;
>>>> +
>>>> + rtems_interrupt_disable(Irql);
>>>> +
>>>> + cmdSave = MG5UART_GETREG( pMG5UART, MG5UART_COMMAND_REGISTER );
>>>> +
>>>> + MG5UART_SETREG( pMG5UART_port, MG5UART_BAUD_RATE, baudcmd );
>>>> +
>>>> + MG5URT_SETREG( pMG5UART,
>>>> + MG5UART_COMMAND_REGISTER,
>>>> + cmd = (cmdSave & ~(MONGOOSEV_UART_ALL_STATUS_BITS
><<
>>>>shift)) | (cmd << shift) );
>>>> +
>>>> + rtems_interrupt_enable(Irql);
>>>> +
>>>> + return RTEMS_SUCCESSFUL;
>>>> +}
>>>> +
>>>> +/*
>>>> + * mg5uart_close
>>>> + *
>>>> + * This function shuts down the requested port.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC int mg5uart_close(
>>>> + int major,
>>>> + int minor,
>>>> + void *arg
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART;
>>>> + uint32_t pMG5UART_port;
>>>> + uint32_t cmd, cmdSave;
>>>> + uint32_t shift;
>>>> + rtems_interrupt_level Irql;
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1;
>>>> + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
>>>> +
>>>> + /*
>>>> + * Disable interrupts from this channel and then disable it
>>>>totally.
>>>> + */
>>>> +
>>>> + /* XXX interrupts */
>>>> +
>>>> + cmd = MONGOOSEV_UART_CMD_TX_DISABLE |
>MONGOOSEV_UART_CMD_RX_DISABLE;
>>>> +
>>>> + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 )
>>>> + shift = MONGOOSEV_UART0_CMD_SHIFT;
>>>> + else
>>>> + shift = MONGOOSEV_UART1_CMD_SHIFT;
>>>> +
>>>> +
>>>> + rtems_interrupt_disable(Irql);
>>>> + cmdSave = MG5UART_GETREG( pMG5UART, MG5UART_COMMAND_REGISTER );
>>>> +
>>>> + MG5UART_SETREG( pMG5UART,
>>>> + MG5UART_COMMAND_REGISTER,
>>>> + (cmdSave & ~(MONGOOSEV_UART_ALL_STATUS_BITS <<
>>>>shift)) | (cmd << shift) );
>>>> + rtems_interrupt_enable(Irql);
>>>> +
>>>> + return(RTEMS_SUCCESSFUL);
>>>> +}
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +/*
>>>> + * mg5uart_write_polled
>>>> + *
>>>> + * This routine polls out the requested character.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC void mg5uart_write_polled(
>>>> + int minor,
>>>> + char c
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART;
>>>> + uint32_t pMG5UART_port;
>>>> + uint32_t status;
>>>> + int shift;
>>>> + int timeout;
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1;
>>>> + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
>>>> +
>>>> + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 )
>>>> + shift = MONGOOSEV_UART0_IRQ_SHIFT;
>>>> + else
>>>> + shift = MONGOOSEV_UART1_IRQ_SHIFT;
>>>> +
>>>> + /*
>>>> + * wait for transmitter holding register to be empty
>>>> + */
>>>> + timeout = 2000;
>>>> +
>>>> + while( --timeout )
>>>> + {
>>>> + status = MG5UART_GETREG(pMG5UART, MG5UART_STATUS_REGISTER) >>
>>>>shift;
>>>> +
>>>> + *
>>>> + if ( (status & (MONGOOSEV_UART_TX_READY |
>>>>MONGOOSEV_UART_TX_EMPTY)) ==
>>>> + (MONGOOSEV_UART_TX_READY | MONGOOSEV_UART_TX_EMPTY) )
>>>> + break;
>>>> + */
>>>> +
>>>> + if((status & (MONGOOSEV_UART_TX_READY |
>>>>MONGOOSEV_UART_TX_EMPTY)) )
>>>> + break;
>>>> +
>>>> + /*
>>>> + * Yield while we wait
>>>> + */
>>>> +
>>>> +#if 0
>>>> + if(_System_state_Is_up(_System_state_Get()))
>>>> + {
>>>> + rtems_task_wake_after(RTEMS_YIELD_PROCESSOR);
>>>> + }
>>>> +#endif
>>>> + }
>>>> +
>>>> + /*
>>>> + * transmit character
>>>> + */
>>>> +
>>>> + MG5UART_SETREG(pMG5UART_port, MG5UART_TX_BUFFER, c);
>>>> +}
>>>> +
>>>> +MG5UART_STATIC void mg5uart_process_isr_rx_error(
>>>> + int minor,
>>>> + uint32_t mask
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART;
>>>> + int shift;
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1;
>>>> +
>>>> + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 )
>>>> + shift = MONGOOSEV_UART0_IRQ_SHIFT;
>>>> + else
>>>> + shift = MONGOOSEV_UART1_IRQ_SHIFT;
>>>> +
>>>> + /* now clear the error */
>>>> +
>>>> + MG5UART_SETREG(
>>>> + pMG5UART,
>>>> + MG5UART_STATUS_REGISTER,
>>>> + mask << shift );
>>>> +}
>>>> +
>>>> +
>>>> +MG5UART_STATIC void mg5uart_process_isr_rx_frame_error(
>>>> + int minor
>>>> +)
>>>> +{
>>>> + mg5uart_process_isr_rx_error( minor,
>MONGOOSEV_UART_RX_FRAME_ERROR
>>>>);
>>>> +}
>>>> +
>>>> +MG5UART_STATIC void mg5uart_process_isr_rx_overrun_error(
>>>> + int minor
>>>> +)
>>>> +{
>>>> + mg5uart_process_isr_rx_error( minor,
>>>>MONGOOSEV_UART_RX_OVERRUN_ERROR );
>>> +}
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +MG5UART_STATIC void m5uart_process_tx_isr(
>>>> + int minor,
>>>> + uint32_t source
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART;
>>>> + int shift;
>>>> +
>>>> + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1;
>>>> +
>>>> + mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL_EXCEPT_TX);
>>>> +
>>>> + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 )
>>>> + shift = MONGOOSEV_UART0_IRQ_SHIFT;
>>>> + else
>>>> + shift = MONGOOSEV_UART1_IRQ_SHIFT;
>>>> +
>>>> + MG5UART_SETREG(
>>>> + pMG5UART,
>>>> + MG5UART_STATUS_REGISTER,
>>>> + source << shift );
>>>> +
>>>> + if( rtems_termios_dequeue_characters(
>>>>Console_Port_Data[minor].termios_data, 1) )
>>>> + {
>>>> + mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL);
>>>> + return;
>>>> + }
>>>> +
>>>> + /*
>>>> + * There are no more characters to transmit. The tx
>interrupts
>>>>are be cleared
>>>> + * by writing data to the uart, so just disable the tx
>interrupt
>>>>sources.
>>>> + */
>>>> +
>>>> + Console_Port_Data[minor].bActive = FALSE;
>>>> +
>>>> + /* mg5uart_enable_interrupts(minor,
>MG5UART_ENABLE_ALL_EXCEPT_TX);
>>>>*/
>>>> +}
>>>> +
>>>> +
>>>> +
>>>> +MG5UART_STATIC void mg5uart_process_isr_tx_empty(
>>>> + int minor
>>>> +)
>>>> +{
>>>> + /* mg5uart_process_tx_isr( minor, MONGOOSEV_UART_TX_EMPTY ); */
>>>> +}
>>>> +
>>>> +MG5UART_STATIC void mg5uart_process_isr_tx_ready(
>>>> + int minor
>>>> +)
>>>> +{
>>>> + mg5uart_process_tx_isr( minor, MONGOOSEV_UART_TX_READY );
>>>> +}
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +
>>>> +MG5UART_STATIC void mg5uart_process_isr_rx_ready(
>>>> + int minor
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART_port;
>>>> + char c;
>>>> +
>>>> + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2;
>>>> +
>>>> + /* reading the RX buffer automatically resets the interrupt flag
>*/
>>>> +
>>>> + c = (char) MG5UART_GETREG(pMG5UART_port, MG5UART_RX_BUFFER);
>>>> +
>>>> + rtems_termios_enqueue_raw_characters(
>>>> + Console_Port_Data[minor].termios_data,
>>>> + &c, 1 ;
>>>> +}
>>>> +
>>>> +static rtems_irq_connect_data mg5uart_rx_frame_error_cd = { \
>>> + 0, /* filled in at initialization */
>>>> + mg5uart_isr_rx_frame_error, /* filled in at initialization */
>>>> + NULL, /* (void *) minor */
>>>> + NULL,
>>>> + NULL,
>>>> + NULL
>>>> +};
>>>> +
>>>> +static rtems_irq_connect_data mg5uart_rx_overrun_error_cd = { \
>>>> + 0, /* filled in at initialization */
>>>> + mg5uart_isr_rx_overrun_error, /* filled in at initialization
>*/
>>>> + NULL, /* (void *) minor */
>>>> + NULL,
>>>> + NULL,
>>>> + NULL
>>>> +};
>>>> +
>>>> +static rtems_irq_connect_data mg5uart_tx_empty_cd = { \
>>>> + 0, /* filled in at initializaion */
>>>> + mg5uart_isr_tx_empty, /* filled in at initialization */
>>>> + NULL,id *) minor */
>>>> + NULL,
>>>> + NULL,
>>>> + NULL
>>>> +};
>>>> +
>>>> +static rtems_irq_connect_data mg5uart_tx_ready_cd = { \
>>>> + 0, /* filled in at initialization */
>>>> + mg5uart_isr_tx_ready, /* filled in at initialization */
>>>> + NULL, /* (void *) minor */
>>>> + NULL,
>>>> + NULL,
>>>> NULL
>>>> +};
>>>> +
>>>> +static rtems_irq_connect_data mg5uart_rx_ready_cd = { \
>>>> + 0, /* filled in at initialization */
>>>> + mg5uart_isr_rx_ready, /* filled in at initialization */
>>>> + NULL, /* (void *) minor */
>>>> + NULL,
>>>> + NULL,
>>>> + NUL
>>>> +};
>>>> +
>>>> +
>>>> +/*
>>>> + * mg5uart_initialize_interrupts
>>>> + *
>>>> + * This routine initializes the console's receive and transmit
>>>> + * ring buffers and loads the appropriate vectors to handle the
>>>>interrupts.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC void mg5uart_initialize_interrupts(int minor)
>>>> +{
>>>> + unsigned long v;
>>>> + mg5uart_init(minor);
>>>> +
>>>> + Console_Port_Data[minor].bActive = FALSE;
>>>> + v = Console_Port_Tbl[minor]->ulIntVector;
>>>> +
>>>> + mg5uart_rx_frame_error_cd.name = v +
>MG5UART_IRQ_RX_FRAME_ERROR;
>>>> + mg5uart_rx_overrun_error_cd.name = v +
>>>>MG5UART_IRQ_RX_OVERRUN_ERROR;
>>>> + mg5uart_tx_empty_cd.name = v + MG5UART_IRQ_TX_EMPTY;
>>>> + mg5uart_tx_ready_cd.name = v + MG5UART_IRQ_TX_READY;
>>>> + mg5uart_rx_ready_cd.name = v + MG5UART_IRQ_RX_READY;
>>>> +
>>>> + mg5uart_rx_frame_error_cd.handle = (void
>>>>*)mg5uart_rx_frame_error_cd.name;
>>>> + mg5uart_rx_overrun_error_cd.handle = (void
>>>>*)mg5uart_rx_overrun_error_cd.name;
>>>> + mg5uart_tx_empty_cd.handle = (void
>>>>*)mg5uart_tx_empty_cd.name;
>>>> + mg5uart_tx_ready_cd.handle = (void
>>>>*)mg5uart_tx_ready_cd.name;
>>>> + mg5uart_rx_ready_cd.handle = (void
>>>>*)mg5uart_rx_ready_cd.name;
>>>> +
>>>> +
>>>> + BSP_install_rtems_irq_handler( &mg5uart_rx_frame_error_cd );
>>>> + BSP_install_rtems_irq_handler( &mg5uart_rx_overrun_error_cd );
>>>> + BSP_install_rtems_irq_handler( &mg5uart_tx_empty_cd );
>>>> + BSP_install_rtems_irq_handler( &mg5uart_tx_ready_cd );
>>>> + BSP_istall_rtems_irq_handler( &mg5uart_rx_ready_cd );
>>>> +
>>>> + mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL_EXCEPT_TX);
>>>> +}
>>>> +
>>>> +/*
>>>> + * mg5uart_write_support_int
>>>> + *
>>>> + * Console Termios output entry point when using interrupt driven
>>>>output.
>>>> + */
>>>> +
>>>> +MG5UART_STATIC int mg5uart_write_support_int(
>>>> + int minor,
>>>> + const char *buf,
>>>> + size_t len
>>>> +)
>>>> +{
>>>> + uint32_t pMG5UART
More information about the devel
mailing list