diff --git a/shared/runtime/semihosting_arm.c b/shared/runtime/semihosting_arm.c index 5cfaaa3c6..d44124faa 100644 --- a/shared/runtime/semihosting_arm.c +++ b/shared/runtime/semihosting_arm.c @@ -34,6 +34,7 @@ #define SYS_OPEN 0x01 #define SYS_WRITEC 0x03 #define SYS_WRITE 0x05 +#define SYS_READ 0x06 #define SYS_READC 0x07 // Constants: @@ -91,6 +92,20 @@ int mp_semihosting_rx_char() { return mp_semihosting_call(SYS_READC, NULL); } +// Returns 0 on success. +int mp_semihosting_rx_chars(char *str, size_t len) { + struct { + uint32_t fd; + const char *str; + uint32_t len; + } args = { + .fd = mp_semihosting_stdout, + .str = str, + .len = len, + }; + return mp_semihosting_call(SYS_READ, &args); +} + static void mp_semihosting_tx_char(char c) { mp_semihosting_call(SYS_WRITEC, &c); } diff --git a/shared/runtime/semihosting_arm.h b/shared/runtime/semihosting_arm.h index 7e90f25ac..1faaae7fe 100644 --- a/shared/runtime/semihosting_arm.h +++ b/shared/runtime/semihosting_arm.h @@ -38,6 +38,8 @@ Then make sure the debugger is attached and enables semihosting. In OpenOCD thi done with ARM semihosting enable followed by reset. The terminal will need further configuration to work with MicroPython (bash: stty raw -echo). +If mp_semihosting_rx_char() doesn't work then try mp_semihosting_rx_chars(str, 1). + */ #include @@ -45,6 +47,7 @@ configuration to work with MicroPython (bash: stty raw -echo). void mp_semihosting_init(); int mp_semihosting_rx_char(); +int mp_semihosting_rx_chars(char *str, size_t len); uint32_t mp_semihosting_tx_strn(const char *str, size_t len); uint32_t mp_semihosting_tx_strn_cooked(const char *str, size_t len);