Message ID | 20221124132906.257732-7-apatel@ventanamicro.com |
---|---|
State | Superseded |
Headers | show |
Series | OpenSBI debug console support | expand |
在 2022-11-24星期四的 18:59 +0530,Anup Patel写道: > We implement console_puts() for semihosting serial driver to speed-up > semihosting based prints. > > Signed-off-by: Anup Patel <apatel@ventanamicro.com> Look good to me Reviewed-by: Xiang W <wxjstz@126.com> > --- > lib/utils/serial/semihosting.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/lib/utils/serial/semihosting.c b/lib/utils/serial/semihosting.c > index 86fa296..773b75e 100644 > --- a/lib/utils/serial/semihosting.c > +++ b/lib/utils/serial/semihosting.c > @@ -15,6 +15,7 @@ > > #define SYSOPEN 0x01 > #define SYSWRITEC 0x03 > +#define SYSWRITE 0x05 > #define SYSREAD 0x06 > #define SYSREADC 0x07 > #define SYSERRNO 0x13 > @@ -93,6 +94,7 @@ static int semihosting_errno(void) > } > > static int semihosting_infd = SBI_ENODEV; > +static int semihosting_outfd = SBI_ENODEV; > > static long semihosting_open(const char *fname, enum semihosting_open_mode mode) > { > @@ -141,6 +143,21 @@ static long semihosting_read(long fd, void *memp, size_t len) > return len - ret; > } > > +static long semihosting_write(long fd, const void *memp, size_t len) > +{ > + long ret; > + struct semihosting_rdwr_s write; > + > + write.fd = fd; > + write.memp = (void *)memp; > + write.len = len; > + > + ret = semihosting_trap(SYSWRITE, &write); > + if (ret < 0) > + return semihosting_errno(); > + return len - ret; > +} > + > /* clang-format on */ > > static void semihosting_putc(char ch) > @@ -148,6 +165,20 @@ static void semihosting_putc(char ch) > semihosting_trap(SYSWRITEC, &ch); > } > > +static void semihosting_puts(const char *str, unsigned long len) > +{ > + char ch; > + unsigned long i; > + > + if (semihosting_outfd < 0) { > + for (i = 0; i < len; i++) { > + ch = str[i]; > + semihosting_trap(SYSWRITEC, &ch); > + } > + } else > + semihosting_write(semihosting_outfd, str, len); > +} > + > static int semihosting_getc(void) > { > char ch = 0; > @@ -165,12 +196,14 @@ static int semihosting_getc(void) > static struct sbi_console_device semihosting_console = { > .name = "semihosting", > .console_putc = semihosting_putc, > + .console_puts = semihosting_puts, > .console_getc = semihosting_getc > }; > > int semihosting_init(void) > { > semihosting_infd = semihosting_open(":tt", MODE_READ); > + semihosting_outfd = semihosting_open(":tt", MODE_WRITE); > > sbi_console_set_device(&semihosting_console); > > -- > 2.34.1 > >
On Thu, Nov 24, 2022 at 9:33 PM Anup Patel <apatel@ventanamicro.com> wrote: > > We implement console_puts() for semihosting serial driver to speed-up > semihosting based prints. > > Signed-off-by: Anup Patel <apatel@ventanamicro.com> > --- > lib/utils/serial/semihosting.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > Reviewed-by: Bin Meng <bmeng@tinylab.org>
diff --git a/lib/utils/serial/semihosting.c b/lib/utils/serial/semihosting.c index 86fa296..773b75e 100644 --- a/lib/utils/serial/semihosting.c +++ b/lib/utils/serial/semihosting.c @@ -15,6 +15,7 @@ #define SYSOPEN 0x01 #define SYSWRITEC 0x03 +#define SYSWRITE 0x05 #define SYSREAD 0x06 #define SYSREADC 0x07 #define SYSERRNO 0x13 @@ -93,6 +94,7 @@ static int semihosting_errno(void) } static int semihosting_infd = SBI_ENODEV; +static int semihosting_outfd = SBI_ENODEV; static long semihosting_open(const char *fname, enum semihosting_open_mode mode) { @@ -141,6 +143,21 @@ static long semihosting_read(long fd, void *memp, size_t len) return len - ret; } +static long semihosting_write(long fd, const void *memp, size_t len) +{ + long ret; + struct semihosting_rdwr_s write; + + write.fd = fd; + write.memp = (void *)memp; + write.len = len; + + ret = semihosting_trap(SYSWRITE, &write); + if (ret < 0) + return semihosting_errno(); + return len - ret; +} + /* clang-format on */ static void semihosting_putc(char ch) @@ -148,6 +165,20 @@ static void semihosting_putc(char ch) semihosting_trap(SYSWRITEC, &ch); } +static void semihosting_puts(const char *str, unsigned long len) +{ + char ch; + unsigned long i; + + if (semihosting_outfd < 0) { + for (i = 0; i < len; i++) { + ch = str[i]; + semihosting_trap(SYSWRITEC, &ch); + } + } else + semihosting_write(semihosting_outfd, str, len); +} + static int semihosting_getc(void) { char ch = 0; @@ -165,12 +196,14 @@ static int semihosting_getc(void) static struct sbi_console_device semihosting_console = { .name = "semihosting", .console_putc = semihosting_putc, + .console_puts = semihosting_puts, .console_getc = semihosting_getc }; int semihosting_init(void) { semihosting_infd = semihosting_open(":tt", MODE_READ); + semihosting_outfd = semihosting_open(":tt", MODE_WRITE); sbi_console_set_device(&semihosting_console);
We implement console_puts() for semihosting serial driver to speed-up semihosting based prints. Signed-off-by: Anup Patel <apatel@ventanamicro.com> --- lib/utils/serial/semihosting.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)