Hi Sean, On Tue, 22 Mar 2022 at 15:00, Sean Anderson <sean.ander...@seco.com> wrote: > > This adds a serial driver which uses semihosting calls to read and write > to the host's console. For convenience, if CONFIG_DM_SERIAL is enabled, > we will instantiate a serial driver. This allows users to enable this > driver (which has no physical device) without modifying their device > trees or board files. We also implement a non-DM driver for SPL, or for > much faster output in U-Boot proper. > > There are three ways to print to the console: > > Method Baud > ================== ===== > smh_putc in a loop 170 > smh_puts 1600 > smh_write with :tt 20000 > ================== ===== > > These speeds were measured using a 175 character message with a J-Link > adapter. For reference, U-Boot typically prints around 2700 characters > during boot on this board. There are two major factors affecting the > speed of these functions. First, each breakpoint incurs a delay. Second, > each debugger memory transaction incurs a delay. smh_putc has a > breakpoint and memory transaction for every character. smh_puts has one > breakpoint, but still has to use a transaction for every character. This > is because we don't know the length up front, so OpenOCD has to check if > each character is nul. smh_write has only one breakpoint and one memory > transfer. > > DM serial drivers can only implement a putc interface, so we are stuck > with the slowest API. Non-DM drivers can implement puts, which is vastly > more efficient. When the driver starts up, we try to open :tt. Since > this is an extension, this may fail. If it does, we fall back to > smh_puts. We don't check :semihosting-features, since there are > nonconforming implementations (OpenOCD) which don't implement it (but > *do* implement :tt). > > Some semihosting implementations (QEMU) don't handle READC properly. To > work around this, we try to use open/read (much like for stdin) if > possible. > > There is no non-blocking I/O available, so we don't implement pending. > This will cause __serial_tstc to always return true. If > CONFIG_SERIAL_RX_BUFFER is enabled, _serial_tstc will try and read > characters forever. To avoid this, we depend on this config being > disabled. > > Signed-off-by: Sean Anderson <sean.ander...@seco.com> > --- > > (no changes since v2) > > Changes in v2: > - Fix baud numbers being off by 10 > - Fix typos in commit message > - Rename non-DM driver struct to match format of other drivers > > drivers/serial/Kconfig | 22 +++++ > drivers/serial/Makefile | 1 + > drivers/serial/serial.c | 2 + > drivers/serial/serial_semihosting.c | 147 ++++++++++++++++++++++++++++ > include/serial.h | 1 + > 5 files changed, 173 insertions(+) > create mode 100644 drivers/serial/serial_semihosting.c >
Reviewed-by: Simon Glass <s...@chromium.org> But please can we drop the non-DM support?