tools: kwboot: Check whether baudrate was set to requested value
The tcsetattr() function can return 0 even if baudrate was not changed. Check whether baudrate was changed to requested value, and in case of arbitrary baudrate, check whether the set value is within 3% tolerance. Signed-off-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Stefan Roese <sr@denx.de>
This commit is contained in:

committed by
Stefan Roese

parent
93b55636b0
commit
99a3d02370
@@ -567,6 +567,13 @@ kwboot_tty_baudrate_to_speed(int baudrate)
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
_is_within_tolerance(int value, int reference, int tolerance)
|
||||
{
|
||||
return 100 * value >= reference * (100 - tolerance) &&
|
||||
100 * value <= reference * (100 + tolerance);
|
||||
}
|
||||
|
||||
static int
|
||||
kwboot_tty_change_baudrate(int fd, int baudrate)
|
||||
{
|
||||
@@ -601,7 +608,32 @@ kwboot_tty_change_baudrate(int fd, int baudrate)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = tcgetattr(fd, &tio);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (cfgetospeed(&tio) != speed || cfgetispeed(&tio) != speed)
|
||||
goto baud_fail;
|
||||
|
||||
#ifdef BOTHER
|
||||
/*
|
||||
* Check whether set baudrate is within 3% tolerance.
|
||||
* If BOTHER is defined, Linux always fills out c_ospeed / c_ispeed
|
||||
* with real values.
|
||||
*/
|
||||
if (!_is_within_tolerance(tio.c_ospeed, baudrate, 3))
|
||||
goto baud_fail;
|
||||
|
||||
if (!_is_within_tolerance(tio.c_ispeed, baudrate, 3))
|
||||
goto baud_fail;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
baud_fail:
|
||||
fprintf(stderr, "Could not set baudrate to requested value\n");
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
|
Reference in New Issue
Block a user