*Added support for Wiimms virtual sector sizes for WBFS (sector sizes other than 512 bytes per sector). Sector sizes other than 512 bytes support more games than 500 (sector size - 12 games). You can just format your drive with Wiimms tools and use it.

*Changed USB Loader GX WBFS formatter to choose 2048 as virtual sector size if a drive with a size > 500GB is formatted.

NOTE: Don't use this feature with IOS58 mode. It might damage the partition. I did not build in a safety check for IOS58 mode because it will be removed soon anyway.
This commit is contained in:
dimok321 2011-02-04 15:25:27 +00:00
parent ca55f426c0
commit ae77bd1b7e
12 changed files with 56 additions and 44 deletions

View File

@ -2,8 +2,8 @@
<app version="1"> <app version="1">
<name> USB Loader GX</name> <name> USB Loader GX</name>
<coder>USB Loader GX Team</coder> <coder>USB Loader GX Team</coder>
<version>2.0 r1061</version> <version>2.0 r1062</version>
<release_date>201102021831</release_date> <release_date>201102032147</release_date>
<no_ios_reload/> <no_ios_reload/>
<short_description>Loads games from USB-devices</short_description> <short_description>Loads games from USB-devices</short_description>
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. <long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.

View File

@ -94,7 +94,7 @@ void BoxCover::WiiPADControl(GuiTrigger *t)
} }
else if((t->wpad.btns_h & WPAD_BUTTON_A) && moveChan == t->chan && t->wpad.ir.valid) else if((t->wpad.btns_h & WPAD_BUTTON_A) && moveChan == t->chan && t->wpad.ir.valid)
{ {
movePosX = (t->wpad.ir.x-moveStartPosX) / 220.0f; movePosX = (t->wpad.ir.x-moveStartPosX) / 180.0f;
movePosY = (moveStartPosY-t->wpad.ir.y) / 180.0f; movePosY = (moveStartPosY-t->wpad.ir.y) / 180.0f;
last_manual_move_frame = frameCount; last_manual_move_frame = frameCount;
} }
@ -199,10 +199,10 @@ void BoxCover::Draw()
GX_LoadPosMtxImm(modelView, GX_PNMTX0); GX_LoadPosMtxImm(modelView, GX_PNMTX0);
//! Border quads
GX_LoadTexObj(&boxBorderTex, GX_TEXMAP0); GX_LoadTexObj(&boxBorderTex, GX_TEXMAP0);
GX_InvalidateTexAll(); GX_InvalidateTexAll();
//! Border quads
GX_SetArray(GX_VA_POS, (void *) &g_boxMeshQ[0].pos, sizeof(g_boxMeshQ[0])); GX_SetArray(GX_VA_POS, (void *) &g_boxMeshQ[0].pos, sizeof(g_boxMeshQ[0]));
GX_SetArray(GX_VA_TEX0, (void *) &g_boxMeshQ[0].texCoord, sizeof(g_boxMeshQ[0])); GX_SetArray(GX_VA_TEX0, (void *) &g_boxMeshQ[0].texCoord, sizeof(g_boxMeshQ[0]));
@ -228,10 +228,10 @@ void BoxCover::Draw()
} }
GX_End(); GX_End();
//! Back Cover (Might be flat)
GX_LoadTexObj(flatCover ? &defaultBoxTex : &coverTex, GX_TEXMAP0); GX_LoadTexObj(flatCover ? &defaultBoxTex : &coverTex, GX_TEXMAP0);
GX_InvalidateTexAll(); GX_InvalidateTexAll();
//! Back Cover
GX_SetArray(GX_VA_POS, (void *) &g_boxBackCoverMesh[0].pos, sizeof(g_boxBackCoverMesh[0])); GX_SetArray(GX_VA_POS, (void *) &g_boxBackCoverMesh[0].pos, sizeof(g_boxBackCoverMesh[0]));
GX_SetArray(GX_VA_TEX0, (void *) &g_boxBackCoverMesh[0].texCoord, sizeof(g_boxBackCoverMesh[0])); GX_SetArray(GX_VA_TEX0, (void *) &g_boxBackCoverMesh[0].texCoord, sizeof(g_boxBackCoverMesh[0]));

View File

@ -754,8 +754,11 @@ int wbfs_extract_file(wbfs_disc_t*d, char *path, void **data)
int wbfs_get_fragments(wbfs_disc_t *d, _frag_append_t append_fragment, void *callback_data) int wbfs_get_fragments(wbfs_disc_t *d, _frag_append_t append_fragment, void *callback_data)
{ {
if (!d) return -1; if (!d) return -1;
//! Use here real physical HDD sector size
u32 phys_hdd_sec_sz = *(((u32 *) d->p->callback_data)+1);
wbfs_t *p = d->p; wbfs_t *p = d->p;
int src_wbs_nlb = p->wbfs_sec_sz / p->hd_sec_sz; int src_wbs_nlb = p->wbfs_sec_sz / phys_hdd_sec_sz;
int i, ret, last = 0; int i, ret, last = 0;
for (i = 0; i < p->n_wbfs_sec_per_disc; i++) for (i = 0; i < p->n_wbfs_sec_per_disc; i++)
{ {

View File

@ -351,7 +351,7 @@ static void ProgressWindow(const char *title, const char *msg1, const char *msg2
while (showProgress) while (showProgress)
{ {
usleep(30000); usleep(50000);
if (shutdown) if (shutdown)
Sys_Shutdown(); Sys_Shutdown();

View File

@ -300,9 +300,6 @@ int LoaderSettings::GetMenuInternal()
//! Settings: Game/Install Partition //! Settings: Game/Install Partition
else if (ret == ++Idx) else if (ret == ++Idx)
{ {
if(DeviceHandler::Instance()->GetUSBHandle()->GetPartitionCount() < 2)
return MENU_NONE;
// Select the next valid partition, even if that's the same one // Select the next valid partition, even if that's the same one
int fs_type = 0; int fs_type = 0;
int ios = IOS_GetVersion(); int ios = IOS_GetVersion();

View File

@ -48,6 +48,7 @@ void GameList::clear()
//! Clear memory of the vector completely //! Clear memory of the vector completely
std::vector<struct discHdr *>().swap(FilteredList); std::vector<struct discHdr *>().swap(FilteredList);
std::vector<struct discHdr>().swap(FullGameList); std::vector<struct discHdr>().swap(FullGameList);
std::vector<int>().swap(GamePartitionList);
} }
struct discHdr * GameList::GetDiscHeader(const char * gameID) const struct discHdr * GameList::GetDiscHeader(const char * gameID) const
@ -78,8 +79,6 @@ int GameList::GetPartitionNumber(const u8 *gameID) const
void GameList::RemovePartition(int part) void GameList::RemovePartition(int part)
{ {
wString filter(GameFilter);
for(u32 i = 0; i < GamePartitionList.size(); ++i) for(u32 i = 0; i < GamePartitionList.size(); ++i)
{ {
if(GamePartitionList[i] == part) if(GamePartitionList[i] == part)
@ -91,8 +90,11 @@ void GameList::RemovePartition(int part)
} }
if(FullGameList.size() > 0) if(FullGameList.size() > 0)
{
wString filter(GameFilter);
FilterList(filter.c_str()); FilterList(filter.c_str());
} }
}
int GameList::InternalReadList(int part) int GameList::InternalReadList(int part)
{ {

View File

@ -35,16 +35,12 @@ void WBFS_CloseDisc(wbfs_disc_t *disc)
{ {
if(!disc) return; if(!disc) return;
for(u32 i = 0; i < WbfsList.size(); ++i) struct discHdr * header = (struct discHdr *) disc->header;
{ int part_num = gameList.GetPartitionNumber(header->id);
if(!WbfsList[i]) continue; if(!VALID(part_num))
return;
if(WbfsList[i]->GetHDDHandle() == disc->p) WbfsList[part_num]->CloseDisc(disc);
{
WbfsList[i]->CloseDisc(disc);
break;
}
}
} }
s32 WBFS_Init(u32 device) s32 WBFS_Init(u32 device)
@ -117,7 +113,6 @@ bool WBFS_Close(int part_num)
if(!VALID(part_num)) if(!VALID(part_num))
return false; return false;
WbfsList[part_num]->Close();
delete WbfsList[part_num]; delete WbfsList[part_num];
WbfsList[part_num] = NULL; WbfsList[part_num] = NULL;
@ -128,6 +123,8 @@ bool WBFS_Close(int part_num)
void WBFS_CloseAll() void WBFS_CloseAll()
{ {
gameList.clear();
for(u32 i = 0; i < WbfsList.size(); ++i) for(u32 i = 0; i < WbfsList.size(); ++i)
WBFS_Close(i); WBFS_Close(i);
} }
@ -159,7 +156,7 @@ s32 WBFS_CheckGame(u8 *discid)
{ {
int part_num = gameList.GetPartitionNumber(discid); int part_num = gameList.GetPartitionNumber(discid);
if(!VALID(part_num)) if(!VALID(part_num))
return -1; return 0;
return WbfsList[part_num]->CheckGame(discid); return WbfsList[part_num]->CheckGame(discid);
} }

View File

@ -12,7 +12,7 @@ class Wbfs
{ {
public: public:
Wbfs(u32, u32, u32); Wbfs(u32, u32, u32);
~Wbfs() { Close(); };
static s32 Init(u32); static s32 Init(u32);
s32 CheckGame(u8 *); s32 CheckGame(u8 *);
s32 GameSize(u8 *, f32 *); s32 GameSize(u8 *, f32 *);
@ -21,7 +21,7 @@ class Wbfs
virtual bool ShowFreeSpace(void); virtual bool ShowFreeSpace(void);
virtual s32 Open() = 0; virtual s32 Open() = 0;
virtual void Close() = 0; virtual void Close() {};
virtual wbfs_disc_t* OpenDisc(u8 *discid) = 0; virtual wbfs_disc_t* OpenDisc(u8 *discid) = 0;
virtual void CloseDisc(wbfs_disc_t *disc) = 0; virtual void CloseDisc(wbfs_disc_t *disc) = 0;
virtual s32 Format(); virtual s32 Format();

View File

@ -36,7 +36,7 @@ using namespace std;
static const char wbfs_fat_dir[] = "/wbfs"; static const char wbfs_fat_dir[] = "/wbfs";
static const char invalid_path[] = "/\\:|<>?*\"'"; static const char invalid_path[] = "/\\:|<>?*\"'";
static const u32 fat_sector_size = 512; extern u32 hdd_sector_size;
Wbfs_Fat::Wbfs_Fat(u32 device, u32 lba, u32 size) : Wbfs_Fat::Wbfs_Fat(u32 device, u32 lba, u32 size) :
Wbfs(device, lba, size), fat_hdr_list(NULL), fat_hdr_count(0) Wbfs(device, lba, size), fat_hdr_list(NULL), fat_hdr_count(0)
@ -96,13 +96,13 @@ wbfs_disc_t* Wbfs_Fat::OpenDisc(u8 *discid)
return iso_file; return iso_file;
} }
hdd = OpenPart(fname); wbfs_t *part = OpenPart(fname);
if (!hdd) return NULL; if (!part) return NULL;
wbfs_disc_t *disc = wbfs_open_disc(hdd, discid); wbfs_disc_t *disc = wbfs_open_disc(part, discid);
if(!disc) if(!disc)
{ {
ClosePart(hdd); ClosePart(part);
return NULL; return NULL;
} }
@ -318,12 +318,12 @@ u64 Wbfs_Fat::EstimateGameSize()
{ {
wbfs_t *part = NULL; wbfs_t *part = NULL;
u64 size = (u64) 143432 * 2 * 0x8000ULL; u64 size = (u64) 143432 * 2 * 0x8000ULL;
u32 n_sector = size / fat_sector_size; u32 n_sector = size / hdd_sector_size;
u32 wii_sec_sz; u32 wii_sec_sz;
// init a temporary dummy part // init a temporary dummy part
// as a placeholder for wbfs_size_disc // as a placeholder for wbfs_size_disc
part = wbfs_open_partition(nop_rw_sector, nop_rw_sector, NULL, fat_sector_size, n_sector, 0, 1); part = wbfs_open_partition(nop_rw_sector, nop_rw_sector, NULL, hdd_sector_size, n_sector, 0, 1);
if (!part) return -1; if (!part) return -1;
wii_sec_sz = part->wii_sec_sz; wii_sec_sz = part->wii_sec_sz;
@ -687,7 +687,7 @@ wbfs_t* Wbfs_Fat::OpenPart(char *fname)
ret = split_open(&split, fname); ret = split_open(&split, fname);
if (ret) return NULL; if (ret) return NULL;
part = wbfs_open_partition(split_read_sector, nop_rw_sector, //readonly //split_write_sector, part = wbfs_open_partition(split_read_sector, nop_rw_sector, //readonly //split_write_sector,
&split, fat_sector_size, split.total_sec, 0, 0); &split, hdd_sector_size, split.total_sec, 0, 0);
if (!part) if (!part)
{ {
split_close(&split); split_close(&split);
@ -769,7 +769,7 @@ wbfs_t* Wbfs_Fat::CreatePart(u8 *id, char *path)
return NULL; return NULL;
} }
part = wbfs_open_partition(split_read_sector, split_write_sector, &split, fat_sector_size, n_sector, 0, 1); part = wbfs_open_partition(split_read_sector, split_write_sector, &split, hdd_sector_size, n_sector, 0, 1);
if (!part) if (!part)
{ {
split_close(&split); split_close(&split);

View File

@ -11,7 +11,6 @@ class Wbfs_Fat: public Wbfs
{ {
public: public:
Wbfs_Fat(u32 device, u32 lba, u32 size); Wbfs_Fat(u32 device, u32 lba, u32 size);
~Wbfs_Fat();
virtual s32 Open(); virtual s32 Open();
virtual void Close(); virtual void Close();

View File

@ -68,12 +68,12 @@ s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf)
u32 cnt = 0; u32 cnt = 0;
s32 ret; s32 ret;
u32 partition_offset = info->partition_lba + (lba-info->partition_lba)*(info->wbfs_sector_size/info->hdd_sector_size); u32 partition_offset = info->partition_lba + (lba-info->partition_lba)*(info->wbfs_sector_size/info->hdd_sector_size);
count *= info->wbfs_sector_size/info->hdd_sector_size; count *= (info->wbfs_sector_size/info->hdd_sector_size);
/* Do reads */ /* Do reads */
while (cnt < count) while (cnt < count)
{ {
u8 *ptr = ((u8 *) iobuf) + (cnt * info->wbfs_sector_size); u8 *ptr = ((u8 *) iobuf) + (cnt * info->hdd_sector_size);
u32 sectors = (count - cnt); u32 sectors = (count - cnt);
/* Read sectors is too big */ /* Read sectors is too big */
@ -96,12 +96,12 @@ s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf)
u32 cnt = 0; u32 cnt = 0;
s32 ret; s32 ret;
u32 partition_offset = info->partition_lba + (lba-info->partition_lba)*(info->wbfs_sector_size/info->hdd_sector_size); u32 partition_offset = info->partition_lba + (lba-info->partition_lba)*(info->wbfs_sector_size/info->hdd_sector_size);
count *= info->wbfs_sector_size/info->hdd_sector_size; count *= (info->wbfs_sector_size/info->hdd_sector_size);
/* Do writes */ /* Do writes */
while (cnt < count) while (cnt < count)
{ {
u8 *ptr = ((u8 *) iobuf) + (cnt * info->wbfs_sector_size); u8 *ptr = ((u8 *) iobuf) + (cnt * info->hdd_sector_size);
u32 sectors = (count - cnt); u32 sectors = (count - cnt);
/* Write sectors is too big */ /* Write sectors is too big */

View File

@ -4,19 +4,21 @@
#include "usbloader/wbfs.h" #include "usbloader/wbfs.h"
#include "wbfs_rw.h" #include "wbfs_rw.h"
#define MAX_WBFS_SECTORSIZE 4096
extern u32 hdd_sector_size; extern u32 hdd_sector_size;
s32 Wbfs_Wbfs::Open() s32 Wbfs_Wbfs::Open()
{ {
wbfs_t *part = NULL; wbfs_t *part = NULL;
PartInfo.wbfs_sector_size = hdd_sector_size; PartInfo.wbfs_sector_size = MAX_WBFS_SECTORSIZE;
PartInfo.hdd_sector_size = hdd_sector_size; PartInfo.hdd_sector_size = hdd_sector_size;
PartInfo.partition_lba = lba; PartInfo.partition_lba = lba;
PartInfo.partition_num_sec = size; PartInfo.partition_num_sec = size;
u8 * buffer = (u8 *) malloc(hdd_sector_size); u8 * buffer = (u8 *) malloc(MAX_WBFS_SECTORSIZE);
memset(buffer, 0, hdd_sector_size); memset(buffer, 0, MAX_WBFS_SECTORSIZE);
if(readCallback(&PartInfo, lba, 1, buffer) < 0) if(readCallback(&PartInfo, lba, 1, buffer) < 0)
{ {
@ -31,10 +33,14 @@ s32 Wbfs_Wbfs::Open()
if (head.magic != wbfs_htonl(WBFS_MAGIC)) if (head.magic != wbfs_htonl(WBFS_MAGIC))
return -1; return -1;
/* Set correct sector values for wbfs read/write */
PartInfo.wbfs_sector_size = 1 << head.hd_sec_sz_s; PartInfo.wbfs_sector_size = 1 << head.hd_sec_sz_s;
PartInfo.partition_num_sec = head.n_hd_sec;
/* Open partition */ /* Open partition */
part = wbfs_open_partition(readCallback, writeCallback, &PartInfo, 1 << head.hd_sec_sz_s, head.n_hd_sec, lba, 0); part = wbfs_open_partition(readCallback, writeCallback, &PartInfo,
PartInfo.wbfs_sector_size, PartInfo.partition_num_sec,
lba, 0);
if (!part) return -1; if (!part) return -1;
/* Close current hard disk */ /* Close current hard disk */
@ -79,10 +85,18 @@ s32 Wbfs_Wbfs::Format()
HDD_Inf.partition_lba = lba; HDD_Inf.partition_lba = lba;
HDD_Inf.partition_num_sec = size; HDD_Inf.partition_num_sec = size;
//! If size is over 500GB in sectors and sector size is 512
//! set 2048 as hdd sector size
if(size > 1048576000 && hdd_sector_size == 512)
{
HDD_Inf.wbfs_sector_size = 2048;
HDD_Inf.partition_num_sec = size/(2048/hdd_sector_size);
}
wbfs_t *partition = NULL; wbfs_t *partition = NULL;
/* Reset partition */ /* Reset partition */
partition = wbfs_open_partition(readCallback, writeCallback, &PartInfo, hdd_sector_size, size, lba, 1); partition = wbfs_open_partition(readCallback, writeCallback, &HDD_Inf, HDD_Inf.wbfs_sector_size, HDD_Inf.partition_num_sec, lba, 1);
if (!partition) return -1; if (!partition) return -1;
/* Free memory */ /* Free memory */