diff --git a/source/main.c b/source/main.c index 13dbe46..552daf9 100644 --- a/source/main.c +++ b/source/main.c @@ -366,7 +366,7 @@ int main(int argc, char *argv[]) consolePrint("lrOpenLocationResolver succeeded\n"); - rc = lrLrResolveProgramPath(&resolver, (u64)0x01006F8002326000, path); // ACNH 0x01006F8002326000 | Smash 0x01006A800016E000 | Dark Souls 0x01004AB00A260000 + rc = lrLrResolveProgramPath(&resolver, (u64)0x01007EF00011E000, path); // ACNH 0x01006F8002326000 | Smash 0x01006A800016E000 | Dark Souls 0x01004AB00A260000 | BotW 0x01007EF00011E000 if (R_FAILED(rc)) { consolePrint("lrLrResolveProgramPath failed\n"); @@ -494,9 +494,9 @@ int main(int argc, char *argv[]) consolePrint("\nwaiting for threads to join\n"); thrd_join(read_thread, NULL); + consolePrint("read_thread done: %lu\n", time(NULL)); thrd_join(write_thread, NULL); - - usbEndSession(); + consolePrint("write_thread done: %lu\n", time(NULL)); if (shared_data.read_error || shared_data.write_error) { @@ -510,6 +510,10 @@ int main(int argc, char *argv[]) goto out2; } + consolePrint("ending usb session... "); + usbEndSession(); + consolePrint("done\n"); + consolePrint("process completed in %lu seconds\n", start); diff --git a/source/usb.c b/source/usb.c index 60fa73b..2875eb6 100644 --- a/source/usb.c +++ b/source/usb.c @@ -31,6 +31,7 @@ #define USB_SESSION_START_TIMEOUT 10 /* 10 seconds */ #define USB_TRANSFER_ALIGNMENT 0x1000 /* 4 KiB */ +#define USB_TRANSFER_TIMEOUT 5 /* 5 seconds */ /* Type definitions. */ @@ -169,6 +170,10 @@ void usbExit(void) /* Free USB transfer buffer */ usbFreeTransferBuffer(); + /* Reset global variables */ + g_usbTransferRemainingSize = 0; + g_usbSessionStarted = false; + rwlockWriteUnlock(&g_usbDeviceLock); } @@ -195,7 +200,7 @@ bool usbStartSession(void) { /* Once the console has been connected to a host device, there's no need to keep running this loop */ /* usbTransferData() implements its own timeout */ - ret = g_usbSessionStarted = _usbStartSession(); + ret = _usbStartSession(); break; } @@ -204,6 +209,8 @@ bool usbStartSession(void) now = time(NULL); } + if (ret) g_usbSessionStarted = true; + exit: rwlockWriteUnlock(&(g_usbDeviceInterface.lock)); rwlockWriteUnlock(&g_usbDeviceLock); @@ -460,8 +467,6 @@ NX_INLINE void usbFreeTransferBuffer(void) if (!g_usbTransferBuffer) return; free(g_usbTransferBuffer); g_usbTransferBuffer = NULL; - g_usbTransferRemainingSize = 0; - g_usbSessionStarted = false; } static bool usbInitializeComms(void) @@ -898,7 +903,9 @@ NX_INLINE bool usbIsHostAvailable(void) { u32 state = 0; Result rc = usbDsGetState(&state); - return (R_SUCCEEDED(rc) && state == 5); + bool ret = (R_SUCCEEDED(rc) && state == 5); + if (!ret) g_usbSessionStarted = false; + return ret; } NX_INLINE bool usbRead(void *buf, u64 size) @@ -945,9 +952,18 @@ static bool usbTransferData(void *buf, u64 size, UsbDsEndpoint *endpoint) } /* Wait for the transfer to finish */ - eventWait(&(endpoint->CompletionEvent), UINT64_MAX); + /* If we're starting an USB transfer session, use an infinite timeout value to let the user start the companion app */ + u64 timeout = (g_usbSessionStarted ? (USB_TRANSFER_TIMEOUT * (u64)1000000000) : UINT64_MAX); + rc = eventWait(&(endpoint->CompletionEvent), timeout); eventClear(&(endpoint->CompletionEvent)); + if (R_FAILED(rc)) + { + usbDsEndpoint_Cancel(endpoint); + LOGFILE("eventWait failed! (0x%08X)", rc); + return false; + } + rc = usbDsEndpoint_GetReportData(endpoint, &report_data); if (R_FAILED(rc)) {