[PATCH v3 16/29] serial: Add semihosting driver

Tom Rini trini at konsulko.com
Sun Apr 3 02:16:14 CEST 2022


On Tue, Mar 22, 2022 at 04:59:24PM -0400, Sean Anderson 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.anderson at seco.com>
> Reviewed-by: Simon Glass <sjg at chromium.org>

Applied to u-boot/next, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20220402/852a5bef/attachment.sig>


More information about the U-Boot mailing list