From 9374e9b082bf80e68aaa747dd26a5a3b01bc6626 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Thu, 19 Jun 2008 05:46:19 +0000 Subject: 2008-06-19 Matthew Riek * mcf52235/README, mcf52235/gdb-init, mcf52235/clock/clock.c, mcf52235/console/console.c, mcf52235/include/bsp.h, mcf52235/include/coverhd.h, mcf52235/start/start.S, mcf52235/startup/bspclean.c, mcf52235/startup/bspstart.c, mcf52235/startup/linkcmds, mcf52235/timer/timer.c: Cleaned up white space and code formmated to adhere to RTEMS standards. Fixed a bug in the nano seconds since last tick support. Fixed a bug with the location of the start stack (no longer within .bss). Removed double definition of IPSBAR and some type defs etc.. Added timing test overhead results. --- c/src/lib/libbsp/m68k/mcf52235/ChangeLog | 13 + c/src/lib/libbsp/m68k/mcf52235/README | 123 ++- c/src/lib/libbsp/m68k/mcf52235/clock/clock.c | 72 +- c/src/lib/libbsp/m68k/mcf52235/console/console.c | 1049 ++++++++++----------- c/src/lib/libbsp/m68k/mcf52235/gdb-init | 6 +- c/src/lib/libbsp/m68k/mcf52235/include/bsp.h | 16 +- c/src/lib/libbsp/m68k/mcf52235/include/coverhd.h | 8 +- c/src/lib/libbsp/m68k/mcf52235/start/start.S | 29 +- c/src/lib/libbsp/m68k/mcf52235/startup/bspclean.c | 14 +- c/src/lib/libbsp/m68k/mcf52235/startup/bspstart.c | 4 +- c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds | 11 +- c/src/lib/libbsp/m68k/mcf52235/timer/timer.c | 33 +- 12 files changed, 700 insertions(+), 678 deletions(-) diff --git a/c/src/lib/libbsp/m68k/mcf52235/ChangeLog b/c/src/lib/libbsp/m68k/mcf52235/ChangeLog index 9745b63614..c67a9346ff 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/ChangeLog +++ b/c/src/lib/libbsp/m68k/mcf52235/ChangeLog @@ -1,3 +1,16 @@ +2008-06-19 Matthew Riek + + * mcf52235/README, mcf52235/gdb-init, mcf52235/clock/clock.c, + mcf52235/console/console.c, mcf52235/include/bsp.h, + mcf52235/include/coverhd.h, mcf52235/start/start.S, + mcf52235/startup/bspclean.c, mcf52235/startup/bspstart.c, + mcf52235/startup/linkcmds, mcf52235/timer/timer.c: Cleaned up + white space and code formmated to adhere to RTEMS standards. Fixed + a bug in the nano seconds since last tick support. Fixed a bug + with the location of the start stack (no longer within + .bss). Removed double definition of IPSBAR and some type defs + etc.. Added timing test overhead results. + 2008-06-10 Matthew Riek * .cvsignore, ChangeLog, Makefile.am, README, bsp_specs, diff --git a/c/src/lib/libbsp/m68k/mcf52235/README b/c/src/lib/libbsp/m68k/mcf52235/README index b52aa5de91..469499e581 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/README +++ b/c/src/lib/libbsp/m68k/mcf52235/README @@ -3,7 +3,7 @@ # Description: Motorola MCF52235EVB -============ +============================================================================ CPU: MCF52235, 60MHz SRAM: 32K FLASH: 256K @@ -11,10 +11,10 @@ FLASH: 256K This is a Motorola evaluation board that uses the MCF52235 Coldfire CPU. This board is running at 60MHz scaled from a 25MHz oscillator. +============================================================================ NOTES: -====== -Currently this BSP must be configured with most (all?) RTEMS features turned +Currently this BSP must be configured with most RTEMS features turned off as RAM usage is too high. Configure as follows: @@ -22,17 +22,35 @@ configure --target=m68k-rtems4.9 --enable-rtemsbsp=mcf52235 \ --disable-networking --disable-posix --disable-itron --disable-cxx \ --disable-tests +To get the tests to compile (but not run) change the linkcmds to specify +a larger sram memory region (256K works). This of course will let you +compile all tests, but many or most of them wont run. + +See testsuites/samples/minumum for an example of what type of config flags +you need for this BSP! + +In you project before you include confdefs.h, define some or all of the +following: + +#define CONFIGURE_DISABLE_CLASSIC_API_NOTEPADS +#define CONFIGURE_DISABLE_CLASSIC_NOTEPADS +#define CONFIGURE_INIT_TASK_STACK_SIZE x +#define CONFIGURE_MINIMUM_TASK_STACK_SIZE x +#define CONFIGURE_INTERRUPT_STACK_SIZE x + +Note that the default stack size is 1K +Note that the default number of priorities is 15 + +============================================================================ TODO: -===== -*) Work with TINY RTEMS to get the ram usage down. *) Add drivers for I2C, ADC, FEC *) Support for LWIP *) Update the coverhd.h (calling overheads) page 21 of the BSP guide -*) Adjust initial stack so that it's space is not forever unusable after init -*) Fix up constants used by cfinit such as clockspeed, rambase, flashbase etc. +*) Recover the 1K stack space reserved in linkcmds used for board startup. ============================================================================ + Interrupt map +-----+-----------------------------------------------------------------------+ @@ -46,7 +64,7 @@ TODO: +-----+--------+--------+--------+--------+--------+--------+--------+--------+ | 5 | | | | | | | | | +-----+--------+--------+--------+--------+--------+--------+--------+--------+ -| 4 | FEC RX | FEC TX | | | | | | PIT | +| 4 | | | | | | | | PIT | +-----+--------+--------+--------+--------+--------+--------+--------+--------+ | 3 | UART 0 | UART 1 | UART 2 | | | | | | +-----+--------+--------+--------+--------+--------+--------+--------+--------+ @@ -54,3 +72,92 @@ TODO: +-----+--------+--------+--------+--------+--------+--------+--------+--------+ | 1 | | | | | | | | | +-----+--------+--------+--------+--------+--------+--------+--------+--------+ + +============================================================================ + +*** TIME TEST 1 *** +rtems_semaphore_create 8 +rtems_semaphore_delete 10 +rtems_semaphore_obtain: available 3 +rtems_semaphore_obtain: not available -- NO_WAIT 3 +rtems_semaphore_release: no waiting tasks 7 +*** END OF TEST 1 *** + + +*** TIME TEST OVERHEAD *** +rtems_shutdown_executive 0 +rtems_task_create 0 +rtems_task_ident 0 +rtems_task_start 0 +rtems_task_restart 0 +rtems_task_delete 0 +rtems_task_suspend 0 +rtems_task_resume 0 +rtems_task_set_priority 0 +rtems_task_mode 0 +rtems_task_get_note 0 +rtems_task_set_note 0 +rtems_task_wake_when 0 +rtems_task_wake_after 0 +rtems_interrupt_catch 0 +rtems_clock_get 0 +rtems_clock_set 0 +rtems_clock_tick 0 + +rtems_timer_create 0 +rtems_timer_delete 0 +rtems_timer_ident 0 +rtems_timer_fire_after 0 +rtems_timer_fire_when 1 +rtems_timer_reset 0 +rtems_timer_cancel 0 +rtems_semaphore_create 0 +rtems_semaphore_delete 0 +rtems_semaphore_ident 0 +rtems_semaphore_obtain 0 +rtems_semaphore_release 0 +rtems_message_queue_create 0 +rtems_message_queue_ident 0 +rtems_message_queue_delete 0 +rtems_message_queue_send 0 +rtems_message_queue_urgent 0 +rtems_message_queue_broadcast 0 +rtems_message_queue_receive 0 +rtems_message_queue_flush 0 + +rtems_event_send 0 +rtems_event_receive 0 +rtems_signal_catch 0 +rtems_signal_send 0 +rtems_partition_create 0 +rtems_partition_ident 0 +rtems_partition_delete 0 +rtems_partition_get_buffer 0 +rtems_partition_return_buffer 0 +rtems_region_create 0 +rtems_region_ident 0 +rtems_region_delete 0 +rtems_region_get_segment 0 +rtems_region_return_segment 0 +rtems_port_create 0 +rtems_port_ident 0 +rtems_port_delete 0 +rtems_port_external_to_internal 0 +rtems_port_internal_to_external 0 + +rtems_io_initialize 0 +rtems_io_open 0 +rtems_io_close 0 +rtems_io_read 0 +rtems_io_write 0 +rtems_io_control 0 +rtems_fatal_error_occurred 0 +rtems_rate_monotonic_create 0 +rtems_rate_monotonic_ident 0 +rtems_rate_monotonic_delete 0 +rtems_rate_monotonic_cancel 0 +rtems_rate_monotonic_period 0 +rtems_multiprocessing_announce 0 +*** END OF TIME OVERHEAD *** + + diff --git a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c index 9e7b3dd346..c52c4918e0 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c +++ b/c/src/lib/libbsp/m68k/mcf52235/clock/clock.c @@ -17,15 +17,19 @@ static uint32_t s_nanoScale = 0; /* * Provide nanosecond extension + * Interrupts are disabled when this is called */ static uint32_t bsp_clock_nanoseconds_since_last_tick(void) { - uint32_t i = MCF_PIT1_PCNTR; - if(MCF_PIT1_PCSR & MCF_PIT_PCSR_PIF) - { - i = MCF_PIT1_PCNTR + MCF_PIT1_PMR; - } - return (i - s_pcntrAtTick) * s_nanoScale; + uint32_t i; + + if (MCF_PIT1_PCSR & MCF_PIT_PCSR_PIF) { + i = s_pcntrAtTick + (MCF_PIT1_PMR - MCF_PIT1_PCNTR); + } + else { + i = s_pcntrAtTick - MCF_PIT1_PCNTR; + } + return i * s_nanoScale; } #define Clock_driver_nanoseconds_since_last_tick bsp_clock_nanoseconds_since_last_tick @@ -50,9 +54,9 @@ static uint32_t bsp_clock_nanoseconds_since_last_tick(void) /* * Turn off the clock */ -static void Clock_driver_support_shutdown_hardware() +static void Clock_driver_support_shutdown_hardware() { - MCF_PIT1_PCSR &= ~MCF_PIT_PCSR_EN; + MCF_PIT1_PCSR &= ~MCF_PIT_PCSR_EN; } /* @@ -62,35 +66,33 @@ static void Clock_driver_support_shutdown_hardware() */ static void Clock_driver_support_initialize_hardware() { - int level; - uint32_t pmr; - uint32_t preScaleCode = 0; - uint32_t clk = bsp_get_CPU_clock_speed() >> 1; - uint32_t tps = 1000000 / Configuration.microseconds_per_tick; - while (preScaleCode < 15) { - pmr = (clk >> preScaleCode) / tps; - if(pmr < (1 << 15)) break; - preScaleCode++; - } - s_nanoScale = 1000000000 / (clk >> preScaleCode); + int level; + uint32_t pmr; + uint32_t preScaleCode = 0; + uint32_t clk = bsp_get_CPU_clock_speed() >> 1; + uint32_t tps = 1000000 / Configuration.microseconds_per_tick; + + while (preScaleCode < 15) { + pmr = (clk >> preScaleCode) / tps; + if (pmr < (1 << 15)) + break; + preScaleCode++; + } + s_nanoScale = 1000000000 / (clk >> preScaleCode); - MCF_INTC0_ICR56 = MCF_INTC_ICR_IL(PIT3_IRQ_LEVEL) | - MCF_INTC_ICR_IP(PIT3_IRQ_PRIORITY); - rtems_interrupt_disable( level ); - MCF_INTC0_IMRH &= ~MCF_INTC_IMRH_MASK56; - MCF_PIT1_PCSR &= ~MCF_PIT_PCSR_EN; - rtems_interrupt_enable( level ); + MCF_INTC0_ICR56 = MCF_INTC_ICR_IL(PIT3_IRQ_LEVEL) | + MCF_INTC_ICR_IP(PIT3_IRQ_PRIORITY); + rtems_interrupt_disable(level); + MCF_INTC0_IMRH &= ~MCF_INTC_IMRH_MASK56; + MCF_PIT1_PCSR &= ~MCF_PIT_PCSR_EN; + rtems_interrupt_enable(level); - MCF_PIT1_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) | - MCF_PIT_PCSR_OVW | - MCF_PIT_PCSR_PIE | - MCF_PIT_PCSR_RLD; - MCF_PIT1_PMR = pmr; - MCF_PIT1_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) | - MCF_PIT_PCSR_PIE | - MCF_PIT_PCSR_RLD | - MCF_PIT_PCSR_EN; - s_pcntrAtTick = MCF_PIT1_PCNTR; + MCF_PIT1_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) | + MCF_PIT_PCSR_OVW | MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_RLD; + MCF_PIT1_PMR = pmr; + MCF_PIT1_PCSR = MCF_PIT_PCSR_PRE(preScaleCode) | + MCF_PIT_PCSR_PIE | MCF_PIT_PCSR_RLD | MCF_PIT_PCSR_EN; + s_pcntrAtTick = MCF_PIT1_PCNTR; } #include "../../../shared/clockdrv_shell.c" diff --git a/c/src/lib/libbsp/m68k/mcf52235/console/console.c b/c/src/lib/libbsp/m68k/mcf52235/console/console.c index eee826847f..b99f127109 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/console/console.c +++ b/c/src/lib/libbsp/m68k/mcf52235/console/console.c @@ -23,23 +23,23 @@ MCF_UART_USR_OE ) static int IntUartPollWrite(int minor, const char *buf, int len); -static int IntUartInterruptWrite (int minor, const char *buf, int len); +static int IntUartInterruptWrite(int minor, const char *buf, int len); -static void -_BSP_null_char( char c ) -{ - int level; - - if (c == '\n') - _BSP_null_char('\r'); - rtems_interrupt_disable(level); - while ( (MCF_UART_USR(CONSOLE_PORT) & MCF_UART_USR_TXRDY) == 0 ) - continue; - MCF_UART_UTB(CONSOLE_PORT) = c; - while ( (MCF_UART_USR(CONSOLE_PORT) & MCF_UART_USR_TXRDY) == 0 ) - continue; - rtems_interrupt_enable(level); +static void _BSP_null_char(char c) +{ + int level; + + if (c == '\n') + _BSP_null_char('\r'); + rtems_interrupt_disable(level); + while ((MCF_UART_USR(CONSOLE_PORT) & MCF_UART_USR_TXRDY) == 0) + continue; + MCF_UART_UTB(CONSOLE_PORT) = c; + while ((MCF_UART_USR(CONSOLE_PORT) & MCF_UART_USR_TXRDY) == 0) + continue; + rtems_interrupt_enable(level); } + BSP_output_char_function_type BSP_output_char = _BSP_null_char; #define MAX_UART_INFO 3 @@ -47,17 +47,17 @@ BSP_output_char_function_type BSP_output_char = _BSP_null_char; struct IntUartInfoStruct { - int iomode; - volatile int uimr; - int baud; - int databits; - int parity; - int stopbits; - int hwflow; - int rx_in; - int rx_out; - char rx_buffer[RX_BUFFER_SIZE]; - void *ttyp; + int iomode; + volatile int uimr; + int baud; + int databits; + int parity; + int stopbits; + int hwflow; + int rx_in; + int rx_out; + char rx_buffer[RX_BUFFER_SIZE]; + void *ttyp; }; struct IntUartInfoStruct IntUartInfo[MAX_UART_INFO]; @@ -68,89 +68,84 @@ struct IntUartInfoStruct IntUartInfo[MAX_UART_INFO]; Description : This updates the hardware UART settings. ***************************************************************************/ static void -IntUartSet(int minor, int baud, int databits, int parity, int stopbits, int hwflow) +IntUartSet(int minor, int baud, int databits, int parity, int stopbits, + int hwflow) { - int divisor; - uint32_t clock_speed; - uint8_t umr1 = 0; - uint8_t umr2 = 0; - struct IntUartInfoStruct *info = &IntUartInfo[minor]; - int level; - - rtems_interrupt_disable(level); - - - /* disable interrupts, clear RTS line, and disable the UARTS */ - MCF_UART_UIMR(minor) = 0; - MCF_UART_UOP0(minor) = 1; - MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_DISABLED | MCF_UART_UCR_RX_DISABLED); - - /* save the current values */ - info->uimr = 0; - info->baud = baud; - info->databits = databits; - info->parity = parity; - info->stopbits = stopbits; - info->hwflow = hwflow; - - clock_speed = bsp_get_CPU_clock_speed(); - /* determine the baud divisor value */ - // MRTODO - //divisor = ((clock_speed/2) / ( 32 * baud )); - divisor = ((clock_speed) / ( 32 * baud )); - if ( divisor < 2 ) - divisor = 2; - - /* check to see if doing hardware flow control */ - if ( hwflow ) - { - /* set hardware flow options */ - umr1 |= MCF_UART_UMR_RXRTS; - umr2 |= MCF_UART_UMR_TXCTS; - } - - /* determine the new umr values */ - umr1 |= (parity | databits); - umr2 |= (stopbits); - - /* reset the uart */ - MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_ERROR; - MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_RX; - MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_TX; - - /* reset the uart mode register and update values */ - MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_MR; - MCF_UART_UMR(minor) = umr1; - MCF_UART_UMR(minor) = umr2; - - /* set the baud rate values */ - MCF_UART_UCSR(minor) = (MCF_UART_UCSR_RCS_SYS_CLK | MCF_UART_UCSR_TCS_SYS_CLK); - MCF_UART_UBG1(minor) = (divisor & 0xff00) >> 8; - MCF_UART_UBG2(minor) = (divisor & 0x00ff); - - /* enable the uart */ - MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_ENABLED | MCF_UART_UCR_RX_ENABLED); - - /* check to see if interrupts need to be enabled */ - if ( info->iomode != TERMIOS_POLLED ) - { - /* enable rx interrupts */ - info->uimr |= MCF_UART_UIMR_RXRDY_FU; - MCF_UART_UIMR(minor) = info->uimr; - } - - /* check to see if doing hardware flow control */ - if ( hwflow ) - { - /* assert the RTS line */ - MCF_UART_UOP1(minor) = 1; - } - - rtems_interrupt_enable(level); + int divisor; + uint32_t clock_speed; + uint8_t umr1 = 0; + uint8_t umr2 = 0; + struct IntUartInfoStruct *info = &IntUartInfo[minor]; + int level; + + rtems_interrupt_disable(level); + + /* disable interrupts, clear RTS line, and disable the UARTS */ + MCF_UART_UIMR(minor) = 0; + MCF_UART_UOP0(minor) = 1; + MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_DISABLED | MCF_UART_UCR_RX_DISABLED); + + /* save the current values */ + info->uimr = 0; + info->baud = baud; + info->databits = databits; + info->parity = parity; + info->stopbits = stopbits; + info->hwflow = hwflow; + + clock_speed = bsp_get_CPU_clock_speed(); + /* determine the baud divisor value */ + divisor = ((clock_speed) / (32 * baud)); + if (divisor < 2) + divisor = 2; + + /* check to see if doing hardware flow control */ + if (hwflow) { + /* set hardware flow options */ + umr1 |= MCF_UART_UMR_RXRTS; + umr2 |= MCF_UART_UMR_TXCTS; + } + + /* determine the new umr values */ + umr1 |= (parity | databits); + umr2 |= (stopbits); + + /* reset the uart */ + MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_ERROR; + MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_RX; + MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_TX; + + /* reset the uart mode register and update values */ + MCF_UART_UCR(minor) = MCF_UART_UCR_RESET_MR; + MCF_UART_UMR(minor) = umr1; + MCF_UART_UMR(minor) = umr2; + + /* set the baud rate values */ + MCF_UART_UCSR(minor) = + (MCF_UART_UCSR_RCS_SYS_CLK | MCF_UART_UCSR_TCS_SYS_CLK); + MCF_UART_UBG1(minor) = (divisor & 0xff00) >> 8; + MCF_UART_UBG2(minor) = (divisor & 0x00ff); + + /* enable the uart */ + MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_ENABLED | MCF_UART_UCR_RX_ENABLED); + + /* check to see if interrupts need to be enabled */ + if (info->iomode != TERMIOS_POLLED) { + /* enable rx interrupts */ + info->uimr |= MCF_UART_UIMR_RXRDY_FU; + MCF_UART_UIMR(minor) = info->uimr; + } + + /* check to see if doing hardware flow control */ + if (hwflow) { + /* assert the RTS line */ + MCF_UART_UOP1(minor) = 1; + } + + rtems_interrupt_enable(level); } - /*************************************************************************** Function : IntUartSetAttributes @@ -160,82 +155,71 @@ IntUartSet(int minor, int baud, int databits, int parity, int stopbits, int hwfl Note: The highest baudrate is 115200 as this stays within an error of +/- 5% at 25MHz processor clock ***************************************************************************/ -static int -IntUartSetAttributes(int minor, const struct termios *t) +static int IntUartSetAttributes(int minor, const struct termios *t) { - /* set default index values */ - int baud = (int)19200; - int databits = (int)MCF_UART_UMR_BC_8; - int parity = (int)MCF_UART_UMR_PM_NONE; - int stopbits = (int)MCF_UART_UMR_SB_STOP_BITS_1; - int hwflow = (int)0; - struct IntUartInfoStruct *info = &IntUartInfo[minor]; - - /* check to see if input is valid */ - if ( t != (const struct termios *)0 ) - { - /* determine baud rate index */ - baud = termios_baud_to_number(t->c_cflag & CBAUD); - - /* determine data bits */ - switch ( t->c_cflag & CSIZE ) - { - case CS5: - databits = (int)MCF_UART_UMR_BC_5; - break; - case CS6: - databits = (int)MCF_UART_UMR_BC_6; - break; - case CS7: - databits = (int)MCF_UART_UMR_BC_7; - break; - case CS8: - databits = (int)MCF_UART_UMR_BC_8; - break; - } - - /* determine if parity is enabled */ - if ( t->c_cflag & PARENB ) - { - if ( t->c_cflag & PARODD ) - { - /* odd parity */ - parity = (int)MCF_UART_UMR_PM_ODD; - } - else - { - /* even parity */ - parity = (int)MCF_UART_UMR_PM_EVEN; - } - } - - /* determine stop bits */ - if ( t->c_cflag & CSTOPB ) - { - /* two stop bits */ - stopbits = (int)MCF_UART_UMR_SB_STOP_BITS_2; - } - - /* check to see if hardware flow control */ - if ( t->c_cflag & CRTSCTS ) - { - hwflow = 1; - } - } - - /* check to see if values have changed */ - if ( ( baud != info->baud ) || - ( databits != info->databits ) || - ( parity != info->parity ) || - ( stopbits != info->stopbits ) || - ( hwflow != info->hwflow ) ) - { - - /* call function to set values */ - IntUartSet(minor, baud, databits, parity, stopbits, hwflow); - } - - return( RTEMS_SUCCESSFUL ); + /* set default index values */ + int baud = (int) 19200; + int databits = (int) MCF_UART_UMR_BC_8; + int parity = (int) MCF_UART_UMR_PM_NONE; + int stopbits = (int) MCF_UART_UMR_SB_STOP_BITS_1; + int hwflow = (int) 0; + struct IntUartInfoStruct *info = &IntUartInfo[minor]; + + /* check to see if input is valid */ + if (t != (const struct termios *) 0) { + /* determine baud rate index */ + baud = termios_baud_to_number(t->c_cflag & CBAUD); + + /* determine data bits */ + switch (t->c_cflag & CSIZE) { + case CS5: + databits = (int) MCF_UART_UMR_BC_5; + break; + case CS6: + databits = (int) MCF_UART_UMR_BC_6; + break; + case CS7: + databits = (int) MCF_UART_UMR_BC_7; + break; + case CS8: + databits = (int) MCF_UART_UMR_BC_8; + break; + } + + /* determine if parity is enabled */ + if (t->c_cflag & PARENB) { + if (t->c_cflag & PARODD) { + /* odd parity */ + parity = (int) MCF_UART_UMR_PM_ODD; + } else { + /* even parity */ + parity = (int) MCF_UART_UMR_PM_EVEN; + } + } + + /* determine stop bits */ + if (t->c_cflag & CSTOPB) { + /* two stop bits */ + stopbits = (int) MCF_UART_UMR_SB_STOP_BITS_2; + } + + /* check to see if hardware flow control */ + if (t->c_cflag & CRTSCTS) { + hwflow = 1; + } + } + + /* check to see if values have changed */ + if ((baud != info->baud) || + (databits != info->databits) || + (parity != info->parity) || + (stopbits != info->stopbits) || (hwflow != info->hwflow)) { + + /* call function to set values */ + IntUartSet(minor, baud, databits, parity, stopbits, hwflow); + } + + return (RTEMS_SUCCESSFUL); } @@ -246,71 +230,60 @@ IntUartSetAttributes(int minor, const struct termios *t) determines which channel caused the interrupt before queueing any received chars and dequeueing chars waiting for transmission. ***************************************************************************/ -static rtems_isr -IntUartInterruptHandler(rtems_vector_number v) +static rtems_isr IntUartInterruptHandler(rtems_vector_number v) { - unsigned int chan = v - UART_INTC0_IRQ_VECTOR(0); - struct IntUartInfoStruct *info = &IntUartInfo[chan]; - - /* check to see if received data */ - if ( MCF_UART_UISR(chan) & MCF_UART_UISR_RXRDY_FU ) - { - /* read data and put into the receive buffer */ - while ( MCF_UART_USR(chan) & MCF_UART_USR_RXRDY ) - { - - if ( MCF_UART_USR(chan) & MCF_UART_USR_ERROR ) - { - /* clear the error */ - MCF_UART_UCR(chan) = MCF_UART_UCR_RESET_ERROR; - } - /* put data in rx buffer and check for errors */ - info->rx_buffer[info->rx_in] = MCF_UART_URB(chan); - - /* update buffer values */ - info->rx_in++; - - if ( info->rx_in >= RX_BUFFER_SIZE ) - { - info->rx_in = 0; - } - } - /* Make sure the port has been opened */ - if ( info->ttyp ) - { - - /* check to see if task driven */ - if ( info->iomode == TERMIOS_TASK_DRIVEN ) - { - /* notify rx task that rx buffer has data */ - rtems_termios_rxirq_occured(info->ttyp); - } - else - { - /* Push up the received data */ - rtems_termios_enqueue_raw_characters(info->ttyp, info->rx_buffer, info->rx_in); - info->rx_in = 0; - } - } - } - - /* check to see if data needs to be transmitted */ - if ( ( info->uimr & MCF_UART_UIMR_TXRDY ) && - ( MCF_UART_UISR(chan) & MCF_UART_UISR_TXRDY ) ) - { - - /* disable tx interrupts */ - info->uimr &= ~MCF_UART_UIMR_TXRDY; - MCF_UART_UIMR(chan) = info->uimr; - - /* tell upper level that character has been sent */ - if ( info->ttyp ) - rtems_termios_dequeue_characters(info->ttyp, 1); - } + unsigned int chan = v - UART_INTC0_IRQ_VECTOR(0); + struct IntUartInfoStruct *info = &IntUartInfo[chan]; + + /* check to see if received data */ + if (MCF_UART_UISR(chan) & MCF_UART_UISR_RXRDY_FU) { + /* read data and put into the receive buffer */ + while (MCF_UART_USR(chan) & MCF_UART_USR_RXRDY) { + + if (MCF_UART_USR(chan) & MCF_UART_USR_ERROR) { + /* clear the error */ + MCF_UART_UCR(chan) = MCF_UART_UCR_RESET_ERROR; + } + /* put data in rx buffer and check for errors */ + info->rx_buffer[info->rx_in] = MCF_UART_URB(chan); + + /* update buffer values */ + info->rx_in++; + + if (info->rx_in >= RX_BUFFER_SIZE) { + info->rx_in = 0; + } + } + /* Make sure the port has been opened */ + if (info->ttyp) { + + /* check to see if task driven */ + if (info->iomode == TERMIOS_TASK_DRIVEN) { + /* notify rx task that rx buffer has data */ + rtems_termios_rxirq_occured(info->ttyp); + } else { + /* Push up the received data */ + rtems_termios_enqueue_raw_characters(info->ttyp, info->rx_buffer, + info->rx_in); + info->rx_in = 0; + } + } + } + + /* check to see if data needs to be transmitted */ + if ((info->uimr & MCF_UART_UIMR_TXRDY) && + (MCF_UART_UISR(chan) & MCF_UART_UISR_TXRDY)) { + + /* disable tx interrupts */ + info->uimr &= ~MCF_UART_UIMR_TXRDY; + MCF_UART_UIMR(chan) = info->uimr; + + /* tell upper level that character has been sent */ + if (info->ttyp) + rtems_termios_dequeue_characters(info->ttyp, 1); + } } - - /*************************************************************************** Function : IntUartInitialize @@ -318,71 +291,62 @@ IntUartInterruptHandler(rtems_vector_number v) internal uarts. If the internal uart is to be interrupt driven then the interrupt vectors are hooked. ***************************************************************************/ -static void -IntUartInitialize(void) +static void IntUartInitialize(void) { - unsigned int chan; - struct IntUartInfoStruct *info; - rtems_isr_entry old_handler; - int level; - - for ( chan = 0; chan < MAX_UART_INFO; chan++ ) - { - info = &IntUartInfo[chan]; - - info->ttyp = NULL; - info->rx_in = 0; - info->rx_out = 0; - info->baud = -1; - info->databits = -1; - info->parity = -1; - info->stopbits = -1; - info->hwflow = -1; - info->iomode = TERMIOS_POLLED; /*polled console io */ - - MCF_UART_UACR(chan) = 0; - MCF_UART_UIMR(chan) = 0; - if ( info->iomode != TERMIOS_POLLED ) - { - rtems_interrupt_catch (IntUartInterruptHandler, - UART_INTC0_IRQ_VECTOR(chan), - &old_handler); - } - - /* set uart default values */ - IntUartSetAttributes(chan, NULL); - - /* unmask interrupt */ - rtems_interrupt_disable(level); - switch(chan) { - case 0: - MCF_INTC0_ICR13 = MCF_INTC_ICR_IL(UART0_IRQ_LEVEL) | - MCF_INTC_ICR_IP(UART0_IRQ_PRIORITY); - MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASK13 | - MCF_INTC_IMRL_MASKALL); - break; - - case 1: - MCF_INTC0_ICR14 = MCF_INTC_ICR_IL(UART1_IRQ_LEVEL) | - MCF_INTC_ICR_IP(UART1_IRQ_PRIORITY); - MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASK14 | - MCF_INTC_IMRL_MASKALL); - break; - - case 2: - MCF_INTC0_ICR15 = MCF_INTC_ICR_IL(UART2_IRQ_LEVEL) | - MCF_INTC_ICR_IP(UART2_IRQ_PRIORITY); - MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASK15 | - MCF_INTC_IMRL_MASKALL); - break; - } - rtems_interrupt_enable(level); - - } /* of chan loop */ - - -} /* IntUartInitialise */ - + unsigned int chan; + struct IntUartInfoStruct *info; + rtems_isr_entry old_handler; + int level; + + for (chan = 0; chan < MAX_UART_INFO; chan++) { + info = &IntUartInfo[chan]; + + info->ttyp = NULL; + info->rx_in = 0; + info->rx_out = 0; + info->baud = -1; + info->databits = -1; + info->parity = -1; + info->stopbits = -1; + info->hwflow = -1; + info->iomode = TERMIOS_POLLED; /*polled console io */ + + MCF_UART_UACR(chan) = 0; + MCF_UART_UIMR(chan) = 0; + if (info->iomode != TERMIOS_POLLED) { + rtems_interrupt_catch(IntUartInterruptHandler, + UART_INTC0_IRQ_VECTOR(chan), &old_handler); + } + + /* set uart default values */ + IntUartSetAttributes(chan, NULL); + + /* unmask interrupt */ + rtems_interrupt_disable(level); + switch (chan) { + case 0: + MCF_INTC0_ICR13 = MCF_INTC_ICR_IL(UART0_IRQ_LEVEL) | + MCF_INTC_ICR_IP(UART0_IRQ_PRIORITY); + MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASK13 | MCF_INTC_IMRL_MASKALL); + break; + + case 1: + MCF_INTC0_ICR14 = MCF_INTC_ICR_IL(UART1_IRQ_LEVEL) | + MCF_INTC_ICR_IP(UART1_IRQ_PRIORITY); + MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASK14 | MCF_INTC_IMRL_MASKALL); + break; + + case 2: + MCF_INTC0_ICR15 = MCF_INTC_ICR_IL(UART2_IRQ_LEVEL) | + MCF_INTC_ICR_IP(UART2_IRQ_PRIORITY); + MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_MASK15 | MCF_INTC_IMRL_MASKALL); + break; + } + rtems_interrupt_enable(level); + + } /* of chan loop */ + +} /* IntUartInitialise */ /*************************************************************************** Function : IntUartInterruptWrite @@ -392,22 +356,21 @@ IntUartInitialize(void) to initiate a transmit sequence. Calling this routine enables Tx interrupts. ***************************************************************************/ -static int -IntUartInterruptWrite (int minor, const char *buf, int len) +static int IntUartInterruptWrite(int minor, const char *buf, int len) { - int level; + int level; - rtems_interrupt_disable(level); + rtems_interrupt_disable(level); - /* write out character */ - MCF_UART_UTB(minor) = *buf; + /* write out character */ + MCF_UART_UTB(minor) = *buf; - /* enable tx interrupt */ - IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY; - MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr; + /* enable tx interrupt */ + IntUartInfo[minor].uimr |= MCF_UART_UIMR_TXRDY; + MCF_UART_UIMR(minor) = IntUartInfo[minor].uimr; - rtems_interrupt_enable(level); - return( 0 ); + rtems_interrupt_enable(level); + return (0); } /*************************************************************************** @@ -415,55 +378,49 @@ IntUartInterruptWrite (int minor, const char *buf, int len) Description : This enables interrupts when the tty is opened. ***************************************************************************/ -static int -IntUartInterruptOpen(int major, int minor, void *arg) +static int IntUartInterruptOpen(int major, int minor, void *arg) { - struct IntUartInfoStruct *info = &IntUartInfo[minor]; - - /* enable the uart */ - MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_ENABLED | MCF_UART_UCR_RX_ENABLED); - - /* check to see if interrupts need to be enabled */ - if ( info->iomode != TERMIOS_POLLED ) - { - /* enable rx interrupts */ - info->uimr |= MCF_UART_UIMR_RXRDY_FU; - MCF_UART_UIMR(minor) = info->uimr; - } - - /* check to see if doing hardware flow control */ - if ( info->hwflow ) - { - /* assert the RTS line */ - MCF_UART_UOP1(minor) = 1; - } - - return( 0 ); -} + struct IntUartInfoStruct *info = &IntUartInfo[minor]; + /* enable the uart */ + MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_ENABLED | MCF_UART_UCR_RX_ENABLED); + /* check to see if interrupts need to be enabled */ + if (info->iomode != TERMIOS_POLLED) { + /* enable rx interrupts */ + info->uimr |= MCF_UART_UIMR_RXRDY_FU; + MCF_UART_UIMR(minor) = info->uimr; + } + + /* check to see if doing hardware flow control */ + if (info->hwflow) { + /* assert the RTS line */ + MCF_UART_UOP1(minor) = 1; + } + + return (0); +} /*************************************************************************** Function : IntUartInterruptClose Description : This disables interrupts when the tty is closed. ***************************************************************************/ -static int -IntUartInterruptClose(int major, int minor, void *arg) +static int IntUartInterruptClose(int major, int minor, void *arg) { - struct IntUartInfoStruct *info = &IntUartInfo[minor]; + struct IntUartInfoStruct *info = &IntUartInfo[minor]; - /* disable the interrupts and the uart */ - MCF_UART_UIMR(minor) = 0; - MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_DISABLED | MCF_UART_UCR_RX_DISABLED); + /* disable the interrupts and the uart */ + MCF_UART_UIMR(minor) = 0; + MCF_UART_UCR(minor) = (MCF_UART_UCR_TX_DISABLED | MCF_UART_UCR_RX_DISABLED); - /* reset values */ - info->ttyp = NULL; - info->uimr = 0; - info->rx_in = 0; - info->rx_out = 0; + /* reset values */ + info->ttyp = NULL; + info->uimr = 0; + info->rx_in = 0; + info->rx_out = 0; - return( 0 ); + return (0); } /*************************************************************************** @@ -473,69 +430,58 @@ IntUartInterruptClose(int major, int minor, void *arg) and places them into the termios buffer. The rx interrupts will be re-enabled after all data has been read. ***************************************************************************/ -static int -IntUartTaskRead(int minor) +static int IntUartTaskRead(int minor) { - char buffer[RX_BUFFER_SIZE]; - int count; - int rx_in; - int index = 0; - struct IntUartInfoStruct *info = &IntUartInfo[minor]; - - /* determine number of values to copy out */ - rx_in = info->rx_in; - if ( info->rx_out <= rx_in ) - { - count = rx_in - info->rx_out; - } - else - { - count = (RX_BUFFER_SIZE - info->rx_out) + rx_in; - } - - /* copy data into local buffer from rx buffer */ - while ( ( index < count ) && ( index < RX_BUFFER_SIZE ) ) - { - /* copy data byte */ - buffer[index] = info->rx_buffer[info->rx_out]; - index++; - - /* increment rx buffer values */ - info->rx_out++; - if ( info->rx_out >= RX_BUFFER_SIZE ) - { - info->rx_out = 0; - } - } - - /* check to see if buffer is not empty */ - if ( count > 0 ) - { - /* set characters into termios buffer */ - rtems_termios_enqueue_raw_characters(info->ttyp, buffer, count); - } - - return( EOF ); + char buffer[RX_BUFFER_SIZE]; + int count; + int rx_in; + int index = 0; + struct IntUartInfoStruct *info = &IntUartInfo[minor]; + + /* determine number of values to copy out */ + rx_in = info->rx_in; + if (info->rx_out <= rx_in) { + count = rx_in - info->rx_out; + } else { + count = (RX_BUFFER_SIZE - info->rx_out) + rx_in; + } + + /* copy data into local buffer from rx buffer */ + while ((index < count) && (index < RX_BUFFER_SIZE)) { + /* copy data byte */ + buffer[index] = info->rx_buffer[info->rx_out]; + index++; + + /* increment rx buffer values */ + info->rx_out++; + if (info->rx_out >= RX_BUFFER_SIZE) { + info->rx_out = 0; + } + } + + /* check to see if buffer is not empty */ + if (count > 0) { + /* set characters into termios buffer */ + rtems_termios_enqueue_raw_characters(info->ttyp, buffer, count); + } + + return (EOF); } - - /*************************************************************************** Function : IntUartPollRead Description : This reads a character from the internal uart. It returns to the caller without blocking if not character is waiting. ***************************************************************************/ -static int -IntUartPollRead (int minor) +static int IntUartPollRead(int minor) { - if ( (MCF_UART_USR(minor) & MCF_UART_USR_RXRDY) == 0 ) - return(-1); + if ((MCF_UART_USR(minor) & MCF_UART_USR_RXRDY) == 0) + return (-1); - return(MCF_UART_URB(minor)); + return (MCF_UART_URB(minor)); } - /*************************************************************************** Function : IntUartPollWrite @@ -543,69 +489,59 @@ IntUartPollRead (int minor) appropriate internal uart channel waiting till each one is sucessfully transmitted. ***************************************************************************/ -static int -IntUartPollWrite (int minor, const char *buf, int len) +static int IntUartPollWrite(int minor, const char *buf, int len) { - /* loop over buffer */ - while ( len-- ) - { - /* block until we can transmit */ - while ( (MCF_UART_USR(minor) & MCF_UART_USR_TXRDY) == 0 ) - continue; - /* transmit data byte */ - MCF_UART_UTB(minor) = *buf++; - } - return(0); + /* loop over buffer */ + while (len--) { + /* block until we can transmit */ + while ((MCF_UART_USR(minor) & MCF_UART_USR_TXRDY) == 0) + continue; + /* transmit data byte */ + MCF_UART_UTB(minor) = *buf++; + } + return (0); } - /*************************************************************************** Function : console_initialize Description : This initialises termios, both sets of uart hardware before registering /dev/tty devices for each channel and the system /dev/console. ***************************************************************************/ -rtems_device_driver console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg ) +rtems_device_driver console_initialize(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) { - rtems_status_code status; - - - /* Set up TERMIOS */ - rtems_termios_initialize (); - - /* set io modes for the different channels and initialize device */ - IntUartInfo[minor].iomode = TERMIOS_IRQ_DRIVEN; - IntUartInitialize(); - - /* Register the console port */ - status = rtems_io_register_name ("/dev/console", major, CONSOLE_PORT); - if ( status != RTEMS_SUCCESSFUL ) - { - rtems_fatal_error_occurred (status); - } - - /* Register the other port */ - if ( CONSOLE_PORT != 0 ) - { - status = rtems_io_register_name ("/dev/tty00", major, 0); - if ( status != RTEMS_SUCCESSFUL ) - { - rtems_fatal_error_occurred (status); - } - } - if ( CONSOLE_PORT != 1 ) - { - status = rtems_io_register_name ("/dev/tty01", major, 1); - if ( status != RTEMS_SUCCESSFUL ) - { - rtems_fatal_error_occurred (status); - } - } - - return(RTEMS_SUCCESSFUL); + rtems_status_code status; + + /* Set up TERMIOS */ + rtems_termios_initialize(); + + /* set io modes for the different channels and initialize device */ + IntUartInfo[minor].iomode = TERMIOS_IRQ_DRIVEN; + IntUartInitialize(); + + /* Register the console port */ + status = rtems_io_register_name("/dev/console", major, CONSOLE_PORT); + if (status != RTEMS_SUCCESSFUL) { + rtems_fatal_error_occurred(status); + } + + /* Register the other port */ + if (CONSOLE_PORT != 0) { + status = rtems_io_register_name("/dev/tty00", major, 0); + if (status != RTEMS_SUCCESSFUL) { + rtems_fatal_error_occurred(status); + } + } + if (CONSOLE_PORT != 1) { + status = rtems_io_register_name("/dev/tty01", major, 1); + if (status != RTEMS_SUCCESSFUL) { + rtems_fatal_error_occurred(status); + } + } + + return (RTEMS_SUCCESSFUL); } /*************************************************************************** @@ -616,82 +552,77 @@ rtems_device_driver console_initialize( passed to termios when the devices is opened depending on whether it is polled or not. ***************************************************************************/ -rtems_device_driver console_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg) +rtems_device_driver console_open(rtems_device_major_number major, + rtems_device_minor_number minor, void *arg) { - rtems_status_code status = RTEMS_INVALID_NUMBER; - rtems_libio_open_close_args_t *args = (rtems_libio_open_close_args_t *)arg; - struct IntUartInfoStruct *info; - - static const rtems_termios_callbacks IntUartPollCallbacks = { - NULL, /* firstOpen */ - NULL, /* lastClose */ - IntUartPollRead, /* pollRead */ - IntUartPollWrite, /* write */ - IntUartSetAttributes, /* setAttributes */ - NULL, /* stopRemoteTx */ - NULL, /* startRemoteTx */ - TERMIOS_POLLED /* mode */ - }; - static const rtems_termios_callbacks IntUartIntrCallbacks = { - IntUartInterruptOpen, /* firstOpen */ - IntUartInterruptClose, /* lastClose */ - NULL, /* pollRead */ - IntUartInterruptWrite, /* write */ - IntUartSetAttributes, /* setAttributes */ - NULL, /* stopRemoteTx */ - NULL, /* startRemoteTx */ - TERMIOS_IRQ_DRIVEN /* mode */ - }; - - static const rtems_termios_callbacks IntUartTaskCallbacks = { - IntUartInterruptOpen, /* firstOpen */ - IntUartInterruptClose, /* lastClose */ - IntUartTaskRead, /* pollRead */ - IntUartInterruptWrite, /* write */ - IntUartSetAttributes, /* setAttributes */ - NULL, /* stopRemoteTx */ - NULL, /* startRemoteTx */ - TERMIOS_TASK_DRIVEN /* mode */ - }; - - /* open the port depending on the minor device number */ - if ( ( minor >= 0 ) && ( minor < MAX_UART_INFO ) ) - { - info = &IntUartInfo[minor]; - switch ( info->iomode ) - { - case TERMIOS_POLLED: - status = rtems_termios_open(major, minor, arg, &IntUartPollCallbacks); - break; - case TERMIOS_IRQ_DRIVEN: - status = rtems_termios_open(major, minor, arg, &IntUartIntrCallbacks); - info->ttyp = args->iop->data1; - break; - case TERMIOS_TASK_DRIVEN: - status = rtems_termios_open(major, minor, arg, &IntUartTaskCallbacks); - info->ttyp = args->iop->data1; - break; - } - } - - if (status == RTEMS_SUCCESSFUL) - { - /* - * Reset the default baudrate. - */ - struct termios term; - if (tcgetattr (STDIN_FILENO, &term) >= 0) - { - term.c_cflag &= ~(CBAUD | CSIZE); - term.c_cflag |= CS8 | B19200; - tcsetattr (STDIN_FILENO, TCSANOW, &term); - } - } - - return( status ); + rtems_status_code status = RTEMS_INVALID_NUMBER; + rtems_libio_open_close_args_t *args = (rtems_libio_open_close_args_t *) arg; + struct IntUartInfoStruct *info; + + static const rtems_termios_callbacks IntUartPollCallbacks = { + NULL, /* firstOpen */ + NULL, /* lastClose */ + IntUartPollRead, /* pollRead */ + IntUartPollWrite, /* write */ + IntUartSetAttributes, /* setAttributes */ + NULL, /* stopRemoteTx */ + NULL, /* startRemoteTx */ + TERMIOS_POLLED /* mode */ + }; + static const rtems_termios_callbacks IntUartIntrCallbacks = { + IntUartInterruptOpen, /* firstOpen */ + IntUartInterruptClose, /* lastClose */ + NULL, /* pollRead */ + IntUartInterruptWrite, /* write */ + IntUartSetAttributes, /* setAttributes */ + NULL, /* stopRemoteTx */ + NULL, /* startRemoteTx */ + TERMIOS_IRQ_DRIVEN /* mode */ + }; + + static const rtems_termios_callbacks IntUartTaskCallbacks = { + IntUartInterruptOpen, /* firstOpen */ + IntUartInterruptClose, /* lastClose */ + IntUartTaskRead, /* pollRead */ + IntUartInterruptWrite, /* write */ + IntUartSetAttributes, /* setAttributes */ + NULL, /* stopRemoteTx */ + NULL, /* startRemoteTx */ + TERMIOS_TASK_DRIVEN /* mode */ + }; + + /* open the port depending on the minor device number */ + if ((minor >= 0) && (minor < MAX_UART_INFO)) { + info = &IntUartInfo[minor]; + switch (info->iomode) { + case TERMIOS_POLLED: + status = rtems_termios_open(major, minor, arg, &IntUartPollCallbacks); + break; + case TERMIOS_IRQ_DRIVEN: + status = rtems_termios_open(major, minor, arg, &IntUartIntrCallbacks); + info->ttyp = args->iop->data1; + break; + case TERMIOS_TASK_DRIVEN: + status = rtems_termios_open(major, minor, arg, &IntUartTaskCallbacks); + info->ttyp = args->iop->data1; + break; + } + } + + if (status == RTEMS_SUCCESSFUL) { + /* + * Reset the default baudrate. + */ + struct termios term; + + if (tcgetattr(STDIN_FILENO, &term) >= 0) { + term.c_cflag &= ~(CBAUD | CSIZE); + term.c_cflag |= CS8 | B19200; + tcsetattr(STDIN_FILENO, TCSANOW, &term); + } + } + + return (status); } /*************************************************************************** @@ -699,12 +630,10 @@ rtems_device_driver console_open( Description : This closes the device via termios ***************************************************************************/ -rtems_device_driver console_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg) +rtems_device_driver console_close(rtems_device_major_number major, + rtems_device_minor_number minor, void *arg) { - return(rtems_termios_close (arg)); + return (rtems_termios_close(arg)); } /****************** @@ -713,12 +642,10 @@ rtems_device_driver console_close( Description : Read from the device via termios ***************************************************************************/ -rtems_device_driver console_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg) +rtems_device_driver console_read(rtems_device_major_number major, + rtems_device_minor_number minor, void *arg) { - return(rtems_termios_read (arg)); + return (rtems_termios_read(arg)); } /*************************************************************************** @@ -726,12 +653,10 @@ rtems_device_driver console_read( Description : Write to the device via termios ***************************************************************************/ -rtems_device_driver console_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg) +rtems_device_driver console_write(rtems_device_major_number major, + rtems_device_minor_number minor, void *arg) { - return(rtems_termios_write (arg)); + return (rtems_termios_write(arg)); } /*************************************************************************** @@ -739,30 +664,30 @@ rtems_device_driver console_write( Description : Pass the IOCtl call to termios ***************************************************************************/ -rtems_device_driver console_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg) +rtems_device_driver console_control(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) { - return( rtems_termios_ioctl (arg) ); + return (rtems_termios_ioctl(arg)); } int DEBUG_OUTCHAR(int c) { - if(c == '\n') - DEBUG_OUTCHAR('\r'); - _BSP_null_char(c); - return c; + if (c == '\n') + DEBUG_OUTCHAR('\r'); + _BSP_null_char(c); + return c; } void DEBUG_OUTSTR(const char *msg) { - while (*msg) - DEBUG_OUTCHAR(*msg++); + while (*msg) + DEBUG_OUTCHAR(*msg++); } void DEBUG_OUTNUM(int i) { - int n; - static const char map[] = "0123456789ABCDEF"; - DEBUG_OUTCHAR(' '); - for (n = 28 ; n >= 0 ; n -= 4) - DEBUG_OUTCHAR(map[(i >> n) & 0xF]); + int n; + static const char map[] = "0123456789ABCDEF"; + + DEBUG_OUTCHAR(' '); + for (n = 28; n >= 0; n -= 4) + DEBUG_OUTCHAR(map[(i >> n) & 0xF]); } diff --git a/c/src/lib/libbsp/m68k/mcf52235/gdb-init b/c/src/lib/libbsp/m68k/mcf52235/gdb-init index fc86b13e35..cb94382b4d 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/gdb-init +++ b/c/src/lib/libbsp/m68k/mcf52235/gdb-init @@ -24,10 +24,12 @@ define show-exception-sframe end # Add -v and -d flags for bdm info +# Add -B flags to utilize hardware breakpoints when they are availiable + #target remote | m68k-bdm-gdbserver pipe /dev/bdmcf0 target remote | m68k-bdm-gdbserver pipe /dev/tblcf2 -B - #monitor set remote-debug 1 + monitor bdm-reset # Set VBR to the beginning of what will be SRAM @@ -42,5 +44,5 @@ monitor bdm-ctl-set 0x0C04 0x00000061 # Enable PST[3:0] signals set *((char*) 0x40100074) = 0x0F -# Add the load when debugging from ram, should never happen with rtems +# Add the load when debugging from ram which won't happen with rtems! #load diff --git a/c/src/lib/libbsp/m68k/mcf52235/include/bsp.h b/c/src/lib/libbsp/m68k/mcf52235/include/bsp.h index 307f0f5325..42aa4b3eb5 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/include/bsp.h +++ b/c/src/lib/libbsp/m68k/mcf52235/include/bsp.h @@ -19,16 +19,13 @@ extern "C" { /***************************************************************************/ /** Hardware data structure headers **/ -#include /* internal MCF52235 modules */ +#include + +/* Declare base address of peripherals area */ +#define __IPSBAR ((vuint8 *) 0x40000000) /***************************************************************************/ /** Network driver configuration **/ -#if 0 -struct rtems_bsdnet_ifconfig; -extern int rtems_fec_driver_attach (struct rtems_bsdnet_ifconfig *config, int attaching ); -#define RTEMS_BSP_NETWORK_DRIVER_NAME "fs1" -#define RTEMS_BSP_NETWORK_DRIVER_ATTACH rtems_fec_driver_attach -#endif /***************************************************************************/ /** User Definable configuration **/ @@ -58,7 +55,9 @@ extern int rtems_fec_driver_attach (struct rtems_bsdnet_ifconfig *config, int at /* functions */ uint32_t bsp_get_CPU_clock_speed(void); + void bsp_cleanup(void); + m68k_isr_entry set_vector( rtems_isr_entry handler, rtems_vector_number vector, @@ -69,9 +68,6 @@ m68k_isr_entry set_vector( * Interrupt assignments * Highest-priority listed first */ -#define FEC_IRQ_LEVEL 4 -#define FEC_IRQ_RX_PRIORITY 7 -#define FEC_IRQ_TX_PRIORITY 6 #define PIT3_IRQ_LEVEL 4 #define PIT3_IRQ_PRIORITY 0 diff --git a/c/src/lib/libbsp/m68k/mcf52235/include/coverhd.h b/c/src/lib/libbsp/m68k/mcf52235/include/coverhd.h index a0aaa20535..8dec5878ba 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/include/coverhd.h +++ b/c/src/lib/libbsp/m68k/mcf52235/include/coverhd.h @@ -40,17 +40,17 @@ #define CALLING_OVERHEAD_TASK_MODE 0 #define CALLING_OVERHEAD_TASK_GET_NOTE 0 #define CALLING_OVERHEAD_TASK_SET_NOTE 0 -#define CALLING_OVERHEAD_TASK_WAKE_WHEN 1 +#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0 #define CALLING_OVERHEAD_TASK_WAKE_AFTER 0 #define CALLING_OVERHEAD_INTERRUPT_CATCH 0 -#define CALLING_OVERHEAD_CLOCK_GET 1 -#define CALLING_OVERHEAD_CLOCK_SET 1 +#define CALLING_OVERHEAD_CLOCK_GET 0 +#define CALLING_OVERHEAD_CLOCK_SET 0 #define CALLING_OVERHEAD_CLOCK_TICK 0 #define CALLING_OVERHEAD_TIMER_CREATE 0 #define CALLING_OVERHEAD_TIMER_IDENT 0 #define CALLING_OVERHEAD_TIMER_DELETE 0 -#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 1 +#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0 #define CALLING_OVERHEAD_TIMER_FIRE_WHEN 1 #define CALLING_OVERHEAD_TIMER_RESET 0 #define CALLING_OVERHEAD_TIMER_CANCEL 0 diff --git a/c/src/lib/libbsp/m68k/mcf52235/start/start.S b/c/src/lib/libbsp/m68k/mcf52235/start/start.S index ff4e7dc8c2..386924c0d3 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/start/start.S +++ b/c/src/lib/libbsp/m68k/mcf52235/start/start.S @@ -31,7 +31,7 @@ SYM(_INTERRUPT_VECTOR): .long SYM(_uhoh) /* 02 Access Error */ .long SYM(_uhoh) /* 03 Address Error */ .long SYM(_uhoh) /* 04 Illegal Instruction */ - .long SYM(_uhoh) /* 05 Reserved */ + .long SYM(_uhoh) /* 05 Divide by Zero */ .long SYM(_uhoh) /* 06 Reserved */ .long SYM(_uhoh) /* 07 Reserved */ .long SYM(_uhoh) /* 08 Privilege Violation */ @@ -41,7 +41,7 @@ SYM(_INTERRUPT_VECTOR): .long SYM(_uhoh) /* 12 Debug Interrupt */ .long SYM(_uhoh) /* 13 Reserved */ .long SYM(_uhoh) /* 14 Format Error */ - .long SYM(_uhoh) /* 15 Unitialized Int. */ + .long SYM(_uhoh) /* 15 Reserved */ .long SYM(_uhoh) /* 16 Reserved */ .long SYM(_uhoh) /* 17 Reserved */ .long SYM(_uhoh) /* 18 Reserved */ @@ -51,13 +51,13 @@ SYM(_INTERRUPT_VECTOR): .long SYM(_uhoh) /* 22 Reserved */ .long SYM(_uhoh) /* 23 Reserved */ .long SYM(_spuriousInterrupt) /* 24 Spurious Interrupt */ - .long SYM(_uhoh) /* 25 Autovector Level 1 */ - .long SYM(_uhoh) /* 26 Autovector Level 2 */ - .long SYM(_uhoh) /* 27 Autovector Level 3 */ - .long SYM(_uhoh) /* 28 Autovector Level 4 */ - .long SYM(_uhoh) /* 29 Autovector Level 5 */ - .long SYM(_uhoh) /* 30 Autovector Level 6 */ - .long SYM(_uhoh) /* 31 Autovector Level 7 */ + .long SYM(_uhoh) /* 25 Reserved */ + .long SYM(_uhoh) /* 26 Reserved */ + .long SYM(_uhoh) /* 27 Reserved */ + .long SYM(_uhoh) /* 28 Reserved */ + .long SYM(_uhoh) /* 29 Reserved */ + .long SYM(_uhoh) /* 30 Reserved */ + .long SYM(_uhoh) /* 31 Reserved */ .long SYM(_uhoh) /* 32 TRAP #0 */ .long SYM(_uhoh) /* 33 TRAP #1 */ .long SYM(_uhoh) /* 34 TRAP #2 */ @@ -314,17 +314,6 @@ _cfm_msec: .long 0x00000000 .align 4 PUBLIC (_uhoh) SYM(_uhoh): -/* - link a6,#0 - lea -20(sp), sp - movem.l d0-d2/a0-a1, (sp) - pea.l 20(sp) | push exception frame address - jsr mcf5xxx_exception_handler - movem.l 4(sp), d0-d2/a0-a1 - lea 24(sp), sp - unlk a6 - rte -*/ nop | Leave spot for breakpoint stop #0x2700 | Stop with interrupts disabled bra.w SYM(_uhoh) | Stuck forever diff --git a/c/src/lib/libbsp/m68k/mcf52235/startup/bspclean.c b/c/src/lib/libbsp/m68k/mcf52235/startup/bspclean.c index 7bddc13392..75d0a0c569 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/startup/bspclean.c +++ b/c/src/lib/libbsp/m68k/mcf52235/startup/bspclean.c @@ -22,13 +22,11 @@ #include #include -void bsp_cleanup( void ) +void bsp_cleanup(void) { - printk("\nRTEMS exited!\n"); - for ( ;; ) - { - asm volatile ( " nop " ); - asm volatile ( " nop " ); - } - + printk("\nRTEMS exited!\n"); + for (;;) { + asm volatile (" nop "); + asm volatile (" nop "); + } } diff --git a/c/src/lib/libbsp/m68k/mcf52235/startup/bspstart.c b/c/src/lib/libbsp/m68k/mcf52235/startup/bspstart.c index bb57277dc7..2ce509c7fc 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/startup/bspstart.c +++ b/c/src/lib/libbsp/m68k/mcf52235/startup/bspstart.c @@ -54,11 +54,11 @@ void _CPU_cache_invalidate_1_data_line(const void *addr) {} * * This routine does the bulk of the system initialisation. */ -void bsp_start( void ) +void bsp_start(void) { } uint32_t bsp_get_CPU_clock_speed(void) { - return 60000000; + return 60000000; } diff --git a/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds b/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds index 1f3343f69f..a61e000a59 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds +++ b/c/src/lib/libbsp/m68k/mcf52235/startup/linkcmds @@ -21,7 +21,6 @@ _HeapSize = DEFINED(_HeapSize) ? _HeapSize : 0x0; _StackSize = DEFINED(_StackSize) ? _StackSize : 0x400; _FlashBase = DEFINED(_FlashBase) ? _FlashBase : 0x00000000; -__IPSBAR = DEFINED(__IPSBAR) ? __IPSBAR : 0x40000000; _VBR = 0x20000000; ENTRY(start) @@ -143,21 +142,23 @@ SECTIONS .bss : { - _clear_start = .; + PROVIDE (_clear_start = .); *(.bss*) *(COMMON) . = ALIGN (16); PROVIDE (_end = .); + PROVIDE (_clear_end = .); + } >sram + .stack : + { /* * Starting Stack */ . += _StackSize; . = ALIGN (16); PROVIDE(_StackInit = .); - - _clear_end = .; - _WorkspaceBase = .; + PROVIDE(_WorkspaceBase = .); } >sram /* Stabs debugging sections. */ diff --git a/c/src/lib/libbsp/m68k/mcf52235/timer/timer.c b/c/src/lib/libbsp/m68k/mcf52235/timer/timer.c index fbf075028a..3e3f9befe5 100644 --- a/c/src/lib/libbsp/m68k/mcf52235/timer/timer.c +++ b/c/src/lib/libbsp/m68k/mcf52235/timer/timer.c @@ -16,43 +16,32 @@ #include #include -typedef volatile unsigned char vuint8; -typedef volatile unsigned short vuint16; -typedef volatile unsigned long vuint32; - -/* Declare base address of peripherals area */ -#define __IPSBAR ((vuint8 *) 0x40000000) - -void -Timer_initialize(void) +void Timer_initialize(void) { - uint32_t preScaleDivisor = bsp_get_CPU_clock_speed() / 1000000; - MCF_DTIM3_DTMR = 0; - MCF_DTIM3_DTMR = MCF_DTIM_DTMR_PS(preScaleDivisor - 1) | - MCF_DTIM_DTMR_CLK_DIV1 | - MCF_DTIM_DTMR_RST; + uint32_t preScaleDivisor = bsp_get_CPU_clock_speed() / 1000000; + + MCF_DTIM3_DTMR = 0; + MCF_DTIM3_DTMR = MCF_DTIM_DTMR_PS(preScaleDivisor - 1) | + MCF_DTIM_DTMR_CLK_DIV1 | MCF_DTIM_DTMR_RST; } /* * Return timer value in microsecond units */ -int -Read_timer(void) +int Read_timer(void) { - return MCF_DTIM3_DTCN; + return MCF_DTIM3_DTCN; } /* * Empty function call used in loops to measure basic cost of looping * in Timing Test Suite. */ -rtems_status_code -Empty_function(void) +rtems_status_code Empty_function(void) { - return RTEMS_SUCCESSFUL; + return RTEMS_SUCCESSFUL; } -void -Set_find_average_overhead(rtems_boolean find_flag) +void Set_find_average_overhead(rtems_boolean find_flag) { } -- cgit v1.2.3