mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-19 09:49:21 +01:00
*Reverting some stuff to the OLD way before new IOS222
Now if you use 249 there is no change to R492 before 222. So if you still get blackscreens it wasnt caused by that.
This commit is contained in:
parent
fc76b6a9c6
commit
587fdbbae2
@ -25,131 +25,42 @@ static u8 size_to_shift(u32 size)
|
|||||||
size>>=1;
|
size>>=1;
|
||||||
}
|
}
|
||||||
return ret-1;
|
return ret-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define read_le32_unaligned(x) ((x)[0]|((x)[1]<<8)|((x)[2]<<16)|((x)[3]<<24))
|
#define read_le32_unaligned(x) ((x)[0]|((x)[1]<<8)|((x)[2]<<16)|((x)[3]<<24))
|
||||||
|
|
||||||
|
|
||||||
u32 WBFS_part_list[4]={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};
|
wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
|
||||||
|
rw_sector_callback_t write_hdsector,
|
||||||
|
void *callback_data,
|
||||||
u32 wbfs_get_partition_LBA(int index)
|
int hd_sector_size, int num_hd_sector __attribute((unused)), int reset)
|
||||||
{
|
{
|
||||||
return WBFS_part_list[index & 3];
|
int i=num_hd_sector,ret;
|
||||||
}
|
u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size);
|
||||||
|
u8 part_table[16*4];
|
||||||
|
ret = read_hdsector(callback_data,0,1,tmp_buffer);
|
||||||
wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
|
if(ret)
|
||||||
rw_sector_callback_t write_hdsector,
|
return 0;
|
||||||
void *callback_data,
|
//find wbfs partition
|
||||||
int hd_sector_size, int num_hd_sector __attribute((unused)), int reset)
|
wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4);
|
||||||
{
|
ptr = part_table;
|
||||||
int i=num_hd_sector,ret;
|
for(i=0;i<4;i++,ptr+=16)
|
||||||
u8 *ptr,*tmp_buffer = wbfs_ioalloc(hd_sector_size);
|
{
|
||||||
u8 part_table[16*4];
|
u32 part_lba = read_le32_unaligned(ptr+0x8);
|
||||||
int l;
|
wbfs_head_t *head = (wbfs_head_t *)tmp_buffer;
|
||||||
|
ret = read_hdsector(callback_data,part_lba,1,tmp_buffer);
|
||||||
ret = read_hdsector(callback_data,0,1,tmp_buffer);
|
// verify there is the magic.
|
||||||
if(ret)
|
if (head->magic == wbfs_htonl(WBFS_MAGIC))
|
||||||
{
|
{
|
||||||
wbfs_iofree(tmp_buffer);
|
wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
|
||||||
return 0;
|
callback_data,hd_sector_size,0,part_lba,reset);
|
||||||
}
|
return p;
|
||||||
//find wbfs partition
|
}
|
||||||
wbfs_memcpy(part_table,tmp_buffer+0x1be,16*4);
|
}
|
||||||
ptr = part_table;
|
if(reset)// XXX make a empty hd partition..
|
||||||
|
{
|
||||||
for(l=0;l<4;l++) WBFS_part_list[l]=0xFFFFFFFF;
|
}
|
||||||
|
return 0;
|
||||||
l=0;
|
}
|
||||||
|
|
||||||
for(i=0;i<4;i++,ptr+=16)
|
|
||||||
{
|
|
||||||
u32 part_lba = read_le32_unaligned(ptr+0x8);
|
|
||||||
wbfs_head_t *head = (wbfs_head_t *)tmp_buffer;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if(head->magic != wbfs_htonl(WBFS_MAGIC))
|
|
||||||
if(ptr[4]==0) continue;
|
|
||||||
|
|
||||||
if(ptr[4]==0xf)
|
|
||||||
{
|
|
||||||
u32 part_lba2=part_lba;
|
|
||||||
u32 next_lba2=0;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
for(n=0;n<8;n++) // max 8 logic partitions (i think it is sufficient!)
|
|
||||||
{
|
|
||||||
ret = read_hdsector(callback_data,part_lba+next_lba2 ,1,tmp_buffer);
|
|
||||||
if(ret)
|
|
||||||
{
|
|
||||||
wbfs_iofree(tmp_buffer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
part_lba2=part_lba+next_lba2+read_le32_unaligned(tmp_buffer+0x1C6);
|
|
||||||
next_lba2=read_le32_unaligned(tmp_buffer+0x1D6);
|
|
||||||
|
|
||||||
ret = read_hdsector(callback_data,part_lba2,1,tmp_buffer);
|
|
||||||
if(ret)
|
|
||||||
{
|
|
||||||
wbfs_iofree(tmp_buffer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// verify there is the magic.
|
|
||||||
if (head->magic == wbfs_htonl(WBFS_MAGIC))
|
|
||||||
{
|
|
||||||
|
|
||||||
WBFS_part_list[l]=part_lba2;
|
|
||||||
if(l>0 && WBFS_part_list[l-1]==WBFS_part_list[l]) WBFS_part_list[l]=0xFFFFFFFF;
|
|
||||||
else l++; if(l>=4) break;
|
|
||||||
|
|
||||||
/*wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
|
|
||||||
callback_data,hd_sector_size,0,part_lba2,reset);
|
|
||||||
return p;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if(next_lba2==0) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
ret = read_hdsector(callback_data,part_lba,1,tmp_buffer);
|
|
||||||
|
|
||||||
if(ret)
|
|
||||||
{
|
|
||||||
wbfs_iofree(tmp_buffer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// verify there is the magic.
|
|
||||||
if (head->magic == wbfs_htonl(WBFS_MAGIC))
|
|
||||||
{
|
|
||||||
WBFS_part_list[l]=part_lba;
|
|
||||||
if(l>0 && WBFS_part_list[l-1]==WBFS_part_list[l]) WBFS_part_list[l]=0xFFFFFFFF;
|
|
||||||
else l++; if(l>=4) break;
|
|
||||||
/*
|
|
||||||
wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
|
|
||||||
callback_data,hd_sector_size,0,part_lba,reset);
|
|
||||||
return p;*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(l>=4) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
wbfs_iofree(tmp_buffer);
|
|
||||||
|
|
||||||
if(WBFS_part_list[0]==0xFFFFFFFF) return 0;
|
|
||||||
|
|
||||||
// open the first partition finded
|
|
||||||
|
|
||||||
wbfs_t*p = wbfs_open_partition(read_hdsector,write_hdsector,
|
|
||||||
callback_data,hd_sector_size,0,WBFS_part_list[0],reset);
|
|
||||||
return p;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
wbfs_t*wbfs_open_partition(rw_sector_callback_t read_hdsector,
|
wbfs_t*wbfs_open_partition(rw_sector_callback_t read_hdsector,
|
||||||
rw_sector_callback_t write_hdsector,
|
rw_sector_callback_t write_hdsector,
|
||||||
void *callback_data,
|
void *callback_data,
|
||||||
|
@ -122,15 +122,6 @@ wbfs_t*wbfs_open_hd(rw_sector_callback_t read_hdsector,
|
|||||||
rw_sector_callback_t write_hdsector,
|
rw_sector_callback_t write_hdsector,
|
||||||
void *callback_data,
|
void *callback_data,
|
||||||
int hd_sector_size, int num_hd_sector, int reset);
|
int hd_sector_size, int num_hd_sector, int reset);
|
||||||
|
|
||||||
/* call wbfs_open_hd at first time to find the WBFS partition on the HDD (max 4 partitions)
|
|
||||||
|
|
||||||
wbfs_get_partition_LBA receive 0 to 3 as partition index (first, second...) and return 0xFFFFFFFF if WBFS partition is not finded
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
u32 wbfs_get_partition_LBA(int index);
|
|
||||||
|
|
||||||
/*! @brief open a wbfs partition
|
/*! @brief open a wbfs partition
|
||||||
@param read_hdsector,write_hdsector: accessors to the partition
|
@param read_hdsector,write_hdsector: accessors to the partition
|
||||||
|
@ -14,8 +14,7 @@
|
|||||||
|
|
||||||
#define wbfs_malloc(x) malloc(x)
|
#define wbfs_malloc(x) malloc(x)
|
||||||
#define wbfs_free(x) free(x)
|
#define wbfs_free(x) free(x)
|
||||||
#define wbfs_ioalloc(x) memalign(32, x)
|
#define wbfs_ioalloc(x) memalign(32, x)
|
||||||
#define wbfs_iofree(x) free(x) // XXX should allocate in a ios heap
|
|
||||||
#define wbfs_iofree(x) free(x)
|
#define wbfs_iofree(x) free(x)
|
||||||
#define wbfs_be16(x) (*((u16*)(x)))
|
#define wbfs_be16(x) (*((u16*)(x)))
|
||||||
#define wbfs_be32(x) (*((u32*)(x)))
|
#define wbfs_be32(x) (*((u32*)(x)))
|
||||||
|
@ -1324,7 +1324,7 @@ static int MenuInstall()
|
|||||||
int menu = MENU_NONE;
|
int menu = MENU_NONE;
|
||||||
static struct discHdr headerdisc ATTRIBUTE_ALIGN(32);
|
static struct discHdr headerdisc ATTRIBUTE_ALIGN(32);
|
||||||
|
|
||||||
Disc_SetUSB(NULL, GetPartition());
|
Disc_SetUSB(NULL);
|
||||||
|
|
||||||
int ret, choice = 0;
|
int ret, choice = 0;
|
||||||
char *name;
|
char *name;
|
||||||
@ -1582,10 +1582,7 @@ static int MenuFormat()
|
|||||||
menu = MENU_SETTINGS;
|
menu = MENU_SETTINGS;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
for(int i = 0; i < 4; i++) {
|
ret = WBFS_Open();
|
||||||
ret = WBFS_Open2(i);
|
|
||||||
if(ret == 0) break;
|
|
||||||
}
|
|
||||||
sprintf(text, "%s %s", text,LANGUAGE.formated);
|
sprintf(text, "%s %s", text,LANGUAGE.formated);
|
||||||
WindowPrompt(LANGUAGE.Success,text,LANGUAGE.ok,0,0,0);
|
WindowPrompt(LANGUAGE.Success,text,LANGUAGE.ok,0,0,0);
|
||||||
menu = MENU_DISCLIST;
|
menu = MENU_DISCLIST;
|
||||||
@ -1700,10 +1697,7 @@ static int MenuCheck()
|
|||||||
Sys_LoadMenu();
|
Sys_LoadMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < 4; i++) {
|
ret2 = WBFS_Open();
|
||||||
ret2 = WBFS_Open2(i);
|
|
||||||
if(ret2 == 0) break;
|
|
||||||
}
|
|
||||||
if (ret2 < 0) {
|
if (ret2 < 0) {
|
||||||
choice = WindowPrompt(LANGUAGE.NoWBFSpartitionfound,
|
choice = WindowPrompt(LANGUAGE.NoWBFSpartitionfound,
|
||||||
LANGUAGE.Youneedtoformatapartition,
|
LANGUAGE.Youneedtoformatapartition,
|
||||||
@ -1871,7 +1865,7 @@ int MainMenu(int menu)
|
|||||||
Sys_IosReload(249);
|
Sys_IosReload(249);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = Disc_SetUSB(header->id, GetPartition());
|
ret = Disc_SetUSB(header->id);
|
||||||
if(ret < 0) Sys_BackToLoader();
|
if(ret < 0) Sys_BackToLoader();
|
||||||
ret = Disc_Open();
|
ret = Disc_Open();
|
||||||
if(ret < 0) Sys_BackToLoader();
|
if(ret < 0) Sys_BackToLoader();
|
||||||
|
@ -81,15 +81,14 @@ int Sys_IosReload(int IOS)
|
|||||||
SDCard_deInit();
|
SDCard_deInit();
|
||||||
USBDevice_deInit();
|
USBDevice_deInit();
|
||||||
|
|
||||||
mload_close();
|
|
||||||
|
|
||||||
WPAD_Flush(0);
|
WPAD_Flush(0);
|
||||||
WPAD_Disconnect(0);
|
WPAD_Disconnect(0);
|
||||||
WPAD_Shutdown();
|
WPAD_Shutdown();
|
||||||
|
|
||||||
USBStorage_Deinit();
|
|
||||||
WDVD_Close();
|
WDVD_Close();
|
||||||
|
|
||||||
|
USBStorage_Deinit();
|
||||||
|
|
||||||
if(IOS == 249 || IOS == 222 || IOS == 223) {
|
if(IOS == 249 || IOS == 222 || IOS == 223) {
|
||||||
for(int i = 0; i < 10; i++) {
|
for(int i = 0; i < 10; i++) {
|
||||||
ret = IOS_ReloadIOS(IOS);
|
ret = IOS_ReloadIOS(IOS);
|
||||||
@ -102,12 +101,8 @@ int Sys_IosReload(int IOS)
|
|||||||
}
|
}
|
||||||
if(ret>=0) {
|
if(ret>=0) {
|
||||||
ret = Disc_Init();
|
ret = Disc_Init();
|
||||||
int i = 0;
|
|
||||||
if(ret>=0) {
|
if(ret>=0) {
|
||||||
for(i = 0; i < 4; i++) {
|
ret = WBFS_Open();
|
||||||
ret = WBFS_Open2(i);
|
|
||||||
if(ret == 0) break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else Sys_BackToLoader();
|
} else Sys_BackToLoader();
|
||||||
}
|
}
|
||||||
|
@ -217,10 +217,10 @@ s32 Disc_Wait(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Disc_SetUSB(u8 *id, int ios222)
|
s32 Disc_SetUSB(u8 *id)
|
||||||
{
|
{
|
||||||
/* Set USB mode */
|
/* Set USB mode */
|
||||||
return WDVD_SetUSBMode(id, ios222);
|
return WDVD_SetUSBMode(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 Disc_ReadHeader(void *outbuf)
|
s32 Disc_ReadHeader(void *outbuf)
|
||||||
|
@ -43,7 +43,7 @@ s32 Disc_Init(void);
|
|||||||
s32 Disc_Open(void);
|
s32 Disc_Open(void);
|
||||||
s32 Disc_Wait(void);
|
s32 Disc_Wait(void);
|
||||||
void __Disc_SetLowMem(void);
|
void __Disc_SetLowMem(void);
|
||||||
s32 Disc_SetUSB(u8 *, int ios222);
|
s32 Disc_SetUSB(u8 *);
|
||||||
s32 Disc_ReadHeader(void *);
|
s32 Disc_ReadHeader(void *);
|
||||||
s32 Disc_IsWii(void);
|
s32 Disc_IsWii(void);
|
||||||
s32 Disc_BootPartition(u64, u8, u8, u8, u8, u8);
|
s32 Disc_BootPartition(u64, u8, u8, u8, u8, u8);
|
||||||
|
@ -21,8 +21,7 @@ static wbfs_t *hdd = NULL;
|
|||||||
|
|
||||||
/* WBFS callbacks */
|
/* WBFS callbacks */
|
||||||
static rw_sector_callback_t readCallback = NULL;
|
static rw_sector_callback_t readCallback = NULL;
|
||||||
static rw_sector_callback_t writeCallback = NULL;
|
static rw_sector_callback_t writeCallback = NULL;
|
||||||
static int current_partition = 0;
|
|
||||||
|
|
||||||
/* Variables */
|
/* Variables */
|
||||||
|
|
||||||
@ -75,35 +74,6 @@ void __WBFS_Spinner(s32 x, s32 max)
|
|||||||
wbfs_t *GetHddInfo(void)
|
wbfs_t *GetHddInfo(void)
|
||||||
{
|
{
|
||||||
return hdd;
|
return hdd;
|
||||||
}
|
|
||||||
|
|
||||||
s32 WBFS_Open2(int index) // index 0-3
|
|
||||||
{
|
|
||||||
u32 lba;
|
|
||||||
/* Close hard disk */
|
|
||||||
if (hdd)
|
|
||||||
wbfs_close(hdd);hdd=0;
|
|
||||||
|
|
||||||
lba = wbfs_get_partition_LBA(index);
|
|
||||||
|
|
||||||
current_partition = index & 3;
|
|
||||||
|
|
||||||
if(lba==0xFFFFFFFF)
|
|
||||||
{
|
|
||||||
if((index & 3)==0) return WBFS_Open();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* Open hard disk */
|
|
||||||
hdd = wbfs_open_partition(readCallback, writeCallback, NULL, sector_size, 0, lba, 0);
|
|
||||||
if (!hdd)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 GetPartition()
|
|
||||||
{
|
|
||||||
return current_partition;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf)
|
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf)
|
||||||
|
@ -20,9 +20,7 @@ enum {
|
|||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
|
|
||||||
s32 WBFS_Init(u32);
|
s32 WBFS_Init(u32);
|
||||||
s32 WBFS_Open();
|
s32 WBFS_Open(void);
|
||||||
s32 WBFS_Open2(int partition);
|
|
||||||
s32 GetPartition();
|
|
||||||
s32 WBFS_Close(void);
|
s32 WBFS_Close(void);
|
||||||
s32 WBFS_Format(u32, u32);
|
s32 WBFS_Format(u32, u32);
|
||||||
s32 WBFS_GetCount(u32 *);
|
s32 WBFS_GetCount(u32 *);
|
||||||
@ -37,6 +35,10 @@ s32 WBFS_DiskSpace(f32 *, f32 *);
|
|||||||
s32 WBFS_RenameGame(u8 *, const void *);
|
s32 WBFS_RenameGame(u8 *, const void *);
|
||||||
f32 WBFS_EstimeGameSize(void);
|
f32 WBFS_EstimeGameSize(void);
|
||||||
|
|
||||||
|
s32 __WBFS_ReadUSB(void *fp, u32 lba, u32 count, void *iobuf);
|
||||||
|
s32 __WBFS_WriteUSB(void *fp, u32 lba, u32 count, void *iobuf);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -322,7 +322,7 @@ s32 WDVD_DisableReset(u8 val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Hermes **/
|
/** Hermes **/
|
||||||
s32 WDVD_SetUSBMode(u8 *id, s32 partition)
|
s32 WDVD_SetUSBMode(u8 *id)
|
||||||
{
|
{
|
||||||
s32 ret;
|
s32 ret;
|
||||||
|
|
||||||
@ -334,19 +334,17 @@ s32 WDVD_SetUSBMode(u8 *id, s32 partition)
|
|||||||
|
|
||||||
|
|
||||||
/* Copy ID */
|
/* Copy ID */
|
||||||
if (id)
|
if (id) {
|
||||||
{
|
|
||||||
memcpy(&inbuf[2], id, 6);
|
memcpy(&inbuf[2], id, 6);
|
||||||
inbuf[5] = partition;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ret = IOS_Ioctl(di_fd, IOCTL_DI_SETUSBMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
|
ret = IOS_Ioctl(di_fd, IOCTL_DI_SETUSBMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
|
||||||
if(ret!=1)
|
if(ret!=1) {
|
||||||
{ // Try old cIOS 222
|
// Try old cIOS 222
|
||||||
/* Set USB mode */
|
/* Set USB mode */
|
||||||
inbuf[0] = DI_SETWBFSMODE << 24;
|
inbuf[0] = DI_SETWBFSMODE << 24;
|
||||||
ret = IOS_Ioctl(di_fd, DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
|
ret = IOS_Ioctl(di_fd, DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -23,7 +23,7 @@ s32 WDVD_Read(void *, u32, u64);
|
|||||||
s32 WDVD_WaitForDisc(void);
|
s32 WDVD_WaitForDisc(void);
|
||||||
s32 WDVD_GetCoverStatus(u32 *);
|
s32 WDVD_GetCoverStatus(u32 *);
|
||||||
s32 WDVD_DisableReset(u8);
|
s32 WDVD_DisableReset(u8);
|
||||||
s32 WDVD_SetUSBMode(u8 *, s32);
|
s32 WDVD_SetUSBMode(u8 *);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user