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/console/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/duart/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 directly, 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 will 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 +MIPS1 and 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, /* pDeviceFlow */ + 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 found + * on the Synova Mongoose-V. + */ + +/* + * COPYRIGHT (c) 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 distribution 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 mg5uart_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 vector = (rtems_vector_number) arg; \ + int minor; \ + \ + for(minor=0 ; minor<Console_Port_Count ; minor++) { \ + if( Console_Port_Tbl[minor]->deviceType == SERIAL_MG5UART && \ + vector == Console_Port_Tbl[minor]->ulIntVector + _OFFSET ) { \ + mg5uart_process_isr_ ## _TYPE (minor); \ + return; \ + } \ + } \ + mips_default_isr( vector ); \ + } + +__ISR(rx_frame_error, MG5UART_IRQ_RX_FRAME_ERROR) +__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_REGISTER ); + + 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]->ulCtrlPort1; + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2; + + pmg5uartContext->mate = -1; + + for (port=0 ; port<Console_Port_Count ; port++ ) { + if ( Console_Port_Tbl[port]->ulCtrlPort1 == pMG5UART && + Console_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_context *) 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 ); + + MG5UART_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 mg5uart_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 initialization */ + mg5uart_isr_tx_empty, /* filled in at initialization */ + NULL, /* (void *) 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, + NULL +}; + + +/* + * 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_install_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_port; + + pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2; + + /* + * We are using interrupt driven output and termios only sends us + * one character at a time. + */ + + if ( !len ) + return 0; + + /* + * Put the character out and enable interrupts if necessary. + */ + + MG5UART_SETREG(pMG5UART_port, MG5UART_TX_BUFFER, *buf); + + if( Console_Port_Data[minor].bActive == FALSE ) + { + Console_Port_Data[minor].bActive = TRUE; + mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL); + } + + return 1; +} + + + + +/* + * mg5uart_write_support_polled + * + * Console Termios output entry point when using polled output. + * + */ + +MG5UART_STATIC ssize_t mg5uart_write_support_polled( + int minor, + const char *buf, + size_t len +) +{ + int nwrite = 0; + + /* + * poll each byte in the string out of the port. + */ + while (nwrite < len) + { + mg5uart_write_polled(minor, *buf++); + nwrite++; + } + + /* + * return the number of bytes written. + */ + return nwrite; +} + +/* + * mg5uart_inbyte_nonblocking_polled + * + * Console Termios polling input entry point. + */ + +MG5UART_STATIC int mg5uart_inbyte_nonblocking_polled( + int minor +) +{ + uint32_t pMG5UART; + uint32_t pMG5UART_port; + uint32_t status; + uint32_t tmp,shift; + + 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; + + /* reset overrrun or framing errors */ + status = MG5UART_GETREG(pMG5UART, MG5UART_STATUS_REGISTER) >> shift; + + if( (tmp = (status & 0x3)) ) + { + MG5UART_SETREG(pMG5UART, MG5UART_STATUS_REGISTER, (tmp << shift) ); + status = MG5UART_GETREG(pMG5UART, MG5UART_STATUS_REGISTER) >> shift; + } + + if ( status & MONGOOSEV_UART_RX_READY ) + { + return (int) MG5UART_GETREG(pMG5UART_port, MG5UART_RX_BUFFER); + } + else + { + return -1; + } +} + +/* + * mg5uart_baud_rate + */ + +MG5UART_STATIC int mg5uart_baud_rate( + int minor, + uint32_t baud, + uint32_t *code +) +{ + uint32_t clock; + uint32_t tmp_code; + uint32_t baud_requested; + + baud_requested = baud & CBAUD; + if (!baud_requested) + baud_requested = B9600; /* default to 9600 baud */ + + baud_requested = rtems_termios_baud_to_number( baud_requested ); + + clock = (uint32_t) Console_Port_Tbl[minor]->ulClock; + if (!clock) + rtems_fatal_error_occurred(RTEMS_INVALID_NUMBER); + + /* + * Formula is Code = round(ClockFrequency / Baud - 1). + * + * Since this is integer math, we will divide by twice the baud and + * check the remaining odd bit. + */ + + tmp_code = (clock / baud_requested) - 1; + + /* + * From section 12.7, "Keep C>100 for best receiver operation." + * That is 100 cycles which is not a lot of instructions. It is + * reasonable to think that the Mongoose-V could not keep + * up with C < 100. + */ + + if ( tmp_code < 100 ) + return RTEMS_INVALID_NUMBER; + + /* + * upper word is receiver baud and lower word is transmitter baud + */ + + *code = (tmp_code << 16) | tmp_code; + + return 0; +} + + + + +/* + * mg5uart_enable_interrupts + * + * This function enables specific interrupt sources on the DUART. + */ + +MG5UART_STATIC void mg5uart_enable_interrupts( + int minor, + int mask +) +{ + uint32_t pMG5UART; + uint32_t maskSave; + uint32_t shift; + rtems_interrupt_level Irql; + + pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1; + + /* + * Enable interrupts on RX and TX -- not break + */ + + if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 ) + shift = MONGOOSEV_UART0_IRQ_SHIFT; + else + shift = MONGOOSEV_UART1_IRQ_SHIFT; + + + rtems_interrupt_disable(Irql); + + maskSave = MG5UART_GETREG( pMG5UART, MG5UART_INTERRUPT_MASK_REGISTER ); + + MG5UART_SETREG( + pMG5UART, + MG5UART_INTERRUPT_MASK_REGISTER, + (maskSave & ~(MONGOOSEV_UART_ALL_STATUS_BITS << shift)) | (mask << shift) ); + + rtems_interrupt_enable(Irql); +} + + + +/* + * Flow control is only supported when using interrupts + */ + +const console_fns mg5uart_fns = +{ + libchip_serial_default_probe, /* deviceProbe */ + mg5uart_open, /* deviceFirstOpen */ + NULL, /* deviceLastClose */ + NULL, /* deviceRead */ + mg5uart_write_support_int, /* deviceWrite */ + mg5uart_initialize_interrupts, /* deviceInitialize */ + mg5uart_write_polled, /* deviceWritePolled */ + mg5uart_set_attributes, /* deviceSetAttributes */ + TRUE /* deviceOutputUsesInterrupts */ +}; + +const console_fns mg5uart_fns_polled = +{ + libchip_serial_default_probe, /* deviceProbe */ + mg5uart_open, /* deviceFirstOpen */ + mg5uart_close, /* deviceLastClose */ + mg5uart_inbyte_nonblocking_polled, /* deviceRead */ + mg5uart_write_support_polled, /* deviceWrite */ + mg5uart_init, /* deviceInitialize */ + mg5uart_write_polled, /* deviceWritePolled */ + mg5uart_set_attributes, /* deviceSetAttributes */ + FALSE, /* deviceOutputUsesInterrupts */ +}; diff --git a/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.h b/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.h new file mode 100644 index 0000000..fa7bed6 --- /dev/null +++ b/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart.h @@ -0,0 +1,98 @@ +/* + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef _MG5UART_H_ +#define _MG5UART_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This is the ASCII for "MG5U" which should be unique enough to + * distinguish this type of serial device from others. + */ + +#define SERIAL_MG5UART 0x474D5535 + +#define MG5UART_UART0 0 +#define MG5UART_UART1 1 + +/* + * These are just used in the interface between this driver and + * the read/write register routines when accessing the first + * control port. They are indices of registers from the bases. + */ + +/* shared registers from peripheral base (i.e. from ulCtrlPort1) */ +/* +#define MG5UART_COMMAND_REGISTER 0 +#define MG5UART_STATUS_REGISTER 1 +#define MG5UART_INTERRUPT_CAUSE_REGISTER 2 +#define MG5UART_INTERRUPT_MASK_REGISTER 3 +*/ + +#define MG5UART_COMMAND_REGISTER 0 +#define MG5UART_STATUS_REGISTER 0x04 +#define MG5UART_INTERRUPT_CAUSE_REGISTER 0x08 +#define MG5UART_INTERRUPT_MASK_REGISTER 0x0C + +/* port specific registers from uart base (i.e. from ulCtrlPort2) */ +#define MG5UART_RX_BUFFER 0 +#define MG5UART_TX_BUFFER 4 +#define MG5UART_BAUD_RATE 8 + +/* + * Interrupt mask values + */ + +#define MG5UART_ENABLE_ALL_EXCEPT_TX MONGOOSEV_UART_ALL_RX_STATUS_BITS + +/* all rx ints on, but only tx ready. no need to also int on tx empty */ +#define MG5UART_ENABLE_ALL (MONGOOSEV_UART_ALL_STATUS_BITS & ~MONGOOSEV_UART_TX_EMPTY) + +#define MG5UART_DISABLE_ALL 0x0000 + +/* + * Assume vectors are sequential. + */ + +#define MG5UART_IRQ_RX_FRAME_ERROR 0 +#define MG5UART_IRQ_RX_OVERRUN_ERROR 1 +#define MG5UART_IRQ_TX_EMPTY 2 +#define MG5UART_IRQ_TX_READY 3 +#define MG5UART_IRQ_RX_READY 4 +/* + * Driver function table + */ + +extern const console_fns mg5uart_fns; +extern const console_fns mg5uart_fns_polled; + +/* + * Default register access routines + */ + +uint32_t mg5uart_get_register( /* registers are on 32-bit boundaries */ + uint32_t ulCtrlPort, /* and accessed as word */ + uint32_t ucRegNum +); + +void mg5uart_set_register( + uint32_t ulCtrlPort, + uint32_t ucRegNum, + uint32_t ucData +); + +#ifdef __cplusplus +} +#endif + +#endif /* _MG5UART_H_ */ diff --git a/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart_reg.c b/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart_reg.c new file mode 100644 index 0000000..134695f --- /dev/null +++ b/c/src/lib/libbsp/mips/genmongoosev/console/mg5uart_reg.c @@ -0,0 +1,58 @@ +/* + * This file contains a typical set of register access routines which may be + * used with the mg5uart chip if accesses to the chip are as follows: + * + * + registers are accessed as uint32_t 's + * + registers are only u32-aligned (no address gaps) + * + * COPYRIGHT (c) 1989-2001. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include <rtems.h> + +#ifndef _MG5UART_MULTIPLIER +#define _MG5UART_MULTIPLIER 1 +#define _MG5UART_NAME(_X) _X +#define _MG5UART_TYPE uint32_t +#endif + +#define CALCULATE_REGISTER_ADDRESS( _base, _reg ) \ + (_MG5UART_TYPE *)((_base) + ((_reg) * _MG5UART_MULTIPLIER )) + +/* + * MG5UART Get Register Routine + */ + +uint8_t _MG5UART_NAME(mg5uart_get_register)( + uint32_t ulCtrlPort, + uint8_t ucRegNum +) +{ + _MG5UART_TYPE *port; + + port = CALCULATE_REGISTER_ADDRESS( ulCtrlPort, ucRegNum ); + + return *port; +} + +/* + * MG5UART Set Register Routine + */ + +void _MG5UART_NAME(mg5uart_set_register)( + uint32_t ulCtrlPort, + uint8_t ucRegNum, + uint8_t ucData +) +{ + _MG5UART_TYPE *port; + + port = CALCULATE_REGISTER_ADDRESS( ulCtrlPort, ucRegNum ); + + *port = ucData; +} diff --git a/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h b/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h index da4c198..5146b7f 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h +++ b/c/src/lib/libbsp/mips/genmongoosev/include/bsp.h @@ -28,7 +28,7 @@ extern "C" { #include <rtems/iosupp.h> #include <rtems/console.h> #include <rtems/clockdrv.h> -#include <libcpu/mongoose-v.h> +#include <bsp/mongoose-v.h> #define BSP_FEATURE_IRQ_EXTENSION #define BSP_SHARED_HANDLER_SUPPORT 1 diff --git a/c/src/lib/libbsp/mips/genmongoosev/include/mongoose-v.h b/c/src/lib/libbsp/mips/genmongoosev/include/mongoose-v.h new file mode 100644 index 0000000..e69d25a --- /dev/null +++ b/c/src/lib/libbsp/mips/genmongoosev/include/mongoose-v.h @@ -0,0 +1,306 @@ +/** + * @file + * + * MIPS Mongoose-V specific information + */ + +/* + * COPYRIGHT (c) 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 distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#ifndef __MONGOOSEV_h +#define __MONGOOSEV_h + +/* + * Macros to assist in accessing memory mapped Mongoose registers + */ + + +#define MONGOOSEV_READ( _base ) \ + ( *((volatile uint32_t*)(_base)) ) + +#define MONGOOSEV_WRITE( _base, _value ) \ + ( *((volatile uint32_t*)(_base)) = (_value) ) + +#define MONGOOSEV_READ_REGISTER( _base, _register ) \ + ( *((volatile uint32_t*)((_base) + (_register))) ) + +#define MONGOOSEV_WRITE_REGISTER( _base, _register, _value ) \ + ( *((volatile uint32_t*)((_base) + (_register))) = (_value) ) + + + + + +/* + * Macros to read/write the Mongoose FPU control register. + */ + + + + +/* + * BIU and DRAM Registers + */ + +#define MONGOOSEV_BIU_CACHE_CONFIGURATION_REGISTER 0xFFFE0130 +#define MONGOOSEV_DRAM_CONFIGURATION_REGISTER 0xFFFE0120 +#define MONGOOSEV_REFRESH_TIMER_INITIAL_COUNTER_REGISTER 0xFFFE0010 +#define MONGOOSEV_WAIT_STATE_CONFIGURATION_REGISTER_BASE 0xFFFE0100 + +/* + * Peripheral Function Addresses + * + * NOTE: Status and Interrupt Cause use the same bits + */ + +#define MONGOOSEV_PERIPHERAL_COMMAND_REGISTER 0xFFFE0180 +#define MONGOOSEV_PERIPHERAL_STATUS_REGISTER 0xFFFE0184 +#define MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_CAUSE_REGISTER 0xFFFE0188 +#define MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_MASK_REGISTER 0xFFFE018C + +#define MONGOOSEV_WATCHDOG 0xBE000000 + +/* UART Bits in Peripheral Command Register Bits (TX/RX tied together here) */ +#define MONGOOSEV_UART_CMD_RESET_BOTH_PORTS 0x0001 +#define MONGOOSEV_UART_CMD_LOOPBACK_CTSN 0x0002 +#define MONGOOSEV_UART_CMD_LOOPBACK_RXTX 0x0004 + +#define MONGOOSEV_UART_CMD_RX_ENABLE 0x001 +#define MONGOOSEV_UART_CMD_RX_DISABLE 0x000 +#define MONGOOSEV_UART_CMD_TX_ENABLE 0x002 +#define MONGOOSEV_UART_CMD_TX_DISABLE 0x000 +#define MONGOOSEV_UART_CMD_TX_READY 0x004 +#define MONGOOSEV_UART_CMD_PARITY_ENABLE 0x008 +#define MONGOOSEV_UART_CMD_PARITY_DISABLE 0x000 +#define MONGOOSEV_UART_CMD_PARITY_EVEN 0x010 +#define MONGOOSEV_UART_CMD_PARITY_ODD 0x000 + +#define MONGOOSEV_UART0_CMD_SHIFT 5 +#define MONGOOSEV_UART1_CMD_SHIFT 11 + +#define MONGOOSEV_UART_CMD_TX_ENABLE_0 \ + (MONGOOSEV_UART_CMD_TX_ENABLE << MONGOOSEV_UART0_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_RX_ENABLE_0 \ + (MONGOOSEV_UART_CMD_RX_ENABLE << MONGOOSEV_UART0_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_TX_READY_0 \ + (MONGOOSEV_UART_CMD_TX_READY << MONGOOSEV_UART0_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_ENABLE_0 \ + (MONGOOSEV_UART_CMD_PARITY_ENABLE << MONGOOSEV_UART0_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_DISABLE_0 \ + (MONGOOSEV_UART_CMD_PARITY_DISABLE << MONGOOSEV_UART0_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_EVEN_0 \ + (MONGOOSEV_UART_CMD_PARITY_EVEN << MONGOOSEV_UART0_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_ODD_0 \ + (MONGOOSEV_UART_CMD_PARITY_ODD << MONGOOSEV_UART0_CMD_SHIFT) + +#define MONGOOSEV_UART_CMD_TX_ENABLE_1 \ + (MONGOOSEV_UART_CMD_TX_ENABLE << MONGOOSEV_UART1_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_RX_ENABLE_1 \ + (MONGOOSEV_UART_CMD_RX_ENABLE << MONGOOSEV_UART1_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_TX_READY_1 \ + (MONGOOSEV_UART_CMD_TX_READY << MONGOOSEV_UART1_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_ENABLE_1 \ + (MONGOOSEV_UART_CMD_PARITY_ENABLE << MONGOOSEV_UART1_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_DISABLE_1 \ + (MONGOOSEV_UART_CMD_PARITY_DISABLE << MONGOOSEV_UART1_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_EVEN_1 \ + (MONGOOSEV_UART_CMD_PARITY_EVEN << MONGOOSEV_UART1_CMD_SHIFT) +#define MONGOOSEV_UART_CMD_PARITY_ODD_1 \ + (MONGOOSEV_UART_CMD_PARITY_ODD << MONGOOSEV_UART1_CMD_SHIFT) + +/* UART Bits in Peripheral Status and Interrupt Cause Register */ +#define MONGOOSEV_UART_RX_FRAME_ERROR 0x0001 +#define MONGOOSEV_UART_RX_OVERRUN_ERROR 0x0002 +#define MONGOOSEV_UART_TX_EMPTY 0x0004 +#define MONGOOSEV_UART_TX_READY 0x0008 +#define MONGOOSEV_UART_RX_READY 0x0010 + +#define MONGOOSEV_UART_ALL_RX_STATUS_BITS 0x0013 +#define MONGOOSEV_UART_ALL_STATUS_BITS 0x001F + +/* + * The Peripheral Interrupt Status, Cause, and Mask registers have the + * same bit assignments although some revisions of the document have + * the Cause and Status registers incorrect. + */ + +#define MONGOOSEV_UART0_IRQ_SHIFT 11 +#define MONGOOSEV_UART1_IRQ_SHIFT 17 + +#define MONGOOSEV_UART_FRAME_ERROR_0 \ + (MONGOOSEV_UART_FRAME_ERROR << MONGOOSEV_UART0_IRQ_SHIFT) +#define MONGOOSEV_UART_RX_OVERRUN_ERROR_0 \ + (MONGOOSEV_UART_RX_OVERRUN_ERROR << MONGOOSEV_UART0_IRQ_SHIFT) +#define MONGOOSEV_UART_TX_EMPTY_0 \ + (MONGOOSEV_UART_TX_EMPTY << MONGOOSEV_UART0_IRQ_SHIFT) +#define MONGOOSEV_UART_TX_READY_0 \ + (MONGOOSEV_UART_TX_READY << MONGOOSEV_UART0_IRQ_SHIFT) +#define MONGOOSEV_UART_RX_READY_0 \ + (MONGOOSEV_UART_RX_READY << MONGOOSEV_UART0_IRQ_SHIFT) + +#define MONGOOSEV_UART_FRAME_ERROR_1 \ + (MONGOOSEV_UART_FRAME_ERROR << MONGOOSEV_UART1_IRQ_SHIFT) +#define MONGOOSEV_UART_RX_OVERRUN_ERROR_1 \ + (MONGOOSEV_UART_RX_OVERRUN_ERROR << MONGOOSEV_UART1_IRQ_SHIFT) +#define MONGOOSEV_UART_TX_EMPTY_1 \ + (MONGOOSEV_UART_TX_EMPTY << MONGOOSEV_UART1_IRQ_SHIFT) +#define MONGOOSEV_UART_TX_READY_1 \ + (MONGOOSEV_UART_TX_READY << MONGOOSEV_UART1_IRQ_SHIFT) +#define MONGOOSEV_UART_RX_READY_1 \ + (MONGOOSEV_UART_RX_READY << MONGOOSEV_UART1_IRQ_SHIFT) + +/* + * Bits in the Peripheral Interrupt Mask Register + */ + +/* +** Interrupt Status/Cause/Mask register bits - from 31 to 0 +*/ +#define MONGOOSEV_EDAC_SERR_BIT 0x80000000 +#define MONGOOSEV_EDAC_MERR_BIT 0x40000000 +/* 29 - 24 reserved */ +#define MONGOOSEV_MAVN_WRITE_ACCESS 0x00800000 +#define MONGOOSEV_MAVN_READ_ACCESS 0x00400000 +#define MONGOOSEV_UART_1_RX_READY 0x00200000 +#define MONGOOSEV_UART_1_TX_READY 0x00100000 +#define MONGOOSEV_UART_1_TX_EMPTY 0x00080000 +#define MONGOOSEV_UART_1_RX_OVERRUN 0x00040000 +#define MONGOOSEV_UART_1_FRAME_ERROR 0x00020000 +#define MONGOOSEV_RESERVED_16 0x00010000 +#define MONGOOSEV_UART_0_RX_READY 0x00008000 +#define MONGOOSEV_UART_0_TX_READY 0x00004000 +#define MONGOOSEV_UART_0_TX_EMPTY 0x00002000 +#define MONGOOSEV_UART_0_RX_OVERRUN 0x00001000 +#define MONGOOSEV_UART_0_FRAME_ERROR 0x00000800 +#define MONGOOSEV_RESERVED_10 0x00000400 +#define MONGOOSEV_EXTERN_INT_9 0x00000200 +#define MONGOOSEV_EXTERN_INT_8 0x00000100 +#define MONGOOSEV_EXTERN_INT_7 0x00000080 +#define MONGOOSEV_EXTERN_INT_6 0x00000040 +#define MONGOOSEV_EXTERN_INT_5 0x00000020 +#define MONGOOSEV_EXTERN_INT_4 0x00000010 +#define MONGOOSEV_EXTERN_INT_3 0x00000008 +#define MONGOOSEV_EXTERN_INT_2 0x00000004 +#define MONGOOSEV_EXTERN_INT_1 0x00000002 +#define MONGOOSEV_EXTERN_INT_0 0x00000001 + + +/* +** Peripheral Command bits (non-uart, those are defined above) +*/ +#define MONGOOSEV_COMMAND_ENABLE_EDAC MONGOOSEV_EDAC_SERR_BIT +#define MONGOOSEV_COMMAND_OVERRIDE_EDAC MONGOOSEV_EDAC_MERR_BIT + + + +/* + * EDAC Registers + */ + +#define MONGOOSEV_EDAC_ERROR_ADDRESS_REGISTER 0xFFFE0190 +#define MONGOOSEV_EDAC_PARITY_TEST_MODE_REGISTER 0xFFFE0194 + +/* + * MAVN Registers + */ + +#define MONGOOSEV_MAVN_TEST_REGISTER 0xFFFE01B4 +#define MONGOOSEV_MAVN_ACCESS_PRIVILEGE_REGISTER 0xFFFE01B8 +#define MONGOOSEV_MAVN_ACCESS_VIOLATION_REGISTER 0xFFFE01BC +#define MONGOOSEV_MAVN_RANGE_0_REGISTER 0xFFFE01C0 +#define MONGOOSEV_MAVN_RANGE_1_REGISTER 0xFFFE01C4 +#define MONGOOSEV_MAVN_RANGE_2_REGISTER 0xFFFE01C8 +#define MONGOOSEV_MAVN_RANGE_3_REGISTER 0xFFFE01CC +#define MONGOOSEV_MAVN_RANGE_4_REGISTER 0xFFFE01D0 +#define MONGOOSEV_MAVN_RANGE_5_REGISTER 0xFFFE01D4 +#define MONGOOSEV_MAVN_RANGE_6_REGISTER 0xFFFE01D8 +#define MONGOOSEV_MAVN_RANGE_7_REGISTER 0xFFFE01DC + +/* + * Timer Base Addresses, Offsets, and Values + */ + +#define MONGOOSEV_TIMER1_BASE 0xFFFE0000 +#define MONGOOSEV_TIMER2_BASE 0xFFFE0008 + +#define MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER 0 +#define MONGOOSEV_TIMER_CONTROL_REGISTER 4 + +/* Timer Control Register Constants */ +#define MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE 0x04 +#define MONGOOSEV_TIMER_CONTROL_INTERRUPT_ENABLE 0x02 +#define MONGOOSEV_TIMER_CONTROL_TIMEOUT 0x01 + +/* + * UART Base Addresses and Offsets + * + * Many bits in the peripheral command register are UART related + * and the bits are defined there. + */ + +#define MONGOOSEV_UART0_BASE 0xFFFE01E8 +#define MONGOOSEV_UART1_BASE 0xFFFE01F4 + +#define MONGOOSEV_RX_BUFFER 0 +#define MONGOOSEV_TX_BUFFER 4 +#define MONGOOSEV_BAUD_RATE 8 + + +/* + * Status Register Bits + */ + +#define SR_CUMASK 0xf0000000 /* coproc usable bits */ +#define SR_CU3 0x80000000 /* Coprocessor 3 usable */ +#define SR_CU2 0x40000000 /* Coprocessor 2 usable */ +#define SR_CU1 0x20000000 /* Coprocessor 1 usable */ +#define SR_CU0 0x10000000 /* Coprocessor 0 usable */ +#define SR_BEV 0x00400000 /* use boot exception vectors */ +#define SR_TS 0x00200000 /* TLB shutdown */ +#define SR_PE 0x00100000 /* cache parity error */ +#define SR_CM 0x00080000 /* cache miss */ +#define SR_PZ 0x00040000 /* cache parity zero */ +#define SR_SWC 0x00020000 /* swap cache */ +#define SR_ISC 0x00010000 /* Isolate data cache */ +#define SR_IMASK 0x0000ff00 /* Interrupt mask */ +#define SR_IMASK8 0x00000000 /* mask level 8 */ +#define SR_IMASK7 0x00008000 /* mask level 7 */ +#define SR_IMASK6 0x0000c000 /* mask level 6 */ +#define SR_IMASK5 0x0000e000 /* mask level 5 */ +#define SR_IMASK4 0x0000f000 /* mask level 4 */ +#define SR_IMASK3 0x0000f800 /* mask level 3 */ +#define SR_IMASK2 0x0000fc00 /* mask level 2 */ +#define SR_IMASK1 0x0000fe00 /* mask level 1 */ +#define SR_IMASK0 0x0000ff00 /* mask level 0 */ + +#define SR_IBIT8 0x00008000 /* bit level 8 */ +#define SR_IBIT7 0x00004000 /* bit level 7 */ +#define SR_IBIT6 0x00002000 /* bit level 6 */ +#define SR_IBIT5 0x00001000 /* bit level 5 */ +#define SR_IBIT4 0x00000800 /* bit level 4 */ +#define SR_IBIT3 0x00000400 /* bit level 3 */ +#define SR_IBIT2 0x00000200 /* bit level 2 */ +#define SR_IBIT1 0x00000100 /* bit level 1 */ + +#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */ +#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */ +#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */ +#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */ +#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */ +#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */ +#define SR_KUMSK (SR_KUO|SR_IEO|SR_KUP|SR_IEP|SR_KUC|SR_IEC) + +#define SR_IMASKSHIFT 8 + + + +#define MONGOOSEV_IC_SIZE 0x1000 /* instruction cache = 4Kbytes */ +#define MONGOOSEV_DC_SIZE 0x800 /* data cache 2Kbytes */ + +#endif diff --git a/c/src/lib/libbsp/mips/genmongoosev/irq/vectorisrs.c b/c/src/lib/libbsp/mips/genmongoosev/irq/vectorisrs.c index 8a23643..b7210f7 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/irq/vectorisrs.c +++ b/c/src/lib/libbsp/mips/genmongoosev/irq/vectorisrs.c @@ -15,7 +15,7 @@ #include <rtems.h> #include <stdlib.h> -#include <libcpu/mongoose-v.h> +#include <bsp/mongoose-v.h> #include <rtems/mips/iregdef.h> #include <rtems/mips/idtcpu.h> diff --git a/c/src/lib/libbsp/mips/genmongoosev/preinstall.am b/c/src/lib/libbsp/mips/genmongoosev/preinstall.am index f11c87a..e5988a4 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/preinstall.am +++ b/c/src/lib/libbsp/mips/genmongoosev/preinstall.am @@ -69,6 +69,26 @@ $(PROJECT_INCLUDE)/bsp/bootcard.h: ../../shared/include/bootcard.h $(PROJECT_INC $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h +$(PROJECT_INCLUDE)/bsp/lr33000.h: include/lr33000.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lr33000.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lr33000.h + +$(PROJECT_INCLUDE)/bsp/lr333x0.h: include/lr333x0.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lr333x0.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lr333x0.h + +$(PROJECT_INCLUDE)/bsp/mongoose-v.h: include/mongoose-v.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mongoose-v.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mongoose-v.h + +$(PROJECT_INCLUDE)/bsp/r3000.h: include/r3000.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/r3000.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/r3000.h + +$(PROJECT_INCLUDE)/bsp/mg5uart.h: console/mg5uart.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mg5uart.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mg5uart.h + $(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h diff --git a/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c b/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c index 744dd69..a8dd2cb 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c +++ b/c/src/lib/libbsp/mips/genmongoosev/startup/bspstart.c @@ -23,7 +23,7 @@ #include <string.h> #include <bsp.h> -#include <libcpu/mongoose-v.h> +#include <bsp/mongoose-v.h> #include <libcpu/isr_entries.h> #include <bsp/irq-generic.h> diff --git a/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c b/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c index 5f6ec0d..481774e 100644 --- a/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c +++ b/c/src/lib/libbsp/mips/genmongoosev/startup/gdb-support.c @@ -11,7 +11,7 @@ #include <rtems.h> #include <rtems/bspIo.h> -#include <libcpu/mongoose-v.h> +#include <bsp/mongoose-v.h> #include "gdb_if.h" #include <rtems/libio.h> diff --git a/c/src/lib/libcpu/mips/Makefile.am b/c/src/lib/libcpu/mips/Makefile.am index 6dc6258..e4dd7ca 100644 --- a/c/src/lib/libcpu/mips/Makefile.am +++ b/c/src/lib/libcpu/mips/Makefile.am @@ -31,10 +31,6 @@ if tx49 interrupts_CPPFLAGS = -DTX49 endif -if mongoosev -interrupts_CPPFLAGS = -DMONGOOSEV -endif - noinst_PROGRAMS += shared/interrupts.rel shared_interrupts_rel_SOURCES = shared/interrupts/installisrentries.c \ shared/interrupts/isr_entries.S shared/interrupts/isr_entries.h @@ -42,23 +38,6 @@ shared_interrupts_rel_CPPFLAGS = $(AM_CPPFLAGS) $(interrupts_CPPFLAGS) shared_interrupts_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) include_libcpu_HEADERS += shared/interrupts/isr_entries.h -EXTRA_DIST += mongoosev/README -EXTRA_DIST += mongoosev/duart/README.mguart -if mongoosev -include_libcpu_HEADERS += mongoosev/include/mongoose-v.h - -## mongoosev/duart -include_libchipdir = $(includedir)/libchip -include_libchip_HEADERS = mongoosev/duart/mg5uart.h - -noinst_PROGRAMS += mongoosev/duart.rel -mongoosev_duart_rel_SOURCES = mongoosev/duart/mg5uart.c \ - mongoosev/duart/mg5uart.h mongoosev/duart/mg5uart_reg.c -mongoosev_duart_rel_CPPFLAGS = $(AM_CPPFLAGS) -mongoosev_duart_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) - -endif - if tx39 include_libcpu_HEADERS += tx39/include/tx3904.h endif diff --git a/c/src/lib/libcpu/mips/mongoosev/duart/README.mguart b/c/src/lib/libcpu/mips/mongoosev/duart/README.mguart deleted file mode 100644 index 8073ab7..0000000 --- a/c/src/lib/libcpu/mips/mongoosev/duart/README.mguart +++ /dev/null @@ -1,101 +0,0 @@ -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, /* pDeviceFlow */ - 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/libcpu/mips/mongoosev/duart/mg5uart.c b/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c deleted file mode 100644 index 50f6586..0000000 --- a/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.c +++ /dev/null @@ -1,917 +0,0 @@ -/** - * @file - * - * This file contains the termios TTY driver for the UART found - * on the Synova Mongoose-V. - */ - -/* - * COPYRIGHT (c) 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 distribution 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/mg5uart.h> -#include <libchip/sersupp.h> -#include <libcpu/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 mg5uart_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 vector = (rtems_vector_number) arg; \ - int minor; \ - \ - for(minor=0 ; minor<Console_Port_Count ; minor++) { \ - if( Console_Port_Tbl[minor]->deviceType == SERIAL_MG5UART && \ - vector == Console_Port_Tbl[minor]->ulIntVector + _OFFSET ) { \ - mg5uart_process_isr_ ## _TYPE (minor); \ - return; \ - } \ - } \ - mips_default_isr( vector ); \ - } - -__ISR(rx_frame_error, MG5UART_IRQ_RX_FRAME_ERROR) -__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_REGISTER ); - - 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]->ulCtrlPort1; - pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2; - - pmg5uartContext->mate = -1; - - for (port=0 ; port<Console_Port_Count ; port++ ) { - if ( Console_Port_Tbl[port]->ulCtrlPort1 == pMG5UART && - Console_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_context *) 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 ); - - MG5UART_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 mg5uart_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 initialization */ - mg5uart_isr_tx_empty, /* filled in at initialization */ - NULL, /* (void *) 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, - NULL -}; - - -/* - * 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_install_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_port; - - pMG5UART_port = Console_Port_Tbl[minor]->ulCtrlPort2; - - /* - * We are using interrupt driven output and termios only sends us - * one character at a time. - */ - - if ( !len ) - return 0; - - /* - * Put the character out and enable interrupts if necessary. - */ - - MG5UART_SETREG(pMG5UART_port, MG5UART_TX_BUFFER, *buf); - - if( Console_Port_Data[minor].bActive == FALSE ) - { - Console_Port_Data[minor].bActive = TRUE; - mg5uart_enable_interrupts(minor, MG5UART_ENABLE_ALL); - } - - return 1; -} - - - - -/* - * mg5uart_write_support_polled - * - * Console Termios output entry point when using polled output. - * - */ - -MG5UART_STATIC ssize_t mg5uart_write_support_polled( - int minor, - const char *buf, - size_t len -) -{ - int nwrite = 0; - - /* - * poll each byte in the string out of the port. - */ - while (nwrite < len) - { - mg5uart_write_polled(minor, *buf++); - nwrite++; - } - - /* - * return the number of bytes written. - */ - return nwrite; -} - -/* - * mg5uart_inbyte_nonblocking_polled - * - * Console Termios polling input entry point. - */ - -MG5UART_STATIC int mg5uart_inbyte_nonblocking_polled( - int minor -) -{ - uint32_t pMG5UART; - uint32_t pMG5UART_port; - uint32_t status; - uint32_t tmp,shift; - - 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; - - /* reset overrrun or framing errors */ - status = MG5UART_GETREG(pMG5UART, MG5UART_STATUS_REGISTER) >> shift; - - if( (tmp = (status & 0x3)) ) - { - MG5UART_SETREG(pMG5UART, MG5UART_STATUS_REGISTER, (tmp << shift) ); - status = MG5UART_GETREG(pMG5UART, MG5UART_STATUS_REGISTER) >> shift; - } - - if ( status & MONGOOSEV_UART_RX_READY ) - { - return (int) MG5UART_GETREG(pMG5UART_port, MG5UART_RX_BUFFER); - } - else - { - return -1; - } -} - -/* - * mg5uart_baud_rate - */ - -MG5UART_STATIC int mg5uart_baud_rate( - int minor, - uint32_t baud, - uint32_t *code -) -{ - uint32_t clock; - uint32_t tmp_code; - uint32_t baud_requested; - - baud_requested = baud & CBAUD; - if (!baud_requested) - baud_requested = B9600; /* default to 9600 baud */ - - baud_requested = rtems_termios_baud_to_number( baud_requested ); - - clock = (uint32_t) Console_Port_Tbl[minor]->ulClock; - if (!clock) - rtems_fatal_error_occurred(RTEMS_INVALID_NUMBER); - - /* - * Formula is Code = round(ClockFrequency / Baud - 1). - * - * Since this is integer math, we will divide by twice the baud and - * check the remaining odd bit. - */ - - tmp_code = (clock / baud_requested) - 1; - - /* - * From section 12.7, "Keep C>100 for best receiver operation." - * That is 100 cycles which is not a lot of instructions. It is - * reasonable to think that the Mongoose-V could not keep - * up with C < 100. - */ - - if ( tmp_code < 100 ) - return RTEMS_INVALID_NUMBER; - - /* - * upper word is receiver baud and lower word is transmitter baud - */ - - *code = (tmp_code << 16) | tmp_code; - - return 0; -} - - - - -/* - * mg5uart_enable_interrupts - * - * This function enables specific interrupt sources on the DUART. - */ - -MG5UART_STATIC void mg5uart_enable_interrupts( - int minor, - int mask -) -{ - uint32_t pMG5UART; - uint32_t maskSave; - uint32_t shift; - rtems_interrupt_level Irql; - - pMG5UART = Console_Port_Tbl[minor]->ulCtrlPort1; - - /* - * Enable interrupts on RX and TX -- not break - */ - - if ( Console_Port_Tbl[minor]->ulDataPort == MG5UART_UART0 ) - shift = MONGOOSEV_UART0_IRQ_SHIFT; - else - shift = MONGOOSEV_UART1_IRQ_SHIFT; - - - rtems_interrupt_disable(Irql); - - maskSave = MG5UART_GETREG( pMG5UART, MG5UART_INTERRUPT_MASK_REGISTER ); - - MG5UART_SETREG( - pMG5UART, - MG5UART_INTERRUPT_MASK_REGISTER, - (maskSave & ~(MONGOOSEV_UART_ALL_STATUS_BITS << shift)) | (mask << shift) ); - - rtems_interrupt_enable(Irql); -} - - - -/* - * Flow control is only supported when using interrupts - */ - -const console_fns mg5uart_fns = -{ - libchip_serial_default_probe, /* deviceProbe */ - mg5uart_open, /* deviceFirstOpen */ - NULL, /* deviceLastClose */ - NULL, /* deviceRead */ - mg5uart_write_support_int, /* deviceWrite */ - mg5uart_initialize_interrupts, /* deviceInitialize */ - mg5uart_write_polled, /* deviceWritePolled */ - mg5uart_set_attributes, /* deviceSetAttributes */ - TRUE /* deviceOutputUsesInterrupts */ -}; - -const console_fns mg5uart_fns_polled = -{ - libchip_serial_default_probe, /* deviceProbe */ - mg5uart_open, /* deviceFirstOpen */ - mg5uart_close, /* deviceLastClose */ - mg5uart_inbyte_nonblocking_polled, /* deviceRead */ - mg5uart_write_support_polled, /* deviceWrite */ - mg5uart_init, /* deviceInitialize */ - mg5uart_write_polled, /* deviceWritePolled */ - mg5uart_set_attributes, /* deviceSetAttributes */ - FALSE, /* deviceOutputUsesInterrupts */ -}; diff --git a/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.h b/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.h deleted file mode 100644 index fa7bed6..0000000 --- a/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * COPYRIGHT (c) 1989-1999. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifndef _MG5UART_H_ -#define _MG5UART_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This is the ASCII for "MG5U" which should be unique enough to - * distinguish this type of serial device from others. - */ - -#define SERIAL_MG5UART 0x474D5535 - -#define MG5UART_UART0 0 -#define MG5UART_UART1 1 - -/* - * These are just used in the interface between this driver and - * the read/write register routines when accessing the first - * control port. They are indices of registers from the bases. - */ - -/* shared registers from peripheral base (i.e. from ulCtrlPort1) */ -/* -#define MG5UART_COMMAND_REGISTER 0 -#define MG5UART_STATUS_REGISTER 1 -#define MG5UART_INTERRUPT_CAUSE_REGISTER 2 -#define MG5UART_INTERRUPT_MASK_REGISTER 3 -*/ - -#define MG5UART_COMMAND_REGISTER 0 -#define MG5UART_STATUS_REGISTER 0x04 -#define MG5UART_INTERRUPT_CAUSE_REGISTER 0x08 -#define MG5UART_INTERRUPT_MASK_REGISTER 0x0C - -/* port specific registers from uart base (i.e. from ulCtrlPort2) */ -#define MG5UART_RX_BUFFER 0 -#define MG5UART_TX_BUFFER 4 -#define MG5UART_BAUD_RATE 8 - -/* - * Interrupt mask values - */ - -#define MG5UART_ENABLE_ALL_EXCEPT_TX MONGOOSEV_UART_ALL_RX_STATUS_BITS - -/* all rx ints on, but only tx ready. no need to also int on tx empty */ -#define MG5UART_ENABLE_ALL (MONGOOSEV_UART_ALL_STATUS_BITS & ~MONGOOSEV_UART_TX_EMPTY) - -#define MG5UART_DISABLE_ALL 0x0000 - -/* - * Assume vectors are sequential. - */ - -#define MG5UART_IRQ_RX_FRAME_ERROR 0 -#define MG5UART_IRQ_RX_OVERRUN_ERROR 1 -#define MG5UART_IRQ_TX_EMPTY 2 -#define MG5UART_IRQ_TX_READY 3 -#define MG5UART_IRQ_RX_READY 4 -/* - * Driver function table - */ - -extern const console_fns mg5uart_fns; -extern const console_fns mg5uart_fns_polled; - -/* - * Default register access routines - */ - -uint32_t mg5uart_get_register( /* registers are on 32-bit boundaries */ - uint32_t ulCtrlPort, /* and accessed as word */ - uint32_t ucRegNum -); - -void mg5uart_set_register( - uint32_t ulCtrlPort, - uint32_t ucRegNum, - uint32_t ucData -); - -#ifdef __cplusplus -} -#endif - -#endif /* _MG5UART_H_ */ diff --git a/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart_reg.c b/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart_reg.c deleted file mode 100644 index 134695f..0000000 --- a/c/src/lib/libcpu/mips/mongoosev/duart/mg5uart_reg.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This file contains a typical set of register access routines which may be - * used with the mg5uart chip if accesses to the chip are as follows: - * - * + registers are accessed as uint32_t 's - * + registers are only u32-aligned (no address gaps) - * - * COPYRIGHT (c) 1989-2001. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include <rtems.h> - -#ifndef _MG5UART_MULTIPLIER -#define _MG5UART_MULTIPLIER 1 -#define _MG5UART_NAME(_X) _X -#define _MG5UART_TYPE uint32_t -#endif - -#define CALCULATE_REGISTER_ADDRESS( _base, _reg ) \ - (_MG5UART_TYPE *)((_base) + ((_reg) * _MG5UART_MULTIPLIER )) - -/* - * MG5UART Get Register Routine - */ - -uint8_t _MG5UART_NAME(mg5uart_get_register)( - uint32_t ulCtrlPort, - uint8_t ucRegNum -) -{ - _MG5UART_TYPE *port; - - port = CALCULATE_REGISTER_ADDRESS( ulCtrlPort, ucRegNum ); - - return *port; -} - -/* - * MG5UART Set Register Routine - */ - -void _MG5UART_NAME(mg5uart_set_register)( - uint32_t ulCtrlPort, - uint8_t ucRegNum, - uint8_t ucData -) -{ - _MG5UART_TYPE *port; - - port = CALCULATE_REGISTER_ADDRESS( ulCtrlPort, ucRegNum ); - - *port = ucData; -} diff --git a/c/src/lib/libcpu/mips/mongoosev/include/mongoose-v.h b/c/src/lib/libcpu/mips/mongoosev/include/mongoose-v.h deleted file mode 100644 index b8ded3d..0000000 --- a/c/src/lib/libcpu/mips/mongoosev/include/mongoose-v.h +++ /dev/null @@ -1,306 +0,0 @@ -/** - * @file - * - * MIPS Mongoose-V specific information - */ - -/* - * COPYRIGHT (c) 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 distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifndef __MONGOOSEV_h -#define __MONGOOSEV_h - -/* - * Macros to assist in accessing memory mapped Mongoose registers - */ - - -#define MONGOOSEV_READ( _base ) \ - ( *((volatile uint32_t*)(_base)) ) - -#define MONGOOSEV_WRITE( _base, _value ) \ - ( *((volatile uint32_t*)(_base)) = (_value) ) - -#define MONGOOSEV_READ_REGISTER( _base, _register ) \ - ( *((volatile uint32_t*)((_base) + (_register))) ) - -#define MONGOOSEV_WRITE_REGISTER( _base, _register, _value ) \ - ( *((volatile uint32_t*)((_base) + (_register))) = (_value) ) - - - - - -/* - * Macros to read/write the Mongoose FPU control register. - */ - - - - -/* - * BIU and DRAM Registers - */ - -#define MONGOOSEV_BIU_CACHE_CONFIGURATION_REGISTER 0xFFFE0130 -#define MONGOOSEV_DRAM_CONFIGURATION_REGISTER 0xFFFE0120 -#define MONGOOSEV_REFRESH_TIMER_INITIAL_COUNTER_REGISTER 0xFFFE0010 -#define MONGOOSEV_WAIT_STATE_CONFIGURATION_REGISTER_BASE 0xFFFE0100 - -/* - * Peripheral Function Addresses - * - * NOTE: Status and Interrupt Cause use the same bits - */ - -#define MONGOOSEV_PERIPHERAL_COMMAND_REGISTER 0xFFFE0180 -#define MONGOOSEV_PERIPHERAL_STATUS_REGISTER 0xFFFE0184 -#define MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_CAUSE_REGISTER 0xFFFE0188 -#define MONGOOSEV_PERIPHERAL_FUNCTION_INTERRUPT_MASK_REGISTER 0xFFFE018C - -#define MONGOOSEV_WATCHDOG 0xBE000000 - -/* UART Bits in Peripheral Command Register Bits (TX/RX tied together here) */ -#define MONGOOSEV_UART_CMD_RESET_BOTH_PORTS 0x0001 -#define MONGOOSEV_UART_CMD_LOOPBACK_CTSN 0x0002 -#define MONGOOSEV_UART_CMD_LOOPBACK_RXTX 0x0004 - -#define MONGOOSEV_UART_CMD_RX_ENABLE 0x001 -#define MONGOOSEV_UART_CMD_RX_DISABLE 0x000 -#define MONGOOSEV_UART_CMD_TX_ENABLE 0x002 -#define MONGOOSEV_UART_CMD_TX_DISABLE 0x000 -#define MONGOOSEV_UART_CMD_TX_READY 0x004 -#define MONGOOSEV_UART_CMD_PARITY_ENABLE 0x008 -#define MONGOOSEV_UART_CMD_PARITY_DISABLE 0x000 -#define MONGOOSEV_UART_CMD_PARITY_EVEN 0x010 -#define MONGOOSEV_UART_CMD_PARITY_ODD 0x000 - -#define MONGOOSEV_UART0_CMD_SHIFT 5 -#define MONGOOSEV_UART1_CMD_SHIFT 11 - -#define MONGOOSEV_UART_CMD_TX_ENABLE_0 \ - (MONGOOSEV_UART_CMD_TX_ENABLE << MONGOOSEV_UART0_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_RX_ENABLE_0 \ - (MONGOOSEV_UART_CMD_RX_ENABLE << MONGOOSEV_UART0_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_TX_READY_0 \ - (MONGOOSEV_UART_CMD_TX_READY << MONGOOSEV_UART0_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_ENABLE_0 \ - (MONGOOSEV_UART_CMD_PARITY_ENABLE << MONGOOSEV_UART0_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_DISABLE_0 \ - (MONGOOSEV_UART_CMD_PARITY_DISABLE << MONGOOSEV_UART0_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_EVEN_0 \ - (MONGOOSEV_UART_CMD_PARITY_EVEN << MONGOOSEV_UART0_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_ODD_0 \ - (MONGOOSEV_UART_CMD_PARITY_ODD << MONGOOSEV_UART0_CMD_SHIFT) - -#define MONGOOSEV_UART_CMD_TX_ENABLE_1 \ - (MONGOOSEV_UART_CMD_TX_ENABLE << MONGOOSEV_UART1_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_RX_ENABLE_1 \ - (MONGOOSEV_UART_CMD_RX_ENABLE << MONGOOSEV_UART1_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_TX_READY_1 \ - (MONGOOSEV_UART_CMD_TX_READY << MONGOOSEV_UART1_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_ENABLE_1 \ - (MONGOOSEV_UART_CMD_PARITY_ENABLE << MONGOOSEV_UART1_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_DISABLE_1 \ - (MONGOOSEV_UART_CMD_PARITY_DISABLE << MONGOOSEV_UART1_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_EVEN_1 \ - (MONGOOSEV_UART_CMD_PARITY_EVEN << MONGOOSEV_UART1_CMD_SHIFT) -#define MONGOOSEV_UART_CMD_PARITY_ODD_1 \ - (MONGOOSEV_UART_CMD_PARITY_ODD << MONGOOSEV_UART1_CMD_SHIFT) - -/* UART Bits in Peripheral Status and Interrupt Cause Register */ -#define MONGOOSEV_UART_RX_FRAME_ERROR 0x0001 -#define MONGOOSEV_UART_RX_OVERRUN_ERROR 0x0002 -#define MONGOOSEV_UART_TX_EMPTY 0x0004 -#define MONGOOSEV_UART_TX_READY 0x0008 -#define MONGOOSEV_UART_RX_READY 0x0010 - -#define MONGOOSEV_UART_ALL_RX_STATUS_BITS 0x0013 -#define MONGOOSEV_UART_ALL_STATUS_BITS 0x001F - -/* - * The Peripheral Interrupt Status, Cause, and Mask registers have the - * same bit assignments although some revisions of the document have - * the Cause and Status registers incorrect. - */ - -#define MONGOOSEV_UART0_IRQ_SHIFT 11 -#define MONGOOSEV_UART1_IRQ_SHIFT 17 - -#define MONGOOSEV_UART_FRAME_ERROR_0 \ - (MONGOOSEV_UART_FRAME_ERROR << MONGOOSEV_UART0_IRQ_SHIFT) -#define MONGOOSEV_UART_RX_OVERRUN_ERROR_0 \ - (MONGOOSEV_UART_RX_OVERRUN_ERROR << MONGOOSEV_UART0_IRQ_SHIFT) -#define MONGOOSEV_UART_TX_EMPTY_0 \ - (MONGOOSEV_UART_TX_EMPTY << MONGOOSEV_UART0_IRQ_SHIFT) -#define MONGOOSEV_UART_TX_READY_0 \ - (MONGOOSEV_UART_TX_READY << MONGOOSEV_UART0_IRQ_SHIFT) -#define MONGOOSEV_UART_RX_READY_0 \ - (MONGOOSEV_UART_RX_READY << MONGOOSEV_UART0_IRQ_SHIFT) - -#define MONGOOSEV_UART_FRAME_ERROR_1 \ - (MONGOOSEV_UART_FRAME_ERROR << MONGOOSEV_UART1_IRQ_SHIFT) -#define MONGOOSEV_UART_RX_OVERRUN_ERROR_1 \ - (MONGOOSEV_UART_RX_OVERRUN_ERROR << MONGOOSEV_UART1_IRQ_SHIFT) -#define MONGOOSEV_UART_TX_EMPTY_1 \ - (MONGOOSEV_UART_TX_EMPTY << MONGOOSEV_UART1_IRQ_SHIFT) -#define MONGOOSEV_UART_TX_READY_1 \ - (MONGOOSEV_UART_TX_READY << MONGOOSEV_UART1_IRQ_SHIFT) -#define MONGOOSEV_UART_RX_READY_1 \ - (MONGOOSEV_UART_RX_READY << MONGOOSEV_UART1_IRQ_SHIFT) - -/* - * Bits in the Peripheral Interrupt Mask Register - */ - -/* -** Interrupt Status/Cause/Mask register bits - from 31 to 0 -*/ -#define MONGOOSEV_EDAC_SERR_BIT 0x80000000 -#define MONGOOSEV_EDAC_MERR_BIT 0x40000000 -/* 29 - 24 reserved */ -#define MONGOOSEV_MAVN_WRITE_ACCESS 0x00800000 -#define MONGOOSEV_MAVN_READ_ACCESS 0x00400000 -#define MONGOOSEV_UART_1_RX_READY 0x00200000 -#define MONGOOSEV_UART_1_TX_READY 0x00100000 -#define MONGOOSEV_UART_1_TX_EMPTY 0x00080000 -#define MONGOOSEV_UART_1_RX_OVERRUN 0x00040000 -#define MONGOOSEV_UART_1_FRAME_ERROR 0x00020000 -#define MONGOOSEV_RESERVED_16 0x00010000 -#define MONGOOSEV_UART_0_RX_READY 0x00008000 -#define MONGOOSEV_UART_0_TX_READY 0x00004000 -#define MONGOOSEV_UART_0_TX_EMPTY 0x00002000 -#define MONGOOSEV_UART_0_RX_OVERRUN 0x00001000 -#define MONGOOSEV_UART_0_FRAME_ERROR 0x00000800 -#define MONGOOSEV_RESERVED_10 0x00000400 -#define MONGOOSEV_EXTERN_INT_9 0x00000200 -#define MONGOOSEV_EXTERN_INT_8 0x00000100 -#define MONGOOSEV_EXTERN_INT_7 0x00000080 -#define MONGOOSEV_EXTERN_INT_6 0x00000040 -#define MONGOOSEV_EXTERN_INT_5 0x00000020 -#define MONGOOSEV_EXTERN_INT_4 0x00000010 -#define MONGOOSEV_EXTERN_INT_3 0x00000008 -#define MONGOOSEV_EXTERN_INT_2 0x00000004 -#define MONGOOSEV_EXTERN_INT_1 0x00000002 -#define MONGOOSEV_EXTERN_INT_0 0x00000001 - - -/* -** Peripheral Command bits (non-uart, those are defined above) -*/ -#define MONGOOSEV_COMMAND_ENABLE_EDAC MONGOOSEV_EDAC_SERR_BIT -#define MONGOOSEV_COMMAND_OVERRIDE_EDAC MONGOOSEV_EDAC_MERR_BIT - - - -/* - * EDAC Registers - */ - -#define MONGOOSEV_EDAC_ERROR_ADDRESS_REGISTER 0xFFFE0190 -#define MONGOOSEV_EDAC_PARITY_TEST_MODE_REGISTER 0xFFFE0194 - -/* - * MAVN Registers - */ - -#define MONGOOSEV_MAVN_TEST_REGISTER 0xFFFE01B4 -#define MONGOOSEV_MAVN_ACCESS_PRIVILEGE_REGISTER 0xFFFE01B8 -#define MONGOOSEV_MAVN_ACCESS_VIOLATION_REGISTER 0xFFFE01BC -#define MONGOOSEV_MAVN_RANGE_0_REGISTER 0xFFFE01C0 -#define MONGOOSEV_MAVN_RANGE_1_REGISTER 0xFFFE01C4 -#define MONGOOSEV_MAVN_RANGE_2_REGISTER 0xFFFE01C8 -#define MONGOOSEV_MAVN_RANGE_3_REGISTER 0xFFFE01CC -#define MONGOOSEV_MAVN_RANGE_4_REGISTER 0xFFFE01D0 -#define MONGOOSEV_MAVN_RANGE_5_REGISTER 0xFFFE01D4 -#define MONGOOSEV_MAVN_RANGE_6_REGISTER 0xFFFE01D8 -#define MONGOOSEV_MAVN_RANGE_7_REGISTER 0xFFFE01DC - -/* - * Timer Base Addresses, Offsets, and Values - */ - -#define MONGOOSEV_TIMER1_BASE 0xFFFE0000 -#define MONGOOSEV_TIMER2_BASE 0xFFFE0008 - -#define MONGOOSEV_TIMER_INITIAL_COUNTER_REGISTER 0 -#define MONGOOSEV_TIMER_CONTROL_REGISTER 4 - -/* Timer Control Register Constants */ -#define MONGOOSEV_TIMER_CONTROL_COUNTER_ENABLE 0x04 -#define MONGOOSEV_TIMER_CONTROL_INTERRUPT_ENABLE 0x02 -#define MONGOOSEV_TIMER_CONTROL_TIMEOUT 0x01 - -/* - * UART Base Addresses and Offsets - * - * Many bits in the peripheral command register are UART related - * and the bits are defined there. - */ - -#define MONGOOSEV_UART0_BASE 0xFFFE01E8 -#define MONGOOSEV_UART1_BASE 0xFFFE01F4 - -#define MONGOOSEV_RX_BUFFER 0 -#define MONGOOSEV_TX_BUFFER 4 -#define MONGOOSEV_BAUD_RATE 8 - - -/* - * Status Register Bits - */ - -#define SR_CUMASK 0xf0000000 /* coproc usable bits */ -#define SR_CU3 0x80000000 /* Coprocessor 3 usable */ -#define SR_CU2 0x40000000 /* Coprocessor 2 usable */ -#define SR_CU1 0x20000000 /* Coprocessor 1 usable */ -#define SR_CU0 0x10000000 /* Coprocessor 0 usable */ -#define SR_BEV 0x00400000 /* use boot exception vectors */ -#define SR_TS 0x00200000 /* TLB shutdown */ -#define SR_PE 0x00100000 /* cache parity error */ -#define SR_CM 0x00080000 /* cache miss */ -#define SR_PZ 0x00040000 /* cache parity zero */ -#define SR_SWC 0x00020000 /* swap cache */ -#define SR_ISC 0x00010000 /* Isolate data cache */ -#define SR_IMASK 0x0000ff00 /* Interrupt mask */ -#define SR_IMASK8 0x00000000 /* mask level 8 */ -#define SR_IMASK7 0x00008000 /* mask level 7 */ -#define SR_IMASK6 0x0000c000 /* mask level 6 */ -#define SR_IMASK5 0x0000e000 /* mask level 5 */ -#define SR_IMASK4 0x0000f000 /* mask level 4 */ -#define SR_IMASK3 0x0000f800 /* mask level 3 */ -#define SR_IMASK2 0x0000fc00 /* mask level 2 */ -#define SR_IMASK1 0x0000fe00 /* mask level 1 */ -#define SR_IMASK0 0x0000ff00 /* mask level 0 */ - -#define SR_IBIT8 0x00008000 /* bit level 8 */ -#define SR_IBIT7 0x00004000 /* bit level 7 */ -#define SR_IBIT6 0x00002000 /* bit level 6 */ -#define SR_IBIT5 0x00001000 /* bit level 5 */ -#define SR_IBIT4 0x00000800 /* bit level 4 */ -#define SR_IBIT3 0x00000400 /* bit level 3 */ -#define SR_IBIT2 0x00000200 /* bit level 2 */ -#define SR_IBIT1 0x00000100 /* bit level 1 */ - -#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */ -#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */ -#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */ -#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */ -#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */ -#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */ -#define SR_KUMSK (SR_KUO|SR_IEO|SR_KUP|SR_IEP|SR_KUC|SR_IEC) - -#define SR_IMASKSHIFT 8 - - - -#define MONGOOSEV_IC_SIZE 0x1000 /* instruction cache = 4Kbytes */ -#define MONGOOSEV_DC_SIZE 0x800 /* data cache 2Kbytes */ - -#endif diff --git a/c/src/lib/libcpu/mips/preinstall.am b/c/src/lib/libcpu/mips/preinstall.am index 4a83d60..85aec82 100644 --- a/c/src/lib/libcpu/mips/preinstall.am +++ b/c/src/lib/libcpu/mips/preinstall.am @@ -26,20 +26,6 @@ $(PROJECT_INCLUDE)/libcpu/isr_entries.h: shared/interrupts/isr_entries.h $(PROJE $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/isr_entries.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/isr_entries.h -if mongoosev -$(PROJECT_INCLUDE)/libcpu/mongoose-v.h: mongoosev/include/mongoose-v.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/mongoose-v.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/mongoose-v.h - -$(PROJECT_INCLUDE)/libchip/$(dirstamp): - @$(MKDIR_P) $(PROJECT_INCLUDE)/libchip - @: > $(PROJECT_INCLUDE)/libchip/$(dirstamp) -PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libchip/$(dirstamp) - -$(PROJECT_INCLUDE)/libchip/mg5uart.h: mongoosev/duart/mg5uart.h $(PROJECT_INCLUDE)/libchip/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/mg5uart.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/mg5uart.h -endif if tx39 $(PROJECT_INCLUDE)/libcpu/tx3904.h: tx39/include/tx3904.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/tx3904.h -- 1.9.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel