Newer
Older
uwuboot / source / arm9 / main.c
#include <stdio.h>
#include "types.h"
#include "mem_map.h"
#include "arm9/firm.h"
#include "arm9/dev.h"
#include "arm9/fatfs/ff.h"
#include "hid.h"
#include "arm9/utils.h"
#include "arm9/linux.h"



void heap_init(void)
{
	extern void* fake_heap_start;
	extern void* fake_heap_end;
	fake_heap_start = (void*)A9_HEAP_START;
	fake_heap_end = (void*)A9_HEAP_END;
}

/*void test(void)
{
	u32 iv[4] = {0x9D38EAC5, 0xDD89ECED, 0x714D585A, 0xEB7DA30B};
	u32 key[4] = {0x0BB8CA27, 0x94C46C82, 0x5B31EA56, 0x1589DBD4};
	AES_ctx aesCtx;
	u8  buf[16] = {0};

	AES_setNormalKey(AES_INPUT_LITTLE | AES_INPUT_NORMAL_ORDER, 4, key);
	AES_setCtrIvNonce(&aesCtx, iv, AES_INPUT_LITTLE | AES_INPUT_NORMAL_ORDER | AES_MODE_CBC_ENCRYPT, 0);
	AES_setCryptParams(&aesCtx, AES_FLUSH_READ_FIFO | AES_FLUSH_WRITE_FIFO | AES_OUTPUT_BIG |
						AES_INPUT_BIG | AES_OUTPUT_NORMAL_ORDER | AES_INPUT_NORMAL_ORDER | AES_MODE_CBC_ENCRYPT);

	AES_crypt(&aesCtx, buf, buf, 16); // Result: 6C4C891B8A2CA7F8521A9DF6EE40538E Matches Openssl output.
	for(int i = 0; i < 16; i++) printf("%02X", buf[i]);
	printf("\n");
}*/

void testCode(void)
{
	FATFS nandFs;
	FRESULT res;

	printf("Mount res: %X\n", (res = f_mount(&nandFs, "twln:", 1)));
	if(res != FR_OK) return;
	FILINFO fileInfo;
	DIR dir;
	char lfn[255 + 1];
	fileInfo.lfname = lfn;
	fileInfo.lfsize = 256;

	f_opendir(&dir, "twln:/");
	while(f_readdir(&dir, &fileInfo) == FR_OK && fileInfo.fname[0] != 0)
	{
		printf("%s 0x%X\n", ((*fileInfo.lfname) ? fileInfo.lfname : fileInfo.fname), (unsigned int)fileInfo.fsize);
	}
	f_closedir(&dir);
	printf("Unmount res: %X\n", f_mount(NULL, "twln:", 1));
}

int main(void)
{
	FATFS fs;
	bool continue_ = true;
	void *entry = NULL;
	u32 kDown;



	hidScanInput();
	kDown = hidKeysDown();

	dev_sdcard->init();

	if(f_mount(&fs, "sdmc:", 1) != FR_OK)
	{
		initGfx();
		printf("Failed to mount SD card fs!\n");
		return 1;
	}

	if(kDown & KEY_R)
	{
		initGfx();
		printf("Boot3r v0.0a\n\n");
		printf("\nA boot firm.bin\nB boot test_firm.bin\nY boot firm1:/\nUp enable 3dshax\nDown update loader\n");
		while(true)
		{
			hidScanInput();
			kDown = hidKeysDown();

			if(kDown & KEY_A)
			{
				if(!loadFile("sdmc:/firm.bin", (void*)FIRM_LOAD_ADDR, FIRM_MAX_SIZE, NULL)) continue_ = false;
				break;
			}
			if(kDown & KEY_B)
			{
				if(!loadFile("sdmc:/test_firm.bin", (void*)FIRM_LOAD_ADDR, FIRM_MAX_SIZE, NULL)) continue_ = false;
				break;
			}
			if(kDown & KEY_Y)
			{
				if(!loadFirmNand()) continue_ = false;
				break;
			}
			if(kDown & KEY_DUP)
			{
				entry = (void*)0x01FF8000;
				if(!loadFile("sdmc:/3dshax_arm9.bin", (void*)0x01FF8000, 0x8000, NULL)) continue_ = false;
				*((vu32*)0x01FF800C) = 3; // FIRMLAUNCH_RUNNINGTYPE = 3
				printf("3dshax enabled.\n");
			}
			if(kDown & KEY_DDOWN)
			{
				updateNandLoader("sdmc:/update.bin");
				/*if(!restoreNand())
				{
					continue_ = false;
					break;
				}*/
				//testCode();
				//loadLinux();
			}
			if(*((vu32*)CORE_SYNC_ID) == 2) // Poweroff signal from ARM11.
			{
				printf("Poweroff...\n");
				continue_ = false;
				break;
			}
		}
	}
	else
	{
		if(!loadFile("sdmc:/firm.bin", (void*)FIRM_LOAD_ADDR, FIRM_MAX_SIZE, NULL))
		{
			initGfx();
			printf("Failed to load '%s'!\n", "sdmc:/firm.bin");
			continue_ = false;
		}
		entry = (void*)0x01FF8000;
		if(!loadFile("sdmc:/3dshax_arm9.bin", (void*)0x01FF8000, 0x8000, NULL))
		{
			initGfx();
			printf("Failed to load '%s'!\n", "sdmc:/3dshax_arm9.bin");
			continue_ = false;
		}
		*((vu32*)0x01FF800C) = 3; // FIRMLAUNCH_RUNNINGTYPE = 3
	}

	if(f_mount(NULL, "sdmc:", 1) != FR_OK)
	{
		initGfx();
		printf("Failed to unmount SD card fs!\n");
		return 1;
	}

	*((vu32*)CORE_SYNC_ID) = 0;
	if(!continue_) return 1;

	if(!firm_load_verify()) return 1;
	firm_launch(entry);

	return 0;
}