diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | custom_baud_darwin.c | 61 | ||||
-rw-r--r-- | meson.build | 2 | ||||
-rw-r--r-- | serial.c | 4 |
4 files changed, 71 insertions, 0 deletions
@@ -844,9 +844,13 @@ LIB_OBJS += serial.o ifeq ($(TARGET_OS), Linux) LIB_OBJS += custom_baud_linux.o else +ifeq ($(TARGET_OS), Darwin) +LIB_OBJS += custom_baud_darwin.o +else LIB_OBJS += custom_baud.o endif endif +endif USE_SOCKETS := $(if $(call filter_deps,$(DEPENDS_ON_SOCKETS)),yes,no) ifeq ($(USE_SOCKETS), yes) diff --git a/custom_baud_darwin.c b/custom_baud_darwin.c new file mode 100644 index 00000000..e8764ddf --- /dev/null +++ b/custom_baud_darwin.c @@ -0,0 +1,61 @@ +/* + * This file is part of the flashrom project. + * + * Copyright (C) 2022 Peter Stuge <peter@stuge.se> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <termios.h> +#include <sys/ioctl.h> +#include <IOKit/serial/ioss.h> +#include <errno.h> + +#include "custom_baud.h" + +int use_custom_baud(unsigned int baud, const struct baudentry *baudtable) +{ + int i; + + if (baud > 230400) + return 1; + + for (i = 0; baudtable[i].baud; i++) { + if (baudtable[i].baud == baud) + return 0; + + if (baudtable[i].baud > baud) + return 1; + } + + return 1; +} + +int set_custom_baudrate(int fd, unsigned int baud, const enum custom_baud_stage stage, void *tio_wanted) +{ + struct termios *wanted; + speed_t speed; + + switch (stage) { + case BEFORE_FLAGS: + break; + + case WITH_FLAGS: + wanted = tio_wanted; + return cfsetspeed(wanted, B19200); + + case AFTER_FLAGS: + speed = baud; + return ioctl(fd, IOSSIOSPEED, &speed); + } + + return 0; +} diff --git a/meson.build b/meson.build index 92c5590a..2f11c3fa 100644 --- a/meson.build +++ b/meson.build @@ -103,6 +103,8 @@ endif if host_machine.system() == 'linux' custom_baud_c = 'custom_baud_linux.c' +elif host_machine.system() == 'darwin' + custom_baud_c = 'custom_baud_darwin.c' else custom_baud_c = 'custom_baud.c' endif @@ -47,6 +47,10 @@ fdtype sp_fd = SER_INV_FD; * On Linux there is a non-standard way to use arbitrary baud rates that we use if there is no * matching standard rate, see custom_baud.c * + * On Darwin there is also a non-standard ioctl() to set arbitrary baud rates + * and any above 230400, see custom_baud_darwin.c and + * https://opensource.apple.com/source/IOSerialFamily/IOSerialFamily-91/tests/IOSerialTestLib.c.auto.html + * * On Windows there exist similar macros (starting with CBR_ instead of B) but they are only defined for * backwards compatibility and the API supports arbitrary baud rates in the same manner as the macros, see * http://msdn.microsoft.com/en-us/library/windows/desktop/aa363214(v=vs.85).aspx |