forked from Imagelibrary/rtems
termios: Add rtems_termios_set_best_baud()
This commit is contained in:
@@ -65,7 +65,7 @@ TERMIOS_C_FILES = src/cfgetispeed.c src/cfgetospeed.c src/cfsetispeed.c \
|
||||
src/tcsetpgrp.c src/termios.c src/termiosinitialize.c \
|
||||
src/termios_baud2index.c src/termios_baud2num.c src/termios_num2baud.c \
|
||||
src/termios_setinitialbaud.c src/termios_baudtable.c src/cfsetspeed.c \
|
||||
src/cfmakeraw.c
|
||||
src/cfmakeraw.c src/termios_setbestbaud.c
|
||||
|
||||
SYSTEM_CALL_C_FILES = src/open.c src/close.c src/read.c src/write.c \
|
||||
src/write_r.c \
|
||||
|
||||
@@ -78,7 +78,8 @@ typedef struct {
|
||||
* @retval true Successful operation.
|
||||
* @retval false Cannot open device.
|
||||
*
|
||||
* @see rtems_termios_get_device_context() and rtems_termios_get_termios().
|
||||
* @see rtems_termios_get_device_context(), rtems_termios_set_best_baud() and
|
||||
* rtems_termios_get_termios().
|
||||
*/
|
||||
bool (*first_open)(
|
||||
struct rtems_termios_tty *tty,
|
||||
@@ -291,7 +292,7 @@ typedef struct rtems_termios_tty {
|
||||
} rtems_termios_tty;
|
||||
|
||||
/**
|
||||
* @brief Installes a Termios device.
|
||||
* @brief Installs a Termios device.
|
||||
*
|
||||
* @param[in] device_file If not @c NULL, then a device file for the specified
|
||||
* major and minor number will be created.
|
||||
@@ -379,12 +380,26 @@ RTEMS_INLINE_ROUTINE void *rtems_termios_get_device_context(
|
||||
* initial attributes.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE struct termios *rtems_termios_get_termios(
|
||||
const rtems_termios_tty *tty
|
||||
rtems_termios_tty *tty
|
||||
)
|
||||
{
|
||||
return &tty->termios;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets the best baud value in the Termios control.
|
||||
*
|
||||
* The valid Termios baud values are between 0 and 460800. The Termios baud
|
||||
* value is chosen which minimizes the difference to the value specified.
|
||||
*
|
||||
* @param[in] tty The Termios control.
|
||||
* @param[in] baud The current baud setting of the device.
|
||||
*/
|
||||
void rtems_termios_set_best_baud(
|
||||
rtems_termios_tty *tty,
|
||||
uint32_t baud
|
||||
);
|
||||
|
||||
struct rtems_termios_linesw {
|
||||
int (*l_open) (struct rtems_termios_tty *tp);
|
||||
int (*l_close)(struct rtems_termios_tty *tp);
|
||||
|
||||
45
cpukit/libcsupport/src/termios_setbestbaud.c
Normal file
45
cpukit/libcsupport/src/termios_setbestbaud.c
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/termiostypes.h>
|
||||
|
||||
void rtems_termios_set_best_baud(
|
||||
rtems_termios_tty *tty,
|
||||
uint32_t baud
|
||||
)
|
||||
{
|
||||
const rtems_assoc_t *current = &rtems_termios_baud_table[ 0 ];
|
||||
const rtems_assoc_t *last = current;
|
||||
tcflag_t cbaud_mask = CBAUD;
|
||||
tcflag_t cbaud;
|
||||
|
||||
while ( current->name != NULL && current->local_value < baud ) {
|
||||
last = current;
|
||||
++current;
|
||||
}
|
||||
|
||||
if ( current->name != NULL ) {
|
||||
uint32_t mid = (last->local_value + current->local_value) / UINT32_C( 2 );
|
||||
|
||||
cbaud = baud <= mid ? last->remote_value : current->remote_value;
|
||||
} else {
|
||||
cbaud = B460800;
|
||||
}
|
||||
|
||||
tty->termios.c_cflag = (tty->termios.c_cflag & ~cbaud_mask) | cbaud;
|
||||
}
|
||||
Reference in New Issue
Block a user