#include #include #include #include "usbloader/sdhc.h" #include "usbloader/usbstorage2.h" #include "usbloader/wdvd.h" #include "wbfs_rw.h" /* Constants */ #define MAX_NB_SECTORS 32 u32 sector_size = 512; rw_sector_callback_t readCallback = NULL; rw_sector_callback_t writeCallback = NULL; void SetSectorSize( u32 size ) { sector_size = size; } s32 __ReadDVD( void *fp, u32 lba, u32 len, void *iobuf ) { void *buffer = NULL; u64 offset; u32 mod, size; s32 ret; /* Calculate offset */ offset = ( ( u64 )lba ) << 2; /* Calcualte sizes */ mod = len % 32; size = len - mod; /* Read aligned data */ if ( size ) { ret = WDVD_UnencryptedRead( iobuf, size, offset ); if ( ret < 0 ) goto out; } /* Read non-aligned data */ if ( mod ) { /* Allocate memory */ buffer = memalign( 32, 0x20 ); if ( !buffer ) return -1; /* Read data */ ret = WDVD_UnencryptedRead( buffer, 0x20, offset + size ); if ( ret < 0 ) goto out; /* Copy data */ void *ptr = ( ( u8 * ) iobuf ) + size; memcpy( ptr, buffer, mod ); } /* Success */ ret = 0; out: /* Free memory */ if ( buffer ) free( buffer ); return ret; } s32 __ReadUSB( void *fp, u32 lba, u32 count, void *iobuf ) { u32 cnt = 0; s32 ret; /* Do reads */ while ( cnt < count ) { void *ptr = ( ( u8 * )iobuf ) + ( cnt * sector_size ); u32 sectors = ( count - cnt ); /* Read sectors is too big */ if ( sectors > MAX_NB_SECTORS ) sectors = MAX_NB_SECTORS; /* USB read */ ret = USBStorage2_ReadSectors( lba + cnt, sectors, ptr ); if ( ret < 0 ) return ret; /* Increment counter */ cnt += sectors; } return 0; } s32 __WriteUSB( void *fp, u32 lba, u32 count, void *iobuf ) { u32 cnt = 0; s32 ret; /* Do writes */ while ( cnt < count ) { void *ptr = ( ( u8 * )iobuf ) + ( cnt * sector_size ); u32 sectors = ( count - cnt ); /* Write sectors is too big */ if ( sectors > MAX_NB_SECTORS ) sectors = MAX_NB_SECTORS; /* USB write */ ret = USBStorage2_WriteSectors( lba + cnt, sectors, ptr ); if ( ret < 0 ) return ret; /* Increment counter */ cnt += sectors; } return 0; } s32 __ReadSDHC( void *fp, u32 lba, u32 count, void *iobuf ) { u32 cnt = 0; s32 ret; /* Do reads */ while ( cnt < count ) { void *ptr = ( ( u8 * )iobuf ) + ( cnt * sector_size ); u32 sectors = ( count - cnt ); /* Read sectors is too big */ if ( sectors > MAX_NB_SECTORS ) sectors = MAX_NB_SECTORS; /* SDHC read */ ret = SDHC_ReadSectors( lba + cnt, sectors, ptr ); if ( !ret ) return -1; /* Increment counter */ cnt += sectors; } return 0; } s32 __WriteSDHC( void *fp, u32 lba, u32 count, void *iobuf ) { u32 cnt = 0; s32 ret; /* Do writes */ while ( cnt < count ) { void *ptr = ( ( u8 * )iobuf ) + ( cnt * sector_size ); u32 sectors = ( count - cnt ); /* Write sectors is too big */ if ( sectors > MAX_NB_SECTORS ) sectors = MAX_NB_SECTORS; /* SDHC write */ ret = SDHC_WriteSectors( lba + cnt, sectors, ptr ); if ( !ret ) return -1; /* Increment counter */ cnt += sectors; } return 0; }