mirror of
https://github.com/rvtr/unlaunch-installer_dev.git
synced 2026-01-26 13:43:08 -05:00
Allow retrieving the filename from the device list
Supports unlaunch/hiya booting
This commit is contained in:
parent
3bb7f0f5e2
commit
9c01c0c464
38
arm7/src/deviceList.h
Normal file
38
arm7/src/deviceList.h
Normal file
@ -0,0 +1,38 @@
|
||||
#ifndef DEVICE_LIST_H
|
||||
#define DEVICE_LIST_H
|
||||
#include <nds/memory.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct PACKED Device {
|
||||
char driveLetter;
|
||||
struct PACKED {
|
||||
u8 phisicalDrive : 1; // (0=External SD/MMC Slot, 1=Internal eMMC)
|
||||
u8 zero1 : 2; // (maybe MSBs of Drive)
|
||||
u8 deviceType : 2; // (0=Physical, 1=Virtual/File, 2=Virtual/Folder, 3=Reserved)
|
||||
u8 partition : 1; // (0=1st, 1=2nd)
|
||||
u8 zero2 : 1; // (maybe MSB of Partition)
|
||||
u8 encrypt : 1; // (set for eMMC physical devices; not for virtual, not for SD)
|
||||
};
|
||||
u8 accessRights; // (bit1=Write, bit2=Read)
|
||||
u8 zero;
|
||||
char deviceName[0x10]; // (eg. "nand" or "dataPub") (zeropadded)
|
||||
char path[0x40]; // (eg. "/" or "nand:/shared1") (zeropadded)
|
||||
} Device;
|
||||
|
||||
|
||||
typedef struct PACKED DeviceList {
|
||||
Device devices[11];
|
||||
u8 zerofilled[0x24];
|
||||
char appname[0x40];
|
||||
} DeviceList;
|
||||
|
||||
#define __DeviceList (((*(u32*)(((vu8*)__DSiHeader)+0x1D4)) >= 0x02000000) ? ((DeviceList*)((vu8*)(*(u32*)(((vu8*)__DSiHeader)+0x1D4)))) : NULL)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -29,6 +29,7 @@
|
||||
---------------------------------------------------------------------------------*/
|
||||
#include "my_sdmmc.h"
|
||||
|
||||
#include "deviceList.h"
|
||||
#include <nds.h>
|
||||
#include <string.h>
|
||||
|
||||
@ -96,10 +97,13 @@ void aes(void* in, void* out, void* iv, u32 method)
|
||||
|
||||
int my_sdmmc_nand_startup();
|
||||
|
||||
#define DEVICE_LIST_SENTINEL *(vu32*)0x02300020
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
int main()
|
||||
//---------------------------------------------------------------------------------
|
||||
{
|
||||
DEVICE_LIST_SENTINEL = 0;
|
||||
// clear sound registers
|
||||
dmaFillWords(0, (void*)0x04000400, 0x100);
|
||||
|
||||
@ -119,6 +123,12 @@ int main()
|
||||
|
||||
if (isDSiMode() /*|| ((REG_SCFG_EXT & BIT(17)) && (REG_SCFG_EXT & BIT(18)))*/)
|
||||
{
|
||||
if(__DeviceList)
|
||||
memmove((vu8*)0x02300024, __DeviceList, sizeof(DeviceList));
|
||||
else
|
||||
memset((vu8*)0x02300024, 0, sizeof(DeviceList));
|
||||
DEVICE_LIST_SENTINEL = 1;
|
||||
|
||||
vu8 *out=(vu8*)0x02300000;
|
||||
memset(out, 0, 16);
|
||||
|
||||
|
||||
27
arm9/src/deviceList.c
Normal file
27
arm9/src/deviceList.c
Normal file
@ -0,0 +1,27 @@
|
||||
#include "deviceList.h"
|
||||
#include <string.h>
|
||||
|
||||
#define DEVICE_LIST_SENTINEL *(vu32*)0x02300020
|
||||
#define DEVICE_LIST_ADDR (vu8*)0x02300024
|
||||
|
||||
DeviceList* getDeviceList(void)
|
||||
{
|
||||
static bool gotDeviceList = false;
|
||||
if(!gotDeviceList) {
|
||||
while(!DEVICE_LIST_SENTINEL);
|
||||
DeviceList* list = (DeviceList*)DEVICE_LIST_ADDR;
|
||||
bool isSd = strncmp(list->appname, "sdmc", 4) == 0;
|
||||
if(!isSd && strncmp(list->appname, "nand", 4) != 0)
|
||||
return 0;
|
||||
if(isSd)
|
||||
{
|
||||
//transform sdmc:/ to sd:/
|
||||
memmove(list->appname + 2, list->appname + 4, sizeof(list->appname) - 4);
|
||||
list->appname[sizeof(list->appname) - 1] = '\0';
|
||||
list->appname[sizeof(list->appname) - 2] = '\0';
|
||||
}
|
||||
gotDeviceList = true;
|
||||
}
|
||||
|
||||
return (DeviceList*)DEVICE_LIST_ADDR;
|
||||
}
|
||||
38
arm9/src/deviceList.h
Normal file
38
arm9/src/deviceList.h
Normal file
@ -0,0 +1,38 @@
|
||||
#ifndef DEVICE_LIST_H
|
||||
#define DEVICE_LIST_H
|
||||
#include <nds/memory.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct PACKED Device {
|
||||
char driveLetter;
|
||||
struct PACKED {
|
||||
u8 phisicalDrive : 1; // (0=External SD/MMC Slot, 1=Internal eMMC)
|
||||
u8 zero1 : 2; // (maybe MSBs of Drive)
|
||||
u8 deviceType : 2; // (0=Physical, 1=Virtual/File, 2=Virtual/Folder, 3=Reserved)
|
||||
u8 partition : 1; // (0=1st, 1=2nd)
|
||||
u8 zero2 : 1; // (maybe MSB of Partition)
|
||||
u8 encrypt : 1; // (set for eMMC physical devices; not for virtual, not for SD)
|
||||
};
|
||||
u8 accessRights; // (bit1=Write, bit2=Read)
|
||||
u8 zero;
|
||||
char deviceName[0x10]; // (eg. "nand" or "dataPub") (zeropadded)
|
||||
char path[0x40]; // (eg. "/" or "nand:/shared1") (zeropadded)
|
||||
} Device;
|
||||
|
||||
|
||||
typedef struct PACKED DeviceList {
|
||||
Device devices[11];
|
||||
u8 zerofilled[0x24];
|
||||
char appname[0x40];
|
||||
} DeviceList;
|
||||
|
||||
DeviceList* getDeviceList(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -7,6 +7,7 @@
|
||||
#include "version.h"
|
||||
#include "unlaunch.h"
|
||||
#include "nitrofs.h"
|
||||
#include "deviceList.h"
|
||||
|
||||
volatile bool programEnd = false;
|
||||
static volatile bool arm7Exiting = false;
|
||||
@ -155,7 +156,9 @@ int main(int argc, char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char* installerPath = (argc > 0) ? argv[0] : "sd:/ntrboot.nds";
|
||||
DeviceList* deviceList = getDeviceList();
|
||||
|
||||
const char* installerPath = (argc > 0) ? argv[0] : (deviceList ? deviceList->appname : "sd:/ntrboot.nds");
|
||||
|
||||
if (!nitroFSInit(installerPath))
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user