Attention is currently required from: Thomas Heijligen.
Peter Stuge has uploaded this change for review. ( https://review.coreboot.org/c/flashrom/+/70571 )
Change subject: serial: Add Darwin/macOS support for custom and >230400 baudrates ......................................................................
serial: Add Darwin/macOS support for custom and >230400 baudrates
This change is based on the patch proposed by Denis Ahrens in https://review.coreboot.org/c/flashrom/+/67822
Change-Id: I3e6b88d2b4c2a130b16456752681fd9f807bf6f0 Signed-off-by: Peter Stuge peter@stuge.se --- M Makefile A custom_baud_darwin.c M meson.build M serial.c 4 files changed, 87 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/flashrom refs/changes/71/70571/1
diff --git a/Makefile b/Makefile index 729ff7a..3ae6c8a 100644 --- a/Makefile +++ b/Makefile @@ -803,9 +803,13 @@ 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 0000000..7525ac2 --- /dev/null +++ b/custom_baud_darwin.c @@ -0,0 +1,62 @@ +/* + * 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 set_custom_baudrate(int fd, unsigned int baud, const enum custom_baud_stage stage, void *tio_wanted) { + speed_t speed; + struct termios *wanted = tio_wanted; + + switch (stage) { + case BEFORE_FLAGS: + break; + + case WITH_FLAGS: + if (cfsetspeed(wanted, B19200) == -1) + return -1; + break; + + case AFTER_FLAGS: + speed = baud; + + if (ioctl(fd, IOSSIOSPEED, &speed) == -1) + return -1; + + cfsetispeed(wanted, speed); + cfsetospeed(wanted, speed); + break; + } + + return 0; +} + +int use_custom_baud(unsigned int baud, const struct baudentry *baudtable) +{ + int i; + for (i = 0; baudtable[i].baud; i++) { + if (baudtable[i].baud == baud) + return 0; + + if (baudtable[i].baud > baud) + return 1; + } + return 1; +} diff --git a/meson.build b/meson.build index a93b1f9..8c11e77 100644 --- a/meson.build +++ b/meson.build @@ -108,6 +108,8 @@
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 diff --git a/serial.c b/serial.c index cfc9b1e..4b4ca39 100644 --- a/serial.c +++ b/serial.c @@ -47,6 +47,10 @@ * 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/I... + * * 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).as... @@ -71,6 +75,7 @@ #ifdef B230400 BAUDENTRY(230400) #endif +#if !IS_DARWIN #ifdef B460800 BAUDENTRY(460800) #endif @@ -107,6 +112,7 @@ #ifdef B4000000 BAUDENTRY(4000000) #endif +#endif /* !IS_DARWIN */ {0, 0} /* Terminator */ };