--- rtemsbsd/include/machine/rtems-bsd-termios.h | 68 +++++++++ rtemsbsd/rtems/rtems-bsd-termios.c | 213 +++++++++++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100755 rtemsbsd/include/machine/rtems-bsd-termios.h create mode 100755 rtemsbsd/rtems/rtems-bsd-termios.c
diff --git a/rtemsbsd/include/machine/rtems-bsd-termios.h b/rtemsbsd/include/machine/rtems-bsd-termios.h new file mode 100755 index 0000000..0acb23f --- /dev/null +++ b/rtemsbsd/include/machine/rtems-bsd-termios.h @@ -0,0 +1,68 @@ +/** + * @file + * + * @ingroup rtems_bsd_machine + * + * @brief TODO. + */ + +/* + * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rt...@embedded-brains.de> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _RTEMS_BSD_MACHINE_RTEMS_BSD_TERMIOS_H_ +#define _RTEMS_BSD_MACHINE_RTEMS_BSD_TERMIOS_H_ + +#include <sys/cdefs.h> +#include <sys/_termios.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdarg.h> + +__BEGIN_DECLS + +u_long +rtems_bsd_ioctl_cmd_to_bsd(struct termios *t, u_long cmd, caddr_t data, int* flush_flags); + +speed_t +rtems_bsd_rtems_speed_to_bsd_speed(speed_t spd); + +speed_t +rtems_bsd_bsd_speed_to_rtems_speed(speed_t spd); + +speed_t +rtems_bsd_get_input_speed(struct termios *t); + +speed_t +rtems_bsd_get_output_speed(struct termios *t); + +__END_DECLS + +#endif /* _RTEMS_BSD_MACHINE_RTEMS_BSD_TERMIOS_H_ */ diff --git a/rtemsbsd/rtems/rtems-bsd-termios.c b/rtemsbsd/rtems/rtems-bsd-termios.c new file mode 100755 index 0000000..cd86581 --- /dev/null +++ b/rtemsbsd/rtems/rtems-bsd-termios.c @@ -0,0 +1,213 @@ +/** + * @file + * + * @ingroup rtems_bsd_rtems + * + * @brief TODO. + */ + +/* + * Copyright (c) 2009, 2010 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * <rt...@embedded-brains.de> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <machine/rtems-bsd-kernel-space.h> + +#include <sys/types.h> +#include <sys/fcntl.h> +#include <sys/tty.h> +#include <sys/ttycom.h> +#define TTYDEFCHARS +#include <sys/ttydefaults.h> +#undef TTYDEFCHARS +#include <sys/ioccom.h> + +typedef struct +{ + speed_t rtems_speed; + speed_t bsd_speed; +}rtems_bsd_termios_speed_entry; + +static rtems_bsd_termios_speed_entry rtems_bsd_speed_table[] = { + { B0, 0 }, + { B50, 50 }, + { B75, 75 }, + { B110, 110 }, + { B134, 134 }, + { B150, 150 }, + { B200, 200 }, + { B300, 300 }, + { B600, 600 }, + { B1200, 1200 }, + { B1800, 1800 }, + { B2400, 2400 }, + { B4800, 4800 }, + { B9600, 9600 }, + { B19200, 19200 }, + { B38400, 38400 }, + { B57600, 57600 }, + { B115200, 115200 }, + { B230400, 230400 }, + { B460800, 460800 }, +}; +#define rtems_bsd_speed_table_size (( int )( sizeof( rtems_bsd_speed_table ) / sizeof( rtems_bsd_speed_table[0] ))) + +/* + ********************************************************************* + * RTEMS ioctl cmd translation for BSD * + ********************************************************************* + */ +u_long +rtems_bsd_ioctl_cmd_to_bsd(struct termios *t, u_long cmd, caddr_t data, int* flush_flags) +{ + uint32_t c_ispeed; + uint32_t c_ospeed; + + switch (cmd) { + + case RTEMS_IO_GET_ATTRIBUTES: + cmd = TIOCGETA; + break; + + case RTEMS_IO_SET_ATTRIBUTES: + cmd = TIOCSETA; + c_ispeed = cfgetispeed(t); + c_ospeed = cfgetospeed(t); + if (c_ispeed && (c_ispeed != c_ospeed)) { + cfsetospeed(t, c_ispeed); + } + break; + + case RTEMS_IO_TCDRAIN: + cmd = TIOCSETAW; + break; + + case RTEMS_IO_RCVWAKEUP: + break; + + case RTEMS_IO_SNDWAKEUP: + break; + + case RTEMS_IO_TCFLUSH: + cmd = TIOCFLUSH; + switch ((intptr_t)data) { + case TCIFLUSH: + *flush_flags = FREAD; + break; + case TCOFLUSH: + *flush_flags = FWRITE; + break; + case TCIOFLUSH: + *flush_flags = FREAD | FWRITE; + break; + default: + *flush_flags = 0; + } + break; + } + return (cmd); +} + +/* + ********************************************************************* + * RTEMS speed translation for BSD speed * + ********************************************************************* + */ +speed_t +rtems_bsd_rtems_speed_to_bsd_speed(speed_t spd) +{ + rtems_bsd_termios_speed_entry* entry = &rtems_bsd_speed_table[0]; + rtems_bsd_termios_speed_entry* entry_end = &rtems_bsd_speed_table[rtems_bsd_speed_table_size]; + + while( entry != entry_end ) { + if(entry->rtems_speed == spd) { + return entry->bsd_speed; + } + entry++; + } + return 0; +} + +/* + ********************************************************************* + * BSD speed translation for RTEMS speed * + ********************************************************************* + */ +speed_t +rtems_bsd_bsd_speed_to_rtems_speed(speed_t spd) +{ + rtems_bsd_termios_speed_entry* entry = &rtems_bsd_speed_table[0]; + rtems_bsd_termios_speed_entry* entry_end = &rtems_bsd_speed_table[rtems_bsd_speed_table_size]; + + while( entry != entry_end ) { + if(entry->bsd_speed == spd) { + return entry->rtems_speed; + } + entry++; + } + return 0; +} + +/* + ********************************************************************* + * RTEMS get input baud rate from termios * + ********************************************************************* + */ +speed_t +rtems_bsd_get_input_speed(struct termios *t) +{ + return rtems_bsd_rtems_speed_to_bsd_speed(cfgetispeed(t)); +} + +/* + ********************************************************************* + * RTEMS get output baud rate from termios * + ********************************************************************* + */ +speed_t +rtems_bsd_get_output_speed(struct termios *t) +{ + return rtems_bsd_rtems_speed_to_bsd_speed(cfgetospeed(t)); +} + +/* + * Obtain a termios structure which is similar to the one provided by + * the kernel. + */ +void +cfmakesane(struct termios *t) +{ + t->c_cflag = TTYDEF_CFLAG; + t->c_iflag = TTYDEF_IFLAG; + t->c_lflag = TTYDEF_LFLAG; + t->c_oflag = TTYDEF_OFLAG; + cfsetispeed(t, TTYDEF_SPEED); + cfsetospeed(t, TTYDEF_SPEED); + memcpy(&t->c_cc, ttydefchars, sizeof ttydefchars); +} -- 1.9.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel