2009-10-01 01:10:58 +02:00
|
|
|
#include <string.h>
|
|
|
|
#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>
|
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"
|
2009-11-15 22:30:44 +01:00
|
|
|
#include "libfat/fat.h"
|
2009-12-19 15:05:31 +01:00
|
|
|
#include "libntfs/ntfs.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;
|
|
|
|
|
|
|
|
void _FAT_mem_init();
|
2009-11-15 20:52:58 +01:00
|
|
|
extern sec_t _FAT_startSector;
|
|
|
|
|
2009-12-19 15:05:31 +01:00
|
|
|
extern s32 wbfsDev;
|
|
|
|
|
2009-11-15 20:52:58 +01:00
|
|
|
int fat_sd_mount = MOUNT_NONE;
|
|
|
|
sec_t fat_sd_sec = 0; // u32
|
|
|
|
|
|
|
|
int fat_usb_mount = 0;
|
|
|
|
sec_t fat_usb_sec = 0;
|
|
|
|
|
|
|
|
int fat_wbfs_mount = 0;
|
|
|
|
sec_t fat_wbfs_sec = 0;
|
2009-10-13 23:19:23 +02:00
|
|
|
|
2009-12-19 15:05:31 +01:00
|
|
|
int fs_ntfs_mount = 0;
|
|
|
|
sec_t fs_ntfs_sec = 0;
|
2009-12-11 00:05:32 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
int USBDevice_Init()
|
|
|
|
{
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( "USBDevice_Init()" );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2010-09-19 01:16:05 +02:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
|
|
|
fatUnmount( "USB:/" );
|
2009-10-01 01:10:58 +02:00
|
|
|
//right now mounts first FAT-partition
|
2009-11-15 20:52:58 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
//try first mount with cIOS
|
2010-02-22 22:29:47 +01:00
|
|
|
// if (!fatMount("USB", &__io_wiiums, 0, CACHE, SECTORS)) {
|
2010-09-19 01:16:05 +02:00
|
|
|
// //try now mount with libogc
|
|
|
|
if ( !fatMount( "USB", &__io_usbstorage2, 0, CACHE, SECTORS ) )
|
|
|
|
{
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( ":-1\n" );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2010-09-19 01:16:05 +02:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
// }
|
2010-02-25 13:08:03 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
fat_usb_mount = 1;
|
|
|
|
fat_usb_sec = _FAT_startSector;
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( ":0\n" );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2010-09-19 01:16:05 +02:00
|
|
|
return 0;
|
2009-10-01 01:10:58 +02:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void USBDevice_deInit()
|
|
|
|
{
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( "USBDevice_deInit(): " );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2009-10-01 01:10:58 +02:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-09-19 01:16:05 +02:00
|
|
|
fatUnmount( "USB:/" );
|
2009-11-15 20:52:58 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
fat_usb_mount = 0;
|
|
|
|
fat_usb_sec = 0;
|
2010-09-19 12:53:24 +02:00
|
|
|
#ifdef DEBUG_FAT
|
|
|
|
gprintf( "ok\n" );
|
|
|
|
#endif
|
2009-11-15 20:52:58 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
int WBFSDevice_Init( u32 sector )
|
|
|
|
{
|
2009-11-15 20:52:58 +01:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-09-19 01:16:05 +02:00
|
|
|
fatUnmount( "WBFS:/" );
|
2009-11-15 20:52:58 +01:00
|
|
|
//right now mounts first FAT-partition
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
//try first mount with cIOS
|
2010-02-25 13:08:03 +01:00
|
|
|
// if (!fatMount("WBFS", &__io_wiiums, 0, CACHE, SECTORS)) {
|
2010-09-19 01:16:05 +02:00
|
|
|
//try now mount with libogc
|
|
|
|
if ( !fatMount( "WBFS", &__io_usbstorage2, 0, CACHE, SECTORS ) )
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
|
|
|
|
fat_wbfs_mount = 1;
|
|
|
|
fat_wbfs_sec = _FAT_startSector;
|
|
|
|
if ( sector && fat_wbfs_sec != sector )
|
|
|
|
{
|
|
|
|
// This is an error situation...actually, but is ignored in Config loader also
|
|
|
|
// Should ask Oggzee about it...
|
|
|
|
}
|
|
|
|
return 0;
|
2009-11-15 20:52:58 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void WBFSDevice_deInit()
|
|
|
|
{
|
2009-11-15 20:52:58 +01:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-09-19 01:16:05 +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-19 01:16:05 +02:00
|
|
|
int isInserted( const char *path )
|
|
|
|
{
|
|
|
|
if ( !strncmp( path, "USB:", 4 ) )
|
2009-10-01 01:10:58 +02:00
|
|
|
return 1;
|
|
|
|
|
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()
|
|
|
|
{
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( "SDCard_Init()" );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2009-10-01 01:10:58 +02:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-09-19 01:16:05 +02:00
|
|
|
fatUnmount( "SD:/" );
|
2009-10-01 01:10:58 +02:00
|
|
|
//right now mounts first FAT-partition
|
2010-09-19 01:16:05 +02:00
|
|
|
if ( fatMount( "SD", &__io_wiisd, 0, CACHE, SECTORS ) )
|
|
|
|
{
|
|
|
|
fat_sd_mount = MOUNT_SD;
|
|
|
|
fat_sd_sec = _FAT_startSector;
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( ":1\n" );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2010-09-19 01:16:05 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if ( fatMount( "SD", &__io_sdhc, 0, CACHE, SDHC_SECTOR_SIZE ) )
|
|
|
|
{
|
|
|
|
fat_sd_mount = MOUNT_SDHC;
|
|
|
|
fat_sd_sec = _FAT_startSector;
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( ":1\n" );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2010-09-19 01:16:05 +02:00
|
|
|
return 1;
|
|
|
|
}
|
2010-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( ":-1\n" );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
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-02-15 03:45:18 +01:00
|
|
|
#ifdef DEBUG_FAT
|
2010-09-19 12:53:24 +02:00
|
|
|
gprintf( "SDCard_deInit(): " );
|
2010-02-15 03:45:18 +01:00
|
|
|
#endif
|
2009-10-01 01:10:58 +02:00
|
|
|
//closing all open Files write back the cache and then shutdown em!
|
2010-09-19 01:16:05 +02:00
|
|
|
fatUnmount( "SD:/" );
|
2009-11-15 22:30:44 +01:00
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
fat_sd_mount = MOUNT_NONE;
|
|
|
|
fat_sd_sec = 0;
|
2010-09-19 12:53:24 +02:00
|
|
|
#ifdef DEBUG_FAT
|
|
|
|
gprintf( "ok\n" );
|
|
|
|
#endif
|
2009-10-01 01:10:58 +02:00
|
|
|
}
|
2009-12-19 15:05:31 +01:00
|
|
|
|
|
|
|
void ntfsInit();
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
s32 MountNTFS( u32 sector )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
s32 ret;
|
|
|
|
|
|
|
|
if ( fs_ntfs_mount ) return 0;
|
|
|
|
//printf("mounting NTFS\n");
|
|
|
|
//Wpad_WaitButtons();
|
|
|
|
_FAT_mem_init();
|
|
|
|
|
|
|
|
ntfsInit(); // Call ntfs init here, to prevent locale resets
|
|
|
|
|
|
|
|
// ntfsInit resets locale settings
|
|
|
|
// 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" );
|
|
|
|
|
|
|
|
if ( wbfsDev == WBFS_DEVICE_USB )
|
|
|
|
{
|
|
|
|
/* Initialize WBFS interface */
|
|
|
|
// if (!__io_wiiums.startup()) {
|
|
|
|
ret = __io_usbstorage2.startup();
|
|
|
|
if ( !ret )
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
/* Mount device */
|
|
|
|
// if (!ntfsMount("NTFS", &__io_wiiums, sector, CACHE, SECTORS, NTFS_SHOW_HIDDEN_FILES | NTFS_RECOVER)) {
|
|
|
|
ret = ntfsMount( "NTFS", &__io_usbstorage2, sector, CACHE, SECTORS, NTFS_SHOW_HIDDEN_FILES | NTFS_READ_ONLY | NTFS_RECOVER );
|
|
|
|
if ( !ret )
|
|
|
|
{
|
|
|
|
return -2;
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
else if ( wbfsDev == WBFS_DEVICE_SDHC )
|
|
|
|
{
|
|
|
|
if ( sdhc_mode_sd == 0 )
|
|
|
|
{
|
|
|
|
ret = ntfsMount( "NTFS", &__io_sdhc, 0, CACHE, SECTORS, NTFS_SHOW_HIDDEN_FILES | NTFS_READ_ONLY | NTFS_RECOVER );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ret = ntfsMount( "NTFS", &__io_sdhc, 0, CACHE, SECTORS_SD, NTFS_SHOW_HIDDEN_FILES | NTFS_READ_ONLY | NTFS_RECOVER );
|
|
|
|
}
|
|
|
|
if ( !ret )
|
|
|
|
{
|
|
|
|
return -5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fs_ntfs_mount = 1;
|
|
|
|
fs_ntfs_sec = sector; //_FAT_startSector;
|
|
|
|
|
|
|
|
return 0;
|
2009-12-19 15:05:31 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
s32 UnmountNTFS( void )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
/* Unmount device */
|
|
|
|
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-02-09 11:59:55 +01:00
|
|
|
void _FAT_mem_init()
|
|
|
|
{
|
2009-12-19 15:05:31 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void* _FAT_mem_allocate( size_t size )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
return malloc( size );
|
2009-12-19 15:05:31 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void* _FAT_mem_align( size_t size )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
return memalign( 32, size );
|
2009-12-19 15:05:31 +01:00
|
|
|
}
|
|
|
|
|
2010-09-19 01:16:05 +02:00
|
|
|
void _FAT_mem_free( void *mem )
|
2010-02-09 11:59:55 +01:00
|
|
|
{
|
2010-09-19 01:16:05 +02:00
|
|
|
free( mem );
|
2009-12-19 15:05:31 +01:00
|
|
|
}
|