From 3eb784b758033f0f3d28fa8a9fa95941b1cdff6b Mon Sep 17 00:00:00 2001 From: sheinz Date: Sun, 23 Oct 2016 14:04:34 +0300 Subject: [PATCH] Fix spiff and stdin_uart_interrupt overiding the same read function --- core/newlib_syscalls.c | 16 ++++++++++------ extras/spiffs/esp_spiffs.c | 13 ++++--------- .../stdin_uart_interrupt/stdin_uart_interrupt.c | 4 ++-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/core/newlib_syscalls.c b/core/newlib_syscalls.c index 577ecda..f526bea 100644 --- a/core/newlib_syscalls.c +++ b/core/newlib_syscalls.c @@ -59,14 +59,9 @@ __attribute__((weak)) long _write_r(struct _reent *r, int fd, const char *ptr, i } /* syscall implementation for stdio read from UART */ -__attribute__((weak)) long _read_r( struct _reent *r, int fd, char *ptr, int len ) +__attribute__((weak)) long _read_stdin_r(struct _reent *r, int fd, char *ptr, int len) { int ch, i; - - if(fd != r->_stdin->_file) { - r->_errno = EBADF; - return -1; - } uart_rxfifo_wait(0, 1); for(i = 0; i < len; i++) { ch = uart_getc_nowait(0); @@ -76,6 +71,15 @@ __attribute__((weak)) long _read_r( struct _reent *r, int fd, char *ptr, int len return i; } +__attribute__((weak)) long _read_r( struct _reent *r, int fd, char *ptr, int len ) +{ + if(fd != r->_stdin->_file) { + r->_errno = EBADF; + return -1; + } + return _read_stdin_r(r, fd, ptr, len); +} + /* Stub syscall implementations follow, to allow compiling newlib functions that pull these in via various codepaths */ diff --git a/extras/spiffs/esp_spiffs.c b/extras/spiffs/esp_spiffs.c index c052c2f..96ec743 100644 --- a/extras/spiffs/esp_spiffs.c +++ b/extras/spiffs/esp_spiffs.c @@ -141,21 +141,16 @@ long _write_r(struct _reent *r, int fd, const char *ptr, int len ) return len; } +// This function is weakly defined in core/newlib_syscalls.c +long _read_stdin_r(struct _reent *r, int fd, char *ptr, int len); + // This implementation replaces implementation in core/newlib_syscals.c long _read_r( struct _reent *r, int fd, char *ptr, int len ) { - int ch, i; - if(fd != r->_stdin->_file) { return SPIFFS_read(&fs, (spiffs_file)fd, ptr, len); } - uart_rxfifo_wait(0, 1); - for(i = 0; i < len; i++) { - ch = uart_getc_nowait(0); - if (ch < 0) break; - ptr[i] = ch; - } - return i; + return _read_stdin_r(r, fd, ptr, len); } int _open_r(struct _reent *r, const char *pathname, int flags, int mode) diff --git a/extras/stdin_uart_interrupt/stdin_uart_interrupt.c b/extras/stdin_uart_interrupt/stdin_uart_interrupt.c index e85c913..c836651 100644 --- a/extras/stdin_uart_interrupt/stdin_uart_interrupt.c +++ b/extras/stdin_uart_interrupt/stdin_uart_interrupt.c @@ -75,9 +75,9 @@ uint32_t uart0_num_char(void) return count; } -// _read_r in core/newlib_syscalls.c will be skipped by the linker in favour +// _read_stdin_r in core/newlib_syscalls.c will be skipped by the linker in favour // of this function -long _read_r(struct _reent *r, int fd, char *ptr, int len) +long _read_stdin_r(struct _reent *r, int fd, char *ptr, int len) { if (!inited) uart0_rx_init(); for(int i = 0; i < len; i++) {