#include #include #include #include #include "sdhc.h" /* IOCTL comamnds */ #define IOCTL_SDHC_INIT 0x01 #define IOCTL_SDHC_READ 0x02 #define IOCTL_SDHC_WRITE 0x03 #define IOCTL_SDHC_ISINSERTED 0x04 #define SDHC_HEAPSIZE 0x8000 #define SDHC_MEM2_SIZE 0x10000 int sdhc_mode_sd = 0; /* Variables */ static char fs[] ATTRIBUTE_ALIGN( 32 ) = "/dev/sdio/sdhc"; static s32 hid = -1, fd = -1; static u32 sector_size = SDHC_SECTOR_SIZE; static void *sdhc_buf2; extern void* SYS_AllocArena2MemLo( u32 size, u32 align ); bool SDHC_Init( void ) { s32 ret; if ( sdhc_mode_sd ) { return __io_wiisd.startup(); } /* Already open */ if ( fd >= 0 ) return true; /* Create heap */ if ( hid < 0 ) { hid = iosCreateHeap( SDHC_HEAPSIZE ); if ( hid < 0 ) goto err; } // allocate buf2 if ( sdhc_buf2 == NULL ) { sdhc_buf2 = SYS_AllocArena2MemLo( SDHC_MEM2_SIZE, 32 ); } /* Open SDHC device */ fd = IOS_Open( fs, 0 ); if ( fd < 0 ) goto err; /* Initialize SDHC */ ret = IOS_IoctlvFormat( hid, fd, IOCTL_SDHC_INIT, ":" ); if ( ret ) goto err; return true; err: /* Close SDHC device */ if ( fd >= 0 ) { IOS_Close( fd ); fd = -1; } return false; } bool SDHC_Close( void ) { if ( sdhc_mode_sd ) { return __io_wiisd.shutdown(); } /* Close SDHC device */ if ( fd >= 0 ) { IOS_Close( fd ); fd = -1; } /*if (hid > 0) { iosDestroyHeap(hid); hid = -1; }*/ return true; } bool SDHC_IsInserted( void ) { s32 ret; if ( sdhc_mode_sd ) { return __io_wiisd.isInserted(); } /* Check if SD card is inserted */ ret = IOS_IoctlvFormat( hid, fd, IOCTL_SDHC_ISINSERTED, ":" ); return ( !ret ) ? true : false; } bool SDHC_ReadSectors( u32 sector, u32 count, void *buffer ) { //printf("SD-R(%u %u)\n", sector, count); if ( sdhc_mode_sd ) { return __io_wiisd.readSectors( sector, count, buffer ); } void *buf = ( void * )buffer; u32 len = ( sector_size * count ); s32 ret; /* Device not opened */ if ( fd < 0 ) return false; /* Buffer not aligned */ if ( ( u32 )buffer & 0x1F ) { /* Allocate memory */ //buf = iosAlloc(hid, len); buf = sdhc_buf2; if ( !buf ) return false; } /* Read data */ ret = IOS_IoctlvFormat( hid, fd, IOCTL_SDHC_READ, "ii:d", sector, count, buf, len ); /* Copy data */ if ( buf != buffer ) { memcpy( buffer, buf, len ); //iosFree(hid, buf); } return ( !ret ) ? true : false; } bool SDHC_WriteSectors( u32 sector, u32 count, void *buffer ) { if ( sdhc_mode_sd ) { return __io_wiisd.writeSectors( sector, count, buffer ); } void *buf = ( void * )buffer; u32 len = ( sector_size * count ); s32 ret; /* Device not opened */ if ( fd < 0 ) return false; /* Buffer not aligned */ if ( ( u32 )buffer & 0x1F ) { /* Allocate memory */ //buf = iosAlloc(hid, len); buf = sdhc_buf2; if ( !buf ) return false; /* Copy data */ memcpy( buf, buffer, len ); } /* Read data */ ret = IOS_IoctlvFormat( hid, fd, IOCTL_SDHC_WRITE, "ii:d", sector, count, buf, len ); /* Free memory */ //if (buf != buffer) // iosFree(hid, buf); return ( !ret ) ? true : false; } bool SDHC_ClearStatus( void ) { return true; } bool __io_SDHC_Close( void ) { // do nothing. return true; } bool __io_SDHC_NOP( void ) { // do nothing. return true; } const DISC_INTERFACE __io_sdhc = { DEVICE_TYPE_WII_SD, FEATURE_MEDIUM_CANREAD | FEATURE_MEDIUM_CANWRITE | FEATURE_WII_SD, ( FN_MEDIUM_STARTUP )&SDHC_Init, ( FN_MEDIUM_ISINSERTED )&SDHC_IsInserted, ( FN_MEDIUM_READSECTORS )&SDHC_ReadSectors, ( FN_MEDIUM_WRITESECTORS )&SDHC_WriteSectors, ( FN_MEDIUM_CLEARSTATUS )&SDHC_ClearStatus, //(FN_MEDIUM_SHUTDOWN)&SDHC_Close ( FN_MEDIUM_SHUTDOWN )&__io_SDHC_Close }; const DISC_INTERFACE __io_sdhc_ro = { DEVICE_TYPE_WII_SD, FEATURE_MEDIUM_CANREAD | FEATURE_WII_SD, ( FN_MEDIUM_STARTUP ) &SDHC_Init, ( FN_MEDIUM_ISINSERTED ) &SDHC_IsInserted, ( FN_MEDIUM_READSECTORS ) &SDHC_ReadSectors, ( FN_MEDIUM_WRITESECTORS ) &__io_SDHC_NOP, // &SDHC_WriteSectors, ( FN_MEDIUM_CLEARSTATUS ) &SDHC_ClearStatus, //(FN_MEDIUM_SHUTDOWN)&SDHC_Close ( FN_MEDIUM_SHUTDOWN ) &__io_SDHC_Close };