
On Tue, 22 Mar 2022 at 15:00, Sean Anderson sean.anderson@seco.com wrote:
Some serial drivers can be vastly more efficient when printing multiple characters at once. Non-DM serial has had a puts option for these sorts of drivers; implement it for DM serial as well.
Because we have to add carriage returns, we can't just pass the whole string directly to the serial driver. Instead, we print up to the newline, then print a carriage return, and then continue on. This is less efficient, but it is better than printing each character individually. It also avoids having to allocate memory just to add a few characters.
Drivers may perform short writes (such as filling a FIFO) and return the number of characters written in len. We loop over them in the same way that _serial_putc loops over putc.
This results in around sizeof(void *) growth for all boards with DM_SERIAL. The full implementation takes around 140 bytes.
Signed-off-by: Sean Anderson sean.anderson@seco.com
Changes in v3:
- Add a config for puts to reduce the impact on the (vast majority) of boards which don't need it.
- Fix null pointer dereference in _serial_puts caused by a missing return.
- Make puts return the number of characters written on success, instead of reusing the len parameter.
Changes in v2:
- New
drivers/serial/Kconfig | 13 +++++++++++++ drivers/serial/serial-uclass.c | 26 ++++++++++++++++++++++++-- include/serial.h | 18 ++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org