From efb235ae4e5ef66041ea294c50be8f6d1276e3e3 Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Sun, 27 Dec 2020 09:18:58 +0100 Subject: [PATCH] Fixed issues with _read_r in MK22FN512xx libc integration code --- .../mcu/MK22FN512xxx12/boot/libc_integration.c | 17 +++++++++++++---- platform/mcu/MK22FN512xxx12/drivers/usb_vcom.c | 4 ++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/platform/mcu/MK22FN512xxx12/boot/libc_integration.c b/platform/mcu/MK22FN512xxx12/boot/libc_integration.c index c79b5751..ebc2e8a9 100644 --- a/platform/mcu/MK22FN512xxx12/boot/libc_integration.c +++ b/platform/mcu/MK22FN512xxx12/boot/libc_integration.c @@ -213,19 +213,28 @@ int _write_r(struct _reent *ptr, int fd, const void *buf, size_t cnt) */ int _read_r(struct _reent *ptr, int fd, void *buf, size_t cnt) { + int ret = -1; + if(fd == STDIN_FILENO) { for(;;) { ssize_t r = vcom_readBlock(buf, cnt); - if((r < 0) || (r == (ssize_t)(cnt))) return r; + if((r < 0) || (r == ((ssize_t) cnt))) + { + ret = ((int) r); + break; + } } } else + { + /* If fd is not stdin */ + ptr->_errno = EBADF; + ret = -1; + } - /* If fd is not stdin */ - ptr->_errno = EBADF; - return -1; + return ret; } int _read(int fd, void *buf, size_t cnt) diff --git a/platform/mcu/MK22FN512xxx12/drivers/usb_vcom.c b/platform/mcu/MK22FN512xxx12/drivers/usb_vcom.c index 6b0c0ac6..16276eb0 100644 --- a/platform/mcu/MK22FN512xxx12/drivers/usb_vcom.c +++ b/platform/mcu/MK22FN512xxx12/drivers/usb_vcom.c @@ -649,12 +649,12 @@ ssize_t vcom_writeBlock(const void *buf, size_t len) ssize_t vcom_readBlock(void* buf, size_t len) { - if((cdcVcom.attach == 1) && (cdcVcom.startTransactions == 1)) + if(recvSize != 0) { size_t toTransfer = (len < recvSize) ? len : recvSize; memcpy(buf, recvBuf, toTransfer); recvSize = 0; - return toTransfer; + return ((ssize_t) toTransfer); } return 0;