diff --git a/source/devicemounter/DeviceHandler.cpp b/source/devicemounter/DeviceHandler.cpp index 981c5000..b3db40c7 100644 --- a/source/devicemounter/DeviceHandler.cpp +++ b/source/devicemounter/DeviceHandler.cpp @@ -33,6 +33,7 @@ #include "DeviceHandler.hpp" #include "defines.h" #include "sdhc.h" +#include "usbthread.h" #include "usbstorage.h" #include "usbstorage_libogc.h" #include "loader/cios.h" @@ -69,6 +70,9 @@ void DeviceHandler::MountAll() void DeviceHandler::UnMountAll() { + /* Kill possible USB thread */ + KillUSBKeepAliveThread(); + for(u32 i = SD; i < MAXDEVICES; i++) UnMount(i); @@ -172,6 +176,8 @@ bool DeviceHandler::MountUSB(int pos) bool DeviceHandler::MountAllUSB() { + /* Kill possible USB thread */ + KillUSBKeepAliveThread(); /* Wait for our slowass HDD */ WaitForDevice(GetUSB0Interface()); /* Get Partitions and Mount them */ @@ -190,9 +196,12 @@ bool DeviceHandler::MountAllUSB() if(MountUSB(i)) result = true; } + if(result && usb_libogc_mode) + CreateUSBKeepAliveThread(); return result; } +/* bool DeviceHandler::MountUSBPort1() { if(!usb1)// && (Settings.USBPort == 1 || Settings.USBPort == 2)) @@ -219,6 +228,7 @@ bool DeviceHandler::MountUSBPort1() return result; } +*/ void DeviceHandler::UnMountUSB(int pos) { @@ -304,7 +314,6 @@ int DeviceHandler::GetFSType(int dev) return -1; } - u16 DeviceHandler::GetUSBPartitionCount() { if(!instance) diff --git a/source/devicemounter/usbstorage.c b/source/devicemounter/usbstorage.c index ff90907b..8ae31855 100644 --- a/source/devicemounter/usbstorage.c +++ b/source/devicemounter/usbstorage.c @@ -34,6 +34,7 @@ #include "usbstorage.h" #include "usbstorage_libogc.h" +#include "usbthread.h" #include "gecko/gecko.h" /* IOCTL commands */ @@ -90,6 +91,7 @@ s32 USBStorage2_Init(u32 port) if(usb_libogc_mode) { + USBKeepAliveThreadReset(); __io_usbstorage_ogc.startup(); return (USBStorage2_GetCapacity(port, &hdd_sector_size[port]) == 0) ? IPC_ENOENT : 0; } @@ -128,7 +130,10 @@ void USBStorage2_Deinit() { /* Close USB device */ if(usb_libogc_mode) + { + USBKeepAliveThreadReset(); __io_usbstorage_ogc.shutdown(); + } else if(fd >= 0) IOS_Close(fd); // not sure to close the fd is needed @@ -176,7 +181,10 @@ s32 USBStorage2_GetCapacity(u32 port, u32 *_sector_size) u32 sectorSize = 0; USBStorage2_SetPort(port); if(usb_libogc_mode) + { + USBKeepAliveThreadReset(); USB_OGC_GetCapacity(&numSectors, §orSize); + } else numSectors = IOS_IoctlvFormat(hid, fd, USB_IOCTL_UMS_GET_CAPACITY, ":i", §orSize); @@ -201,12 +209,19 @@ s32 USBStorage2_GetCapacity(u32 port, u32 *_sector_size) s32 USBStorage2_ReadSectors(u32 port, u32 sector, u32 numSectors, void *buffer) { + s32 ret = -1; + if(usb_libogc_mode) - return __io_usbstorage_ogc.readSectors(sector, numSectors, buffer); + { + USBKeepAliveThreadReset(); + reading = true; + ret = __io_usbstorage_ogc.readSectors(sector, numSectors, buffer); + reading = false; + return ret; + } bool isMEM2Buffer = __USBStorage_isMEM2Buffer(buffer); u8 *buf = (u8 *)buffer; - s32 ret = -1; /* Device not opened */ if(fd < 0) @@ -251,7 +266,10 @@ s32 USBStorage2_ReadSectors(u32 port, u32 sector, u32 numSectors, void *buffer) s32 USBStorage2_WriteSectors(u32 port, u32 sector, u32 numSectors, const void *buffer) { if(usb_libogc_mode) + { + USBKeepAliveThreadReset(); return __io_usbstorage_ogc.writeSectors(sector, numSectors, buffer); + } bool isMEM2Buffer = __USBStorage_isMEM2Buffer(buffer); u8 *buf = (u8 *)buffer; diff --git a/source/devicemounter/usbthread.c b/source/devicemounter/usbthread.c new file mode 100644 index 00000000..079fe627 --- /dev/null +++ b/source/devicemounter/usbthread.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright (C) 2012 FIX94 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ****************************************************************************/ +#include +#include +#include +#include +#include + +#include "usbthread.h" +#include "usbstorage.h" +#include "gecko/gecko.h" + +lwp_t USB_Thread = LWP_THREAD_NULL; +volatile bool CheckUSB = false; +volatile bool idle = false; +volatile time_t start = 0; +u8 sector[4096]; + +void *KeepUSBAlive(void *nothing) +{ + int NumberSectors = USBStorage2_GetCapacity(0, NULL); + start = time(NULL); + srand(start); + while(CheckUSB) + { + if(idle || (time(NULL) - start) > 19) + { + USBStorage2_ReadSectors(0, rand() % NumberSectors, 1, sector); + idle = true; + } + sleep(1); + } + return nothing; +} + +void CreateUSBKeepAliveThread() +{ + CheckUSB = true; + LWP_CreateThread(&USB_Thread, KeepUSBAlive, NULL, NULL, 0, 40); +} + +void KillUSBKeepAliveThread() +{ + CheckUSB = false; + USBKeepAliveThreadReset(); + if(USB_Thread != LWP_THREAD_NULL) + { + LWP_JoinThread(USB_Thread, NULL); + USB_Thread = LWP_THREAD_NULL; + } +} + +void USBKeepAliveThreadReset() +{ + while(reading) + usleep(100); + start = time(NULL); + idle = false; +} diff --git a/source/devicemounter/usbthread.h b/source/devicemounter/usbthread.h new file mode 100644 index 00000000..748ce517 --- /dev/null +++ b/source/devicemounter/usbthread.h @@ -0,0 +1,34 @@ +/**************************************************************************** + * Copyright (C) 2012 FIX94 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ****************************************************************************/ +#ifndef _USBTHREAD_H_ +#define _USBTHREAD_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +void CreateUSBKeepAliveThread(); +void KillUSBKeepAliveThread(); +void USBKeepAliveThreadReset(); +static volatile bool reading = false; + +#ifdef __cplusplus +} +#endif + +#endif /* _USBTHREAD_H_ */ diff --git a/source/loader/sys.c b/source/loader/sys.c index 9da931b8..0fbed5cf 100644 --- a/source/loader/sys.c +++ b/source/loader/sys.c @@ -44,7 +44,7 @@ void Open_Inputs(void) WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR); - WPAD_SetIdleTimeout(60*5); // idle after 5 minutes + WPAD_SetIdleTimeout(60 * 2); // idle after 2 minutes } void Close_Inputs(void)