Implement nonstandard baudrate handling on MacOS
Alas, MacOS doesn't handle nonstandard baud rates like other systems in regular tcsetattr() calls. Instead, they invented a new ioctl (IOSSIOSPEED). So, if we notice we are going to configure a nonstandard rate on MacOS, issue that ioctl after configuring everything else using tcsetattr().
This commit is contained in:
parent
34168759b0
commit
87b39637ff
2
build.sh
2
build.sh
|
@ -59,7 +59,7 @@ case "${ostype}" in
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
cmake ${build_flags} ${extra_enable} -D CMAKE_BUILD_TYPE=${build_type} -B build_${ostype} ||\
|
cmake ${build_flags} ${extra_enable} -D CMAKE_VERBOSE_MAKEFILE:BOOL=ON -D CMAKE_BUILD_TYPE=${build_type} -B build_${ostype} ||\
|
||||||
{ echo "CMake failed."; exit 1; }
|
{ echo "CMake failed."; exit 1; }
|
||||||
cmake --build build_${ostype} ||\
|
cmake --build build_${ostype} ||\
|
||||||
{ echo "Build failed."; exit 1; }
|
{ echo "Build failed."; exit 1; }
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "ac_cfg.h"
|
#include "ac_cfg.h"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -42,6 +43,10 @@
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
# include <IOKit/serial/ioss.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "avrdude.h"
|
#include "avrdude.h"
|
||||||
#include "libavrdude.h"
|
#include "libavrdude.h"
|
||||||
|
|
||||||
|
@ -78,10 +83,12 @@ static struct baud_mapping baud_lookup_table [] = {
|
||||||
static struct termios original_termios;
|
static struct termios original_termios;
|
||||||
static int saved_original_termios;
|
static int saved_original_termios;
|
||||||
|
|
||||||
static speed_t serial_baud_lookup(long baud)
|
static speed_t serial_baud_lookup(long baud, bool *nonstandard)
|
||||||
{
|
{
|
||||||
struct baud_mapping *map = baud_lookup_table;
|
struct baud_mapping *map = baud_lookup_table;
|
||||||
|
|
||||||
|
*nonstandard = false;
|
||||||
|
|
||||||
while (map->baud) {
|
while (map->baud) {
|
||||||
if (map->baud == baud)
|
if (map->baud == baud)
|
||||||
return map->speed;
|
return map->speed;
|
||||||
|
@ -95,6 +102,8 @@ static speed_t serial_baud_lookup(long baud)
|
||||||
avrdude_message(MSG_NOTICE, "%s: serial_baud_lookup(): Using non-standard baud rate: %ld",
|
avrdude_message(MSG_NOTICE, "%s: serial_baud_lookup(): Using non-standard baud rate: %ld",
|
||||||
progname, baud);
|
progname, baud);
|
||||||
|
|
||||||
|
*nonstandard = true;
|
||||||
|
|
||||||
return baud;
|
return baud;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,7 +111,8 @@ static int ser_setparams(union filedescriptor *fd, long baud, unsigned long cfla
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
struct termios termios;
|
struct termios termios;
|
||||||
speed_t speed = serial_baud_lookup (baud);
|
bool nonstandard;
|
||||||
|
speed_t speed = serial_baud_lookup (baud, &nonstandard);
|
||||||
|
|
||||||
if (!isatty(fd->ifd))
|
if (!isatty(fd->ifd))
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
|
@ -146,8 +156,16 @@ static int ser_setparams(union filedescriptor *fd, long baud, unsigned long cfla
|
||||||
termios.c_iflag &= ~PARMRK;
|
termios.c_iflag &= ~PARMRK;
|
||||||
#endif /* PARMRK */
|
#endif /* PARMRK */
|
||||||
|
|
||||||
|
// MacOS doesn't handle nonstandard baudrate values in
|
||||||
|
// normal tcsetattr(), sigh.
|
||||||
|
#ifdef __APPLE__
|
||||||
|
if (!nonstandard) {
|
||||||
|
#endif
|
||||||
cfsetospeed(&termios, speed);
|
cfsetospeed(&termios, speed);
|
||||||
cfsetispeed(&termios, speed);
|
cfsetispeed(&termios, speed);
|
||||||
|
#ifdef __APPLE__
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
termios.c_cflag &= ~CSIZE;
|
termios.c_cflag &= ~CSIZE;
|
||||||
if (cflags & SERIAL_CS8) {
|
if (cflags & SERIAL_CS8) {
|
||||||
|
@ -204,6 +222,17 @@ static int ser_setparams(union filedescriptor *fd, long baud, unsigned long cfla
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
// handle nonstandard speed values the MacOS way
|
||||||
|
if (nonstandard) {
|
||||||
|
if (ioctl(fd->ifd, IOSSIOSPEED, &speed) < 0) {
|
||||||
|
avrdude_message(MSG_INFO, "%s: ser_setparams(): ioctrl(IOSSIOSPEED) failed\n",
|
||||||
|
progname);
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // __APPLE__
|
||||||
|
|
||||||
tcflush(fd->ifd, TCIFLUSH);
|
tcflush(fd->ifd, TCIFLUSH);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -564,3 +593,4 @@ struct serial_device serial_serdev =
|
||||||
struct serial_device *serdev = &serial_serdev;
|
struct serial_device *serdev = &serial_serdev;
|
||||||
|
|
||||||
#endif /* WIN32 */
|
#endif /* WIN32 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue