bool __usbstorage_Read_Write(u32 sector, u32 numSectors, void *buffer, int write) { STACK_ALIGN(ioctlv, vector, 3, 32); STACK_ALIGN(u32, _sector, 1, 32); STACK_ALIGN(u32, _numSectors, 1, 32); u32 cnt, len = (sectorSz * numSectors); s32 ret; /* Device not opened */ if (fd < 0) return false; /* Sector info */ *_sector = sector; *_numSectors = numSectors; /* Setup vector */ vector[0].data = _sector; vector[0].len = sizeof(u32); vector[1].data = _numSectors; vector[1].len = sizeof(u32); vector[2].data = buffer; vector[2].len = len; /* Flush cache */ for (cnt = 0; cnt < 3; cnt++) os_sync_after_write(vector[cnt].data, vector[cnt].len); os_sync_after_write(vector, sizeof(ioctlv) * 3); if(!write) { /* Read data */ ret = os_ioctlv(fd, USB_IOCTL_UMS_READ_SECTORS, 2, 1, vector); } else { /* Write data */ ret = os_ioctlv(fd, USB_IOCTL_UMS_WRITE_SECTORS, 3, 0, vector); } if (ret < 0) return false; /* Invalidate cache */ for (cnt = 0; cnt < 3; cnt++) os_sync_before_read(vector[cnt].data, vector[cnt].len); return true; }
bool usbstorage_Init(void) { s32 ret; /* Already open */ if (fd >= 0) return true; /* Open USB device */ fd = os_open(fs, 0); if (fd < 0) return false; /* Initialize USB storage */ os_ioctlv(fd, USB_IOCTL_UMS_INIT, 0, 0, NULL); /* Get device capacity */ ret = __usbstorage_GetCapacity(NULL); if (ret <= 0) goto err; return true; err: /* Close USB device */ usbstorage_Shutdown(); return false; }
s32 __usbstorage_GetCapacity(u32 *_sectorSz) { STACK_ALIGN(ioctlv, vector, 1, 32); STACK_ALIGN(u32, buffer, 1, 32); if (fd >= 0) { s32 ret; /* Setup vector */ vector[0].data = buffer; vector[0].len = sizeof(u32); os_sync_after_write(vector, sizeof(ioctlv)); /* Get capacity */ ret = os_ioctlv(fd, USB_IOCTL_UMS_GET_CAPACITY, 0, 1, vector); os_sync_after_write(buffer, sizeof(u32)); /* Set sector size */ sectorSz = buffer[0]; if (ret && _sectorSz) *_sectorSz = sectorSz; return ret; } return IPC_ENOENT; }
int sdhc_Init(void) { //s32 ret; /* Already open */ if (fd >= 0) return 0; /* Open USB device */ fd = os_open(fs, 1); if (fd < 0) return -11; /* Initialize USB storage */ os_ioctlv(fd, IOCTL_SDHC_INIT, 0, 0, NULL); sectorSz = SDHC_SECTOR_SIZE; return 0; }
s32 ES_GetTitleID(u64 *tid) { s32 fd, ret; /* Open ES */ fd = __ES_Init(); if (fd < 0) return fd; /* Setup vector */ vector[0].data = tid; vector[0].len = sizeof(u64); /* Get title ID */ ret = os_ioctlv(fd, IOCTL_ES_GETTITLEID, 0, 1, vector); /* Close ES */ __ES_Close(fd); return ret; }
bool sdhc_Read(u32 sector, u32 numSectors, void *buffer) { u32 cnt; s32 ret; /* Device not opened */ if (fd < 0) return false; /* Sector info */ io_buffer[0] = sector; io_buffer[1] = numSectors; /* Setup io_vector */ io_vector[0].data = &io_buffer[0]; io_vector[0].len = sizeof(u32); io_vector[1].data = &io_buffer[1]; io_vector[1].len = sizeof(u32); io_vector[2].data = buffer; io_vector[2].len = (sectorSz * numSectors); /* Flush cache */ for (cnt = 0; cnt < 3; cnt++) os_sync_after_write(io_vector[cnt].data, io_vector[cnt].len); os_sync_after_write(io_vector, sizeof(ioctlv) * 3); /* Read data */ ret = os_ioctlv(fd, IOCTL_SDHC_READ, 2, 1, io_vector); if (ret < 0) return false; /* Invalidate cache */ for (cnt = 0; cnt < 3; cnt++) os_sync_before_read(io_vector[cnt].data, io_vector[cnt].len); return true; }