2009-10-01 01:10:58 +02:00
|
|
|
#include <string.h>
|
2010-10-24 21:08:03 +02:00
|
|
|
#include <unistd.h>
|
2009-10-01 01:10:58 +02:00
|
|
|
#include <ogc/lwp_watchdog.h>
|
|
|
|
#include <ogc/mutex.h>
|
|
|
|
#include <ogc/system.h>
|
|
|
|
#include <ogc/usbstorage.h>
|
|
|
|
#include <sdcard/wiisd_io.h>
|
2009-12-19 15:05:31 +01:00
|
|
|
#include <locale.h>
|
2010-10-01 20:53:38 +02:00
|
|
|
#include <fat.h>
|
|
|
|
#include <ntfs.h>
|
2010-12-09 21:57:35 +01:00
|
|
|
#include <ext2.h>
|
2009-10-01 01:10:58 +02:00
|
|
|
|
2010-02-22 22:29:47 +01:00
|
|
|
#include "usbloader/usbstorage2.h"
|
2010-02-25 13:08:03 +01:00
|
|
|
#include "usbloader/sdhc.h"
|
2009-12-19 15:05:31 +01:00
|
|
|
#include "usbloader/wbfs.h"
|
2010-10-01 20:53:38 +02:00
|
|
|
#include "fatmounter.h"
|
2009-12-11 00:05:32 +01:00
|
|
|
#include "gecko.h"
|
2009-10-01 01:10:58 +02:00
|
|
|
|
|
|
|
//these are the only stable and speed is good
|
2010-05-30 08:49:23 +02:00
|
|
|
#define CACHE 32
|
2009-10-01 01:10:58 +02:00
|
|
|
#define SECTORS 64
|
2009-12-19 15:05:31 +01:00
|
|
|
#define SECTORS_SD 32
|
2009-10-01 01:10:58 +02:00
|
|
|
|
2009-11-15 20:52:58 +01:00
|
|
|
#define MOUNT_NONE 0
|
|
|
|
#define MOUNT_SD 1
|
|
|
|
#define MOUNT_SDHC 2
|
|
|
|
|
2010-02-15 03:45:18 +01:00
|
|
|
#define DEBUG_FAT
|
|
|
|
|
2009-12-19 15:05:31 +01:00
|
|
|
/* Disc interfaces */
|
|
|
|
extern const DISC_INTERFACE __io_sdhc;
|
|
|
|
|
2009-11-15 20:52:58 +01:00
|
|
|
extern sec_t _FAT_startSector;
|
|
|
|
|
2009-12-19 15:05:31 +01:00
|
|
|
extern s32 wbfsDev;
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
int fat_sd_mount = MOUNT_NONE;
|
2009-11-15 20:52:58 +01:00
|
|
|
sec_t fat_sd_sec = 0; // u32
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
int fat_usb_mount = 0;
|
2009-11-15 20:52:58 +01:00
|
|
|
sec_t fat_usb_sec = 0;
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
int fat_wbfs_mount = 0;
|
2009-11-15 20:52:58 +01:00
|
|
|
sec_t fat_wbfs_sec = 0;
|
2009-10-13 23:19:23 +02:00
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
int fs_ntfs_mount = 0;
|
2009-12-19 15:05:31 +01:00
|
|
|
sec_t fs_ntfs_sec = 0;
|
2009-12-11 00:05:32 +01:00
|
|
|
|
2010-12-09 21:57:35 +01:00
|
|
|
int fs_ext_mount = 0;
|
|
|
|
sec_t fs_ext_sec = 0;
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
int USBDevice_Init()
|
|
|
|
{
|
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-10-01 20:53:38 +02:00
|
|
|
USBDevice_deInit();
|
2009-10-01 01:10:58 +02:00
|
|
|
//right now mounts first FAT-partition
|
2009-11-15 20:52:58 +01:00
|
|
|
|
2010-11-28 16:31:08 +01:00
|
|
|
bool started = false;
|
|
|
|
int retries = 10;
|
2010-10-01 20:53:38 +02:00
|
|
|
|
2010-11-28 16:31:08 +01:00
|
|
|
// wait 0.5 sec for the USB to spin up...stupid slow ass HDD
|
|
|
|
do
|
2010-10-24 21:08:03 +02:00
|
|
|
{
|
2010-11-28 18:24:23 +01:00
|
|
|
started = (__io_usbstorage2.startup() && __io_usbstorage2.isInserted());
|
2010-11-28 16:31:08 +01:00
|
|
|
usleep(50000);
|
|
|
|
--retries;
|
2010-10-24 21:08:03 +02:00
|
|
|
}
|
2010-11-28 16:31:08 +01:00
|
|
|
while(!started && retries > 0);
|
2010-10-01 20:53:38 +02:00
|
|
|
|
2010-11-28 16:31:08 +01:00
|
|
|
if(!started)
|
|
|
|
return -1;
|
2010-02-25 13:08:03 +01:00
|
|
|
|
2010-11-28 16:31:08 +01:00
|
|
|
if (fatMount("USB", &__io_usbstorage2, 0, CACHE, SECTORS))
|
2010-10-24 21:08:03 +02:00
|
|
|
{
|
|
|
|
fat_usb_sec = _FAT_startSector;
|
|
|
|
return (fat_usb_mount = 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
2009-10-01 01:10:58 +02:00
|
|
|
}
|
|
|
|
|
2010-11-28 16:31:08 +01:00
|
|
|
int USBDevice_Init_Loop()
|
|
|
|
{
|
|
|
|
time_t starttime = time(0);
|
|
|
|
time_t timenow = starttime;
|
2010-11-28 18:24:23 +01:00
|
|
|
bool StatusPrinted = false;
|
|
|
|
bool started = false;
|
2010-11-28 16:31:08 +01:00
|
|
|
|
2010-11-28 18:24:23 +01:00
|
|
|
do
|
2010-11-28 16:31:08 +01:00
|
|
|
{
|
2010-11-28 18:24:23 +01:00
|
|
|
started = (__io_usbstorage2.startup() && __io_usbstorage2.isInserted());
|
|
|
|
|
|
|
|
if(!started)
|
2010-11-28 16:31:08 +01:00
|
|
|
{
|
2010-11-28 18:24:23 +01:00
|
|
|
if(timenow != time(0))
|
2010-11-28 16:31:08 +01:00
|
|
|
{
|
2010-11-28 18:24:23 +01:00
|
|
|
timenow = time(0);
|
|
|
|
if(!StatusPrinted)
|
|
|
|
{
|
|
|
|
printf("\tWaiting for slow HDD...");
|
|
|
|
StatusPrinted = true;
|
|
|
|
}
|
|
|
|
printf("%i ", (int) (timenow-starttime));
|
2010-11-28 16:31:08 +01:00
|
|
|
}
|
2010-11-28 18:24:23 +01:00
|
|
|
usleep(100000);
|
2010-11-28 16:31:08 +01:00
|
|
|
}
|
|
|
|
}
|
2010-11-28 18:24:23 +01:00
|
|
|
while(!started && timenow-starttime < 30);
|
2010-11-28 16:31:08 +01:00
|
|
|
|
2010-11-28 18:24:23 +01:00
|
|
|
if(StatusPrinted)
|
|
|
|
printf("\n");
|
2010-11-28 17:31:55 +01:00
|
|
|
|
2010-11-28 18:24:23 +01:00
|
|
|
return USBDevice_Init();
|
2010-11-28 16:31:08 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void USBDevice_deInit()
|
|
|
|
{
|
2009-10-01 01:10:58 +02:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-09-24 02:48:03 +02:00
|
|
|
fatUnmount("USB:/");
|
2010-10-24 21:08:03 +02:00
|
|
|
//only shutdown libogc usb and not the cios one
|
2010-11-13 23:34:53 +01:00
|
|
|
__io_usbstorage2.shutdown();
|
2009-11-15 20:52:58 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
fat_usb_mount = 0;
|
|
|
|
fat_usb_sec = 0;
|
2009-11-15 20:52:58 +01:00
|
|
|
}
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
int WBFSDevice_Init(u32 sector)
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
2009-11-15 20:52:58 +01:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-09-24 02:48:03 +02:00
|
|
|
fatUnmount("WBFS:/");
|
2009-11-15 20:52:58 +01:00
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
if (!fatMount("WBFS", &__io_usbstorage2, 0, CACHE, SECTORS))
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
fat_wbfs_mount = 1;
|
|
|
|
fat_wbfs_sec = _FAT_startSector;
|
2010-11-28 16:31:08 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
return 0;
|
2009-11-15 20:52:58 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void WBFSDevice_deInit()
|
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
fatUnmount("WBFS:/");
|
2009-11-15 20:52:58 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
fat_wbfs_mount = 0;
|
|
|
|
fat_wbfs_sec = 0;
|
2009-10-01 01:10:58 +02:00
|
|
|
}
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
int isInserted(const char *path)
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
if (!strncmp(path, "USB:", 4)) return 1;
|
2009-10-01 01:10:58 +02:00
|
|
|
|
2009-10-13 23:19:23 +02:00
|
|
|
return __io_sdhc.isInserted() || __io_wiisd.isInserted();
|
2009-10-01 01:10:58 +02:00
|
|
|
}
|
2009-11-15 20:52:58 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
int SDCard_Init()
|
|
|
|
{
|
2009-10-01 01:10:58 +02:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-10-01 20:53:38 +02:00
|
|
|
SDCard_deInit();
|
2010-09-29 19:47:51 +02:00
|
|
|
|
2009-10-01 01:10:58 +02:00
|
|
|
//right now mounts first FAT-partition
|
2010-09-24 02:48:03 +02:00
|
|
|
if (fatMount("SD", &__io_wiisd, 0, CACHE, SECTORS))
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
|
|
|
fat_sd_mount = MOUNT_SD;
|
|
|
|
fat_sd_sec = _FAT_startSector;
|
|
|
|
return 1;
|
|
|
|
}
|
2010-10-01 20:53:38 +02:00
|
|
|
|
|
|
|
__io_wiisd.shutdown();
|
|
|
|
|
|
|
|
if (fatMount("SD", &__io_sdhc, 0, CACHE, SECTORS))
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
|
|
|
fat_sd_mount = MOUNT_SDHC;
|
|
|
|
fat_sd_sec = _FAT_startSector;
|
|
|
|
return 1;
|
|
|
|
}
|
2010-09-29 19:47:51 +02:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
return -1;
|
2009-10-01 01:10:58 +02:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void SDCard_deInit()
|
|
|
|
{
|
2010-09-29 19:47:51 +02:00
|
|
|
fatUnmount("SD:/");
|
2010-10-01 20:53:38 +02:00
|
|
|
__io_wiisd.shutdown();
|
|
|
|
__io_sdhc.shutdown();
|
2009-11-15 22:30:44 +01:00
|
|
|
|
2010-09-29 19:47:51 +02:00
|
|
|
fat_sd_mount = MOUNT_NONE;
|
|
|
|
fat_sd_sec = 0;
|
2009-10-01 01:10:58 +02:00
|
|
|
}
|
2009-12-19 15:05:31 +01:00
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
s32 MountNTFS(u32 sector)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
s32 ret;
|
|
|
|
|
2010-09-29 19:47:51 +02:00
|
|
|
if (fs_ntfs_mount)
|
|
|
|
return 0;
|
2010-09-19 01:16:05 +02:00
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
if (wbfsDev == WBFS_DEVICE_USB)
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
ret = ntfsMount("NTFS", &__io_usbstorage2, sector, CACHE, SECTORS, NTFS_SHOW_HIDDEN_FILES | NTFS_RECOVER);
|
|
|
|
if (!ret)
|
2010-11-28 16:31:08 +01:00
|
|
|
return -2;
|
2010-09-19 01:16:05 +02:00
|
|
|
}
|
2010-09-24 02:48:03 +02:00
|
|
|
else if (wbfsDev == WBFS_DEVICE_SDHC)
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
if (sdhc_mode_sd == 0)
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
ret = ntfsMount("NTFS", &__io_sdhc, 0, CACHE, SECTORS, NTFS_SHOW_HIDDEN_FILES | NTFS_RECOVER);
|
2010-09-19 01:16:05 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-09-24 02:48:03 +02:00
|
|
|
ret = ntfsMount("NTFS", &__io_sdhc, 0, CACHE, SECTORS_SD, NTFS_SHOW_HIDDEN_FILES | NTFS_RECOVER);
|
2010-09-19 01:16:05 +02:00
|
|
|
}
|
2010-09-24 02:48:03 +02:00
|
|
|
if (!ret)
|
2010-09-19 01:16:05 +02:00
|
|
|
{
|
|
|
|
return -5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-29 19:47:51 +02:00
|
|
|
// ntfsInit() resets locals
|
|
|
|
// which breaks unicode in console
|
|
|
|
// so we change it back to C-UTF-8
|
|
|
|
setlocale(LC_CTYPE, "C-UTF-8");
|
|
|
|
setlocale(LC_MESSAGES, "C-UTF-8");
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
fs_ntfs_mount = 1;
|
2010-09-29 19:47:51 +02:00
|
|
|
fs_ntfs_sec = sector;
|
2010-09-19 01:16:05 +02:00
|
|
|
|
|
|
|
return 0;
|
2009-12-19 15:05:31 +01:00
|
|
|
}
|
|
|
|
|
2010-09-24 02:48:03 +02:00
|
|
|
s32 UnmountNTFS(void)
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
/* Unmount device */
|
2010-09-24 02:48:03 +02:00
|
|
|
ntfsUnmount("NTFS:/", true);
|
2009-12-19 15:05:31 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
fs_ntfs_mount = 0;
|
|
|
|
fs_ntfs_sec = 0;
|
2009-12-19 15:05:31 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
return 0;
|
2009-12-19 15:05:31 +01:00
|
|
|
}
|
2010-12-09 21:57:35 +01:00
|
|
|
|
|
|
|
s32 MountEXT(u32 sector)
|
|
|
|
{
|
|
|
|
s32 ret;
|
|
|
|
|
|
|
|
if (fs_ext_mount)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
ret = ext2Mount("EXT", &__io_usbstorage2, sector, CACHE, SECTORS, EXT2_FLAG_DEFAULT);
|
|
|
|
if (!ret)
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
fs_ext_mount = 1;
|
|
|
|
fs_ext_sec = sector;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
s32 UnmountEXT(void)
|
|
|
|
{
|
|
|
|
/* Unmount device */
|
|
|
|
ext2Unmount("EXT:/");
|
|
|
|
|
|
|
|
fs_ext_mount = 0;
|
|
|
|
fs_ext_sec = 0;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|