From cfbc3e9278ea787291600c8074f015ac874731ed Mon Sep 17 00:00:00 2001 From: yellows8 Date: Fri, 19 Oct 2018 12:34:17 -0400 Subject: [PATCH] Added usbCommsSetErrorHandling, don't throw fatalSimple for usbComms by default. --- nx/include/switch/runtime/devices/usb_comms.h | 3 +++ nx/source/runtime/devices/usb_comms.c | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/nx/include/switch/runtime/devices/usb_comms.h b/nx/include/switch/runtime/devices/usb_comms.h index b06af541..9da622d3 100644 --- a/nx/include/switch/runtime/devices/usb_comms.h +++ b/nx/include/switch/runtime/devices/usb_comms.h @@ -23,6 +23,9 @@ Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *inf /// Exits usbComms. void usbCommsExit(void); +/// Sets whether to throw a fatal error in usbComms{Read/Write}* on failure, or just return the transferred size. By default (false) the latter is used. +void usbCommsSetErrorHandling(bool flag); + /// Read data with the default interface. size_t usbCommsRead(void* buffer, size_t size); diff --git a/nx/source/runtime/devices/usb_comms.c b/nx/source/runtime/devices/usb_comms.c index 802e2cae..9774afe9 100644 --- a/nx/source/runtime/devices/usb_comms.c +++ b/nx/source/runtime/devices/usb_comms.c @@ -24,6 +24,8 @@ static bool g_usbCommsInitialized = false; static usbCommsInterface g_usbCommsInterfaces[TOTAL_INTERFACES]; +static bool g_usbCommsErrorHandling = 0; + static RwLock g_usbCommsLock; static Result _usbCommsInterfaceInit1x(u32 intf_ind, const UsbCommsInterfaceInfo *info); @@ -143,7 +145,10 @@ Result usbCommsInitializeEx(u32 num_interfaces, const UsbCommsInterfaceInfo *inf } } - if (R_SUCCEEDED(rc)) g_usbCommsInitialized = true; + if (R_SUCCEEDED(rc)) { + g_usbCommsInitialized = true; + g_usbCommsErrorHandling = false; + } rwlockWriteUnlock(&g_usbCommsLock); return rc; @@ -386,6 +391,10 @@ static Result _usbCommsInterfaceInit1x(u32 intf_ind, const UsbCommsInterfaceInfo return rc; } +void usbCommsSetErrorHandling(bool flag) { + g_usbCommsErrorHandling = flag; +} + static Result _usbCommsRead(usbCommsInterface *interface, void* buffer, size_t size, size_t *transferredSize) { Result rc=0; @@ -542,7 +551,7 @@ size_t usbCommsReadEx(void* buffer, size_t size, u32 interface) rwlockWriteUnlock(&inter->lock_out); } } - if (R_FAILED(rc)) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsRead)); + if (R_FAILED(rc) && g_usbCommsErrorHandling) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsRead)); } return transferredSize; } @@ -579,7 +588,7 @@ size_t usbCommsWriteEx(const void* buffer, size_t size, u32 interface) rwlockWriteUnlock(&inter->lock_in); } } - if (R_FAILED(rc)) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsWrite)); + if (R_FAILED(rc) && g_usbCommsErrorHandling) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_BadUsbCommsWrite)); } return transferredSize; }