s32 __WBFS_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 = USBStorage_ReadSectors(lba + cnt, sectors, ptr); if (ret < 0) return ret; /* Increment counter */ cnt += sectors; } return 0; }
s32 Partition_GetEntries(u32 device, partitionEntry *outbuf, u32 *outval) { static partitionTable table ATTRIBUTE_ALIGN(32); u32 cnt, sector_size; s32 ret; /* Read from specified device */ switch (device) { case WBFS_DEVICE_USB: { /* Get sector size */ ret = USBStorage_GetCapacity(§or_size); if (ret == 0) return -1; /* Read partition table */ u8* table_buf = memalign(32, sector_size); ret = USBStorage_ReadSectors(0, 1, table_buf); memcpy(&table, table_buf, sizeof(table)); SAFE_FREE(table_buf); if (ret < 0) return ret; break; } case WBFS_DEVICE_SDHC: { /* SDHC sector size */ sector_size = SDHC_SECTOR_SIZE; /* Read partition table */ ret = SDHC_ReadSectors(0, 1, &table); if (!ret) return -1; break; } default: return -1; } /* Swap endianess */ for (cnt = 0; cnt < 4; cnt++) { partitionEntry *entry = &table.entries[cnt]; entry->sector = swap32(entry->sector); entry->size = swap32(entry->size); } /* Set partition entries */ memcpy(outbuf, table.entries, sizeof(table.entries)); /* Set sector size */ *outval = sector_size; return 0; }
bool Device_ReadSectors(u32 device, u32 sector, u32 count, void *buffer) { s32 ret; /* Read from specified device */ switch (device) { case WBFS_DEVICE_USB: ret = USBStorage_ReadSectors(sector, count, buffer); if (ret < 0) return false; return true; case WBFS_DEVICE_SDHC: return SDHC_ReadSectors(sector, count, buffer); } return false; }