On Mon, Mar 28, 2022 at 11:36:46AM -0400, Sean Anderson wrote: > > > On 3/28/22 2:35 AM, Simon Glass wrote: > > 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? > > Unfortunately, Layerscape does not support DM serial. I tried converting > it, but I ran into some unusual aborts. At the moment, I don't have time > to debug things further. And I thought that non-DM serial was ok for > SPL?
It is OK for SPL, and it needs migration for non-SPL. Can you make another thread with your conversion-that-fails for layerscape please? -- Tom
signature.asc
Description: PGP signature