mirror of
https://github.com/CTCaer/hekate.git
synced 2024-11-26 03:32:17 +00:00
refactor: Remove all unwanted whitespace
This commit is contained in:
parent
9104b85143
commit
7c42f72b8a
135 changed files with 842 additions and 841 deletions
|
@ -1,6 +1,6 @@
|
||||||
# hekate - Bootlogo
|
# hekate - Bootlogo
|
||||||
|
|
||||||
The bootlogo can be any size with a maximum of 720 x 1280.
|
The bootlogo can be any size with a maximum of 720 x 1280.
|
||||||
|
|
||||||
When it's smaller than 720 x 1280, it is automatically centered and the background takes the color of the first pixel.
|
When it's smaller than 720 x 1280, it is automatically centered and the background takes the color of the first pixel.
|
||||||
|
|
||||||
|
|
|
@ -526,7 +526,7 @@ void config_backlight()
|
||||||
bri_text[i * 32] = ' ';
|
bri_text[i * 32] = ' ';
|
||||||
else
|
else
|
||||||
bri_text[i * 32] = '*';
|
bri_text[i * 32] = '*';
|
||||||
|
|
||||||
if (i < 10)
|
if (i < 10)
|
||||||
{
|
{
|
||||||
bri_text[i * 32 + 1] = i + '0';
|
bri_text[i * 32 + 1] = i + '0';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -77,7 +77,7 @@ static int _dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char *outFi
|
||||||
while (totalSectorsVer > 0)
|
while (totalSectorsVer > 0)
|
||||||
{
|
{
|
||||||
num = MIN(totalSectorsVer, NUM_SECTORS_PER_ITER);
|
num = MIN(totalSectorsVer, NUM_SECTORS_PER_ITER);
|
||||||
|
|
||||||
// Check every time or every 4.
|
// Check every time or every 4.
|
||||||
// Every 4 protects from fake sd, sector corruption and frequent I/O corruption.
|
// Every 4 protects from fake sd, sector corruption and frequent I/O corruption.
|
||||||
// Full provides all that, plus protection from extremely rare I/O corruption.
|
// Full provides all that, plus protection from extremely rare I/O corruption.
|
||||||
|
@ -88,7 +88,7 @@ static int _dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char *outFi
|
||||||
gfx_con.fntsz = 16;
|
gfx_con.fntsz = 16;
|
||||||
EPRINTFARGS("\nFailed to read %d blocks (@LBA %08X),\nfrom eMMC!\n\nVerification failed..\n",
|
EPRINTFARGS("\nFailed to read %d blocks (@LBA %08X),\nfrom eMMC!\n\nVerification failed..\n",
|
||||||
num, lba_curr);
|
num, lba_curr);
|
||||||
|
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -97,7 +97,7 @@ static int _dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char *outFi
|
||||||
{
|
{
|
||||||
gfx_con.fntsz = 16;
|
gfx_con.fntsz = 16;
|
||||||
EPRINTFARGS("\nFailed to read %d blocks (@LBA %08X),\nfrom sd card!\n\nVerification failed..\n", num, lba_curr);
|
EPRINTFARGS("\nFailed to read %d blocks (@LBA %08X),\nfrom sd card!\n\nVerification failed..\n", num, lba_curr);
|
||||||
|
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@ static int _dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char *outFi
|
||||||
{
|
{
|
||||||
gfx_con.fntsz = 16;
|
gfx_con.fntsz = 16;
|
||||||
EPRINTFARGS("\nSD and eMMC data (@LBA %08X),\ndo not match!\n\nVerification failed..\n", lba_curr);
|
EPRINTFARGS("\nSD and eMMC data (@LBA %08X),\ndo not match!\n\nVerification failed..\n", lba_curr);
|
||||||
|
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ extern int sd_save_to_file(void *buf, u32 size, const char *filename);
|
||||||
extern void emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
|
extern void emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
|
||||||
|
|
||||||
#pragma GCC push_options
|
#pragma GCC push_options
|
||||||
#pragma GCC optimize ("Os")
|
#pragma GCC optimize ("Os")
|
||||||
|
|
||||||
void print_fuseinfo()
|
void print_fuseinfo()
|
||||||
{
|
{
|
||||||
|
@ -419,7 +419,6 @@ void print_tsec_key()
|
||||||
{
|
{
|
||||||
for (u32 j = 0; j < 0x10; j++)
|
for (u32 j = 0; j < 0x10; j++)
|
||||||
gfx_printf("%02X", keys[j]);
|
gfx_printf("%02X", keys[j]);
|
||||||
|
|
||||||
|
|
||||||
if (pkg1_id->kb == KB_FIRMWARE_VERSION_620)
|
if (pkg1_id->kb == KB_FIRMWARE_VERSION_620)
|
||||||
{
|
{
|
||||||
|
@ -638,13 +637,13 @@ void bootrom_ipatches_info()
|
||||||
gfx_con_setpos(0, 0);
|
gfx_con_setpos(0, 0);
|
||||||
|
|
||||||
static const u32 BOOTROM_SIZE = 0x18000;
|
static const u32 BOOTROM_SIZE = 0x18000;
|
||||||
|
|
||||||
u32 res = fuse_read_ipatch(_ipatch_process);
|
u32 res = fuse_read_ipatch(_ipatch_process);
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
EPRINTFARGS("Failed to read ipatches. Error: %d", res);
|
EPRINTFARGS("Failed to read ipatches. Error: %d", res);
|
||||||
|
|
||||||
gfx_puts("\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
|
gfx_puts("\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
|
||||||
|
|
||||||
u32 btn = btn_wait();
|
u32 btn = btn_wait();
|
||||||
if (btn & BTN_POWER)
|
if (btn & BTN_POWER)
|
||||||
{
|
{
|
||||||
|
@ -662,21 +661,21 @@ void bootrom_ipatches_info()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
EPRINTFARGS("Failed to read evp_thunks. Error: %d", res);
|
EPRINTFARGS("Failed to read evp_thunks. Error: %d", res);
|
||||||
|
|
||||||
emmcsn_path_impl(path, "/dumps", "bootrom_patched.bin", NULL);
|
emmcsn_path_impl(path, "/dumps", "bootrom_patched.bin", NULL);
|
||||||
if (!sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path))
|
if (!sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path))
|
||||||
gfx_puts("\nbootrom_patched.bin saved!\n");
|
gfx_puts("\nbootrom_patched.bin saved!\n");
|
||||||
|
|
||||||
u32 ipatch_backup[14];
|
u32 ipatch_backup[14];
|
||||||
memcpy(ipatch_backup, (void *)IPATCH_BASE, sizeof(ipatch_backup));
|
memcpy(ipatch_backup, (void *)IPATCH_BASE, sizeof(ipatch_backup));
|
||||||
memset((void*)IPATCH_BASE, 0, sizeof(ipatch_backup));
|
memset((void*)IPATCH_BASE, 0, sizeof(ipatch_backup));
|
||||||
|
|
||||||
emmcsn_path_impl(path, "/dumps", "bootrom_unpatched.bin", NULL);
|
emmcsn_path_impl(path, "/dumps", "bootrom_unpatched.bin", NULL);
|
||||||
if (!sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path))
|
if (!sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path))
|
||||||
gfx_puts("\nbootrom_unpatched.bin saved!\n");
|
gfx_puts("\nbootrom_unpatched.bin saved!\n");
|
||||||
|
|
||||||
memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup));
|
memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup));
|
||||||
|
|
||||||
sd_unmount();
|
sd_unmount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -133,13 +133,13 @@ void dump_packages12()
|
||||||
if (kb <= KB_FIRMWARE_VERSION_620)
|
if (kb <= KB_FIRMWARE_VERSION_620)
|
||||||
{
|
{
|
||||||
pkg1_unpack(warmboot, secmon, loader, pkg1_id, pkg1);
|
pkg1_unpack(warmboot, secmon, loader, pkg1_id, pkg1);
|
||||||
|
|
||||||
// Display info.
|
// Display info.
|
||||||
gfx_printf("%kNX Bootloader size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->ldr_size);
|
gfx_printf("%kNX Bootloader size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->ldr_size);
|
||||||
|
|
||||||
gfx_printf("%kSecure monitor addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->secmon_base);
|
gfx_printf("%kSecure monitor addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->secmon_base);
|
||||||
gfx_printf("%kSecure monitor size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->sm_size);
|
gfx_printf("%kSecure monitor size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->sm_size);
|
||||||
|
|
||||||
gfx_printf("%kWarmboot addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->warmboot_base);
|
gfx_printf("%kWarmboot addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->warmboot_base);
|
||||||
gfx_printf("%kWarmboot size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->wb_size);
|
gfx_printf("%kWarmboot size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->wb_size);
|
||||||
|
|
||||||
|
@ -148,19 +148,19 @@ void dump_packages12()
|
||||||
if (sd_save_to_file(pkg1, 0x40000, path))
|
if (sd_save_to_file(pkg1, 0x40000, path))
|
||||||
goto out_free;
|
goto out_free;
|
||||||
gfx_puts("\npkg1 dumped to pkg1_decr.bin\n");
|
gfx_puts("\npkg1 dumped to pkg1_decr.bin\n");
|
||||||
|
|
||||||
// Dump nxbootloader.
|
// Dump nxbootloader.
|
||||||
emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &storage);
|
||||||
if (sd_save_to_file(loader, hdr->ldr_size, path))
|
if (sd_save_to_file(loader, hdr->ldr_size, path))
|
||||||
goto out_free;
|
goto out_free;
|
||||||
gfx_puts("NX Bootloader dumped to nxloader.bin\n");
|
gfx_puts("NX Bootloader dumped to nxloader.bin\n");
|
||||||
|
|
||||||
// Dump secmon.
|
// Dump secmon.
|
||||||
emmcsn_path_impl(path, "/pkg1", "secmon.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "secmon.bin", &storage);
|
||||||
if (sd_save_to_file(secmon, hdr->sm_size, path))
|
if (sd_save_to_file(secmon, hdr->sm_size, path))
|
||||||
goto out_free;
|
goto out_free;
|
||||||
gfx_puts("Secure Monitor dumped to secmon.bin\n");
|
gfx_puts("Secure Monitor dumped to secmon.bin\n");
|
||||||
|
|
||||||
// Dump warmboot.
|
// Dump warmboot.
|
||||||
emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &storage);
|
||||||
if (sd_save_to_file(warmboot, hdr->wb_size, path))
|
if (sd_save_to_file(warmboot, hdr->wb_size, path))
|
||||||
|
@ -187,7 +187,7 @@ void dump_packages12()
|
||||||
// Read in package2.
|
// Read in package2.
|
||||||
u32 pkg2_size_aligned = ALIGN(pkg2_size, NX_EMMC_BLOCKSIZE);
|
u32 pkg2_size_aligned = ALIGN(pkg2_size, NX_EMMC_BLOCKSIZE);
|
||||||
pkg2 = malloc(pkg2_size_aligned);
|
pkg2 = malloc(pkg2_size_aligned);
|
||||||
nx_emmc_part_read(&storage, pkg2_part, 0x4000 / NX_EMMC_BLOCKSIZE,
|
nx_emmc_part_read(&storage, pkg2_part, 0x4000 / NX_EMMC_BLOCKSIZE,
|
||||||
pkg2_size_aligned / NX_EMMC_BLOCKSIZE, pkg2);
|
pkg2_size_aligned / NX_EMMC_BLOCKSIZE, pkg2);
|
||||||
// Decrypt package2 and parse KIP1 blobs in INI1 section.
|
// Decrypt package2 and parse KIP1 blobs in INI1 section.
|
||||||
pkg2_hdr_t *pkg2_hdr = pkg2_decrypt(pkg2, kb);
|
pkg2_hdr_t *pkg2_hdr = pkg2_decrypt(pkg2, kb);
|
||||||
|
|
|
@ -254,6 +254,7 @@ void display_color_screen(u32 color)
|
||||||
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
||||||
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
|
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
|
||||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ;
|
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ;
|
||||||
|
|
||||||
usleep(35000);
|
usleep(35000);
|
||||||
|
|
||||||
display_backlight(true);
|
display_backlight(true);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -415,7 +415,7 @@ static const cfg_op_t _display_config_11[113] = {
|
||||||
{DC_DISP_SYNC_WIDTH, 0x10048},
|
{DC_DISP_SYNC_WIDTH, 0x10048},
|
||||||
{DC_DISP_BACK_PORCH, 0x90048},
|
{DC_DISP_BACK_PORCH, 0x90048},
|
||||||
{DC_DISP_ACTIVE, 0x50002D0},
|
{DC_DISP_ACTIVE, 0x50002D0},
|
||||||
{DC_DISP_FRONT_PORCH, 0xA0088}, // Sources say that this should be above the DC_DISP_ACTIVE cmd.
|
{DC_DISP_FRONT_PORCH, 0xA0088}, // Sources say that this should be above the DC_DISP_ACTIVE cmd.
|
||||||
/* End of Display timings */
|
/* End of Display timings */
|
||||||
{DC_DISP_SHIFT_CLOCK_OPTIONS, SC1_H_QUALIFIER_NONE | SC0_H_QUALIFIER_NONE},
|
{DC_DISP_SHIFT_CLOCK_OPTIONS, SC1_H_QUALIFIER_NONE | SC0_H_QUALIFIER_NONE},
|
||||||
{DC_COM_PIN_OUTPUT_ENABLE(1), 0},
|
{DC_COM_PIN_OUTPUT_ENABLE(1), 0},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -185,7 +185,7 @@ void gfx_putc(char c)
|
||||||
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
|
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
|
||||||
u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride;
|
u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride;
|
||||||
|
|
||||||
for (u32 i = 0; i < 16; i+=2)
|
for (u32 i = 0; i < 16; i += 2)
|
||||||
{
|
{
|
||||||
u8 v = *cbuf++;
|
u8 v = *cbuf++;
|
||||||
for (u32 k = 0; k < 2; k++)
|
for (u32 k = 0; k < 2; k++)
|
||||||
|
@ -254,7 +254,6 @@ void gfx_putc(char c)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfx_puts(const char *s)
|
void gfx_puts(const char *s)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
* Copyright (C) 2018 M4xw
|
* Copyright (c) 2018 M4xw
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -83,7 +83,7 @@ void tui_pbar(int x, int y, u32 val, u32 fgcol, u32 bgcol)
|
||||||
gfx_printf("%k[%3d%%]%k", fgcol, val, 0xFFCCCCCC);
|
gfx_printf("%k[%3d%%]%k", fgcol, val, 0xFFCCCCCC);
|
||||||
|
|
||||||
x += 7 * gfx_con.fntsz;
|
x += 7 * gfx_con.fntsz;
|
||||||
|
|
||||||
for (int i = 0; i < (gfx_con.fntsz >> 3) * 6; i++)
|
for (int i = 0; i < (gfx_con.fntsz >> 3) * 6; i++)
|
||||||
{
|
{
|
||||||
gfx_line(x, y + i + 1, x + 3 * val, y + i + 1, fgcol);
|
gfx_line(x, y + i + 1, x + 3 * val, y + i + 1, fgcol);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -92,13 +92,13 @@ static const u8 console_keyseed[0x10] =
|
||||||
const u8 package2_keyseed[] =
|
const u8 package2_keyseed[] =
|
||||||
{ 0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7 };
|
{ 0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7 };
|
||||||
|
|
||||||
static const u8 master_keyseed_4xx_5xx_610[0x10] =
|
static const u8 master_keyseed_4xx_5xx_610[0x10] =
|
||||||
{ 0x2D, 0xC1, 0xF4, 0x8D, 0xF3, 0x5B, 0x69, 0x33, 0x42, 0x10, 0xAC, 0x65, 0xDA, 0x90, 0x46, 0x66 };
|
{ 0x2D, 0xC1, 0xF4, 0x8D, 0xF3, 0x5B, 0x69, 0x33, 0x42, 0x10, 0xAC, 0x65, 0xDA, 0x90, 0x46, 0x66 };
|
||||||
|
|
||||||
static const u8 master_keyseed_620[0x10] =
|
static const u8 master_keyseed_620[0x10] =
|
||||||
{ 0x37, 0x4B, 0x77, 0x29, 0x59, 0xB4, 0x04, 0x30, 0x81, 0xF6, 0xE5, 0x8C, 0x6D, 0x36, 0x17, 0x9A };
|
{ 0x37, 0x4B, 0x77, 0x29, 0x59, 0xB4, 0x04, 0x30, 0x81, 0xF6, 0xE5, 0x8C, 0x6D, 0x36, 0x17, 0x9A };
|
||||||
|
|
||||||
static const u8 console_keyseed_4xx_5xx[0x10] =
|
static const u8 console_keyseed_4xx_5xx[0x10] =
|
||||||
{ 0x0C, 0x91, 0x09, 0xDB, 0x93, 0x93, 0x07, 0x81, 0x07, 0x3C, 0xC4, 0x16, 0x22, 0x7C, 0x6C, 0x28 };
|
{ 0x0C, 0x91, 0x09, 0xDB, 0x93, 0x93, 0x07, 0x81, 0x07, 0x3C, 0xC4, 0x16, 0x22, 0x7C, 0x6C, 0x28 };
|
||||||
|
|
||||||
static void _hos_crit_error(const char *text)
|
static void _hos_crit_error(const char *text)
|
||||||
|
@ -255,7 +255,7 @@ int keygen(u8 *keyblob, u32 kb, tsec_ctxt_t *tsec_ctxt, launch_ctxt_t *hos_ctxt)
|
||||||
se_aes_unwrap_key(13, 13, master_keyseed_620);
|
se_aes_unwrap_key(13, 13, master_keyseed_620);
|
||||||
se_aes_unwrap_key(12, 13, master_keyseed_retail);
|
se_aes_unwrap_key(12, 13, master_keyseed_retail);
|
||||||
se_aes_unwrap_key(10, 13, master_keyseed_4xx_5xx_610);
|
se_aes_unwrap_key(10, 13, master_keyseed_4xx_5xx_610);
|
||||||
|
|
||||||
// Package2 key.
|
// Package2 key.
|
||||||
se_aes_unwrap_key(8, 12, package2_keyseed);
|
se_aes_unwrap_key(8, 12, package2_keyseed);
|
||||||
|
|
||||||
|
@ -373,7 +373,7 @@ static u8 *_read_emmc_pkg2(launch_ctxt_t *ctxt)
|
||||||
_hos_crit_error("Failed to init emuMMC");
|
_hos_crit_error("Failed to init emuMMC");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
emummc_storage_set_mmc_partition(&storage, 0);
|
emummc_storage_set_mmc_partition(&storage, 0);
|
||||||
|
|
||||||
// Parse eMMC GPT.
|
// Parse eMMC GPT.
|
||||||
|
@ -403,7 +403,7 @@ DPRINTF("pkg2 size on emmc is %08X\n", pkg2_size);
|
||||||
DPRINTF("pkg2 size aligned is %08X\n", pkg2_size_aligned);
|
DPRINTF("pkg2 size aligned is %08X\n", pkg2_size_aligned);
|
||||||
ctxt->pkg2 = malloc(pkg2_size_aligned);
|
ctxt->pkg2 = malloc(pkg2_size_aligned);
|
||||||
ctxt->pkg2_size = pkg2_size;
|
ctxt->pkg2_size = pkg2_size;
|
||||||
nx_emmc_part_read(&storage, pkg2_part, BCT_SIZE / NX_EMMC_BLOCKSIZE,
|
nx_emmc_part_read(&storage, pkg2_part, BCT_SIZE / NX_EMMC_BLOCKSIZE,
|
||||||
pkg2_size_aligned / NX_EMMC_BLOCKSIZE, ctxt->pkg2);
|
pkg2_size_aligned / NX_EMMC_BLOCKSIZE, ctxt->pkg2);
|
||||||
out:;
|
out:;
|
||||||
nx_emmc_gpt_free(&gpt);
|
nx_emmc_gpt_free(&gpt);
|
||||||
|
@ -650,7 +650,7 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
// Finalize per firmware keys.
|
// Finalize per firmware keys.
|
||||||
int bootStateDramPkg2 = 0;
|
int bootStateDramPkg2 = 0;
|
||||||
int bootStatePkg2Continue = 0;
|
int bootStatePkg2Continue = 0;
|
||||||
|
|
||||||
switch (ctxt.pkg1_id->kb)
|
switch (ctxt.pkg1_id->kb)
|
||||||
{
|
{
|
||||||
case KB_FIRMWARE_VERSION_100_200:
|
case KB_FIRMWARE_VERSION_100_200:
|
||||||
|
|
|
@ -36,7 +36,7 @@ static int _config_warmboot(launch_ctxt_t *ctxt, const char *value)
|
||||||
ctxt->warmboot = sd_file_read(value, &ctxt->warmboot_size);
|
ctxt->warmboot = sd_file_read(value, &ctxt->warmboot_size);
|
||||||
if (!ctxt->warmboot)
|
if (!ctxt->warmboot)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -534,7 +534,7 @@ static kip1_patchset_t _fs_patches_900[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
// SHA256 hashes.
|
// SHA256 hashes.
|
||||||
static kip1_id_t _kip_ids[] =
|
static kip1_id_t _kip_ids[] =
|
||||||
{
|
{
|
||||||
{ "FS", "\xde\x9f\xdd\xa4\x08\x5d\xd5\xfe", _fs_patches_100 }, // FS 1.0.0
|
{ "FS", "\xde\x9f\xdd\xa4\x08\x5d\xd5\xfe", _fs_patches_100 }, // FS 1.0.0
|
||||||
{ "FS", "\xfc\x3e\x80\x99\x1d\xca\x17\x96", _fs_patches_100 }, // FS 1.0.0 exfat
|
{ "FS", "\xfc\x3e\x80\x99\x1d\xca\x17\x96", _fs_patches_100 }, // FS 1.0.0 exfat
|
||||||
|
@ -636,7 +636,7 @@ static void parse_external_kip_patches()
|
||||||
memcpy(patches[curr_patch_idx].srcData, pt->srcData, pt->length);
|
memcpy(patches[curr_patch_idx].srcData, pt->srcData, pt->length);
|
||||||
memcpy(patches[curr_patch_idx].dstData, pt->dstData, pt->length);
|
memcpy(patches[curr_patch_idx].dstData, pt->dstData, pt->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
curr_patch_idx++;
|
curr_patch_idx++;
|
||||||
}
|
}
|
||||||
curr_patchset_idx++;
|
curr_patchset_idx++;
|
||||||
|
@ -754,19 +754,19 @@ int pkg2_decompress_kip(pkg2_kip1_info_t* ki, u32 sectsToDecomp)
|
||||||
|
|
||||||
pkg2_kip1_t hdr;
|
pkg2_kip1_t hdr;
|
||||||
memcpy(&hdr, ki->kip1, sizeof(hdr));
|
memcpy(&hdr, ki->kip1, sizeof(hdr));
|
||||||
|
|
||||||
unsigned int newKipSize = sizeof(hdr);
|
unsigned int newKipSize = sizeof(hdr);
|
||||||
for (u32 sectIdx = 0; sectIdx < KIP1_NUM_SECTIONS; sectIdx++)
|
for (u32 sectIdx = 0; sectIdx < KIP1_NUM_SECTIONS; sectIdx++)
|
||||||
{
|
{
|
||||||
u32 sectCompBit = 1u << sectIdx;
|
u32 sectCompBit = 1u << sectIdx;
|
||||||
// For compressed, cant get actual decompressed size without doing it, so use safe "output size".
|
// For compressed, cant get actual decompressed size without doing it, so use safe "output size".
|
||||||
if (sectIdx < 3 && (sectsToDecomp & sectCompBit) && (hdr.flags & sectCompBit))
|
if (sectIdx < 3 && (sectsToDecomp & sectCompBit) && (hdr.flags & sectCompBit))
|
||||||
newKipSize += hdr.sections[sectIdx].size_decomp;
|
newKipSize += hdr.sections[sectIdx].size_decomp;
|
||||||
else
|
else
|
||||||
newKipSize += hdr.sections[sectIdx].size_comp;
|
newKipSize += hdr.sections[sectIdx].size_comp;
|
||||||
}
|
}
|
||||||
|
|
||||||
pkg2_kip1_t* newKip = malloc(newKipSize);
|
pkg2_kip1_t* newKip = malloc(newKipSize);
|
||||||
unsigned char* dstDataPtr = newKip->data;
|
unsigned char* dstDataPtr = newKip->data;
|
||||||
const unsigned char* srcDataPtr = ki->kip1->data;
|
const unsigned char* srcDataPtr = ki->kip1->data;
|
||||||
for (u32 sectIdx = 0; sectIdx < KIP1_NUM_SECTIONS; sectIdx++)
|
for (u32 sectIdx = 0; sectIdx < KIP1_NUM_SECTIONS; sectIdx++)
|
||||||
|
@ -790,7 +790,7 @@ int pkg2_decompress_kip(pkg2_kip1_info_t* ki, u32 sectsToDecomp)
|
||||||
gfx_printf("Decomping %s KIP1 sect %d of size %d...\n", (const char*)hdr.name, sectIdx, compSize);
|
gfx_printf("Decomping %s KIP1 sect %d of size %d...\n", (const char*)hdr.name, sectIdx, compSize);
|
||||||
if (blz_uncompress_srcdest(srcDataPtr, compSize, dstDataPtr, outputSize) == 0)
|
if (blz_uncompress_srcdest(srcDataPtr, compSize, dstDataPtr, outputSize) == 0)
|
||||||
{
|
{
|
||||||
gfx_printf("%kERROR decomping sect %d of %s KIP!%k\n", 0xFFFF0000, sectIdx, (char*)hdr.name, 0xFFCCCCCC);
|
gfx_printf("%kERROR decomping sect %d of %s KIP!%k\n", 0xFFFF0000, sectIdx, (char*)hdr.name, 0xFFCCCCCC);
|
||||||
free(newKip);
|
free(newKip);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -972,7 +972,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
{
|
{
|
||||||
if (!se_calc_sha256(shaBuf, ki->kip1, ki->size))
|
if (!se_calc_sha256(shaBuf, ki->kip1, ki->size))
|
||||||
memset(shaBuf, 0, sizeof(shaBuf));
|
memset(shaBuf, 0, sizeof(shaBuf));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (memcmp(shaBuf, _kip_ids[currKipIdx].hash, sizeof(_kip_ids[0].hash)) != 0)
|
if (memcmp(shaBuf, _kip_ids[currKipIdx].hash, sizeof(_kip_ids[0].hash)) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
@ -995,7 +995,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
for (const kip1_patch_t* currPatch=currPatchset->patches; currPatch != NULL && (currPatch->length != 0); currPatch++)
|
for (const kip1_patch_t* currPatch=currPatchset->patches; currPatch != NULL && (currPatch->length != 0); currPatch++)
|
||||||
bitsAffected |= 1u << GET_KIP_PATCH_SECTION(currPatch->offset);
|
bitsAffected |= 1u << GET_KIP_PATCH_SECTION(currPatch->offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
currPatchset++;
|
currPatchset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1060,7 +1060,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
}
|
}
|
||||||
kipSectData += ki->kip1->sections[currSectIdx].size_comp;
|
kipSectData += ki->kip1->sections[currSectIdx].size_comp;
|
||||||
}
|
}
|
||||||
|
|
||||||
patchesApplied |= appliedMask;
|
patchesApplied |= appliedMask;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1101,7 +1101,7 @@ pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb)
|
||||||
pkg2_hdr_t mkey_test;
|
pkg2_hdr_t mkey_test;
|
||||||
u8 *pdata = (u8 *)data;
|
u8 *pdata = (u8 *)data;
|
||||||
u8 keyslot = 8;
|
u8 keyslot = 8;
|
||||||
|
|
||||||
// Skip signature.
|
// Skip signature.
|
||||||
pdata += 0x100;
|
pdata += 0x100;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -28,7 +28,7 @@ static u8 *_htoa(u8 *result, const char *ptr, u8 byte_len)
|
||||||
tmp = (ch - 'A' + 10);
|
tmp = (ch - 'A' + 10);
|
||||||
else if (ch >= 'a' && ch <= 'f')
|
else if (ch >= 'a' && ch <= 'f')
|
||||||
tmp = (ch - 'a' + 10);
|
tmp = (ch - 'a' + 10);
|
||||||
|
|
||||||
if (shift)
|
if (shift)
|
||||||
*dst = (tmp << 4) & 0xF0;
|
*dst = (tmp << 4) & 0xF0;
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -44,7 +44,7 @@ u8 warmboot_reboot[] = {
|
||||||
0x14, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E450
|
0x14, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E450
|
||||||
0x01, 0x10, 0xB0, 0xE3, // MOVS R1, #1
|
0x01, 0x10, 0xB0, 0xE3, // MOVS R1, #1
|
||||||
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
||||||
0x0C, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E400
|
0x0C, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E400
|
||||||
0x10, 0x10, 0xB0, 0xE3, // MOVS R1, #0x10
|
0x10, 0x10, 0xB0, 0xE3, // MOVS R1, #0x10
|
||||||
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
||||||
0xFE, 0xFF, 0xFF, 0xEA, // LOOP
|
0xFE, 0xFF, 0xFF, 0xEA, // LOOP
|
||||||
|
@ -83,7 +83,7 @@ void check_sept()
|
||||||
f_unlink("sept/payload.bin");
|
f_unlink("sept/payload.bin");
|
||||||
f_rename("sept/payload.bak", "sept/payload.bin");
|
f_rename("sept/payload.bak", "sept/payload.bin");
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,6 +96,7 @@ void check_sept()
|
||||||
EPRINTF("Failed to init eMMC.");
|
EPRINTF("Failed to init eMMC.");
|
||||||
goto out_free;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
emummc_storage_set_mmc_partition(&storage, 1);
|
emummc_storage_set_mmc_partition(&storage, 1);
|
||||||
|
|
||||||
// Read package1.
|
// Read package1.
|
||||||
|
@ -130,7 +131,7 @@ int reboot_to_sept(const u8 *tsec_fw, u32 kb)
|
||||||
memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot));
|
memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot));
|
||||||
memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_fw_size);
|
memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_fw_size);
|
||||||
*(vu32 *)SEPT_TCSZ_ADDR = tsec_fw_size;
|
*(vu32 *)SEPT_TCSZ_ADDR = tsec_fw_size;
|
||||||
|
|
||||||
// Copy sept-primary.
|
// Copy sept-primary.
|
||||||
if (f_open(&fp, "sept/sept-primary.bin", FA_READ))
|
if (f_open(&fp, "sept/sept-primary.bin", FA_READ))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
|
@ -33,24 +33,24 @@ const blz_footer *blz_get_footer(const unsigned char *compData, unsigned int com
|
||||||
}
|
}
|
||||||
|
|
||||||
// From https://github.com/SciresM/hactool/blob/master/kip.c which is exactly how kernel does it, thanks SciresM!
|
// From https://github.com/SciresM/hactool/blob/master/kip.c which is exactly how kernel does it, thanks SciresM!
|
||||||
int blz_uncompress_inplace(unsigned char *dataBuf, unsigned int compSize, const blz_footer *footer)
|
int blz_uncompress_inplace(unsigned char *dataBuf, unsigned int compSize, const blz_footer *footer)
|
||||||
{
|
{
|
||||||
u32 addl_size = footer->addl_size;
|
u32 addl_size = footer->addl_size;
|
||||||
u32 header_size = footer->header_size;
|
u32 header_size = footer->header_size;
|
||||||
u32 cmp_and_hdr_size = footer->cmp_and_hdr_size;
|
u32 cmp_and_hdr_size = footer->cmp_and_hdr_size;
|
||||||
|
|
||||||
unsigned char* cmp_start = &dataBuf[compSize] - cmp_and_hdr_size;
|
unsigned char* cmp_start = &dataBuf[compSize] - cmp_and_hdr_size;
|
||||||
u32 cmp_ofs = cmp_and_hdr_size - header_size;
|
u32 cmp_ofs = cmp_and_hdr_size - header_size;
|
||||||
u32 out_ofs = cmp_and_hdr_size + addl_size;
|
u32 out_ofs = cmp_and_hdr_size + addl_size;
|
||||||
|
|
||||||
while (out_ofs)
|
while (out_ofs)
|
||||||
{
|
{
|
||||||
unsigned char control = cmp_start[--cmp_ofs];
|
unsigned char control = cmp_start[--cmp_ofs];
|
||||||
for (unsigned int i=0; i<8; i++)
|
for (unsigned int i=0; i<8; i++)
|
||||||
{
|
{
|
||||||
if (control & 0x80)
|
if (control & 0x80)
|
||||||
{
|
{
|
||||||
if (cmp_ofs < 2)
|
if (cmp_ofs < 2)
|
||||||
return 0; // Out of bounds.
|
return 0; // Out of bounds.
|
||||||
|
|
||||||
cmp_ofs -= 2;
|
cmp_ofs -= 2;
|
||||||
|
@ -65,17 +65,17 @@ int blz_uncompress_inplace(unsigned char *dataBuf, unsigned int compSize, const
|
||||||
for (unsigned int j = 0; j < seg_size; j++)
|
for (unsigned int j = 0; j < seg_size; j++)
|
||||||
cmp_start[out_ofs + j] = cmp_start[out_ofs + j + seg_ofs];
|
cmp_start[out_ofs + j] = cmp_start[out_ofs + j + seg_ofs];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Copy directly.
|
// Copy directly.
|
||||||
if (cmp_ofs < 1)
|
if (cmp_ofs < 1)
|
||||||
return 0; //out of bounds
|
return 0; //out of bounds
|
||||||
|
|
||||||
cmp_start[--out_ofs] = cmp_start[--cmp_ofs];
|
cmp_start[--out_ofs] = cmp_start[--cmp_ofs];
|
||||||
}
|
}
|
||||||
control <<= 1;
|
control <<= 1;
|
||||||
if (out_ofs == 0) // Blz works backwards, so if it reaches byte 0, it's done.
|
if (out_ofs == 0) // Blz works backwards, so if it reaches byte 0, it's done.
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "elfload.h"
|
#include "elfload.h"
|
||||||
|
|
|
@ -75,7 +75,7 @@ typedef struct el_ctx
|
||||||
// Section Header Str Table
|
// Section Header Str Table
|
||||||
Elf_Shdr shstr;
|
Elf_Shdr shstr;
|
||||||
Elf_Shdr symtab;
|
Elf_Shdr symtab;
|
||||||
|
|
||||||
/* Offset of dynamic table (0 if not ET_DYN) */
|
/* Offset of dynamic table (0 if not ET_DYN) */
|
||||||
Elf_Off dynoff;
|
Elf_Off dynoff;
|
||||||
/* Size of dynamic table (0 if not ET_DYN) */
|
/* Size of dynamic table (0 if not ET_DYN) */
|
||||||
|
|
|
@ -252,14 +252,14 @@ void reloc_patcher(u32 payload_dst, u32 payload_src, u32 payload_size)
|
||||||
|
|
||||||
bool is_ipl_updated(void *buf)
|
bool is_ipl_updated(void *buf)
|
||||||
{
|
{
|
||||||
ipl_ver_meta_t *update_ft = (ipl_ver_meta_t *)(buf + PATCHED_RELOC_SZ + sizeof(boot_cfg_t));
|
ipl_ver_meta_t *update_ft = (ipl_ver_meta_t *)(buf + PATCHED_RELOC_SZ + sizeof(boot_cfg_t));
|
||||||
|
|
||||||
if (update_ft->magic == ipl_ver.magic)
|
if (update_ft->magic == ipl_ver.magic)
|
||||||
{
|
{
|
||||||
if (byte_swap_32(update_ft->version) <= byte_swap_32(ipl_ver.version))
|
if (byte_swap_32(update_ft->version) <= byte_swap_32(ipl_ver.version))
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return true;
|
return true;
|
||||||
|
@ -398,7 +398,7 @@ void launch_tools()
|
||||||
{
|
{
|
||||||
memset(&ments[i + 2], 0, sizeof(ment_t));
|
memset(&ments[i + 2], 0, sizeof(ment_t));
|
||||||
menu_t menu = { ments, "Choose a file to launch", 0, 0 };
|
menu_t menu = { ments, "Choose a file to launch", 0, 0 };
|
||||||
|
|
||||||
file_sec = (char *)tui_do_menu(&menu);
|
file_sec = (char *)tui_do_menu(&menu);
|
||||||
|
|
||||||
if (!file_sec)
|
if (!file_sec)
|
||||||
|
@ -421,7 +421,6 @@ void launch_tools()
|
||||||
free(ments);
|
free(ments);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (file_sec)
|
if (file_sec)
|
||||||
{
|
{
|
||||||
|
@ -915,7 +914,6 @@ void auto_launch_firmware()
|
||||||
break;
|
break;
|
||||||
boot_entry_id++;
|
boot_entry_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1308,7 +1306,7 @@ void ipl_main()
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
tui_do_menu(&menu_top);
|
tui_do_menu(&menu_top);
|
||||||
|
|
||||||
// Halt BPMP if we managed to get out of execution.
|
// Halt BPMP if we managed to get out of execution.
|
||||||
while (true)
|
while (true)
|
||||||
bpmp_halt();
|
bpmp_halt();
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
#include "../utils/types.h"
|
#include "../utils/types.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
s32 pll_osc_in;
|
s32 pll_osc_in;
|
||||||
s32 pll_out;
|
s32 pll_out;
|
||||||
|
@ -257,7 +257,7 @@ typedef struct
|
||||||
} burst_regs_t;
|
} burst_regs_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 burst_regs[221];
|
u32 burst_regs[221];
|
||||||
u32 burst_reg_per_ch[8];
|
u32 burst_reg_per_ch[8];
|
||||||
|
@ -266,7 +266,7 @@ typedef struct
|
||||||
u32 shadow_regs_rdwr_train[221];
|
u32 shadow_regs_rdwr_train[221];
|
||||||
} burst_regs_table_t;
|
} burst_regs_table_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 ptfv_dqsosc_movavg_c0d0u0_idx;
|
u32 ptfv_dqsosc_movavg_c0d0u0_idx;
|
||||||
u32 ptfv_dqsosc_movavg_c0d0u1_idx;
|
u32 ptfv_dqsosc_movavg_c0d0u1_idx;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2015, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2013-2015, NVIDIA CORPORATION. All rights reserved.
|
||||||
* Copyright 2014 Google Inc.
|
* Copyright 2014 Google Inc.
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Battery charger driver for Nintendo Switch's TI BQ24193
|
* Battery charger driver for Nintendo Switch's TI BQ24193
|
||||||
*
|
*
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -91,7 +91,7 @@ int bq24193_get_property(enum BQ24193_reg_prop prop, int *value)
|
||||||
break;
|
break;
|
||||||
case BQ24193_ChargeVoltageLimit: // Charge voltage limit (mV).
|
case BQ24193_ChargeVoltageLimit: // Charge voltage limit (mV).
|
||||||
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgVolt);
|
data = i2c_recv_byte(I2C_1, BQ24193_I2C_ADDR, BQ24193_ChrgVolt);
|
||||||
data = (data & BQ24193_CHRGVOLT_VREG) >> 2;
|
data = (data & BQ24193_CHRGVOLT_VREG) >> 2;
|
||||||
*value += ((data >> 0) & 1) ? 16 : 0;
|
*value += ((data >> 0) & 1) ? 16 : 0;
|
||||||
*value += ((data >> 1) & 1) ? 32 : 0;
|
*value += ((data >> 1) & 1) ? 32 : 0;
|
||||||
*value += ((data >> 2) & 1) ? 64 : 0;
|
*value += ((data >> 2) & 1) ? 64 : 0;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Battery charger driver for Nintendo Switch's TI BQ24193
|
* Battery charger driver for Nintendo Switch's TI BQ24193
|
||||||
*
|
*
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* Fuel gauge driver for Nintendo Switch's Maxim 17050
|
* Fuel gauge driver for Nintendo Switch's Maxim 17050
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Samsung Electronics
|
* Copyright (c) 2011 Samsung Electronics
|
||||||
* MyungJoo Ham <myungjoo.ham@samsung.com>
|
* MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -262,7 +262,7 @@ int max17050_fix_configuration()
|
||||||
/* Init complete, Clear the POR bit */
|
/* Init complete, Clear the POR bit */
|
||||||
//_max17050_set_por_bit(0); // Should we? Or let the switch to reconfigure POR?
|
//_max17050_set_por_bit(0); // Should we? Or let the switch to reconfigure POR?
|
||||||
|
|
||||||
// Sets POR, BI, BR.
|
// Sets POR, BI, BR.
|
||||||
_max17050_set_por_bit(0x8801);
|
_max17050_set_por_bit(0x8801);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
* Fuel gauge driver for Nintendo Switch's Maxim 17050
|
* Fuel gauge driver for Nintendo Switch's Maxim 17050
|
||||||
* Note that Maxim 8966 and 8997 are mfd and this is its subdevice.
|
* Note that Maxim 8966 and 8997 are mfd and this is its subdevice.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Samsung Electronics
|
* Copyright (c) 2011 Samsung Electronics
|
||||||
* MyungJoo Ham <myungjoo.ham@samsung.com>
|
* MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Defining registers address and its bit definitions of MAX77620 and MAX20024
|
* Defining registers address and its bit definitions of MAX77620 and MAX20024
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2016 NVIDIA CORPORATION. All rights reserved.
|
||||||
* Copyright (c) 2019 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|
|
@ -36,7 +36,7 @@ void max77620_rtc_get_time(rtc_time_t *time)
|
||||||
time->min = i2c_recv_byte(I2C_5, MAX77620_RTC_I2C_ADDR, MAX77620_RTC_MIN_REG) & 0x7F;
|
time->min = i2c_recv_byte(I2C_5, MAX77620_RTC_I2C_ADDR, MAX77620_RTC_MIN_REG) & 0x7F;
|
||||||
|
|
||||||
time->hour = i2c_recv_byte(I2C_5, MAX77620_RTC_I2C_ADDR, MAX77620_RTC_HOUR_REG) & 0x1F;
|
time->hour = i2c_recv_byte(I2C_5, MAX77620_RTC_I2C_ADDR, MAX77620_RTC_HOUR_REG) & 0x1F;
|
||||||
|
|
||||||
if (!(val & MAX77620_RTC_24H) && time->hour & MAX77620_RTC_HOUR_PM_MASK)
|
if (!(val & MAX77620_RTC_24H) && time->hour & MAX77620_RTC_HOUR_PM_MASK)
|
||||||
time->hour = (time->hour & 0xF) + 12;
|
time->hour = (time->hour & 0xF) + 12;
|
||||||
|
|
||||||
|
|
|
@ -209,6 +209,7 @@
|
||||||
#define SE_INT_OP_DONE(x) (x << SE_INT_OP_DONE_SHIFT)
|
#define SE_INT_OP_DONE(x) (x << SE_INT_OP_DONE_SHIFT)
|
||||||
#define SE_INT_ERROR_SHIFT 16
|
#define SE_INT_ERROR_SHIFT 16
|
||||||
#define SE_INT_ERROR(x) (x << SE_INT_ERROR_SHIFT)
|
#define SE_INT_ERROR(x) (x << SE_INT_ERROR_SHIFT)
|
||||||
|
|
||||||
#define SE_STATUS_0 0x800
|
#define SE_STATUS_0 0x800
|
||||||
#define SE_ERR_STATUS_0 0x804
|
#define SE_ERR_STATUS_0 0x804
|
||||||
|
|
||||||
|
@ -254,7 +255,7 @@
|
||||||
TEGRA_SE_RNG_DT_SIZE)
|
TEGRA_SE_RNG_DT_SIZE)
|
||||||
|
|
||||||
#define TEGRA_SE_AES_CMAC_DIGEST_SIZE 16
|
#define TEGRA_SE_AES_CMAC_DIGEST_SIZE 16
|
||||||
#define TEGRA_SE_RSA512_DIGEST_SIZE 64
|
#define TEGRA_SE_RSA512_DIGEST_SIZE 64
|
||||||
#define TEGRA_SE_RSA1024_DIGEST_SIZE 128
|
#define TEGRA_SE_RSA1024_DIGEST_SIZE 128
|
||||||
#define TEGRA_SE_RSA1536_DIGEST_SIZE 192
|
#define TEGRA_SE_RSA1536_DIGEST_SIZE 192
|
||||||
#define TEGRA_SE_RSA2048_DIGEST_SIZE 256
|
#define TEGRA_SE_RSA2048_DIGEST_SIZE 256
|
||||||
|
|
|
@ -155,7 +155,7 @@ int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt)
|
||||||
se = page_alloc(1);
|
se = page_alloc(1);
|
||||||
memcpy(se, (void *)SE_BASE, 0x1000);
|
memcpy(se, (void *)SE_BASE, 0x1000);
|
||||||
smmu_map(pdir, SE_BASE, (u32)se, 1, _READABLE | _WRITABLE | _NONSECURE);
|
smmu_map(pdir, SE_BASE, (u32)se, 1, _READABLE | _WRITABLE | _NONSECURE);
|
||||||
|
|
||||||
// Memory controller.
|
// Memory controller.
|
||||||
mc = page_alloc(1);
|
mc = page_alloc(1);
|
||||||
memcpy(mc, (void *)MC_BASE, 0x1000);
|
memcpy(mc, (void *)MC_BASE, 0x1000);
|
||||||
|
@ -217,7 +217,7 @@ int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt)
|
||||||
|
|
||||||
memcpy(tsec_keys, &key, 0x20);
|
memcpy(tsec_keys, &key, 0x20);
|
||||||
memcpy(tsec_ctxt->pkg1, iram, 0x30000);
|
memcpy(tsec_ctxt->pkg1, iram, 0x30000);
|
||||||
|
|
||||||
smmu_deinit_for_tsec();
|
smmu_deinit_for_tsec();
|
||||||
|
|
||||||
// for (int i = 0; i < kidx; i++)
|
// for (int i = 0; i < kidx; i++)
|
||||||
|
|
|
@ -218,10 +218,10 @@ int fuse_read_ipatch(void (*ipatch)(u32 offset, u32 value))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u32 i = 0; i < word_count; i++)
|
for (u32 i = 0; i < word_count; i++)
|
||||||
words[i] = fuse_read(word_addr--);
|
words[i] = fuse_read(word_addr--);
|
||||||
|
|
||||||
word0 = words[0];
|
word0 = words[0];
|
||||||
if (_patch_hash_multi(words, word_count) >= 2)
|
if (_patch_hash_multi(words, word_count) >= 2)
|
||||||
{
|
{
|
||||||
|
@ -235,7 +235,7 @@ int fuse_read_ipatch(void (*ipatch)(u32 offset, u32 value))
|
||||||
u32 word = words[i + 1];
|
u32 word = words[i + 1];
|
||||||
u32 addr = (word >> 16) * 2;
|
u32 addr = (word >> 16) * 2;
|
||||||
u32 data = word & 0xFFFF;
|
u32 data = word & 0xFFFF;
|
||||||
|
|
||||||
ipatch(addr, data);
|
ipatch(addr, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,7 +248,7 @@ int fuse_read_ipatch(void (*ipatch)(u32 offset, u32 value))
|
||||||
}
|
}
|
||||||
word_count = word0 >> 25;
|
word_count = word0 >> 25;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,10 +275,10 @@ int fuse_read_evp_thunk(u32 *iram_evp_thunks, u32 *iram_evp_thunks_len)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u32 i = 0; i < word_count; i++)
|
for (u32 i = 0; i < word_count; i++)
|
||||||
words[i] = fuse_read(word_addr--);
|
words[i] = fuse_read(word_addr--);
|
||||||
|
|
||||||
word0 = words[0];
|
word0 = words[0];
|
||||||
if (_patch_hash_multi(words, word_count) >= 2)
|
if (_patch_hash_multi(words, word_count) >= 2)
|
||||||
{
|
{
|
||||||
|
@ -314,7 +314,7 @@ int fuse_read_evp_thunk(u32 *iram_evp_thunks, u32 *iram_evp_thunks_len)
|
||||||
}
|
}
|
||||||
word_count = word0 >> 25;
|
word_count = word0 >> 25;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,7 +331,7 @@ bool fuse_check_patched_rcm()
|
||||||
while (word_count)
|
while (word_count)
|
||||||
{
|
{
|
||||||
u32 word0 = fuse_read(word_addr);
|
u32 word0 = fuse_read(word_addr);
|
||||||
u32 ipatch_count = (word0 >> 16) & 0xF;
|
u32 ipatch_count = (word0 >> 16) & 0xF;
|
||||||
|
|
||||||
for (u32 i = 0; i < ipatch_count; i++)
|
for (u32 i = 0; i < ipatch_count; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -55,9 +55,9 @@ void _config_oscillators()
|
||||||
CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) = (CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) & 0xFFFFFFF3) | 4; // Set CLK_M_DIVISOR to 2.
|
CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) = (CLOCK(CLK_RST_CONTROLLER_SPARE_REG0) & 0xFFFFFFF3) | 4; // Set CLK_M_DIVISOR to 2.
|
||||||
SYSCTR0(SYSCTR0_CNTFID0) = 19200000; // Set counter frequency.
|
SYSCTR0(SYSCTR0_CNTFID0) = 19200000; // Set counter frequency.
|
||||||
TMR(TIMERUS_USEC_CFG) = 0x45F; // For 19.2MHz clk_m.
|
TMR(TIMERUS_USEC_CFG) = 0x45F; // For 19.2MHz clk_m.
|
||||||
CLOCK(CLK_RST_CONTROLLER_OSC_CTRL) = 0x50000071; // Set OSC to 38.4MHz and drive strength.
|
CLOCK(CLK_RST_CONTROLLER_OSC_CTRL) = 0x50000071; // Set OSC to 38.4MHz and drive strength.
|
||||||
|
|
||||||
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFFFFF81) | 0xE; // Set LP0 OSC drive strength.
|
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFFFFF81) | 0xE; // Set LP0 OSC drive strength.
|
||||||
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFBFFFFF) | PMC_OSC_EDPD_OVER_OSC_CTRL_OVER;
|
PMC(APBDEV_PMC_OSC_EDPD_OVER) = (PMC(APBDEV_PMC_OSC_EDPD_OVER) & 0xFFBFFFFF) | PMC_OSC_EDPD_OVER_OSC_CTRL_OVER;
|
||||||
PMC(APBDEV_PMC_CNTRL2) = (PMC(APBDEV_PMC_CNTRL2) & 0xFFFFEFFF) | PMC_CNTRL2_HOLD_CKE_LOW_EN;
|
PMC(APBDEV_PMC_CNTRL2) = (PMC(APBDEV_PMC_CNTRL2) & 0xFFFFEFFF) | PMC_CNTRL2_HOLD_CKE_LOW_EN;
|
||||||
PMC(APBDEV_PMC_SCRATCH188) = (PMC(APBDEV_PMC_SCRATCH188) & 0xFCFFFFFF) | (4 << 23); // LP0 EMC2TMC_CFG_XM2COMP_PU_VREF_SEL_RANGE.
|
PMC(APBDEV_PMC_SCRATCH188) = (PMC(APBDEV_PMC_SCRATCH188) & 0xFCFFFFFF) | (4 << 23); // LP0 EMC2TMC_CFG_XM2COMP_PU_VREF_SEL_RANGE.
|
||||||
|
@ -189,7 +189,7 @@ void _config_se_brom()
|
||||||
if (!(b_cfg.boot_cfg & BOOT_CFG_SEPT_RUN))
|
if (!(b_cfg.boot_cfg & BOOT_CFG_SEPT_RUN))
|
||||||
{
|
{
|
||||||
// Bootrom part we skipped.
|
// Bootrom part we skipped.
|
||||||
u32 sbk[4] = {
|
u32 sbk[4] = {
|
||||||
FUSE(FUSE_PRIVATE_KEY0),
|
FUSE(FUSE_PRIVATE_KEY0),
|
||||||
FUSE(FUSE_PRIVATE_KEY1),
|
FUSE(FUSE_PRIVATE_KEY1),
|
||||||
FUSE(FUSE_PRIVATE_KEY2),
|
FUSE(FUSE_PRIVATE_KEY2),
|
||||||
|
|
|
@ -97,7 +97,7 @@
|
||||||
#define PINMUX_OPEN_DRAIN (1 << 11)
|
#define PINMUX_OPEN_DRAIN (1 << 11)
|
||||||
#define PINMUX_SCHMT (1 << 12)
|
#define PINMUX_SCHMT (1 << 12)
|
||||||
|
|
||||||
#define PINMUX_DRIVE_1X (0 << 13)
|
#define PINMUX_DRIVE_1X (0 << 13)
|
||||||
#define PINMUX_DRIVE_2X (1 << 13)
|
#define PINMUX_DRIVE_2X (1 << 13)
|
||||||
#define PINMUX_DRIVE_3X (2 << 13)
|
#define PINMUX_DRIVE_3X (2 << 13)
|
||||||
#define PINMUX_DRIVE_4X (3 << 13)
|
#define PINMUX_DRIVE_4X (3 << 13)
|
||||||
|
|
|
@ -156,7 +156,7 @@
|
||||||
#define SYSCTR0_COUNTERID7 0xFDC
|
#define SYSCTR0_COUNTERID7 0xFDC
|
||||||
#define SYSCTR0_COUNTERID8 0xFF0
|
#define SYSCTR0_COUNTERID8 0xFF0
|
||||||
#define SYSCTR0_COUNTERID9 0xFF4
|
#define SYSCTR0_COUNTERID9 0xFF4
|
||||||
#define SYSCTR0_COUNTERID10 0xFF8
|
#define SYSCTR0_COUNTERID10 0xFF8
|
||||||
#define SYSCTR0_COUNTERID11 0xFFC
|
#define SYSCTR0_COUNTERID11 0xFFC
|
||||||
|
|
||||||
/*! TMR registers. */
|
/*! TMR registers. */
|
||||||
|
|
|
@ -35,7 +35,7 @@ void uart_init(u32 idx, u32 baud)
|
||||||
uart->UART_LCR = UART_LCR_DLAB | UART_LCR_WORD_LENGTH_8; // Enable DLAB & set 8n1 mode.
|
uart->UART_LCR = UART_LCR_DLAB | UART_LCR_WORD_LENGTH_8; // Enable DLAB & set 8n1 mode.
|
||||||
uart->UART_THR_DLAB = (u8)rate; // Divisor latch LSB.
|
uart->UART_THR_DLAB = (u8)rate; // Divisor latch LSB.
|
||||||
uart->UART_IER_DLAB = (u8)(rate >> 8); // Divisor latch MSB.
|
uart->UART_IER_DLAB = (u8)(rate >> 8); // Divisor latch MSB.
|
||||||
uart->UART_LCR = UART_LCR_WORD_LENGTH_8; // Diable DLAB.
|
uart->UART_LCR = UART_LCR_WORD_LENGTH_8; // Disable DLAB.
|
||||||
|
|
||||||
// Setup and flush fifo.
|
// Setup and flush fifo.
|
||||||
uart->UART_IIR_FCR = UART_IIR_FCR_EN_FIFO | UART_IIR_FCR_RX_CLR | UART_IIR_FCR_TX_CLR;
|
uart->UART_IIR_FCR = UART_IIR_FCR_EN_FIFO | UART_IIR_FCR_RX_CLR | UART_IIR_FCR_TX_CLR;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -180,7 +180,7 @@ int emummc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, v
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ int emummc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors,
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2019 CTCaer
|
* Copyright (c) 2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* include/linux/mmc/sd.h
|
* include/linux/mmc/sd.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved.
|
* Copyright (c) 2005-2007 Pierre Ossman, All Rights Reserved.
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -1064,7 +1064,7 @@ void sdmmc_storage_init_wait_sd()
|
||||||
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 id, u32 bus_width, u32 type)
|
int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 id, u32 bus_width, u32 type)
|
||||||
{
|
{
|
||||||
int is_version_1 = 0;
|
int is_version_1 = 0;
|
||||||
|
|
||||||
// Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms.
|
// Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms.
|
||||||
sdmmc_storage_init_wait_sd();
|
sdmmc_storage_init_wait_sd();
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -722,7 +722,7 @@ static int _sdmmc_check_mask_interrupt(sdmmc_t *sdmmc, u16 *pout, u16 mask)
|
||||||
sdmmc->regs->norintsts = norintsts & mask;
|
sdmmc->regs->norintsts = norintsts & mask;
|
||||||
return SDMMC_MASKINT_MASKED;
|
return SDMMC_MASKINT_MASKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SDMMC_MASKINT_NOERROR;
|
return SDMMC_MASKINT_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -767,7 +767,7 @@ static int _sdmmc_stop_transmission_inner(sdmmc_t *sdmmc, u32 *rsp)
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_sdmmc_cache_rsp(sdmmc, rsp, 4, SDMMC_RSP_TYPE_1);
|
_sdmmc_cache_rsp(sdmmc, rsp, 4, SDMMC_RSP_TYPE_1);
|
||||||
|
|
||||||
return _sdmmc_wait_prnsts_type1(sdmmc);
|
return _sdmmc_wait_prnsts_type1(sdmmc);
|
||||||
|
@ -901,7 +901,7 @@ static int _sdmmc_execute_cmd_inner(sdmmc_t *sdmmc, sdmmc_cmd_t *cmd, sdmmc_req_
|
||||||
_sdmmc_parse_cmdbuf(sdmmc, cmd, is_data_present);
|
_sdmmc_parse_cmdbuf(sdmmc, cmd, is_data_present);
|
||||||
|
|
||||||
int res = _sdmmc_wait_request(sdmmc);
|
int res = _sdmmc_wait_request(sdmmc);
|
||||||
DPRINTF("rsp(%d): %08X, %08X, %08X, %08X\n", res,
|
DPRINTF("rsp(%d): %08X, %08X, %08X, %08X\n", res,
|
||||||
sdmmc->regs->rspreg0, sdmmc->regs->rspreg1, sdmmc->regs->rspreg2, sdmmc->regs->rspreg3);
|
sdmmc->regs->rspreg0, sdmmc->regs->rspreg1, sdmmc->regs->rspreg2, sdmmc->regs->rspreg3);
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
|
@ -943,7 +943,7 @@ static int _sdmmc_config_sdmmc1()
|
||||||
gpio_output_enable(GPIO_PORT_Z, GPIO_PIN_1, GPIO_OUTPUT_DISABLE);
|
gpio_output_enable(GPIO_PORT_Z, GPIO_PIN_1, GPIO_OUTPUT_DISABLE);
|
||||||
usleep(100);
|
usleep(100);
|
||||||
|
|
||||||
// Check if SD card is inserted.
|
// Check if SD card is inserted.
|
||||||
if(!!gpio_read(GPIO_PORT_Z, GPIO_PIN_1))
|
if(!!gpio_read(GPIO_PORT_Z, GPIO_PIN_1))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1055,7 +1055,7 @@ void sdmmc_end(sdmmc_t *sdmmc)
|
||||||
if (!sdmmc->clock_stopped)
|
if (!sdmmc->clock_stopped)
|
||||||
{
|
{
|
||||||
_sdmmc_sd_clock_disable(sdmmc);
|
_sdmmc_sd_clock_disable(sdmmc);
|
||||||
// Disable SDMMC power.
|
// Disable SDMMC power.
|
||||||
_sdmmc_set_voltage(sdmmc, SDMMC_POWER_OFF);
|
_sdmmc_set_voltage(sdmmc, SDMMC_POWER_OFF);
|
||||||
|
|
||||||
// Disable SD card power.
|
// Disable SD card power.
|
||||||
|
@ -1134,7 +1134,7 @@ int sdmmc_enable_low_voltage(sdmmc_t *sdmmc)
|
||||||
_sdmmc_set_voltage(sdmmc, SDMMC_POWER_1_8);
|
_sdmmc_set_voltage(sdmmc, SDMMC_POWER_1_8);
|
||||||
_sdmmc_get_clkcon(sdmmc);
|
_sdmmc_get_clkcon(sdmmc);
|
||||||
msleep(5);
|
msleep(5);
|
||||||
|
|
||||||
if (sdmmc->regs->hostctl2 & SDHCI_CTRL_VDD_180)
|
if (sdmmc->regs->hostctl2 & SDHCI_CTRL_VDD_180)
|
||||||
{
|
{
|
||||||
sdmmc->regs->clkcon |= TEGRA_MMC_CLKCON_SD_CLOCK_ENABLE;
|
sdmmc->regs->clkcon |= TEGRA_MMC_CLKCON_SD_CLOCK_ENABLE;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -29,7 +29,7 @@ char *dirlist(const char *directory, const char *pattern, bool includeHiddenFile
|
||||||
u32 i = 0, j = 0, k = 0;
|
u32 i = 0, j = 0, k = 0;
|
||||||
DIR dir;
|
DIR dir;
|
||||||
FILINFO fno;
|
FILINFO fno;
|
||||||
|
|
||||||
char *dir_entries = (char *)calloc(max_entries, 256);
|
char *dir_entries = (char *)calloc(max_entries, 256);
|
||||||
char *temp = (char *)calloc(1, 256);
|
char *temp = (char *)calloc(1, 256);
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ char *dirlist(const char *directory, const char *pattern, bool includeHiddenFile
|
||||||
{
|
{
|
||||||
for (j = i + 1; j < k; j++)
|
for (j = i + 1; j < k; j++)
|
||||||
{
|
{
|
||||||
if (strcmp(&dir_entries[i * 256], &dir_entries[j * 256]) > 0)
|
if (strcmp(&dir_entries[i * 256], &dir_entries[j * 256]) > 0)
|
||||||
{
|
{
|
||||||
memcpy(temp, &dir_entries[i * 256], strlen(&dir_entries[i * 256]) + 1);
|
memcpy(temp, &dir_entries[i * 256], strlen(&dir_entries[i * 256]) + 1);
|
||||||
memcpy(&dir_entries[i * 256], &dir_entries[j * 256], strlen(&dir_entries[j * 256]) + 1);
|
memcpy(&dir_entries[i * 256], &dir_entries[j * 256], strlen(&dir_entries[j * 256]) + 1);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -88,7 +88,7 @@ void panic(u32 val)
|
||||||
TMR(TIMER_TMR9_TMR_PTV) = TIMER_EN | TIMER_PER_EN;
|
TMR(TIMER_TMR9_TMR_PTV) = TIMER_EN | TIMER_PER_EN;
|
||||||
TMR(TIMER_WDT4_CONFIG) = TIMER_SRC(9) | TIMER_PER(1) | TIMER_PMCRESET_EN;
|
TMR(TIMER_WDT4_CONFIG) = TIMER_SRC(9) | TIMER_PER(1) | TIMER_PMCRESET_EN;
|
||||||
TMR(TIMER_WDT4_COMMAND) = TIMER_START_CNT;
|
TMR(TIMER_WDT4_COMMAND) = TIMER_START_CNT;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
usleep(1);
|
usleep(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* Common Gfx Header
|
* Common Gfx Header
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
* Copyright (C) 2018 M4xw
|
* Copyright (c) 2018 M4xw
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Common Module Header
|
* Common Module Header
|
||||||
* Copyright (C) 2018 M4xw
|
* Copyright (c) 2018 M4xw
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
|
|
|
@ -23,7 +23,7 @@ all: $(TARGET).bso
|
||||||
$(BUILD)/%.o: ./%.c
|
$(BUILD)/%.o: ./%.c
|
||||||
@mkdir -p "$(BUILD)"
|
@mkdir -p "$(BUILD)"
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(TARGET).bso: $(OBJS)
|
$(TARGET).bso: $(OBJS)
|
||||||
$(CC) $(LDFLAGS) -e _modInit $^ -o $(OUTPUT)/$(TARGET).bso
|
$(CC) $(LDFLAGS) -e _modInit $^ -o $(OUTPUT)/$(TARGET).bso
|
||||||
$(STRIP) -g $(OUTPUT)/$(TARGET).bso
|
$(STRIP) -g $(OUTPUT)/$(TARGET).bso
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2015, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2013-2015, NVIDIA CORPORATION. All rights reserved.
|
||||||
* Copyright 2014 Google Inc.
|
* Copyright 2014 Google Inc.
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
|
||||||
* Copyright 2014 Google Inc.
|
* Copyright 2014 Google Inc.
|
||||||
* Copyright (C) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -23,7 +23,7 @@ all: $(TARGET).bso
|
||||||
$(BUILD)/%.o: ./%.c
|
$(BUILD)/%.o: ./%.c
|
||||||
@mkdir -p "$(BUILD)"
|
@mkdir -p "$(BUILD)"
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(TARGET).bso: $(OBJS)
|
$(TARGET).bso: $(OBJS)
|
||||||
$(CC) $(LDFLAGS) -e _minerva_init $^ -o $(OUTPUT)/$(TARGET).bso
|
$(CC) $(LDFLAGS) -e _minerva_init $^ -o $(OUTPUT)/$(TARGET).bso
|
||||||
$(STRIP) -g $(OUTPUT)/$(TARGET).bso
|
$(STRIP) -g $(OUTPUT)/$(TARGET).bso
|
||||||
|
|
|
@ -7,7 +7,7 @@ For more, check [Here](https://github.com/CTCaer/minerva_tc).
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
Minerva Training Cell (C) 2018 CTCaer.
|
Minerva Training Cell (c) 2018 CTCaer.
|
||||||
|
|
||||||
/* Pain... And suffering. */
|
/* Pain... And suffering. */
|
||||||
```
|
```
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
s32 pll_osc_in;
|
s32 pll_osc_in;
|
||||||
s32 pll_out;
|
s32 pll_out;
|
||||||
|
@ -257,7 +257,7 @@ typedef struct
|
||||||
} burst_regs_t;
|
} burst_regs_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 burst_regs[221];
|
u32 burst_regs[221];
|
||||||
u32 burst_reg_per_ch[8];
|
u32 burst_reg_per_ch[8];
|
||||||
|
@ -266,7 +266,7 @@ typedef struct
|
||||||
u32 shadow_regs_rdwr_train[221];
|
u32 shadow_regs_rdwr_train[221];
|
||||||
} burst_regs_table_t;
|
} burst_regs_table_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 ptfv_dqsosc_movavg_c0d0u0_idx;
|
u32 ptfv_dqsosc_movavg_c0d0u0_idx;
|
||||||
u32 ptfv_dqsosc_movavg_c0d0u1_idx;
|
u32 ptfv_dqsosc_movavg_c0d0u1_idx;
|
||||||
|
|
|
@ -1257,7 +1257,7 @@ static u32 _digital_dll_prelock(emc_table_t *mtc_table_entry, u32 needs_tristate
|
||||||
_change_dll_src(mtc_table_entry, selected_clk_src_emc);
|
_change_dll_src(mtc_table_entry, selected_clk_src_emc);
|
||||||
|
|
||||||
EMC(EMC_CFG_DIG_DLL) |= 1;
|
EMC(EMC_CFG_DIG_DLL) |= 1;
|
||||||
|
|
||||||
_timing_update(dual_channel);
|
_timing_update(dual_channel);
|
||||||
|
|
||||||
while (!(EMC(EMC_CFG_DIG_DLL) & 1))
|
while (!(EMC(EMC_CFG_DIG_DLL) & 1))
|
||||||
|
@ -1274,6 +1274,7 @@ static u32 _digital_dll_prelock(emc_table_t *mtc_table_entry, u32 needs_tristate
|
||||||
EMC(EMC_DBG) |= 2u;
|
EMC(EMC_DBG) |= 2u;
|
||||||
EMC(EMC_CFG_DIG_DLL) &= 0xFFFFFFFE; //Disable CFG_DLL_EN: [PMC] Enable digital DLL.
|
EMC(EMC_CFG_DIG_DLL) &= 0xFFFFFFFE; //Disable CFG_DLL_EN: [PMC] Enable digital DLL.
|
||||||
EMC(EMC_DBG) &= 0xFFFFFFFD;
|
EMC(EMC_DBG) &= 0xFFFFFFFD;
|
||||||
|
|
||||||
while (EMC(EMC_CFG_DIG_DLL) & 1)
|
while (EMC(EMC_CFG_DIG_DLL) & 1)
|
||||||
;
|
;
|
||||||
if (dual_channel)
|
if (dual_channel)
|
||||||
|
@ -2043,7 +2044,7 @@ static u32 _minerva_apply_periodic_compensation_trimmer(emc_table_t *mtc_table_e
|
||||||
|
|
||||||
u32 dst_rate_mhz = mtc_table_entry->rate_khz / 1000;
|
u32 dst_rate_mhz = mtc_table_entry->rate_khz / 1000;
|
||||||
|
|
||||||
switch (trim_emc_reg_addr)
|
switch (trim_emc_reg_addr)
|
||||||
{
|
{
|
||||||
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0:
|
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0:
|
||||||
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1:
|
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1:
|
||||||
|
@ -2420,12 +2421,12 @@ static void _save_train_results(emc_table_t *mtc_table_entry, u32 needs_training
|
||||||
if (mtc_table_entry->save_restore_mod_regs[3] & 0x80000000)
|
if (mtc_table_entry->save_restore_mod_regs[3] & 0x80000000)
|
||||||
ib_vref_dq_byte3_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 24) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[3] & 0x7F);
|
ib_vref_dq_byte3_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 24) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[3] & 0x7F);
|
||||||
|
|
||||||
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dq_0_idx =
|
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dq_0_idx =
|
||||||
((ib_vref_dq_byte0_icr & 0x7F)
|
((ib_vref_dq_byte0_icr & 0x7F)
|
||||||
| (ib_vref_dq_byte1_icr & 0x7F) << 8)
|
| (ib_vref_dq_byte1_icr & 0x7F) << 8)
|
||||||
| ((ib_vref_dq_byte2_icr & 0x7F) << 16)
|
| ((ib_vref_dq_byte2_icr & 0x7F) << 16)
|
||||||
| ((ib_vref_dq_byte3_icr & 0x7F) << 24);
|
| ((ib_vref_dq_byte3_icr & 0x7F) << 24);
|
||||||
|
|
||||||
char ib_vref_dq_byte4_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_1) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[4] & 0x7F);
|
char ib_vref_dq_byte4_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_1) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[4] & 0x7F);
|
||||||
if (mtc_table_entry->save_restore_mod_regs[4] & 0x80000000)
|
if (mtc_table_entry->save_restore_mod_regs[4] & 0x80000000)
|
||||||
ib_vref_dq_byte4_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_1) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[4] & 0x7F);
|
ib_vref_dq_byte4_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_1) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[4] & 0x7F);
|
||||||
|
@ -2575,7 +2576,6 @@ static void _save_train_results(emc_table_t *mtc_table_entry, u32 needs_training
|
||||||
mtc_table_entry->burst_reg_per_ch.emc0_mrw12_idx = emc0_ib_vref_dq_byte8_modded_plus | 0x880E0000 | (emc0_mrw12_op_sp1 << 8);
|
mtc_table_entry->burst_reg_per_ch.emc0_mrw12_idx = emc0_ib_vref_dq_byte8_modded_plus | 0x880E0000 | (emc0_mrw12_op_sp1 << 8);
|
||||||
mtc_table_entry->burst_reg_per_ch.emc0_mrw13_idx = emc0_ib_vref_dq_byte9_modded_a_plus << 8 | emc0_mrw13_op_sp0 | mr13_dev_ext_cnt_sp_addr;
|
mtc_table_entry->burst_reg_per_ch.emc0_mrw13_idx = emc0_ib_vref_dq_byte9_modded_a_plus << 8 | emc0_mrw13_op_sp0 | mr13_dev_ext_cnt_sp_addr;
|
||||||
mtc_table_entry->burst_reg_per_ch.emc1_mrw13_idx = (emc1_mrw13_op_sp1 << 8) | emc1_mrw13_op_sp0 | mr13_dev_ext_cnt_sp_addr;
|
mtc_table_entry->burst_reg_per_ch.emc1_mrw13_idx = (emc1_mrw13_op_sp1 << 8) | emc1_mrw13_op_sp0 | mr13_dev_ext_cnt_sp_addr;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2740,7 +2740,7 @@ s32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u
|
||||||
// Check if we need to turn on VREF generator.
|
// Check if we need to turn on VREF generator.
|
||||||
if ((!(src_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 0x100)
|
if ((!(src_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 0x100)
|
||||||
&& (dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 0x100))
|
&& (dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 0x100))
|
||||||
|| (!(src_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 1)
|
|| (!(src_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 1)
|
||||||
&& (dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 1)))
|
&& (dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl_idx & 1)))
|
||||||
{
|
{
|
||||||
EMC(EMC_PMACRO_DATA_PAD_TX_CTRL) =
|
EMC(EMC_PMACRO_DATA_PAD_TX_CTRL) =
|
||||||
|
@ -2756,7 +2756,7 @@ s32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u
|
||||||
// Step 2 - Prelock the DLL.
|
// Step 2 - Prelock the DLL.
|
||||||
EPRINTF("Step 2");
|
EPRINTF("Step 2");
|
||||||
if (dst_emc_entry->burst_regs.emc_cfg_dig_dll_idx & 1)
|
if (dst_emc_entry->burst_regs.emc_cfg_dig_dll_idx & 1)
|
||||||
_digital_dll_prelock(dst_emc_entry, needs_tristate_training, selected_clk_src_emc); //Prelock enabled for target frequency.
|
_digital_dll_prelock(dst_emc_entry, needs_tristate_training, selected_clk_src_emc); // Prelock enabled for target frequency.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_change_dll_src(dst_emc_entry, selected_clk_src_emc);
|
_change_dll_src(dst_emc_entry, selected_clk_src_emc);
|
||||||
|
@ -3235,6 +3235,7 @@ s32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u
|
||||||
ref_delay = (u32)(float)(tRP_src_timing + tRFC_src_timing + 20.0f);
|
ref_delay = (u32)(float)(tRP_src_timing + tRFC_src_timing + 20.0f);
|
||||||
_ccfifo_write(EMC_CFG_SYNC, 0, ref_delay);
|
_ccfifo_write(EMC_CFG_SYNC, 0, ref_delay);
|
||||||
_ccfifo_write(EMC_DBG, emc_dbg_val | 0x40000002, 0); // WRITE_MUX_ACTIVE | WRITE_ACTIVE_ONLY
|
_ccfifo_write(EMC_DBG, emc_dbg_val | 0x40000002, 0); // WRITE_MUX_ACTIVE | WRITE_ACTIVE_ONLY
|
||||||
|
|
||||||
ramp_down_wait = _dvfs_power_ramp_down(false, src_emc_entry, dst_emc_entry, src_clock_period);
|
ramp_down_wait = _dvfs_power_ramp_down(false, src_emc_entry, dst_emc_entry, src_clock_period);
|
||||||
|
|
||||||
// Step 12 - Trigger clock change.
|
// Step 12 - Trigger clock change.
|
||||||
|
@ -3246,6 +3247,7 @@ s32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u
|
||||||
// Step 13 - Ramp up.
|
// Step 13 - Ramp up.
|
||||||
EPRINTF("Step 13");
|
EPRINTF("Step 13");
|
||||||
ramp_up_wait = _dvfs_power_ramp_up(false, src_emc_entry, dst_emc_entry, needs_training & 0xFF, dst_clock_period);
|
ramp_up_wait = _dvfs_power_ramp_up(false, src_emc_entry, dst_emc_entry, needs_training & 0xFF, dst_clock_period);
|
||||||
|
|
||||||
_ccfifo_write(EMC_DBG, emc_dbg_val, 0);
|
_ccfifo_write(EMC_DBG, emc_dbg_val, 0);
|
||||||
|
|
||||||
// Step 14 - Bringup CKE pins.
|
// Step 14 - Bringup CKE pins.
|
||||||
|
@ -3313,17 +3315,22 @@ s32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u
|
||||||
T_PDEX_timing_final = 0;
|
T_PDEX_timing_final = 0;
|
||||||
_ccfifo_write(EMC_ZQ_CAL, 0x80000001, T_PDEX_timing_final);
|
_ccfifo_write(EMC_ZQ_CAL, 0x80000001, T_PDEX_timing_final);
|
||||||
}
|
}
|
||||||
|
|
||||||
T_PDEX_timing_final = zq_latch_dvfs_wait_time + T_PDEX_timing;
|
T_PDEX_timing_final = zq_latch_dvfs_wait_time + T_PDEX_timing;
|
||||||
|
|
||||||
if ((zq_latch_dvfs_wait_time + T_PDEX_timing) < 0)
|
if ((zq_latch_dvfs_wait_time + T_PDEX_timing) < 0)
|
||||||
T_PDEX_timing_final = 0;
|
T_PDEX_timing_final = 0;
|
||||||
|
|
||||||
_ccfifo_write(EMC_ZQ_CAL, 0x80000002, T_PDEX_timing_final);
|
_ccfifo_write(EMC_ZQ_CAL, 0x80000002, T_PDEX_timing_final);
|
||||||
_ccfifo_write(EMC_ZQ_CAL, 0x40000001, 0);
|
_ccfifo_write(EMC_ZQ_CAL, 0x40000001, 0);
|
||||||
|
|
||||||
if (!needs_tristate_training)
|
if (!needs_tristate_training)
|
||||||
{
|
{
|
||||||
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) | 0xC000000, 0);
|
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) | 0xC000000, 0);
|
||||||
_ccfifo_write(EMC_SELF_REF, 0x100, 0);
|
_ccfifo_write(EMC_SELF_REF, 0x100, 0);
|
||||||
_ccfifo_write(EMC_REF, 0, 0);
|
_ccfifo_write(EMC_REF, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
emc_zq_cal = 0x40000002;
|
emc_zq_cal = 0x40000002;
|
||||||
zq_latch_dvfs_wait_time = (s32)(float)(1000.0f / dst_clock_period);
|
zq_latch_dvfs_wait_time = (s32)(float)(1000.0f / dst_clock_period);
|
||||||
}
|
}
|
||||||
|
@ -3334,20 +3341,23 @@ s32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u
|
||||||
|
|
||||||
if (src_clock_period > 2.0)
|
if (src_clock_period > 2.0)
|
||||||
_ccfifo_write(EMC_ZQ_CAL, 1, T_PDEX_timing);
|
_ccfifo_write(EMC_ZQ_CAL, 1, T_PDEX_timing);
|
||||||
|
|
||||||
if (!needs_tristate_training)
|
if (!needs_tristate_training)
|
||||||
{
|
{
|
||||||
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) | 0xC000000, T_PDEX_timing);
|
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) | 0xC000000, T_PDEX_timing);
|
||||||
_ccfifo_write(EMC_SELF_REF, 0x100, 0);
|
_ccfifo_write(EMC_SELF_REF, 0x100, 0);
|
||||||
_ccfifo_write(EMC_REF, 0, 0);
|
_ccfifo_write(EMC_REF, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
emc_zq_cal = 2;
|
emc_zq_cal = 2;
|
||||||
|
|
||||||
if (zq_latch_dvfs_wait_time < 0)
|
if (zq_latch_dvfs_wait_time < 0)
|
||||||
zq_latch_dvfs_wait_time = 0;
|
zq_latch_dvfs_wait_time = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ccfifo_write(EMC_ZQ_CAL, emc_zq_cal, (u32)zq_latch_dvfs_wait_time);
|
_ccfifo_write(EMC_ZQ_CAL, emc_zq_cal, (u32)zq_latch_dvfs_wait_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
_ccfifo_write(EMC_INTSTATUS, 0, 10); // WAR: delay for zqlatch.
|
_ccfifo_write(EMC_INTSTATUS, 0, 10); // WAR: delay for zqlatch.
|
||||||
|
|
||||||
// Step 16 - LPDDR4 Conditional training kickoff.
|
// Step 16 - LPDDR4 Conditional training kickoff.
|
||||||
|
@ -3422,6 +3432,7 @@ s32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u
|
||||||
_ccfifo_write(EMC_INTSTATUS, 0, (u32)(float)(1000.0f / src_clock_period));
|
_ccfifo_write(EMC_INTSTATUS, 0, (u32)(float)(1000.0f / src_clock_period));
|
||||||
_ccfifo_write(EMC_PMACRO_DATA_RX_TERM_MODE, src_emc_entry->burst_regs.emc_pmacro_data_rx_term_mode_idx, 0);
|
_ccfifo_write(EMC_PMACRO_DATA_RX_TERM_MODE, src_emc_entry->burst_regs.emc_pmacro_data_rx_term_mode_idx, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
_ccfifo_write(EMC_DBG, emc_dbg_o, 0);
|
_ccfifo_write(EMC_DBG, emc_dbg_o, 0);
|
||||||
|
|
||||||
if (opt_zcal_en_cc)
|
if (opt_zcal_en_cc)
|
||||||
|
@ -3566,6 +3577,7 @@ step_19_2:
|
||||||
_ccfifo_write(EMC_SEL_DPD_CTRL, src_emc_entry->emc_sel_dpd_ctrl, 0);
|
_ccfifo_write(EMC_SEL_DPD_CTRL, src_emc_entry->emc_sel_dpd_ctrl, 0);
|
||||||
_ccfifo_write(EMC_DBG, emc_dbg_o, 0);
|
_ccfifo_write(EMC_DBG, emc_dbg_o, 0);
|
||||||
_ccfifo_write(EMC_CFG_PIPE_CLK, emc_cfg_pipe_clk_o, 0);
|
_ccfifo_write(EMC_CFG_PIPE_CLK, emc_cfg_pipe_clk_o, 0);
|
||||||
|
|
||||||
if (bg_regulator_mode_change)
|
if (bg_regulator_mode_change)
|
||||||
{
|
{
|
||||||
if (enable_bg_regulator)
|
if (enable_bg_regulator)
|
||||||
|
@ -3582,8 +3594,9 @@ step_19_2:
|
||||||
_change_dll_src(src_emc_entry, (u32)CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC));
|
_change_dll_src(src_emc_entry, (u32)CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC));
|
||||||
}
|
}
|
||||||
EMC(EMC_CFG_DIG_DLL) = (EMC(EMC_CFG_DIG_DLL) & 0xFFFFFF24) | 0x88;
|
EMC(EMC_CFG_DIG_DLL) = (EMC(EMC_CFG_DIG_DLL) & 0xFFFFFF24) | 0x88;
|
||||||
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = selected_clk_src_emc;
|
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = selected_clk_src_emc;
|
||||||
|
|
||||||
if (_wait_emc_status(EMC_INTSTATUS, CLKCHANGE_COMPLETE_INT, true, 0))
|
if (_wait_emc_status(EMC_INTSTATUS, CLKCHANGE_COMPLETE_INT, true, 0))
|
||||||
return 4; // Clkchange handshake timeout error.
|
return 4; // Clkchange handshake timeout error.
|
||||||
|
|
||||||
|
@ -3916,12 +3929,15 @@ s32 _minerva_set_rate(mtc_config_t *mtc_cfg)
|
||||||
if (mtc_cfg->rate_to == table_entry_rate)
|
if (mtc_cfg->rate_to == table_entry_rate)
|
||||||
dst_emc_entry_idx = i;
|
dst_emc_entry_idx = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
src_emc_entry = (emc_table_t *)&mtc_cfg->mtc_table[src_emc_entry_idx];
|
src_emc_entry = (emc_table_t *)&mtc_cfg->mtc_table[src_emc_entry_idx];
|
||||||
dst_emc_entry = (emc_table_t *)&mtc_cfg->mtc_table[dst_emc_entry_idx];
|
dst_emc_entry = (emc_table_t *)&mtc_cfg->mtc_table[dst_emc_entry_idx];
|
||||||
|
|
||||||
s32 src_rate_khz = src_emc_entry->rate_khz;
|
s32 src_rate_khz = src_emc_entry->rate_khz;
|
||||||
s32 dst_rate_khz = dst_emc_entry->rate_khz;
|
s32 dst_rate_khz = dst_emc_entry->rate_khz;
|
||||||
u32 src_clk_src_emc = src_emc_entry->clk_src_emc;
|
u32 src_clk_src_emc = src_emc_entry->clk_src_emc;
|
||||||
u32 dst_clk_src_emc = dst_emc_entry->clk_src_emc;
|
u32 dst_clk_src_emc = dst_emc_entry->clk_src_emc;
|
||||||
|
|
||||||
if (mtc_cfg->table_entries > 900)
|
if (mtc_cfg->table_entries > 900)
|
||||||
return 4;
|
return 4;
|
||||||
|
|
||||||
|
@ -4027,11 +4043,11 @@ void _minerva_init(mtc_config_t *mtc_cfg, void* bp)
|
||||||
_minerva_get_table(mtc_cfg);
|
_minerva_get_table(mtc_cfg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is set, it need to be managed. Changing freq from OC to a lower
|
// If this is set, it needs to be managed. Changing freq from OC to a lower
|
||||||
// must have the rate_from set to 2131200 and not 1600000
|
// must have the rate_from set to 2131200 and not 1600000
|
||||||
// bool overclock = true;
|
// bool overclock = true;
|
||||||
|
|
||||||
// if (overclock && mtc_cfg->rate_to == 1600000)
|
// if (overclock && mtc_cfg->rate_to == 1600000)
|
||||||
// {
|
// {
|
||||||
// mtc_cfg->rate_to = 2131200;
|
// mtc_cfg->rate_to = 2131200;
|
||||||
|
|
|
@ -24,7 +24,7 @@ all: $(TARGET).bso
|
||||||
$(BUILD)/%.o: ./%.c
|
$(BUILD)/%.o: ./%.c
|
||||||
@mkdir -p "$(BUILD)"
|
@mkdir -p "$(BUILD)"
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
$(TARGET).bso: $(OBJS)
|
$(TARGET).bso: $(OBJS)
|
||||||
$(CC) $(LDFLAGS) -e _modInit $^ -o $(OUTPUT)/$(TARGET).bso
|
$(CC) $(LDFLAGS) -e _modInit $^ -o $(OUTPUT)/$(TARGET).bso
|
||||||
$(STRIP) -g $(OUTPUT)/$(TARGET).bso
|
$(STRIP) -g $(OUTPUT)/$(TARGET).bso
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -254,7 +254,6 @@ void gfx_putc(gfx_con_t *con, char c)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfx_puts(gfx_con_t *con, const char *s)
|
void gfx_puts(gfx_con_t *con, const char *s)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
* Copyright (C) 2018 M4xw
|
* Copyright (c) 2018 M4xw
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -60,7 +60,7 @@ static void get_valid_partition(u32 *sector_start, u32 *sector_size, u32 *part_i
|
||||||
sd_mount();
|
sd_mount();
|
||||||
u8 *mbr = (u8 *)malloc(0x200);
|
u8 *mbr = (u8 *)malloc(0x200);
|
||||||
sdmmc_storage_read(&sd_storage, 0, 1, mbr);
|
sdmmc_storage_read(&sd_storage, 0, 1, mbr);
|
||||||
|
|
||||||
memcpy(mbr, mbr + 0x1BE, 0x40);
|
memcpy(mbr, mbr + 0x1BE, 0x40);
|
||||||
|
|
||||||
*part_idx = 0;
|
*part_idx = 0;
|
||||||
|
@ -106,7 +106,7 @@ static void get_valid_partition(u32 *sector_start, u32 *sector_size, u32 *part_i
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
free(mbr);
|
free(mbr);
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ static int _dump_emmc_verify(emmc_tool_gui_t *gui, sdmmc_storage_t *storage, u32
|
||||||
"#FF0000 Aborting..#\n", res);
|
"#FF0000 Aborting..#\n", res);
|
||||||
lv_label_ins_text(gui->label_log, LV_LABEL_POS_LAST, gui->txt_buf);
|
lv_label_ins_text(gui->label_log, LV_LABEL_POS_LAST, gui->txt_buf);
|
||||||
manual_system_maintenance(true);
|
manual_system_maintenance(true);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ static int _dump_emmc_verify(emmc_tool_gui_t *gui, sdmmc_storage_t *storage, u32
|
||||||
while (totalSectorsVer > 0)
|
while (totalSectorsVer > 0)
|
||||||
{
|
{
|
||||||
num = MIN(totalSectorsVer, NUM_SECTORS_PER_ITER);
|
num = MIN(totalSectorsVer, NUM_SECTORS_PER_ITER);
|
||||||
|
|
||||||
// Check every time or every 4.
|
// Check every time or every 4.
|
||||||
// Every 4 protects from fake sd, sector corruption and frequent I/O corruption.
|
// Every 4 protects from fake sd, sector corruption and frequent I/O corruption.
|
||||||
// Full provides all that, plus protection from extremely rare I/O corruption.
|
// Full provides all that, plus protection from extremely rare I/O corruption.
|
||||||
|
@ -468,7 +468,7 @@ static int _dump_emmc_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_storage_t
|
||||||
gui->base_path, outFilename + strlen(gui->base_path));
|
gui->base_path, outFilename + strlen(gui->base_path));
|
||||||
lv_label_ins_text(gui->label_info, LV_LABEL_POS_LAST, gui->txt_buf);
|
lv_label_ins_text(gui->label_info, LV_LABEL_POS_LAST, gui->txt_buf);
|
||||||
manual_system_maintenance(true);
|
manual_system_maintenance(true);
|
||||||
|
|
||||||
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
|
@ -626,7 +626,7 @@ static int _dump_emmc_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_storage_t
|
||||||
}
|
}
|
||||||
|
|
||||||
res = f_write_fast(&fp, buf, NX_EMMC_BLOCKSIZE * num);
|
res = f_write_fast(&fp, buf, NX_EMMC_BLOCKSIZE * num);
|
||||||
|
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
s_printf(gui->txt_buf, "\n#FF0000 Fatal error (%d) when writing to SD Card#\nPlease try again...\n", res);
|
s_printf(gui->txt_buf, "\n#FF0000 Fatal error (%d) when writing to SD Card#\nPlease try again...\n", res);
|
||||||
|
@ -883,7 +883,7 @@ void dump_emmc_selected(emmcPartType_t dumpType, emmc_tool_gui_t *gui)
|
||||||
s_printf(txt_buf, "Time taken: %dm %ds.\nFinished!", timer / 60, timer % 60);
|
s_printf(txt_buf, "Time taken: %dm %ds.\nFinished!", timer / 60, timer % 60);
|
||||||
else
|
else
|
||||||
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
||||||
|
|
||||||
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -1450,7 +1450,7 @@ void restore_emmc_selected(emmcPartType_t restoreType, emmc_tool_gui_t *gui)
|
||||||
s_printf(txt_buf, "Time taken: %dm %ds.\nFinished!", timer / 60, timer % 60);
|
s_printf(txt_buf, "Time taken: %dm %ds.\nFinished!", timer / 60, timer % 60);
|
||||||
else
|
else
|
||||||
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
||||||
|
|
||||||
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -162,7 +162,7 @@ static int _dump_emummc_file_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_sto
|
||||||
gui->base_path, outFilename + strlen(gui->base_path));
|
gui->base_path, outFilename + strlen(gui->base_path));
|
||||||
lv_label_ins_text(gui->label_info, LV_LABEL_POS_LAST, gui->txt_buf);
|
lv_label_ins_text(gui->label_info, LV_LABEL_POS_LAST, gui->txt_buf);
|
||||||
manual_system_maintenance(true);
|
manual_system_maintenance(true);
|
||||||
|
|
||||||
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
|
@ -257,7 +257,7 @@ static int _dump_emummc_file_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_sto
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res = f_write_fast(&fp, buf, NX_EMMC_BLOCKSIZE * num);
|
res = f_write_fast(&fp, buf, NX_EMMC_BLOCKSIZE * num);
|
||||||
|
|
||||||
if (res)
|
if (res)
|
||||||
{
|
{
|
||||||
s_printf(gui->txt_buf, "\n#FF0000 Fatal error (%d) when writing to SD Card#\nPlease try again...\n", res);
|
s_printf(gui->txt_buf, "\n#FF0000 Fatal error (%d) when writing to SD Card#\nPlease try again...\n", res);
|
||||||
|
@ -441,13 +441,13 @@ out_failed:
|
||||||
FIL fp;
|
FIL fp;
|
||||||
f_open(&fp, sdPath, FA_CREATE_ALWAYS | FA_WRITE);
|
f_open(&fp, sdPath, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
|
|
||||||
gui->base_path[strlen(gui->base_path) - 1] = 0;
|
gui->base_path[strlen(gui->base_path) - 1] = 0;
|
||||||
save_emummc_cfg(0, 0, gui->base_path);
|
save_emummc_cfg(0, 0, gui->base_path);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
||||||
|
|
||||||
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -695,13 +695,13 @@ out_failed:
|
||||||
f_open(&fp, sdPath, FA_CREATE_ALWAYS | FA_WRITE);
|
f_open(&fp, sdPath, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
f_write(&fp, §or_start, 4, NULL);
|
f_write(&fp, §or_start, 4, NULL);
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
|
|
||||||
gui->base_path[strlen(gui->base_path) - 1] = 0;
|
gui->base_path[strlen(gui->base_path) - 1] = 0;
|
||||||
save_emummc_cfg(part_idx, sector_start, gui->base_path);
|
save_emummc_cfg(part_idx, sector_start, gui->base_path);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
s_printf(txt_buf, "Time taken: %dm %ds.", timer / 60, timer % 60);
|
||||||
|
|
||||||
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
lv_label_set_array_text(gui->label_finish, txt_buf, 0x1000);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -191,9 +191,9 @@ static bool _fts_touch_read(lv_indev_data_t *data)
|
||||||
// Always set touch points.
|
// Always set touch points.
|
||||||
data->point.x = touchpad.x;
|
data->point.x = touchpad.x;
|
||||||
data->point.y = touchpad.y;
|
data->point.y = touchpad.y;
|
||||||
|
|
||||||
// Decide touch enable.
|
// Decide touch enable.
|
||||||
switch (touchpad.type & STMFTS_MASK_EVENT_ID)
|
switch (touchpad.type & STMFTS_MASK_EVENT_ID)
|
||||||
{
|
{
|
||||||
case STMFTS_EV_MULTI_TOUCH_ENTER:
|
case STMFTS_EV_MULTI_TOUCH_ENTER:
|
||||||
case STMFTS_EV_MULTI_TOUCH_MOTION:
|
case STMFTS_EV_MULTI_TOUCH_MOTION:
|
||||||
|
@ -284,7 +284,7 @@ lv_img_dsc_t *bmp_to_lvimg_obj(const char *path)
|
||||||
|
|
||||||
lv_img_dsc_t *img_desc = (lv_img_dsc_t *)bitmap;
|
lv_img_dsc_t *img_desc = (lv_img_dsc_t *)bitmap;
|
||||||
u32 offset_copy = ALIGN((u32)bitmap + sizeof(lv_img_dsc_t), 0x10);
|
u32 offset_copy = ALIGN((u32)bitmap + sizeof(lv_img_dsc_t), 0x10);
|
||||||
|
|
||||||
img_desc->header.always_zero = 0;
|
img_desc->header.always_zero = 0;
|
||||||
img_desc->header.w = bmpData.size_x;
|
img_desc->header.w = bmpData.size_x;
|
||||||
img_desc->header.h = bmpData.size_y;
|
img_desc->header.h = bmpData.size_y;
|
||||||
|
@ -315,7 +315,7 @@ lv_img_dsc_t *bmp_to_lvimg_obj(const char *path)
|
||||||
tmp2[j++] = tmp[y * bmpData.size_x + x];
|
tmp2[j++] = tmp[y * bmpData.size_x + x];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -323,7 +323,7 @@ lv_img_dsc_t *bmp_to_lvimg_obj(const char *path)
|
||||||
free(bitmap);
|
free(bitmap);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (lv_img_dsc_t *)bitmap;
|
return (lv_img_dsc_t *)bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,7 +367,7 @@ lv_res_t mbox_action(lv_obj_t *btns, const char *txt)
|
||||||
{
|
{
|
||||||
lv_obj_t *mbox = lv_mbox_get_from_btn(btns);
|
lv_obj_t *mbox = lv_mbox_get_from_btn(btns);
|
||||||
lv_obj_t *dark_bg = lv_obj_get_parent(mbox);
|
lv_obj_t *dark_bg = lv_obj_get_parent(mbox);
|
||||||
|
|
||||||
lv_obj_del(dark_bg); // Deletes children also (mbox).
|
lv_obj_del(dark_bg); // Deletes children also (mbox).
|
||||||
|
|
||||||
return LV_RES_INV;
|
return LV_RES_INV;
|
||||||
|
@ -401,7 +401,6 @@ void nyx_window_toggle_buttons(lv_obj_t *win, bool disable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
lv_obj_t *nyx_create_standard_window(const char *win_title)
|
lv_obj_t *nyx_create_standard_window(const char *win_title)
|
||||||
{
|
{
|
||||||
|
@ -551,7 +550,7 @@ static lv_res_t _create_mbox_reload(lv_obj_t *btn)
|
||||||
lv_obj_set_width(mbox, LV_HOR_RES * 4 / 10);
|
lv_obj_set_width(mbox, LV_HOR_RES * 4 / 10);
|
||||||
|
|
||||||
lv_mbox_set_text(mbox, "#FF8000 Do you really want#\n#FF8000 to reload hekate?#");
|
lv_mbox_set_text(mbox, "#FF8000 Do you really want#\n#FF8000 to reload hekate?#");
|
||||||
|
|
||||||
lv_mbox_add_btns(mbox, mbox_btn_map, reload_action);
|
lv_mbox_add_btns(mbox, mbox_btn_map, reload_action);
|
||||||
|
|
||||||
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
|
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
|
||||||
|
@ -627,7 +626,7 @@ void nyx_create_onoff_button(lv_theme_t *th, lv_obj_t *parent, lv_obj_t *btn, co
|
||||||
|
|
||||||
lv_obj_t *label_btn = lv_label_create(btn, NULL);
|
lv_obj_t *label_btn = lv_label_create(btn, NULL);
|
||||||
lv_obj_t *label_btnsw = NULL;
|
lv_obj_t *label_btnsw = NULL;
|
||||||
|
|
||||||
lv_label_set_recolor(label_btn, true);
|
lv_label_set_recolor(label_btn, true);
|
||||||
label_btnsw = lv_label_create(btn, NULL);
|
label_btnsw = lv_label_create(btn, NULL);
|
||||||
lv_label_set_recolor(label_btnsw, true);
|
lv_label_set_recolor(label_btnsw, true);
|
||||||
|
@ -797,7 +796,7 @@ static void _update_status_bar(void *params)
|
||||||
|
|
||||||
lv_obj_realign(status_bar.temp_symbol);
|
lv_obj_realign(status_bar.temp_symbol);
|
||||||
lv_obj_realign(status_bar.temp_degrees);
|
lv_obj_realign(status_bar.temp_degrees);
|
||||||
|
|
||||||
// Set battery percent and charging symbol.
|
// Set battery percent and charging symbol.
|
||||||
s_printf(label, " "SYMBOL_DOT" %d.%d%% ", (batt_percent >> 8) & 0xFF, (batt_percent & 0xFF) / 26);
|
s_printf(label, " "SYMBOL_DOT" %d.%d%% ", (batt_percent >> 8) & 0xFF, (batt_percent & 0xFF) / 26);
|
||||||
|
|
||||||
|
@ -824,7 +823,7 @@ static void _update_status_bar(void *params)
|
||||||
s_printf(label, "#96FF00 +%d", batt_curr / 1000);
|
s_printf(label, "#96FF00 +%d", batt_curr / 1000);
|
||||||
else
|
else
|
||||||
s_printf(label, "#FF3C28 -%d", (~batt_curr + 1) / 1000);
|
s_printf(label, "#FF3C28 -%d", (~batt_curr + 1) / 1000);
|
||||||
|
|
||||||
s_printf(label + strlen(label), " mA# (%d mV)", batt_volt);
|
s_printf(label + strlen(label), " mA# (%d mV)", batt_volt);
|
||||||
|
|
||||||
lv_label_set_array_text(status_bar.battery_more, label, 64);
|
lv_label_set_array_text(status_bar.battery_more, label, 64);
|
||||||
|
@ -1132,7 +1131,7 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
|
||||||
|
|
||||||
// Enable button.
|
// Enable button.
|
||||||
lv_obj_set_opa_scale(launch_ctxt[x], LV_OPA_COVER);
|
lv_obj_set_opa_scale(launch_ctxt[x], LV_OPA_COVER);
|
||||||
|
|
||||||
// Default to switch logo if no icon found at all.
|
// Default to switch logo if no icon found at all.
|
||||||
if (!bmp)
|
if (!bmp)
|
||||||
bmp = icon_switch;
|
bmp = icon_switch;
|
||||||
|
@ -1157,7 +1156,7 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
|
||||||
ext->idx = i;
|
ext->idx = i;
|
||||||
ext = lv_obj_get_ext_attr(launch_ctxt[x]); // Redundancy.
|
ext = lv_obj_get_ext_attr(launch_ctxt[x]); // Redundancy.
|
||||||
ext->idx = i;
|
ext->idx = i;
|
||||||
|
|
||||||
// Set action.
|
// Set action.
|
||||||
if (!more_cfg)
|
if (!more_cfg)
|
||||||
lv_btn_set_action(btn, LV_BTN_ACTION_CLICK, _launch_action);
|
lv_btn_set_action(btn, LV_BTN_ACTION_CLICK, _launch_action);
|
||||||
|
@ -1210,7 +1209,7 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
|
||||||
"Check that a .ini file exists in #96FF00 /bootloader/ini/#,\n"
|
"Check that a .ini file exists in #96FF00 /bootloader/ini/#,\n"
|
||||||
"and that it contains at least one entry.");
|
"and that it contains at least one entry.");
|
||||||
}
|
}
|
||||||
|
|
||||||
lv_obj_set_pos(label_error, 19, 0);
|
lv_obj_set_pos(label_error, 19, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1420,7 +1419,7 @@ static lv_res_t _show_hide_save_button(lv_obj_t *tv, uint16_t tab_idx)
|
||||||
lv_obj_set_opa_scale(status_bar.mid, LV_OPA_0);
|
lv_obj_set_opa_scale(status_bar.mid, LV_OPA_0);
|
||||||
lv_obj_set_click(status_bar.mid, false);
|
lv_obj_set_click(status_bar.mid, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return LV_RES_OK;
|
return LV_RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1529,14 +1528,14 @@ static void _nyx_main_menu(lv_theme_t * th)
|
||||||
}
|
}
|
||||||
lv_tabview_set_sliding(tv, false);
|
lv_tabview_set_sliding(tv, false);
|
||||||
lv_obj_set_size(tv, LV_HOR_RES, LV_VER_RES);
|
lv_obj_set_size(tv, LV_HOR_RES, LV_VER_RES);
|
||||||
|
|
||||||
// Add all tabs content.
|
// Add all tabs content.
|
||||||
char version[32];
|
char version[32];
|
||||||
s_printf(version, "hekate v%d.%d.%d", nyx_str->version & 0xFF, (nyx_str->version >> 8) & 0xFF, (nyx_str->version >> 16) & 0xFF);
|
s_printf(version, "hekate v%d.%d.%d", nyx_str->version & 0xFF, (nyx_str->version >> 8) & 0xFF, (nyx_str->version >> 16) & 0xFF);
|
||||||
lv_obj_t *tab_about = lv_tabview_add_tab(tv, version);
|
lv_obj_t *tab_about = lv_tabview_add_tab(tv, version);
|
||||||
|
|
||||||
lv_obj_t *tab_home = lv_tabview_add_tab(tv, SYMBOL_HOME" Home");
|
lv_obj_t *tab_home = lv_tabview_add_tab(tv, SYMBOL_HOME" Home");
|
||||||
|
|
||||||
lv_obj_t *tab_tools = lv_tabview_add_tab(tv, SYMBOL_TOOLS" Tools");
|
lv_obj_t *tab_tools = lv_tabview_add_tab(tv, SYMBOL_TOOLS" Tools");
|
||||||
lv_page_set_style(tab_tools, LV_PAGE_STYLE_BG, &no_padding);
|
lv_page_set_style(tab_tools, LV_PAGE_STYLE_BG, &no_padding);
|
||||||
lv_page_set_style(tab_tools, LV_PAGE_STYLE_SCRL, &no_padding);
|
lv_page_set_style(tab_tools, LV_PAGE_STYLE_SCRL, &no_padding);
|
||||||
|
@ -1546,7 +1545,7 @@ static void _nyx_main_menu(lv_theme_t * th)
|
||||||
lv_page_set_style(tab_info, LV_PAGE_STYLE_SCRL, &no_padding);
|
lv_page_set_style(tab_info, LV_PAGE_STYLE_SCRL, &no_padding);
|
||||||
|
|
||||||
lv_obj_t *tab_options = lv_tabview_add_tab(tv, SYMBOL_SETTINGS" Options");
|
lv_obj_t *tab_options = lv_tabview_add_tab(tv, SYMBOL_SETTINGS" Options");
|
||||||
|
|
||||||
_create_tab_about(th, tab_about);
|
_create_tab_about(th, tab_about);
|
||||||
_create_tab_home(th, tab_home);
|
_create_tab_home(th, tab_home);
|
||||||
create_tab_tools(th, tab_tools);
|
create_tab_tools(th, tab_tools);
|
||||||
|
@ -1561,10 +1560,10 @@ static void _nyx_main_menu(lv_theme_t * th)
|
||||||
// Create tasks.
|
// Create tasks.
|
||||||
system_tasks.task.dram_periodic_comp = lv_task_create(minerva_periodic_training, EMC_PERIODIC_TRAIN_MS, LV_TASK_PRIO_HIGHEST, NULL);
|
system_tasks.task.dram_periodic_comp = lv_task_create(minerva_periodic_training, EMC_PERIODIC_TRAIN_MS, LV_TASK_PRIO_HIGHEST, NULL);
|
||||||
lv_task_ready(system_tasks.task.dram_periodic_comp);
|
lv_task_ready(system_tasks.task.dram_periodic_comp);
|
||||||
|
|
||||||
system_tasks.task.status_bar = lv_task_create(_update_status_bar, 5000, LV_TASK_PRIO_LOW, NULL);
|
system_tasks.task.status_bar = lv_task_create(_update_status_bar, 5000, LV_TASK_PRIO_LOW, NULL);
|
||||||
lv_task_ready(system_tasks.task.status_bar);
|
lv_task_ready(system_tasks.task.status_bar);
|
||||||
|
|
||||||
lv_task_create(_check_sd_card_removed, 2000, LV_TASK_PRIO_LOWEST, NULL);
|
lv_task_create(_check_sd_card_removed, 2000, LV_TASK_PRIO_LOWEST, NULL);
|
||||||
|
|
||||||
// Create top level global line separators.
|
// Create top level global line separators.
|
||||||
|
|
|
@ -326,7 +326,7 @@ lv_res_t create_window_backup_restore_tool(lv_obj_t *btn)
|
||||||
lv_label_set_static_text(label_btn, SYMBOL_UPLOAD" eMMC BOOT0 & BOOT1");
|
lv_label_set_static_text(label_btn, SYMBOL_UPLOAD" eMMC BOOT0 & BOOT1");
|
||||||
else
|
else
|
||||||
lv_label_set_static_text(label_btn, SYMBOL_DOWNLOAD" eMMC BOOT0 & BOOT1");
|
lv_label_set_static_text(label_btn, SYMBOL_DOWNLOAD" eMMC BOOT0 & BOOT1");
|
||||||
|
|
||||||
lv_obj_align(btn1, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, LV_DPI / 4);
|
lv_obj_align(btn1, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, LV_DPI / 4);
|
||||||
lv_btn_set_action(btn1, LV_BTN_ACTION_CLICK, _emmc_backup_buttons_decider);
|
lv_btn_set_action(btn1, LV_BTN_ACTION_CLICK, _emmc_backup_buttons_decider);
|
||||||
emmc_btn_ctxt.emmc_boot = btn1;
|
emmc_btn_ctxt.emmc_boot = btn1;
|
||||||
|
@ -427,7 +427,7 @@ lv_res_t create_window_backup_restore_tool(lv_obj_t *btn)
|
||||||
"Allows you to restore ALL partitions from RAW GPP\n"
|
"Allows you to restore ALL partitions from RAW GPP\n"
|
||||||
"It contains, CAL0, various package2, SYSTEM, USER, etc.\n");
|
"It contains, CAL0, various package2, SYSTEM, USER, etc.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
lv_obj_set_style(label_txt4, &hint_small_style);
|
lv_obj_set_style(label_txt4, &hint_small_style);
|
||||||
lv_obj_align(label_txt4, btn3, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
|
lv_obj_align(label_txt4, btn3, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ static void _create_window_emummc()
|
||||||
//Disable buttons.
|
//Disable buttons.
|
||||||
nyx_window_toggle_buttons(win, true);
|
nyx_window_toggle_buttons(win, true);
|
||||||
|
|
||||||
// Chreate important info container.
|
// Create important info container.
|
||||||
lv_obj_t *h1 = lv_cont_create(win, NULL);
|
lv_obj_t *h1 = lv_cont_create(win, NULL);
|
||||||
lv_cont_set_fit(h1, false, true);
|
lv_cont_set_fit(h1, false, true);
|
||||||
lv_obj_set_width(h1, (LV_HOR_RES / 9) * 5);
|
lv_obj_set_width(h1, (LV_HOR_RES / 9) * 5);
|
||||||
|
@ -121,7 +121,7 @@ static void _create_window_emummc()
|
||||||
lv_obj_set_style(label_finish, lv_theme_get_current()->label.prim);
|
lv_obj_set_style(label_finish, lv_theme_get_current()->label.prim);
|
||||||
lv_obj_align(label_finish, bar, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI * 9 / 20);
|
lv_obj_align(label_finish, bar, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI * 9 / 20);
|
||||||
emmc_tool_gui_ctxt.label_finish = label_finish;
|
emmc_tool_gui_ctxt.label_finish = label_finish;
|
||||||
|
|
||||||
if (!part_idx)
|
if (!part_idx)
|
||||||
dump_emummc_file(&emmc_tool_gui_ctxt);
|
dump_emummc_file(&emmc_tool_gui_ctxt);
|
||||||
else
|
else
|
||||||
|
@ -184,7 +184,7 @@ static void _create_mbox_emummc_raw()
|
||||||
part_idx = i;
|
part_idx = i;
|
||||||
sector_start += 0x8000;
|
sector_start += 0x8000;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sdmmc_storage_end(&storage);
|
sdmmc_storage_end(&storage);
|
||||||
|
@ -521,7 +521,7 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn)
|
||||||
|
|
||||||
sd_mount();
|
sd_mount();
|
||||||
sdmmc_storage_read(&sd_storage, 0, 1, mbr);
|
sdmmc_storage_read(&sd_storage, 0, 1, mbr);
|
||||||
|
|
||||||
memcpy(mbr, mbr + 0x1BE, 0x40);
|
memcpy(mbr, mbr + 0x1BE, 0x40);
|
||||||
|
|
||||||
sdmmc_storage_t storage;
|
sdmmc_storage_t storage;
|
||||||
|
@ -558,7 +558,7 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//! TODO: What about unallocated
|
//! TODO: What about unallocated
|
||||||
|
@ -593,7 +593,7 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn)
|
||||||
backup = true;
|
backup = true;
|
||||||
else
|
else
|
||||||
backup = false;
|
backup = false;
|
||||||
|
|
||||||
sd_unmount(false);
|
sd_unmount(false);
|
||||||
sdmmc_storage_end(&storage);
|
sdmmc_storage_end(&storage);
|
||||||
|
|
||||||
|
@ -671,7 +671,7 @@ static lv_res_t _save_emummc_cfg_mbox_action(lv_obj_t *btns, const char *txt)
|
||||||
lv_obj_del(emummc_img->win);
|
lv_obj_del(emummc_img->win);
|
||||||
lv_obj_del(emummc_manage_window);
|
lv_obj_del(emummc_manage_window);
|
||||||
free(emummc_img);
|
free(emummc_img);
|
||||||
|
|
||||||
mbox_action(btns, txt);
|
mbox_action(btns, txt);
|
||||||
|
|
||||||
(*emummc_tools)(NULL);
|
(*emummc_tools)(NULL);
|
||||||
|
@ -727,7 +727,6 @@ static lv_res_t _save_disable_emummc_cfg_action(lv_obj_t * btn)
|
||||||
save_emummc_cfg(0, 0, NULL);
|
save_emummc_cfg(0, 0, NULL);
|
||||||
_create_emummc_saved_mbox();
|
_create_emummc_saved_mbox();
|
||||||
sd_unmount(false);
|
sd_unmount(false);
|
||||||
|
|
||||||
|
|
||||||
return LV_RES_INV;
|
return LV_RES_INV;
|
||||||
}
|
}
|
||||||
|
@ -902,9 +901,9 @@ out0:;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
lv_obj_align(btn, lv_desc, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
|
lv_obj_align(btn, lv_desc, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
|
||||||
|
|
||||||
lv_btn_set_action(btn, LV_BTN_ACTION_CLICK, _save_raw_emummc_cfg_action);
|
lv_btn_set_action(btn, LV_BTN_ACTION_CLICK, _save_raw_emummc_cfg_action);
|
||||||
|
|
||||||
lv_desc = lv_label_create(h1, lv_desc);
|
lv_desc = lv_label_create(h1, lv_desc);
|
||||||
lv_label_set_recolor(lv_desc, true);
|
lv_label_set_recolor(lv_desc, true);
|
||||||
lv_obj_set_style(lv_desc, &hint_small_style);
|
lv_obj_set_style(lv_desc, &hint_small_style);
|
||||||
|
@ -1070,7 +1069,7 @@ lv_res_t create_win_emummc_tools(lv_obj_t *btn)
|
||||||
{
|
{
|
||||||
lv_label_set_static_text(label_txt2, "emuMMC is disabled and eMMC will be used for boot.\n\n");
|
lv_label_set_static_text(label_txt2, "emuMMC is disabled and eMMC will be used for boot.\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
free(txt_buf);
|
free(txt_buf);
|
||||||
|
|
||||||
lv_obj_set_style(label_txt2, &hint_small_style);
|
lv_obj_set_style(label_txt2, &hint_small_style);
|
||||||
|
@ -1127,7 +1126,7 @@ lv_res_t create_win_emummc_tools(lv_obj_t *btn)
|
||||||
lv_label_set_static_text(label_txt4,
|
lv_label_set_static_text(label_txt4,
|
||||||
"Allows you to create a new #C7EA46 SD File# or #C7EA46 SD Raw Partition#\n"
|
"Allows you to create a new #C7EA46 SD File# or #C7EA46 SD Raw Partition#\n"
|
||||||
"emuMMC. You can create it from eMMC or a eMMC Backup.");
|
"emuMMC. You can create it from eMMC or a eMMC Backup.");
|
||||||
|
|
||||||
lv_obj_set_style(label_txt4, &hint_small_style);
|
lv_obj_set_style(label_txt4, &hint_small_style);
|
||||||
lv_obj_align(label_txt4, btn3, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
|
lv_obj_align(label_txt4, btn3, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
|
||||||
|
|
||||||
|
|
|
@ -127,23 +127,23 @@ static lv_res_t _bootrom_dump_window_action(lv_obj_t * btn)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
error = 255;
|
error = 255;
|
||||||
|
|
||||||
emmcsn_path_impl(path, "/dumps", "bootrom_patched.bin", NULL);
|
emmcsn_path_impl(path, "/dumps", "bootrom_patched.bin", NULL);
|
||||||
int res = sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path);
|
int res = sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = res;
|
error = res;
|
||||||
|
|
||||||
u32 ipatch_backup[14];
|
u32 ipatch_backup[14];
|
||||||
memcpy(ipatch_backup, (void *)IPATCH_BASE, sizeof(ipatch_backup));
|
memcpy(ipatch_backup, (void *)IPATCH_BASE, sizeof(ipatch_backup));
|
||||||
memset((void*)IPATCH_BASE, 0, sizeof(ipatch_backup));
|
memset((void*)IPATCH_BASE, 0, sizeof(ipatch_backup));
|
||||||
|
|
||||||
emmcsn_path_impl(path, "/dumps", "bootrom_unpatched.bin", NULL);
|
emmcsn_path_impl(path, "/dumps", "bootrom_unpatched.bin", NULL);
|
||||||
res = sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path);
|
res = sd_save_to_file((u8 *)BOOTROM_BASE, BOOTROM_SIZE, path);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = res;
|
error = res;
|
||||||
|
|
||||||
memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup));
|
memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup));
|
||||||
|
|
||||||
sd_unmount(false);
|
sd_unmount(false);
|
||||||
}
|
}
|
||||||
_create_window_dump_done(error, "evp_thunks.bin, bootrom_patched.bin, bootrom_unpatched.bin");
|
_create_window_dump_done(error, "evp_thunks.bin, bootrom_patched.bin, bootrom_unpatched.bin");
|
||||||
|
@ -504,13 +504,13 @@ static lv_res_t _create_window_tsec_keys_status(lv_obj_t *btn)
|
||||||
s_printf(txt_buf + strlen(txt_buf), "#C7EA46 TSEC Key:#\n");
|
s_printf(txt_buf + strlen(txt_buf), "#C7EA46 TSEC Key:#\n");
|
||||||
if (res >= 0)
|
if (res >= 0)
|
||||||
{
|
{
|
||||||
s_printf(txt_buf2, "\n%08X%08X%08X%08X\n",
|
s_printf(txt_buf2, "\n%08X%08X%08X%08X\n",
|
||||||
byte_swap_32(tsec_keys[0]), byte_swap_32(tsec_keys[1]), byte_swap_32(tsec_keys[2]), byte_swap_32(tsec_keys[3]));
|
byte_swap_32(tsec_keys[0]), byte_swap_32(tsec_keys[1]), byte_swap_32(tsec_keys[2]), byte_swap_32(tsec_keys[3]));
|
||||||
|
|
||||||
if (pkg1_id->kb == KB_FIRMWARE_VERSION_620)
|
if (pkg1_id->kb == KB_FIRMWARE_VERSION_620)
|
||||||
{
|
{
|
||||||
s_printf(txt_buf + strlen(txt_buf), "#C7EA46 TSEC root:#\n");
|
s_printf(txt_buf + strlen(txt_buf), "#C7EA46 TSEC root:#\n");
|
||||||
s_printf(txt_buf2 + strlen(txt_buf2), "%08X%08X%08X%08X\n",
|
s_printf(txt_buf2 + strlen(txt_buf2), "%08X%08X%08X%08X\n",
|
||||||
byte_swap_32(tsec_keys[4]), byte_swap_32(tsec_keys[5]), byte_swap_32(tsec_keys[6]), byte_swap_32(tsec_keys[7]));
|
byte_swap_32(tsec_keys[4]), byte_swap_32(tsec_keys[5]), byte_swap_32(tsec_keys[6]), byte_swap_32(tsec_keys[7]));
|
||||||
}
|
}
|
||||||
lv_win_add_btn(win, NULL, SYMBOL_DOWNLOAD" Dump Keys", _tsec_keys_dump_window_action);
|
lv_win_add_btn(win, NULL, SYMBOL_DOWNLOAD" Dump Keys", _tsec_keys_dump_window_action);
|
||||||
|
@ -838,7 +838,7 @@ static lv_res_t _create_window_battery_status(lv_obj_t *btn)
|
||||||
lv_obj_t * lb_desc = lv_label_create(desc, NULL);
|
lv_obj_t * lb_desc = lv_label_create(desc, NULL);
|
||||||
lv_label_set_long_mode(lb_desc, LV_LABEL_LONG_BREAK);
|
lv_label_set_long_mode(lb_desc, LV_LABEL_LONG_BREAK);
|
||||||
lv_label_set_recolor(lb_desc, true);
|
lv_label_set_recolor(lb_desc, true);
|
||||||
|
|
||||||
lv_label_set_static_text(lb_desc,
|
lv_label_set_static_text(lb_desc,
|
||||||
"#00DDFF Fuel Gauge IC Info:#\n"
|
"#00DDFF Fuel Gauge IC Info:#\n"
|
||||||
"Capacity now:\n"
|
"Capacity now:\n"
|
||||||
|
@ -1080,7 +1080,7 @@ void create_tab_info(lv_theme_t *th, lv_obj_t *parent)
|
||||||
lv_label_set_static_text(label_btn, SYMBOL_CIRCUIT" Fuses ");
|
lv_label_set_static_text(label_btn, SYMBOL_CIRCUIT" Fuses ");
|
||||||
lv_obj_align(btn3, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, LV_DPI / 2);
|
lv_obj_align(btn3, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, LV_DPI / 2);
|
||||||
lv_btn_set_action(btn3, LV_BTN_ACTION_CLICK, _create_window_fuses_info_status);
|
lv_btn_set_action(btn3, LV_BTN_ACTION_CLICK, _create_window_fuses_info_status);
|
||||||
|
|
||||||
// Create KFuses button.
|
// Create KFuses button.
|
||||||
lv_obj_t *btn4 = lv_btn_create(h1, btn);
|
lv_obj_t *btn4 = lv_btn_create(h1, btn);
|
||||||
label_btn = lv_label_create(btn4, NULL);
|
label_btn = lv_label_create(btn4, NULL);
|
||||||
|
@ -1130,7 +1130,7 @@ void create_tab_info(lv_theme_t *th, lv_obj_t *parent)
|
||||||
lv_label_set_static_text(label_btn, SYMBOL_CHIP" eMMC ");
|
lv_label_set_static_text(label_btn, SYMBOL_CHIP" eMMC ");
|
||||||
lv_obj_align(btn5, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 2, LV_DPI / 4);
|
lv_obj_align(btn5, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 2, LV_DPI / 4);
|
||||||
lv_btn_set_action(btn5, LV_BTN_ACTION_CLICK, _create_window_emmc_info_status);
|
lv_btn_set_action(btn5, LV_BTN_ACTION_CLICK, _create_window_emmc_info_status);
|
||||||
|
|
||||||
// Create microSD button.
|
// Create microSD button.
|
||||||
lv_obj_t *btn6 = lv_btn_create(h2, btn);
|
lv_obj_t *btn6 = lv_btn_create(h2, btn);
|
||||||
label_btn = lv_label_create(btn6, NULL);
|
label_btn = lv_label_create(btn6, NULL);
|
||||||
|
|
|
@ -321,7 +321,7 @@ void create_tab_options(lv_theme_t *th, lv_obj_t *parent)
|
||||||
lv_btn_set_style(btn, LV_BTN_STYLE_REL, &btn_transp_rel);
|
lv_btn_set_style(btn, LV_BTN_STYLE_REL, &btn_transp_rel);
|
||||||
lv_btn_set_style(btn, LV_BTN_STYLE_PR, &btn_transp_pr);
|
lv_btn_set_style(btn, LV_BTN_STYLE_PR, &btn_transp_pr);
|
||||||
lv_btn_set_style(btn, LV_BTN_STYLE_TGL_REL, &btn_transp_tgl_rel);
|
lv_btn_set_style(btn, LV_BTN_STYLE_TGL_REL, &btn_transp_tgl_rel);
|
||||||
lv_btn_set_style(btn, LV_BTN_STYLE_TGL_PR, &btn_transp_tgl_pr);
|
lv_btn_set_style(btn, LV_BTN_STYLE_TGL_PR, &btn_transp_tgl_pr);
|
||||||
}
|
}
|
||||||
lv_btn_set_layout(btn, LV_LAYOUT_OFF);
|
lv_btn_set_layout(btn, LV_LAYOUT_OFF);
|
||||||
lv_obj_t *label_btn = lv_label_create(btn, NULL);
|
lv_obj_t *label_btn = lv_label_create(btn, NULL);
|
||||||
|
@ -372,7 +372,7 @@ void create_tab_options(lv_theme_t *th, lv_obj_t *parent)
|
||||||
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_BG, &ddlist_transp_bg);
|
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_BG, &ddlist_transp_bg);
|
||||||
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_BGO, &ddlist_transp_bg);
|
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_BGO, &ddlist_transp_bg);
|
||||||
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_PR, &ddlist_transp_sel);
|
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_PR, &ddlist_transp_sel);
|
||||||
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_SEL, &ddlist_transp_sel);
|
lv_ddlist_set_style(ddlist, LV_DDLIST_STYLE_SEL, &ddlist_transp_sel);
|
||||||
}
|
}
|
||||||
|
|
||||||
label_txt2 = lv_label_create(l_cont, NULL);
|
label_txt2 = lv_label_create(l_cont, NULL);
|
||||||
|
@ -464,7 +464,7 @@ void create_tab_options(lv_theme_t *th, lv_obj_t *parent)
|
||||||
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_BG, &ddlist_transp_bg);
|
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_BG, &ddlist_transp_bg);
|
||||||
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_BGO, &ddlist_transp_bg);
|
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_BGO, &ddlist_transp_bg);
|
||||||
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_PR, &ddlist_transp_sel);
|
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_PR, &ddlist_transp_sel);
|
||||||
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_SEL, &ddlist_transp_sel);
|
lv_ddlist_set_style(ddlist2, LV_DDLIST_STYLE_SEL, &ddlist_transp_sel);
|
||||||
}
|
}
|
||||||
|
|
||||||
label_txt2 = lv_label_create(sw_h3, NULL);
|
label_txt2 = lv_label_create(sw_h3, NULL);
|
||||||
|
|
|
@ -50,7 +50,7 @@ bool get_autorcm_status(bool change)
|
||||||
sdmmc_storage_t storage;
|
sdmmc_storage_t storage;
|
||||||
sdmmc_t sdmmc;
|
sdmmc_t sdmmc;
|
||||||
bool enabled = false;
|
bool enabled = false;
|
||||||
|
|
||||||
sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4);
|
sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4);
|
||||||
|
|
||||||
u8 *tempbuf = (u8 *)malloc(0x200);
|
u8 *tempbuf = (u8 *)malloc(0x200);
|
||||||
|
@ -383,7 +383,7 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
emmcsn_path_impl(path, "/pkg1", "pkg1_enc.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "pkg1_enc.bin", &storage);
|
||||||
if (sd_save_to_file(pkg1, 0x40000, path))
|
if (sd_save_to_file(pkg1, 0x40000, path))
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
s_printf(txt_buf + strlen(txt_buf), "\nEncrypted pkg1 dumped to pkg1_enc.bin");
|
s_printf(txt_buf + strlen(txt_buf), "\nEncrypted pkg1 dumped to pkg1_enc.bin");
|
||||||
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
||||||
manual_system_maintenance(true);
|
manual_system_maintenance(true);
|
||||||
|
@ -431,9 +431,9 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
if (kb <= KB_FIRMWARE_VERSION_620)
|
if (kb <= KB_FIRMWARE_VERSION_620)
|
||||||
{
|
{
|
||||||
pkg1_unpack(warmboot, secmon, loader, pkg1_id, pkg1);
|
pkg1_unpack(warmboot, secmon, loader, pkg1_id, pkg1);
|
||||||
|
|
||||||
// Display info.
|
// Display info.
|
||||||
s_printf(txt_buf + strlen(txt_buf),
|
s_printf(txt_buf + strlen(txt_buf),
|
||||||
"#C7EA46 NX Bootloader size: #0x%05X\n"
|
"#C7EA46 NX Bootloader size: #0x%05X\n"
|
||||||
"#C7EA46 Secure monitor addr: #0x%05X\n"
|
"#C7EA46 Secure monitor addr: #0x%05X\n"
|
||||||
"#C7EA46 Secure monitor size: #0x%05X\n"
|
"#C7EA46 Secure monitor size: #0x%05X\n"
|
||||||
|
@ -451,7 +451,7 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
s_printf(txt_buf + strlen(txt_buf), "pkg1 dumped to pkg1_decr.bin\n");
|
s_printf(txt_buf + strlen(txt_buf), "pkg1 dumped to pkg1_decr.bin\n");
|
||||||
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
||||||
manual_system_maintenance(true);
|
manual_system_maintenance(true);
|
||||||
|
|
||||||
// Dump nxbootloader.
|
// Dump nxbootloader.
|
||||||
emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &storage);
|
||||||
if (sd_save_to_file(loader, hdr->ldr_size, path))
|
if (sd_save_to_file(loader, hdr->ldr_size, path))
|
||||||
|
@ -459,7 +459,7 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
s_printf(txt_buf + strlen(txt_buf), "NX Bootloader dumped to nxloader.bin\n");
|
s_printf(txt_buf + strlen(txt_buf), "NX Bootloader dumped to nxloader.bin\n");
|
||||||
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
||||||
manual_system_maintenance(true);
|
manual_system_maintenance(true);
|
||||||
|
|
||||||
// Dump secmon.
|
// Dump secmon.
|
||||||
emmcsn_path_impl(path, "/pkg1", "secmon.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "secmon.bin", &storage);
|
||||||
if (sd_save_to_file(secmon, hdr->sm_size, path))
|
if (sd_save_to_file(secmon, hdr->sm_size, path))
|
||||||
|
@ -467,7 +467,7 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
s_printf(txt_buf + strlen(txt_buf), "Secure Monitor dumped to secmon.bin\n");
|
s_printf(txt_buf + strlen(txt_buf), "Secure Monitor dumped to secmon.bin\n");
|
||||||
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
lv_label_set_array_text(lb_desc, txt_buf, 0x1000);
|
||||||
manual_system_maintenance(true);
|
manual_system_maintenance(true);
|
||||||
|
|
||||||
// Dump warmboot.
|
// Dump warmboot.
|
||||||
emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &storage);
|
||||||
if (sd_save_to_file(warmboot, hdr->wb_size, path))
|
if (sd_save_to_file(warmboot, hdr->wb_size, path))
|
||||||
|
@ -496,7 +496,7 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
// Read in package2.
|
// Read in package2.
|
||||||
u32 pkg2_size_aligned = ALIGN(pkg2_size, NX_EMMC_BLOCKSIZE);
|
u32 pkg2_size_aligned = ALIGN(pkg2_size, NX_EMMC_BLOCKSIZE);
|
||||||
pkg2 = malloc(pkg2_size_aligned);
|
pkg2 = malloc(pkg2_size_aligned);
|
||||||
nx_emmc_part_read(&storage, pkg2_part, 0x4000 / NX_EMMC_BLOCKSIZE,
|
nx_emmc_part_read(&storage, pkg2_part, 0x4000 / NX_EMMC_BLOCKSIZE,
|
||||||
pkg2_size_aligned / NX_EMMC_BLOCKSIZE, pkg2);
|
pkg2_size_aligned / NX_EMMC_BLOCKSIZE, pkg2);
|
||||||
#if 0
|
#if 0
|
||||||
emmcsn_path_impl(path, "/pkg2", "pkg2_encr.bin", &storage);
|
emmcsn_path_impl(path, "/pkg2", "pkg2_encr.bin", &storage);
|
||||||
|
@ -517,7 +517,7 @@ static lv_res_t _create_window_dump_pk12_tool(lv_obj_t *btn)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display info.
|
// Display info.
|
||||||
s_printf(txt_buf + strlen(txt_buf),
|
s_printf(txt_buf + strlen(txt_buf),
|
||||||
"#C7EA46 Kernel size: #0x%05X\n"
|
"#C7EA46 Kernel size: #0x%05X\n"
|
||||||
"#C7EA46 INI1 size: #0x%05X\n\n",
|
"#C7EA46 INI1 size: #0x%05X\n\n",
|
||||||
pkg2_hdr->sec_size[PKG2_SEC_KERNEL], pkg2_hdr->sec_size[PKG2_SEC_INI1]);
|
pkg2_hdr->sec_size[PKG2_SEC_KERNEL], pkg2_hdr->sec_size[PKG2_SEC_INI1]);
|
||||||
|
@ -819,7 +819,7 @@ static void _create_tab_tools_arc_autorcm(lv_theme_t *th, lv_obj_t *parent)
|
||||||
lv_btn_set_style(btn3, LV_BTN_STYLE_REL, &btn_transp_rel);
|
lv_btn_set_style(btn3, LV_BTN_STYLE_REL, &btn_transp_rel);
|
||||||
lv_btn_set_style(btn3, LV_BTN_STYLE_PR, &btn_transp_pr);
|
lv_btn_set_style(btn3, LV_BTN_STYLE_PR, &btn_transp_pr);
|
||||||
lv_btn_set_style(btn3, LV_BTN_STYLE_TGL_REL, &btn_transp_tgl_rel);
|
lv_btn_set_style(btn3, LV_BTN_STYLE_TGL_REL, &btn_transp_tgl_rel);
|
||||||
lv_btn_set_style(btn3, LV_BTN_STYLE_TGL_PR, &btn_transp_tgl_pr);
|
lv_btn_set_style(btn3, LV_BTN_STYLE_TGL_PR, &btn_transp_tgl_pr);
|
||||||
}
|
}
|
||||||
label_btn = lv_label_create(btn3, NULL);
|
label_btn = lv_label_create(btn3, NULL);
|
||||||
lv_btn_set_fit(btn3, true, true);
|
lv_btn_set_fit(btn3, true, true);
|
||||||
|
@ -885,7 +885,7 @@ void create_tab_tools(lv_theme_t *th, lv_obj_t *parent)
|
||||||
|
|
||||||
lv_tabview_set_sliding(tv, false);
|
lv_tabview_set_sliding(tv, false);
|
||||||
lv_tabview_set_btns_pos(tv, LV_TABVIEW_BTNS_POS_BOTTOM);
|
lv_tabview_set_btns_pos(tv, LV_TABVIEW_BTNS_POS_BOTTOM);
|
||||||
|
|
||||||
lv_obj_t *tab1= lv_tabview_add_tab(tv, "eMMC "SYMBOL_DOT" Package1/2");
|
lv_obj_t *tab1= lv_tabview_add_tab(tv, "eMMC "SYMBOL_DOT" Package1/2");
|
||||||
lv_obj_t *tab2 = lv_tabview_add_tab(tv, "Archive bit "SYMBOL_DOT" AutoRCM");
|
lv_obj_t *tab2 = lv_tabview_add_tab(tv, "Archive bit "SYMBOL_DOT" AutoRCM");
|
||||||
|
|
||||||
|
|
|
@ -258,6 +258,7 @@ void display_color_screen(u32 color)
|
||||||
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
||||||
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
|
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
|
||||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ;
|
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = (DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE) | GENERAL_ACT_REQ;
|
||||||
|
|
||||||
usleep(35000);
|
usleep(35000);
|
||||||
|
|
||||||
display_backlight(true);
|
display_backlight(true);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -415,7 +415,7 @@ static const cfg_op_t _display_config_11[113] = {
|
||||||
{DC_DISP_SYNC_WIDTH, 0x10048},
|
{DC_DISP_SYNC_WIDTH, 0x10048},
|
||||||
{DC_DISP_BACK_PORCH, 0x90048},
|
{DC_DISP_BACK_PORCH, 0x90048},
|
||||||
{DC_DISP_ACTIVE, 0x50002D0},
|
{DC_DISP_ACTIVE, 0x50002D0},
|
||||||
{DC_DISP_FRONT_PORCH, 0xA0088}, // Sources say that this should be above the DC_DISP_ACTIVE cmd.
|
{DC_DISP_FRONT_PORCH, 0xA0088}, // Sources say that this should be above the DC_DISP_ACTIVE cmd.
|
||||||
/* End of Display timings */
|
/* End of Display timings */
|
||||||
{DC_DISP_SHIFT_CLOCK_OPTIONS, SC1_H_QUALIFIER_NONE | SC0_H_QUALIFIER_NONE},
|
{DC_DISP_SHIFT_CLOCK_OPTIONS, SC1_H_QUALIFIER_NONE | SC0_H_QUALIFIER_NONE},
|
||||||
{DC_COM_PIN_OUTPUT_ENABLE(1), 0},
|
{DC_COM_PIN_OUTPUT_ENABLE(1), 0},
|
||||||
|
@ -557,7 +557,7 @@ static const cfg_op_t cfg_display_framebuffer[32] = {
|
||||||
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
||||||
{DC_WIN_WIN_OPTIONS, 0},
|
{DC_WIN_WIN_OPTIONS, 0},
|
||||||
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
||||||
{DC_WIN_WIN_OPTIONS, WIN_ENABLE | V_DIRECTION}, //Enable window AD.
|
{DC_WIN_WIN_OPTIONS, WIN_ENABLE | V_DIRECTION}, // Enable window AD.
|
||||||
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY}, //DISPLAY_CTRL_MODE: continuous display.
|
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY}, //DISPLAY_CTRL_MODE: continuous display.
|
||||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE}, //General update; window A update.
|
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE}, //General update; window A update.
|
||||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ} //General activation request; window A activation request.
|
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ} //General activation request; window A activation request.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -189,7 +189,7 @@ void gfx_putc(char c)
|
||||||
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
|
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
|
||||||
u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride;
|
u32 *fb = gfx_ctxt.fb + gfx_con.x + gfx_con.y * gfx_ctxt.stride;
|
||||||
|
|
||||||
for (u32 i = 0; i < 16; i+=2)
|
for (u32 i = 0; i < 16; i += 2)
|
||||||
{
|
{
|
||||||
u8 v = *cbuf++;
|
u8 v = *cbuf++;
|
||||||
for (u32 k = 0; k < 2; k++)
|
for (u32 k = 0; k < 2; k++)
|
||||||
|
@ -258,7 +258,6 @@ void gfx_putc(char c)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfx_puts(const char *s)
|
void gfx_puts(const char *s)
|
||||||
|
@ -596,7 +595,7 @@ __attribute__((target("arm"))) void gfx_set_rect_land_block(const u32 *buf, u32
|
||||||
GOB_address = (y >> 7) * image_width_in_gobs + ((x >> 4) << 13) + (((y % 128) >> 3) << 9);
|
GOB_address = (y >> 7) * image_width_in_gobs + ((x >> 4) << 13) + (((y % 128) >> 3) << 9);
|
||||||
|
|
||||||
x2 = x << 2;
|
x2 = x << 2;
|
||||||
addr = GOB_address
|
addr = GOB_address
|
||||||
+ (((x2 % 64) >> 5) << 8)
|
+ (((x2 % 64) >> 5) << 8)
|
||||||
+ (((y % 8) >> 1) << 6)
|
+ (((y % 8) >> 1) << 6)
|
||||||
+ (((x2 % 32) >> 4) << 5)
|
+ (((x2 % 32) >> 4) << 5)
|
||||||
|
@ -616,7 +615,7 @@ __attribute__((target("arm"))) void gfx_set_rect_land_block(const u32 *buf, u32
|
||||||
// GOB_address = (y / (8 * block_height)) * image_width_in_gobs + ((x * 4 / 64) * 512 * block_height) + ((y % (8 * block_height) / 8) * 512);
|
// GOB_address = (y / (8 * block_height)) * image_width_in_gobs + ((x * 4 / 64) * 512 * block_height) + ((y % (8 * block_height) / 8) * 512);
|
||||||
|
|
||||||
// x2 = x << 2;
|
// x2 = x << 2;
|
||||||
// addr = GOB_address
|
// addr = GOB_address
|
||||||
// + (((x2 % 64) >> 5) << 8)
|
// + (((x2 % 64) >> 5) << 8)
|
||||||
// + (((y % 8) >> 1) << 6)
|
// + (((y % 8) >> 1) << 6)
|
||||||
// + (((x2 % 32) >> 4) << 5)
|
// + (((x2 % 32) >> 4) << 5)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
* Copyright (C) 2018 M4xw
|
* Copyright (c) 2018 M4xw
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -82,13 +82,13 @@ static const u8 console_keyseed[0x10] =
|
||||||
const u8 package2_keyseed[] =
|
const u8 package2_keyseed[] =
|
||||||
{ 0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7 };
|
{ 0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7 };
|
||||||
|
|
||||||
static const u8 master_keyseed_4xx_5xx_610[0x10] =
|
static const u8 master_keyseed_4xx_5xx_610[0x10] =
|
||||||
{ 0x2D, 0xC1, 0xF4, 0x8D, 0xF3, 0x5B, 0x69, 0x33, 0x42, 0x10, 0xAC, 0x65, 0xDA, 0x90, 0x46, 0x66 };
|
{ 0x2D, 0xC1, 0xF4, 0x8D, 0xF3, 0x5B, 0x69, 0x33, 0x42, 0x10, 0xAC, 0x65, 0xDA, 0x90, 0x46, 0x66 };
|
||||||
|
|
||||||
static const u8 master_keyseed_620[0x10] =
|
static const u8 master_keyseed_620[0x10] =
|
||||||
{ 0x37, 0x4B, 0x77, 0x29, 0x59, 0xB4, 0x04, 0x30, 0x81, 0xF6, 0xE5, 0x8C, 0x6D, 0x36, 0x17, 0x9A };
|
{ 0x37, 0x4B, 0x77, 0x29, 0x59, 0xB4, 0x04, 0x30, 0x81, 0xF6, 0xE5, 0x8C, 0x6D, 0x36, 0x17, 0x9A };
|
||||||
|
|
||||||
static const u8 console_keyseed_4xx_5xx[0x10] =
|
static const u8 console_keyseed_4xx_5xx[0x10] =
|
||||||
{ 0x0C, 0x91, 0x09, 0xDB, 0x93, 0x93, 0x07, 0x81, 0x07, 0x3C, 0xC4, 0x16, 0x22, 0x7C, 0x6C, 0x28 };
|
{ 0x0C, 0x91, 0x09, 0xDB, 0x93, 0x93, 0x07, 0x81, 0x07, 0x3C, 0xC4, 0x16, 0x22, 0x7C, 0x6C, 0x28 };
|
||||||
|
|
||||||
int keygen(u8 *keyblob, u32 kb, tsec_ctxt_t *tsec_ctxt)
|
int keygen(u8 *keyblob, u32 kb, tsec_ctxt_t *tsec_ctxt)
|
||||||
|
|
|
@ -91,7 +91,7 @@ pkg2_hdr_t *pkg2_decrypt(void *data, u8 kb)
|
||||||
pkg2_hdr_t mkey_test;
|
pkg2_hdr_t mkey_test;
|
||||||
u8 *pdata = (u8 *)data;
|
u8 *pdata = (u8 *)data;
|
||||||
u8 keyslot = 8;
|
u8 keyslot = 8;
|
||||||
|
|
||||||
// Skip signature.
|
// Skip signature.
|
||||||
pdata += 0x100;
|
pdata += 0x100;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (C) 2018-2019 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
|
|
@ -44,7 +44,7 @@ u8 warmboot_reboot[] = {
|
||||||
0x14, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E450
|
0x14, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E450
|
||||||
0x01, 0x10, 0xB0, 0xE3, // MOVS R1, #1
|
0x01, 0x10, 0xB0, 0xE3, // MOVS R1, #1
|
||||||
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
||||||
0x0C, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E400
|
0x0C, 0x00, 0x9F, 0xE5, // LDR R0, =0x7000E400
|
||||||
0x10, 0x10, 0xB0, 0xE3, // MOVS R1, #0x10
|
0x10, 0x10, 0xB0, 0xE3, // MOVS R1, #0x10
|
||||||
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
0x00, 0x10, 0x80, 0xE5, // STR R1, [R0]
|
||||||
0xFE, 0xFF, 0xFF, 0xEA, // LOOP
|
0xFE, 0xFF, 0xFF, 0xEA, // LOOP
|
||||||
|
@ -80,7 +80,7 @@ void check_sept()
|
||||||
f_unlink("sept/payload.bin");
|
f_unlink("sept/payload.bin");
|
||||||
f_rename("sept/payload.bak", "sept/payload.bin");
|
f_rename("sept/payload.bak", "sept/payload.bin");
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ int reboot_to_sept(const u8 *tsec_fw, u32 kb)
|
||||||
memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot));
|
memcpy((u8 *)(SEPT_PK1T_ADDR - WB_RST_SIZE), (u8 *)warmboot_reboot, sizeof(warmboot_reboot));
|
||||||
memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_fw_size);
|
memcpy((void *)SEPT_PK1T_ADDR, tsec_fw, tsec_fw_size);
|
||||||
*(vu32 *)SEPT_TCSZ_ADDR = tsec_fw_size;
|
*(vu32 *)SEPT_TCSZ_ADDR = tsec_fw_size;
|
||||||
|
|
||||||
// Copy sept-primary.
|
// Copy sept-primary.
|
||||||
if (f_open(&fp, "sept/sept-primary.bin", FA_READ))
|
if (f_open(&fp, "sept/sept-primary.bin", FA_READ))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
|
@ -64,7 +64,6 @@ void get_als_lux(als_table_t *als_val)
|
||||||
data[1] = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1LOW_REG)) +
|
data[1] = i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1LOW_REG)) +
|
||||||
(i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1HIGH_REG)) << 8);
|
(i2c_recv_byte(I2C_2, BH1730_I2C_ADDR, BH1730_ADDR(BH1730_DATA1HIGH_REG)) << 8);
|
||||||
|
|
||||||
|
|
||||||
als_val->over_limit = data[0] > 65534 || data[1] > 65534;
|
als_val->over_limit = data[0] > 65534 || data[1] > 65534;
|
||||||
als_val->vi_light = data[0];
|
als_val->vi_light = data[0];
|
||||||
als_val->ir_light = data[1];
|
als_val->ir_light = data[1];
|
||||||
|
|
|
@ -38,7 +38,7 @@ static int touch_command(u8 cmd)
|
||||||
int err = i2c_send_byte(I2C_3, STMFTS_I2C_ADDR, cmd, 0);
|
int err = i2c_send_byte(I2C_3, STMFTS_I2C_ADDR, cmd, 0);
|
||||||
if (!err)
|
if (!err)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
// TODO: Check for completion in event loop
|
// TODO: Check for completion in event loop
|
||||||
msleep(1);
|
msleep(1);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -60,11 +60,11 @@ static void _touch_process_contact_event(touch_event *event, bool touching)
|
||||||
event->fingers = 0;
|
event->fingers = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _touch_parse_event(touch_event *event)
|
static void _touch_parse_event(touch_event *event)
|
||||||
{
|
{
|
||||||
event->type = event->raw[1] & STMFTS_MASK_EVENT_ID;
|
event->type = event->raw[1] & STMFTS_MASK_EVENT_ID;
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case STMFTS_EV_MULTI_TOUCH_ENTER:
|
case STMFTS_EV_MULTI_TOUCH_ENTER:
|
||||||
case STMFTS_EV_MULTI_TOUCH_MOTION:
|
case STMFTS_EV_MULTI_TOUCH_MOTION:
|
||||||
|
@ -108,7 +108,7 @@ void touch_poll(touch_event *event)
|
||||||
touch_event touch_poll_wait()
|
touch_event touch_poll_wait()
|
||||||
{
|
{
|
||||||
touch_event event;
|
touch_event event;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
touch_poll(&event);
|
touch_poll(&event);
|
||||||
} while (event.type != STMFTS_EV_MULTI_TOUCH_LEAVE);
|
} while (event.type != STMFTS_EV_MULTI_TOUCH_LEAVE);
|
||||||
|
@ -160,7 +160,7 @@ int touch_power_on()
|
||||||
// Enables LDO6 for touchscreen VDD/AVDD supply
|
// Enables LDO6 for touchscreen VDD/AVDD supply
|
||||||
max77620_regulator_set_volt_and_flags(REGULATOR_LDO6, 2900000, MAX77620_POWER_MODE_NORMAL);
|
max77620_regulator_set_volt_and_flags(REGULATOR_LDO6, 2900000, MAX77620_POWER_MODE_NORMAL);
|
||||||
i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_LDO6_CFG2,
|
i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_LDO6_CFG2,
|
||||||
MAX77620_LDO_CFG2_ADE_ENABLE | (3 << 3) | (MAX77620_POWER_MODE_NORMAL << MAX77620_LDO_POWER_MODE_SHIFT));
|
MAX77620_LDO_CFG2_ADE_ENABLE | (3 << 3) | (MAX77620_POWER_MODE_NORMAL << MAX77620_LDO_POWER_MODE_SHIFT));
|
||||||
|
|
||||||
msleep(20);
|
msleep(20);
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ int touch_power_on()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void touch_power_off()
|
void touch_power_off()
|
||||||
{
|
{
|
||||||
touch_command(STMFTS_SLEEP_IN);
|
touch_command(STMFTS_SLEEP_IN);
|
||||||
|
|
||||||
|
|
|
@ -33,24 +33,24 @@ const blz_footer *blz_get_footer(const unsigned char *compData, unsigned int com
|
||||||
}
|
}
|
||||||
|
|
||||||
// From https://github.com/SciresM/hactool/blob/master/kip.c which is exactly how kernel does it, thanks SciresM!
|
// From https://github.com/SciresM/hactool/blob/master/kip.c which is exactly how kernel does it, thanks SciresM!
|
||||||
int blz_uncompress_inplace(unsigned char *dataBuf, unsigned int compSize, const blz_footer *footer)
|
int blz_uncompress_inplace(unsigned char *dataBuf, unsigned int compSize, const blz_footer *footer)
|
||||||
{
|
{
|
||||||
u32 addl_size = footer->addl_size;
|
u32 addl_size = footer->addl_size;
|
||||||
u32 header_size = footer->header_size;
|
u32 header_size = footer->header_size;
|
||||||
u32 cmp_and_hdr_size = footer->cmp_and_hdr_size;
|
u32 cmp_and_hdr_size = footer->cmp_and_hdr_size;
|
||||||
|
|
||||||
unsigned char* cmp_start = &dataBuf[compSize] - cmp_and_hdr_size;
|
unsigned char* cmp_start = &dataBuf[compSize] - cmp_and_hdr_size;
|
||||||
u32 cmp_ofs = cmp_and_hdr_size - header_size;
|
u32 cmp_ofs = cmp_and_hdr_size - header_size;
|
||||||
u32 out_ofs = cmp_and_hdr_size + addl_size;
|
u32 out_ofs = cmp_and_hdr_size + addl_size;
|
||||||
|
|
||||||
while (out_ofs)
|
while (out_ofs)
|
||||||
{
|
{
|
||||||
unsigned char control = cmp_start[--cmp_ofs];
|
unsigned char control = cmp_start[--cmp_ofs];
|
||||||
for (unsigned int i=0; i<8; i++)
|
for (unsigned int i=0; i<8; i++)
|
||||||
{
|
{
|
||||||
if (control & 0x80)
|
if (control & 0x80)
|
||||||
{
|
{
|
||||||
if (cmp_ofs < 2)
|
if (cmp_ofs < 2)
|
||||||
return 0; // Out of bounds.
|
return 0; // Out of bounds.
|
||||||
|
|
||||||
cmp_ofs -= 2;
|
cmp_ofs -= 2;
|
||||||
|
@ -65,17 +65,17 @@ int blz_uncompress_inplace(unsigned char *dataBuf, unsigned int compSize, const
|
||||||
for (unsigned int j = 0; j < seg_size; j++)
|
for (unsigned int j = 0; j < seg_size; j++)
|
||||||
cmp_start[out_ofs + j] = cmp_start[out_ofs + j + seg_ofs];
|
cmp_start[out_ofs + j] = cmp_start[out_ofs + j + seg_ofs];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Copy directly.
|
// Copy directly.
|
||||||
if (cmp_ofs < 1)
|
if (cmp_ofs < 1)
|
||||||
return 0; //out of bounds
|
return 0; //out of bounds
|
||||||
|
|
||||||
cmp_start[--out_ofs] = cmp_start[--cmp_ofs];
|
cmp_start[--out_ofs] = cmp_start[--cmp_ofs];
|
||||||
}
|
}
|
||||||
control <<= 1;
|
control <<= 1;
|
||||||
if (out_ofs == 0) // Blz works backwards, so if it reaches byte 0, it's done.
|
if (out_ofs == 0) // Blz works backwards, so if it reaches byte 0, it's done.
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "elfload.h"
|
#include "elfload.h"
|
||||||
|
|
|
@ -75,7 +75,7 @@ typedef struct el_ctx
|
||||||
// Section Header Str Table
|
// Section Header Str Table
|
||||||
Elf_Shdr shstr;
|
Elf_Shdr shstr;
|
||||||
Elf_Shdr symtab;
|
Elf_Shdr symtab;
|
||||||
|
|
||||||
/* Offset of dynamic table (0 if not ET_DYN) */
|
/* Offset of dynamic table (0 if not ET_DYN) */
|
||||||
Elf_Off dynoff;
|
Elf_Off dynoff;
|
||||||
/* Size of dynamic table (0 if not ET_DYN) */
|
/* Size of dynamic table (0 if not ET_DYN) */
|
||||||
|
|
|
@ -3953,7 +3953,7 @@ FRESULT f_read_fast (
|
||||||
else if (clst == 0xFFFFFFFF) { EFSPRINTF("DSKC"); ABORT(fs, FR_DISK_ERR); }
|
else if (clst == 0xFFFFFFFF) { EFSPRINTF("DSKC"); ABORT(fs, FR_DISK_ERR); }
|
||||||
|
|
||||||
fp->clust = clst; /* Set working cluster */
|
fp->clust = clst; /* Set working cluster */
|
||||||
|
|
||||||
sector_base = clst2sect(fs, fp->clust);
|
sector_base = clst2sect(fs, fp->clust);
|
||||||
count += fs->csize;
|
count += fs->csize;
|
||||||
btr -= csize_bytes;
|
btr -= csize_bytes;
|
||||||
|
@ -4182,7 +4182,7 @@ FRESULT f_write_fast (
|
||||||
else if (clst == 0xFFFFFFFF) { EFSPRINTF("DERR"); ABORT(fs, FR_DISK_ERR); }
|
else if (clst == 0xFFFFFFFF) { EFSPRINTF("DERR"); ABORT(fs, FR_DISK_ERR); }
|
||||||
|
|
||||||
fp->clust = clst; /* Set working cluster */
|
fp->clust = clst; /* Set working cluster */
|
||||||
|
|
||||||
sector_base = clst2sect(fs, fp->clust);
|
sector_base = clst2sect(fs, fp->clust);
|
||||||
count += fs->csize;
|
count += fs->csize;
|
||||||
btw -= csize_bytes;
|
btw -= csize_bytes;
|
||||||
|
|
|
@ -67,7 +67,7 @@ void lv_init(void)
|
||||||
/* Do nothing if already initialized */
|
/* Do nothing if already initialized */
|
||||||
if (_lv_initialized)
|
if (_lv_initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
LV_GC_ROOT(_lv_def_scr) = NULL;
|
LV_GC_ROOT(_lv_def_scr) = NULL;
|
||||||
LV_GC_ROOT(_lv_act_scr) = NULL;
|
LV_GC_ROOT(_lv_act_scr) = NULL;
|
||||||
LV_GC_ROOT(_lv_top_layer) = NULL;
|
LV_GC_ROOT(_lv_top_layer) = NULL;
|
||||||
|
@ -1938,8 +1938,8 @@ static void delete_children(lv_obj_t * obj)
|
||||||
lv_obj_t * i_next;
|
lv_obj_t * i_next;
|
||||||
i = lv_ll_get_head(&(obj->child_ll));
|
i = lv_ll_get_head(&(obj->child_ll));
|
||||||
|
|
||||||
/*Remove from the group; remove before transversing children so that
|
/*Remove from the group; remove before transversing children so that
|
||||||
* the object still has access to all children during the
|
* the object still has access to all children during the
|
||||||
* LV_SIGNAL_DEFOCUS call*/
|
* LV_SIGNAL_DEFOCUS call*/
|
||||||
#if USE_LV_GROUP
|
#if USE_LV_GROUP
|
||||||
if(obj->group_p != NULL) lv_group_remove_obj(obj);
|
if(obj->group_p != NULL) lv_group_remove_obj(obj);
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
/*Store the glyph descriptions*/
|
/*Store the glyph descriptions*/
|
||||||
static const lv_font_glyph_dsc_t hekate_symbol_120_glyph_dsc[] =
|
static const lv_font_glyph_dsc_t hekate_symbol_120_glyph_dsc[] =
|
||||||
{
|
{
|
||||||
#if USE_HEKATE_SYMBOL_120 == 8
|
#if USE_HEKATE_SYMBOL_120 == 8
|
||||||
{.w_px = 103, .glyph_index = 0}, /*Unicode: U+f002 ()*/
|
{.w_px = 103, .glyph_index = 0}, /*Unicode: U+f002 ()*/
|
||||||
|
@ -35,7 +35,7 @@ static const lv_font_glyph_dsc_t hekate_symbol_120_glyph_dsc[] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
lv_font_t hekate_symbol_120 =
|
lv_font_t hekate_symbol_120 =
|
||||||
{
|
{
|
||||||
.unicode_first = LV_SYMBOL_GLYPH_FIRST, /*First Unicode letter in this font*/
|
.unicode_first = LV_SYMBOL_GLYPH_FIRST, /*First Unicode letter in this font*/
|
||||||
.unicode_last = LV_SYMBOL_GLYPH_LAST, /*Last Unicode letter in this font*/
|
.unicode_last = LV_SYMBOL_GLYPH_LAST, /*Last Unicode letter in this font*/
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
/*Store the glyph descriptions*/
|
/*Store the glyph descriptions*/
|
||||||
static const lv_font_glyph_dsc_t hekate_symbol_20_glyph_dsc[] =
|
static const lv_font_glyph_dsc_t hekate_symbol_20_glyph_dsc[] =
|
||||||
{
|
{
|
||||||
#if USE_HEKATE_SYMBOL_20 == 4
|
#if USE_HEKATE_SYMBOL_20 == 4
|
||||||
{.w_px = 5, .glyph_index = 0}, /*Unicode: U+f001 ()*/
|
{.w_px = 5, .glyph_index = 0}, /*Unicode: U+f001 ()*/
|
||||||
|
@ -133,7 +133,7 @@ static const lv_font_glyph_dsc_t hekate_symbol_20_glyph_dsc[] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
lv_font_t hekate_symbol_20 =
|
lv_font_t hekate_symbol_20 =
|
||||||
{
|
{
|
||||||
.unicode_first = LV_SYMBOL_GLYPH_FIRST, /*First Unicode letter in this font*/
|
.unicode_first = LV_SYMBOL_GLYPH_FIRST, /*First Unicode letter in this font*/
|
||||||
.unicode_last = LV_SYMBOL_GLYPH_LAST, /*Last Unicode letter in this font*/
|
.unicode_last = LV_SYMBOL_GLYPH_LAST, /*Last Unicode letter in this font*/
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
/*Store the glyph descriptions*/
|
/*Store the glyph descriptions*/
|
||||||
static const lv_font_glyph_dsc_t hekate_symbol_30_glyph_dsc[] =
|
static const lv_font_glyph_dsc_t hekate_symbol_30_glyph_dsc[] =
|
||||||
{
|
{
|
||||||
#if USE_HEKATE_SYMBOL_30 == 4
|
#if USE_HEKATE_SYMBOL_30 == 4
|
||||||
{.w_px = 7, .glyph_index = 0}, /*Unicode: U+f001 ()*/
|
{.w_px = 7, .glyph_index = 0}, /*Unicode: U+f001 ()*/
|
||||||
|
@ -133,7 +133,7 @@ static const lv_font_glyph_dsc_t hekate_symbol_30_glyph_dsc[] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
lv_font_t hekate_symbol_30 =
|
lv_font_t hekate_symbol_30 =
|
||||||
{
|
{
|
||||||
.unicode_first = LV_SYMBOL_GLYPH_FIRST, /*First Unicode letter in this font*/
|
.unicode_first = LV_SYMBOL_GLYPH_FIRST, /*First Unicode letter in this font*/
|
||||||
.unicode_last = LV_SYMBOL_GLYPH_LAST, /*Last Unicode letter in this font*/
|
.unicode_last = LV_SYMBOL_GLYPH_LAST, /*Last Unicode letter in this font*/
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
/*Store the glyph descriptions*/
|
/*Store the glyph descriptions*/
|
||||||
static const lv_font_glyph_dsc_t interui_20_glyph_dsc[] =
|
static const lv_font_glyph_dsc_t interui_20_glyph_dsc[] =
|
||||||
{
|
{
|
||||||
#if USE_INTERUI_20 == 4
|
#if USE_INTERUI_20 == 4
|
||||||
{.w_px = 6, .glyph_index = 0}, /*Unicode: U+0020 ( )*/
|
{.w_px = 6, .glyph_index = 0}, /*Unicode: U+0020 ( )*/
|
||||||
|
@ -222,7 +222,7 @@ static const lv_font_glyph_dsc_t interui_20_glyph_dsc[] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
lv_font_t interui_20 =
|
lv_font_t interui_20 =
|
||||||
{
|
{
|
||||||
.unicode_first = 32, /*First Unicode letter in this font*/
|
.unicode_first = 32, /*First Unicode letter in this font*/
|
||||||
.unicode_last = 126, /*Last Unicode letter in this font*/
|
.unicode_last = 126, /*Last Unicode letter in this font*/
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
/*Store the glyph descriptions*/
|
/*Store the glyph descriptions*/
|
||||||
static const lv_font_glyph_dsc_t interui_30_glyph_dsc[] =
|
static const lv_font_glyph_dsc_t interui_30_glyph_dsc[] =
|
||||||
{
|
{
|
||||||
#if USE_INTERUI_30 == 4
|
#if USE_INTERUI_30 == 4
|
||||||
{.w_px = 8, .glyph_index = 0}, /*Unicode: U+0020 ( )*/
|
{.w_px = 8, .glyph_index = 0}, /*Unicode: U+0020 ( )*/
|
||||||
|
@ -222,7 +222,7 @@ static const lv_font_glyph_dsc_t interui_30_glyph_dsc[] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
lv_font_t interui_30 =
|
lv_font_t interui_30 =
|
||||||
{
|
{
|
||||||
.unicode_first = 32, /*First Unicode letter in this font*/
|
.unicode_first = 32, /*First Unicode letter in this font*/
|
||||||
.unicode_last = 126, /*Last Unicode letter in this font*/
|
.unicode_last = 126, /*Last Unicode letter in this font*/
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
/*Store the glyph descriptions*/
|
/*Store the glyph descriptions*/
|
||||||
static const lv_font_glyph_dsc_t ubuntu_mono_glyph_dsc[] =
|
static const lv_font_glyph_dsc_t ubuntu_mono_glyph_dsc[] =
|
||||||
{
|
{
|
||||||
#if USE_UBUNTU_MONO == 4
|
#if USE_UBUNTU_MONO == 4
|
||||||
{.w_px = 6, .glyph_index = 0}, /*Unicode: U+0020 ( )*/
|
{.w_px = 6, .glyph_index = 0}, /*Unicode: U+0020 ( )*/
|
||||||
|
@ -222,7 +222,7 @@ static const lv_font_glyph_dsc_t ubuntu_mono_glyph_dsc[] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
lv_font_t ubuntu_mono =
|
lv_font_t ubuntu_mono =
|
||||||
{
|
{
|
||||||
.unicode_first = 32, /*First Unicode letter in this font*/
|
.unicode_first = 32, /*First Unicode letter in this font*/
|
||||||
.unicode_last = 126, /*Last Unicode letter in this font*/
|
.unicode_last = 126, /*Last Unicode letter in this font*/
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
* STATIC VARIABLES
|
* STATIC VARIABLES
|
||||||
**********************/
|
**********************/
|
||||||
#if (!defined(LV_ENABLE_GC)) || LV_ENABLE_GC == 0
|
#if (!defined(LV_ENABLE_GC)) || LV_ENABLE_GC == 0
|
||||||
LV_ROOTS
|
LV_ROOTS
|
||||||
#endif /* LV_ENABLE_GC */
|
#endif /* LV_ENABLE_GC */
|
||||||
/**********************
|
/**********************
|
||||||
* MACROS
|
* MACROS
|
||||||
|
|
|
@ -41,15 +41,14 @@ extern "C" {
|
||||||
prefix void * _lv_task_act;\
|
prefix void * _lv_task_act;\
|
||||||
prefix void * _lv_indev_list;\
|
prefix void * _lv_indev_list;\
|
||||||
prefix void * _lv_disp_list;\
|
prefix void * _lv_disp_list;\
|
||||||
|
|
||||||
|
|
||||||
#define LV_NO_PREFIX
|
#define LV_NO_PREFIX
|
||||||
#define LV_ROOTS LV_GC_ROOTS(LV_NO_PREFIX)
|
#define LV_ROOTS LV_GC_ROOTS(LV_NO_PREFIX)
|
||||||
|
|
||||||
#if LV_ENABLE_GC == 1
|
#if LV_ENABLE_GC == 1
|
||||||
# if LV_MEM_CUSTOM != 1
|
# if LV_MEM_CUSTOM != 1
|
||||||
# error "GC requires CUSTOM_MEM"
|
# error "GC requires CUSTOM_MEM"
|
||||||
# endif /* LV_MEM_CUSTOM */
|
# endif /* LV_MEM_CUSTOM */
|
||||||
#else /* LV_ENABLE_GC */
|
#else /* LV_ENABLE_GC */
|
||||||
# define LV_GC_ROOT(x) x
|
# define LV_GC_ROOT(x) x
|
||||||
LV_GC_ROOTS(extern)
|
LV_GC_ROOTS(extern)
|
||||||
|
|
|
@ -189,9 +189,9 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font,
|
||||||
} else { /*Check the actual length*/
|
} else { /*Check the actual length*/
|
||||||
n_char_since_last_break++;
|
n_char_since_last_break++;
|
||||||
letter_width = lv_font_get_width(font, letter);
|
letter_width = lv_font_get_width(font, letter);
|
||||||
cur_w += letter_width;
|
cur_w += letter_width;
|
||||||
|
|
||||||
/* Get the length of the current work and determine best place
|
/* Get the length of the current work and determine best place
|
||||||
* to break the line. */
|
* to break the line. */
|
||||||
if(cur_w > max_width) {
|
if(cur_w > max_width) {
|
||||||
if( last_break != NO_BREAK_FOUND ) {
|
if( last_break != NO_BREAK_FOUND ) {
|
||||||
|
@ -231,7 +231,7 @@ uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font,
|
||||||
}
|
}
|
||||||
other = false;
|
other = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
n_char_since_last_break++;
|
n_char_since_last_break++;
|
||||||
lv_coord_t letter_width2 = lv_font_get_width(font, letter);
|
lv_coord_t letter_width2 = lv_font_get_width(font, letter);
|
||||||
cur_w += letter_width2;
|
cur_w += letter_width2;
|
||||||
|
|
|
@ -801,7 +801,7 @@ static void draw_days(lv_obj_t * calendar, const lv_area_t * mask)
|
||||||
lv_area_t label_area;
|
lv_area_t label_area;
|
||||||
lv_opa_t opa_scale = lv_obj_get_opa_scale(calendar);
|
lv_opa_t opa_scale = lv_obj_get_opa_scale(calendar);
|
||||||
label_area.y1 = calendar->coords.y1 + get_header_height(calendar) +
|
label_area.y1 = calendar->coords.y1 + get_header_height(calendar) +
|
||||||
ext->style_day_names->body.padding.ver + lv_font_get_height(ext->style_day_names->text.font) +
|
ext->style_day_names->body.padding.ver + lv_font_get_height(ext->style_day_names->text.font) +
|
||||||
ext->style_day_names->body.padding.ver;
|
ext->style_day_names->body.padding.ver;
|
||||||
label_area.y2 = label_area.y1 + lv_font_get_height(style_bg->text.font);
|
label_area.y2 = label_area.y1 + lv_font_get_height(style_bg->text.font);
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue