2008-05-22 Joel Sherrill <joel.sherrill@oarcorp.com>

* shared/console/console.c: Remove explicit switch and call
	termios_baud_to_number().
This commit is contained in:
Joel Sherrill
2008-05-22 20:34:27 +00:00
parent 07edbef54e
commit 923dd7aa21
2 changed files with 107 additions and 161 deletions

View File

@@ -1,3 +1,8 @@
2008-05-22 Joel Sherrill <joel.sherrill@oarcorp.com>
* shared/console/console.c: Remove explicit switch and call
termios_baud_to_number().
2008-05-15 Joel Sherrill <joel.sherrill@OARcorp.com> 2008-05-15 Joel Sherrill <joel.sherrill@OARcorp.com>
* shared/startup/pretaskinghook.c: Add capability for bootcard.c BSP * shared/startup/pretaskinghook.c: Add capability for bootcard.c BSP

View File

@@ -35,14 +35,14 @@ extern int close(int fd);
#include <rtems/termiostypes.h> #include <rtems/termiostypes.h>
#include <termios.h> #include <termios.h>
#include <bsp/uart.h> #include <bsp/uart.h>
#include <rtems/bspIo.h> /* printk */ #include <rtems/bspIo.h> /* printk */
/* Definitions for BSPConsolePort */ /* Definitions for BSPConsolePort */
/* /*
* Possible value for console input/output : * Possible value for console input/output :
* BSP_CONSOLE_PORT_CONSOLE * BSP_CONSOLE_PORT_CONSOLE
* BSP_UART_COM1 * BSP_UART_COM1
* BSP_UART_COM2 * BSP_UART_COM2
*/ */
int BSPConsolePort = BSP_CONSOLE_PORT; int BSPConsolePort = BSP_CONSOLE_PORT;
@@ -54,15 +54,15 @@ int BSPBaseBaud = BSP_UART_BAUD_BASE;
* small changes)... * small changes)...
*/ */
#ifndef TERMIOS_OUTPUT_MODE #ifndef TERMIOS_OUTPUT_MODE
#if 1 #if 1
#define TERMIOS_OUTPUT_MODE TERMIOS_IRQ_DRIVEN #define TERMIOS_OUTPUT_MODE TERMIOS_IRQ_DRIVEN
#else #else
#define TERMIOS_OUTPUT_MODE TERMIOS_TASK_DRIVEN #define TERMIOS_OUTPUT_MODE TERMIOS_TASK_DRIVEN
#endif #endif
#endif #endif
#if ! defined(USE_POLLED_IO) && (TERMIOS_OUTPUT_MODE == TERMIOS_POLLED) #if ! defined(USE_POLLED_IO) && (TERMIOS_OUTPUT_MODE == TERMIOS_POLLED)
#define USE_POLLED_IO #define USE_POLLED_IO
#endif #endif
/*-------------------------------------------------------------------------+ /*-------------------------------------------------------------------------+
@@ -72,25 +72,25 @@ int BSPBaseBaud = BSP_UART_BAUD_BASE;
static int conSetAttr(int minor, const struct termios *); static int conSetAttr(int minor, const struct termios *);
typedef struct TtySTblRec_ { typedef struct TtySTblRec_ {
char *name; char *name;
rtems_irq_hdl isr; rtems_irq_hdl isr;
} TtySTblRec, *TtySTbl; } TtySTblRec, *TtySTbl;
static TtySTblRec ttyS[]={ static TtySTblRec ttyS[]={
{ "/dev/ttyS0", { "/dev/ttyS0",
#ifdef BSP_UART_IOBASE_COM1 #ifdef BSP_UART_IOBASE_COM1
BSP_uart_termios_isr_com1 BSP_uart_termios_isr_com1
#else #else
0 0
#endif #endif
}, },
{ "/dev/ttyS1", { "/dev/ttyS1",
#ifdef BSP_UART_IOBASE_COM2 #ifdef BSP_UART_IOBASE_COM2
BSP_uart_termios_isr_com2 BSP_uart_termios_isr_com2
#else #else
0 0
#endif #endif
}, },
}; };
/*-------------------------------------------------------------------------+ /*-------------------------------------------------------------------------+
@@ -98,10 +98,11 @@ static TtySTblRec ttyS[]={
+--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+
| Initilizes the I/O console (keyboard + VGA display) driver. | Initilizes the I/O console (keyboard + VGA display) driver.
+--------------------------------------------------------------------------*/ +--------------------------------------------------------------------------*/
rtems_device_driver rtems_device_driver console_initialize(
console_initialize(rtems_device_major_number major, rtems_device_major_number major,
rtems_device_minor_number minor, rtems_device_minor_number minor,
void *arg) void *arg
)
{ {
rtems_status_code status; rtems_status_code status;
@@ -113,7 +114,7 @@ console_initialize(rtems_device_major_number major,
/* /*
* Set up TERMIOS * Set up TERMIOS
*/ */
rtems_termios_initialize (); rtems_termios_initialize();
/* /*
* Do device-specific initialization * Do device-specific initialization
@@ -124,32 +125,28 @@ console_initialize(rtems_device_major_number major,
*/ */
for (minor=0; minor < sizeof(ttyS)/sizeof(ttyS[0]); minor++) { for (minor=0; minor < sizeof(ttyS)/sizeof(ttyS[0]); minor++) {
char *nm; char *nm;
/* /*
* Skip ports (possibly not supported by BSP...) we have no ISR for * Skip ports (possibly not supported by BSP...) we have no ISR for
*/ */
if ( ! ttyS[minor].isr ) if ( ! ttyS[minor].isr )
continue; continue;
/* /*
* Register the device * Register the device
*/ */
status = rtems_io_register_name ((nm=ttyS[minor].name), major, minor); status = rtems_io_register_name ((nm=ttyS[minor].name), major, minor);
if ( RTEMS_SUCCESSFUL==status && BSPConsolePort == minor) if ( RTEMS_SUCCESSFUL==status && BSPConsolePort == minor) {
{ printk("Registering /dev/console as minor %d (==%s)\n",
printk("Registering /dev/console as minor %d (==%s)\n", minor,
minor, ttyS[minor].name);
ttyS[minor].name); /* also register an alias */
/* also register an alias */ status = rtems_io_register_name ( (nm="/dev/console"), major, minor);
status = rtems_io_register_name ( }
(nm="/dev/console"),
major, if (status != RTEMS_SUCCESSFUL) {
minor); printk("Error registering %s!\n",nm);
} rtems_fatal_error_occurred (status);
if (status != RTEMS_SUCCESSFUL) }
{
printk("Error registering %s!\n",nm);
rtems_fatal_error_occurred (status);
}
} }
return RTEMS_SUCCESSFUL; return RTEMS_SUCCESSFUL;
@@ -159,19 +156,18 @@ static int console_first_open(int major, int minor, void *arg)
{ {
rtems_status_code status; rtems_status_code status;
/* must not open a minor device we have no ISR for */ /* must not open a minor device we have no ISR for */
assert( minor>=0 && minor < sizeof(ttyS)/sizeof(ttyS[0]) && ttyS[minor].isr ); assert( minor>=0 && minor < sizeof(ttyS)/sizeof(ttyS[0]) && ttyS[minor].isr );
/* 9600-8-N-1 */ /* 9600-8-N-1 */
BSP_uart_init(minor, 9600, 0); BSP_uart_init(minor, 9600, 0);
status = BSP_uart_install_isr(minor, ttyS[minor].isr); status = BSP_uart_install_isr(minor, ttyS[minor].isr);
if (!status) if (!status) {
{ printk("Error installing serial console interrupt handler for '%s'!\n",
printk("Error installing serial console interrupt handler for '%s'!\n", ttyS[minor].name);
ttyS[minor].name); rtems_fatal_error_occurred(status);
rtems_fatal_error_occurred(status); }
} return 0;
return 0;
} }
static int console_last_close(int major, int minor, void *arg) static int console_last_close(int major, int minor, void *arg)
@@ -183,10 +179,11 @@ static int console_last_close(int major, int minor, void *arg)
/*-------------------------------------------------------------------------+ /*-------------------------------------------------------------------------+
| Console device driver OPEN entry point | Console device driver OPEN entry point
+--------------------------------------------------------------------------*/ +--------------------------------------------------------------------------*/
rtems_device_driver rtems_device_driver console_open(
console_open(rtems_device_major_number major, rtems_device_major_number major,
rtems_device_minor_number minor, rtems_device_minor_number minor,
void *arg) void *arg
)
{ {
rtems_status_code status; rtems_status_code status;
static rtems_termios_callbacks cb = static rtems_termios_callbacks cb =
@@ -220,17 +217,16 @@ console_open(rtems_device_major_number major,
status = rtems_termios_open (major, minor, arg, &cb); status = rtems_termios_open (major, minor, arg, &cb);
if(status != RTEMS_SUCCESSFUL) if (status != RTEMS_SUCCESSFUL) {
{ printk("Error opening console device\n");
printk("Error opening console device\n"); return status;
return status; }
}
/* /*
* Pass data area info down to driver * Pass data area info down to driver
*/ */
BSP_uart_termios_set(minor, BSP_uart_termios_set(minor,
((rtems_libio_open_close_args_t *)arg)->iop->data1); ((rtems_libio_open_close_args_t *)arg)->iop->data1);
/* Enable interrupts on channel */ /* Enable interrupts on channel */
BSP_uart_intr_ctrl(minor, BSP_UART_INTR_CTRL_TERMIOS); BSP_uart_intr_ctrl(minor, BSP_UART_INTR_CTRL_TERMIOS);
@@ -241,9 +237,11 @@ console_open(rtems_device_major_number major,
| Console device driver CLOSE entry point | Console device driver CLOSE entry point
+--------------------------------------------------------------------------*/ +--------------------------------------------------------------------------*/
rtems_device_driver rtems_device_driver
console_close(rtems_device_major_number major, console_close(
rtems_device_minor_number minor, rtems_device_major_number major,
void *arg) rtems_device_minor_number minor,
void *arg
)
{ {
rtems_device_driver res = RTEMS_SUCCESSFUL; rtems_device_driver res = RTEMS_SUCCESSFUL;
@@ -257,12 +255,12 @@ console_close(rtems_device_major_number major,
+--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+
| Read characters from the I/O console. We only have stdin. | Read characters from the I/O console. We only have stdin.
+--------------------------------------------------------------------------*/ +--------------------------------------------------------------------------*/
rtems_device_driver rtems_device_driver console_read(
console_read(rtems_device_major_number major, rtems_device_major_number major,
rtems_device_minor_number minor, rtems_device_minor_number minor,
void *arg) void *arg
)
{ {
return rtems_termios_read (arg); return rtems_termios_read (arg);
} /* console_read */ } /* console_read */
@@ -271,104 +269,47 @@ console_read(rtems_device_major_number major,
+--------------------------------------------------------------------------+ +--------------------------------------------------------------------------+
| Write characters to the I/O console. Stderr and stdout are the same. | Write characters to the I/O console. Stderr and stdout are the same.
+--------------------------------------------------------------------------*/ +--------------------------------------------------------------------------*/
rtems_device_driver rtems_device_driver console_write(
console_write(rtems_device_major_number major, rtems_device_major_number major,
rtems_device_minor_number minor, rtems_device_minor_number minor,
void * arg) void *arg
)
{ {
return rtems_termios_write (arg); return rtems_termios_write (arg);
} /* console_write */ } /* console_write */
/* /*
* Handle ioctl request. * Handle ioctl request.
*/ */
rtems_device_driver rtems_device_driver console_control(
console_control(rtems_device_major_number major, rtems_device_major_number major,
rtems_device_minor_number minor, rtems_device_minor_number minor,
void *arg void *arg
)
) )
{ {
/* does the BSP support break callbacks ? */ /* does the BSP support break callbacks ? */
#if defined(BIOCSETBREAKCB) && defined(BIOCGETBREAKCB) #if defined(BIOCSETBREAKCB) && defined(BIOCGETBREAKCB)
rtems_libio_ioctl_args_t *ioa=arg; rtems_libio_ioctl_args_t *ioa=arg;
switch (ioa->command) { switch (ioa->command) {
case BIOCSETBREAKCB: case BIOCSETBREAKCB: return BSP_uart_set_break_cb(minor, ioa);
return BSP_uart_set_break_cb(minor, ioa); case BIOCGETBREAKCB: return BSP_uart_get_break_cb(minor, ioa);
case BIOCGETBREAKCB: default: break;
return BSP_uart_get_break_cb(minor, ioa); }
default:
break;
}
#endif #endif
return rtems_termios_ioctl (arg); return rtems_termios_ioctl (arg);
} }
static int static int conSetAttr(
conSetAttr(int minor, const struct termios *t) int minor,
const struct termios *t
)
{ {
int baud; int baud;
switch (t->c_cflag & CBAUD) baud = termios_baud_to_number(t->c_cflag & CBAUD);
{ if ( baud > 115200 )
case B50: rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR);
baud = 50;
break;
case B75:
baud = 75;
break;
case B110:
baud = 110;
break;
case B134:
baud = 134;
break;
case B150:
baud = 150;
break;
case B200:
baud = 200;
break;
case B300:
baud = 300;
break;
case B600:
baud = 600;
break;
case B1200:
baud = 1200;
break;
case B1800:
baud = 1800;
break;
case B2400:
baud = 2400;
break;
case B4800:
baud = 4800;
break;
case B9600:
baud = 9600;
break;
case B19200:
baud = 19200;
break;
case B38400:
baud = 38400;
break;
case B57600:
baud = 57600;
break;
case B115200:
baud = 115200;
break;
default:
baud = 0;
rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR);
return 0;
}
BSP_uart_set_baud(minor, baud); BSP_uart_set_baud(minor, baud);