1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2022 Sean Anderson <sean.anderson@seco.com>
9 #include <semihosting.h>
12 * struct smh_serial_priv - Semihosting serial private data
13 * @infd: stdin file descriptor (or error)
15 struct smh_serial_priv {
20 #if CONFIG_IS_ENABLED(DM_SERIAL)
21 static int smh_serial_getc(struct udevice *dev)
24 struct smh_serial_priv *priv = dev_get_priv(dev);
29 smh_read(priv->infd, &ch, sizeof(ch));
33 static int smh_serial_putc(struct udevice *dev, const char ch)
39 static const struct dm_serial_ops smh_serial_ops = {
40 .putc = smh_serial_putc,
41 .getc = smh_serial_getc,
44 static int smh_serial_bind(struct udevice *dev)
46 if (semihosting_enabled())
51 static int smh_serial_probe(struct udevice *dev)
53 struct smh_serial_priv *priv = dev_get_priv(dev);
55 priv->infd = smh_open(":tt", MODE_READ);
59 U_BOOT_DRIVER(smh_serial) = {
60 .name = "serial_semihosting",
62 .bind = smh_serial_bind,
63 .probe = smh_serial_probe,
64 .priv_auto = sizeof(struct smh_serial_priv),
65 .ops = &smh_serial_ops,
66 .flags = DM_FLAG_PRE_RELOC,
69 U_BOOT_DRVINFO(smh_serial) = {
70 .name = "serial_semihosting",
73 static int infd = -ENODEV;
74 static int outfd = -ENODEV;
76 static int smh_serial_start(void)
78 infd = smh_open(":tt", MODE_READ);
79 outfd = smh_open(":tt", MODE_WRITE);
83 static int smh_serial_stop(void)
90 static void smh_serial_setbrg(void)
94 static int smh_serial_getc(void)
101 smh_read(infd, &ch, sizeof(ch));
105 static int smh_serial_tstc(void)
110 static void smh_serial_puts(const char *s)
117 smh_write(outfd, s, strlen(s), &unused);
120 struct serial_device serial_smh_device = {
121 .name = "serial_smh",
122 .start = smh_serial_start,
123 .stop = smh_serial_stop,
124 .setbrg = smh_serial_setbrg,
125 .getc = smh_serial_getc,
126 .tstc = smh_serial_tstc,
128 .puts = smh_serial_puts,
131 void smh_serial_initialize(void)
133 if (semihosting_enabled())
134 serial_register(&serial_smh_device);
137 __weak struct serial_device *default_serial_console(void)
139 return &serial_smh_device;
143 #ifdef CONFIG_DEBUG_UART_SEMIHOSTING
144 #include <debug_uart.h>
146 static inline void _debug_uart_init(void)
150 static inline void _debug_uart_putc(int c)