mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 19:31:12 +00:00
Whitespaces, fixes
This commit is contained in:
parent
c9379d97a3
commit
355ebb6acf
71 changed files with 1496 additions and 1448 deletions
28
ipl/arm64.h
28
ipl/arm64.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ARM64_H_
|
#ifndef _ARM64_H_
|
||||||
#define _ARM64_H_
|
#define _ARM64_H_
|
||||||
|
|
125
ipl/blz.c
125
ipl/blz.c
|
@ -1,97 +1,98 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 rajkosto
|
* Copyright (c) 2018 rajkosto
|
||||||
* Copyright (c) 2018 SciresM
|
* Copyright (c) 2018 SciresM
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "blz.h"
|
#include "blz.h"
|
||||||
|
|
||||||
const blz_footer* blz_get_footer(const unsigned char* compData, unsigned int compDataLen, blz_footer* outFooter)
|
const blz_footer *blz_get_footer(const unsigned char *compData, unsigned int compDataLen, blz_footer *outFooter)
|
||||||
{
|
{
|
||||||
if (compDataLen < sizeof(blz_footer))
|
if (compDataLen < sizeof(blz_footer))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
const blz_footer* srcFooter = (const blz_footer*)&compData[compDataLen-sizeof(blz_footer)];
|
const blz_footer *srcFooter = (const blz_footer*)&compData[compDataLen - sizeof(blz_footer)];
|
||||||
if (outFooter != NULL)
|
if (outFooter != NULL)
|
||||||
memcpy(outFooter, srcFooter, sizeof(blz_footer)); //must be a memcpy because no umaligned accesses on ARMv4
|
memcpy(outFooter, srcFooter, sizeof(blz_footer)); // Must be a memcpy because no umaligned accesses on ARMv4.
|
||||||
|
|
||||||
return srcFooter;
|
return srcFooter;
|
||||||
}
|
}
|
||||||
|
|
||||||
//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;
|
||||||
u16 seg_val = ((unsigned int)(cmp_start[cmp_ofs+1]) << 8) | cmp_start[cmp_ofs];
|
u16 seg_val = ((unsigned int)(cmp_start[cmp_ofs + 1]) << 8) | cmp_start[cmp_ofs];
|
||||||
u32 seg_size = ((seg_val >> 12) & 0xF) + 3;
|
u32 seg_size = ((seg_val >> 12) & 0xF) + 3;
|
||||||
u32 seg_ofs = (seg_val & 0x0FFF) + 3;
|
u32 seg_ofs = (seg_val & 0x0FFF) + 3;
|
||||||
if (out_ofs < seg_size) // Kernel restricts segment copy to stay in bounds.
|
if (out_ofs < seg_size) // Kernel restricts segment copy to stay in bounds.
|
||||||
seg_size = out_ofs;
|
seg_size = out_ofs;
|
||||||
|
|
||||||
out_ofs -= seg_size;
|
out_ofs -= seg_size;
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int blz_uncompress_srcdest(const unsigned char* compData, unsigned int compDataLen, unsigned char* dstData, unsigned int dstSize)
|
int blz_uncompress_srcdest(const unsigned char *compData, unsigned int compDataLen, unsigned char *dstData, unsigned int dstSize)
|
||||||
{
|
{
|
||||||
blz_footer footer;
|
blz_footer footer;
|
||||||
const blz_footer* compFooterPtr = blz_get_footer(compData, compDataLen, &footer);
|
const blz_footer *compFooterPtr = blz_get_footer(compData, compDataLen, &footer);
|
||||||
if (compFooterPtr == NULL)
|
if (compFooterPtr == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
//decompression must be done in-place, so need to copy the relevant compressed data first
|
// Decompression must be done in-place, so need to copy the relevant compressed data first.
|
||||||
unsigned int numCompBytes = (const unsigned char*)(compFooterPtr)-compData;
|
unsigned int numCompBytes = (const unsigned char*)(compFooterPtr)-compData;
|
||||||
memcpy(dstData, compData, numCompBytes);
|
memcpy(dstData, compData, numCompBytes);
|
||||||
memset(&dstData[numCompBytes], 0, dstSize-numCompBytes);
|
memset(&dstData[numCompBytes], 0, dstSize - numCompBytes);
|
||||||
|
|
||||||
return blz_uncompress_inplace(dstData, compDataLen, &footer);
|
return blz_uncompress_inplace(dstData, compDataLen, &footer);
|
||||||
}
|
}
|
46
ipl/blz.h
46
ipl/blz.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 rajkosto
|
* Copyright (c) 2018 rajkosto
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _BLZ_H_
|
#ifndef _BLZ_H_
|
||||||
#define _BLZ_H_
|
#define _BLZ_H_
|
||||||
|
@ -21,16 +21,16 @@
|
||||||
|
|
||||||
typedef struct _blz_footer
|
typedef struct _blz_footer
|
||||||
{
|
{
|
||||||
u32 cmp_and_hdr_size;
|
u32 cmp_and_hdr_size;
|
||||||
u32 header_size;
|
u32 header_size;
|
||||||
u32 addl_size;
|
u32 addl_size;
|
||||||
} blz_footer;
|
} blz_footer;
|
||||||
|
|
||||||
//returns pointer to footer in compData if present, additionally copies it to outFooter if not NULL
|
// Returns pointer to footer in compData if present, additionally copies it to outFooter if not NULL.
|
||||||
const blz_footer* blz_get_footer(const unsigned char* compData, unsigned int compDataLen, blz_footer* outFooter);
|
const blz_footer *blz_get_footer(const unsigned char *compData, unsigned int compDataLen, blz_footer *outFooter);
|
||||||
//returns 0 on failure
|
// Returns 0 on failure.
|
||||||
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);
|
||||||
//returns 0 on failure
|
// Returns 0 on failure.
|
||||||
int blz_uncompress_srcdest(const unsigned char* compData, unsigned int compDataLen, unsigned char* dstData, unsigned int dstSize);
|
int blz_uncompress_srcdest(const unsigned char *compData, unsigned int compDataLen, unsigned char *dstData, unsigned int dstSize);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,20 +1,20 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "bq24193.h"
|
#include "bq24193.h"
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __BQ24193_H_
|
#ifndef __BQ24193_H_
|
||||||
#define __BQ24193_H_
|
#define __BQ24193_H_
|
||||||
|
@ -100,17 +100,17 @@ enum BQ24193_reg {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum BQ24193_reg_prop {
|
enum BQ24193_reg_prop {
|
||||||
BQ24193_InputVoltageLimit, // REG 0.
|
BQ24193_InputVoltageLimit, // REG 0.
|
||||||
BQ24193_InputCurrentLimit, // REG 0.
|
BQ24193_InputCurrentLimit, // REG 0.
|
||||||
BQ24193_SystemMinimumVoltage, // REG 1.
|
BQ24193_SystemMinimumVoltage, // REG 1.
|
||||||
BQ24193_FastChargeCurrentLimit, // REG 2.
|
BQ24193_FastChargeCurrentLimit, // REG 2.
|
||||||
BQ24193_ChargeVoltageLimit, // REG 4.
|
BQ24193_ChargeVoltageLimit, // REG 4.
|
||||||
BQ24193_RechargeThreshold, // REG 4.
|
BQ24193_RechargeThreshold, // REG 4.
|
||||||
BQ24193_ThermalRegulation, // REG 6.
|
BQ24193_ThermalRegulation, // REG 6.
|
||||||
BQ24193_ChargeStatus, // REG 8.
|
BQ24193_ChargeStatus, // REG 8.
|
||||||
BQ24193_TempStatus, // REG 9.
|
BQ24193_TempStatus, // REG 9.
|
||||||
BQ24193_DevID, // REG A.
|
BQ24193_DevID, // REG A.
|
||||||
BQ24193_ProductNumber, // REG A.
|
BQ24193_ProductNumber, // REG A.
|
||||||
};
|
};
|
||||||
|
|
||||||
int bq24193_get_property(enum BQ24193_reg_prop prop, int *value);
|
int bq24193_get_property(enum BQ24193_reg_prop prop, int *value);
|
||||||
|
|
30
ipl/btn.c
30
ipl/btn.c
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "btn.h"
|
#include "btn.h"
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
|
|
30
ipl/btn.h
30
ipl/btn.h
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _BTN_H_
|
#ifndef _BTN_H_
|
||||||
#define _BTN_H_
|
#define _BTN_H_
|
||||||
|
|
97
ipl/clock.c
97
ipl/clock.c
|
@ -1,25 +1,25 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "sdmmc.h"
|
#include "sdmmc.h"
|
||||||
|
|
||||||
static const clock_t _clock_uart[] = {
|
static const clock_t _clock_uart[] = {
|
||||||
/* UART A */ { CLK_RST_CONTROLLER_RST_DEVICES_L, CLK_RST_CONTROLLER_CLK_OUT_ENB_L, CLK_RST_CONTROLLER_CLK_SOURCE_UARTA, 6, 0, 0 },
|
/* UART A */ { CLK_RST_CONTROLLER_RST_DEVICES_L, CLK_RST_CONTROLLER_CLK_OUT_ENB_L, CLK_RST_CONTROLLER_CLK_SOURCE_UARTA, 6, 0, 0 },
|
||||||
/* UART B */ { CLK_RST_CONTROLLER_RST_DEVICES_L, CLK_RST_CONTROLLER_CLK_OUT_ENB_L, CLK_RST_CONTROLLER_CLK_SOURCE_UARTB, 7, 0, 0 },
|
/* UART B */ { CLK_RST_CONTROLLER_RST_DEVICES_L, CLK_RST_CONTROLLER_CLK_OUT_ENB_L, CLK_RST_CONTROLLER_CLK_SOURCE_UARTB, 7, 0, 0 },
|
||||||
/* UART C */ { CLK_RST_CONTROLLER_RST_DEVICES_H, CLK_RST_CONTROLLER_CLK_OUT_ENB_H, CLK_RST_CONTROLLER_CLK_SOURCE_UARTC, 0x17, 0, 0 },
|
/* UART C */ { CLK_RST_CONTROLLER_RST_DEVICES_H, CLK_RST_CONTROLLER_CLK_OUT_ENB_H, CLK_RST_CONTROLLER_CLK_SOURCE_UARTC, 0x17, 0, 0 },
|
||||||
|
@ -50,24 +50,24 @@ static clock_t _clock_coresight = { CLK_RST_CONTROLLER_RST_DEVICES_U, CLK_RST_CO
|
||||||
|
|
||||||
void clock_enable(const clock_t *clk)
|
void clock_enable(const clock_t *clk)
|
||||||
{
|
{
|
||||||
//Put clock into reset.
|
// Put clock into reset.
|
||||||
CLOCK(clk->reset) = (CLOCK(clk->reset) & ~(1 << clk->index)) | (1 << clk->index);
|
CLOCK(clk->reset) = (CLOCK(clk->reset) & ~(1 << clk->index)) | (1 << clk->index);
|
||||||
//Disable.
|
// Disable.
|
||||||
CLOCK(clk->enable) &= ~(1 << clk->index);
|
CLOCK(clk->enable) &= ~(1 << clk->index);
|
||||||
//Configure clock source if required.
|
// Configure clock source if required.
|
||||||
if (clk->source)
|
if (clk->source)
|
||||||
CLOCK(clk->source) = clk->clk_div | (clk->clk_src << 29);
|
CLOCK(clk->source) = clk->clk_div | (clk->clk_src << 29);
|
||||||
//Enable.
|
// Enable.
|
||||||
CLOCK(clk->enable) = (CLOCK(clk->enable) & ~(1 << clk->index)) | (1 << clk->index);
|
CLOCK(clk->enable) = (CLOCK(clk->enable) & ~(1 << clk->index)) | (1 << clk->index);
|
||||||
//Take clock off reset.
|
// Take clock off reset.
|
||||||
CLOCK(clk->reset) &= ~(1 << clk->index);
|
CLOCK(clk->reset) &= ~(1 << clk->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void clock_disable(const clock_t *clk)
|
void clock_disable(const clock_t *clk)
|
||||||
{
|
{
|
||||||
//Put clock into reset.
|
// Put clock into reset.
|
||||||
CLOCK(clk->reset) = (CLOCK(clk->reset) & ~(1 << clk->index)) | (1 << clk->index);
|
CLOCK(clk->reset) = (CLOCK(clk->reset) & ~(1 << clk->index)) | (1 << clk->index);
|
||||||
//Disable.
|
// Disable.
|
||||||
CLOCK(clk->enable) &= ~(1 << clk->index);
|
CLOCK(clk->enable) &= ~(1 << clk->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,40 +162,45 @@ void clock_enable_cl_dvfs()
|
||||||
clock_enable(&_clock_cl_dvfs);
|
clock_enable(&_clock_cl_dvfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clock_disable_cl_dvfs()
|
||||||
|
{
|
||||||
|
clock_disable(&_clock_cl_dvfs);
|
||||||
|
}
|
||||||
|
|
||||||
void clock_enable_coresight()
|
void clock_enable_coresight()
|
||||||
{
|
{
|
||||||
clock_enable(&_clock_coresight);
|
clock_enable(&_clock_coresight);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define L_SWR_SDMMC1_RST (1<<14)
|
#define L_SWR_SDMMC1_RST (1 << 14)
|
||||||
#define L_SWR_SDMMC2_RST (1<<9)
|
#define L_SWR_SDMMC2_RST (1 << 9)
|
||||||
#define L_SWR_SDMMC4_RST (1<<15)
|
#define L_SWR_SDMMC4_RST (1 << 15)
|
||||||
#define U_SWR_SDMMC3_RST (1<<5)
|
#define U_SWR_SDMMC3_RST (1 << 5)
|
||||||
|
|
||||||
#define L_CLK_ENB_SDMMC1 (1<<14)
|
#define L_CLK_ENB_SDMMC1 (1 << 14)
|
||||||
#define L_CLK_ENB_SDMMC2 (1<<9)
|
#define L_CLK_ENB_SDMMC2 (1 << 9)
|
||||||
#define L_CLK_ENB_SDMMC4 (1<<15)
|
#define L_CLK_ENB_SDMMC4 (1 << 15)
|
||||||
#define U_CLK_ENB_SDMMC3 (1<<5)
|
#define U_CLK_ENB_SDMMC3 (1 << 5)
|
||||||
|
|
||||||
#define L_SET_SDMMC1_RST (1<<14)
|
#define L_SET_SDMMC1_RST (1 << 14)
|
||||||
#define L_SET_SDMMC2_RST (1<<9)
|
#define L_SET_SDMMC2_RST (1 << 9)
|
||||||
#define L_SET_SDMMC4_RST (1<<15)
|
#define L_SET_SDMMC4_RST (1 << 15)
|
||||||
#define U_SET_SDMMC3_RST (1<<5)
|
#define U_SET_SDMMC3_RST (1 << 5)
|
||||||
|
|
||||||
#define L_CLR_SDMMC1_RST (1<<14)
|
#define L_CLR_SDMMC1_RST (1 << 14)
|
||||||
#define L_CLR_SDMMC2_RST (1<<9)
|
#define L_CLR_SDMMC2_RST (1 << 9)
|
||||||
#define L_CLR_SDMMC4_RST (1<<15)
|
#define L_CLR_SDMMC4_RST (1 << 15)
|
||||||
#define U_CLR_SDMMC3_RST (1<<5)
|
#define U_CLR_SDMMC3_RST (1 << 5)
|
||||||
|
|
||||||
#define L_SET_CLK_ENB_SDMMC1 (1<<14)
|
#define L_SET_CLK_ENB_SDMMC1 (1 << 14)
|
||||||
#define L_SET_CLK_ENB_SDMMC2 (1<<9)
|
#define L_SET_CLK_ENB_SDMMC2 (1 << 9)
|
||||||
#define L_SET_CLK_ENB_SDMMC4 (1<<15)
|
#define L_SET_CLK_ENB_SDMMC4 (1 << 15)
|
||||||
#define U_SET_CLK_ENB_SDMMC3 (1<<5)
|
#define U_SET_CLK_ENB_SDMMC3 (1 << 5)
|
||||||
|
|
||||||
#define L_CLR_CLK_ENB_SDMMC1 (1<<14)
|
#define L_CLR_CLK_ENB_SDMMC1 (1 << 14)
|
||||||
#define L_CLR_CLK_ENB_SDMMC2 (1<<9)
|
#define L_CLR_CLK_ENB_SDMMC2 (1 << 9)
|
||||||
#define L_CLR_CLK_ENB_SDMMC4 (1<<15)
|
#define L_CLR_CLK_ENB_SDMMC4 (1 << 15)
|
||||||
#define U_CLR_CLK_ENB_SDMMC3 (1<<5)
|
#define U_CLR_CLK_ENB_SDMMC3 (1 << 5)
|
||||||
|
|
||||||
static int _clock_sdmmc_is_reset(u32 id)
|
static int _clock_sdmmc_is_reset(u32 id)
|
||||||
{
|
{
|
||||||
|
|
32
ipl/clock.h
32
ipl/clock.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CLOCK_H_
|
#ifndef _CLOCK_H_
|
||||||
#define _CLOCK_H_
|
#define _CLOCK_H_
|
||||||
|
@ -42,6 +42,8 @@
|
||||||
#define CLK_RST_CONTROLLER_PLLD_BASE 0xD0
|
#define CLK_RST_CONTROLLER_PLLD_BASE 0xD0
|
||||||
#define CLK_RST_CONTROLLER_PLLX_BASE 0xE0
|
#define CLK_RST_CONTROLLER_PLLX_BASE 0xE0
|
||||||
#define CLK_RST_CONTROLLER_PLLX_MISC 0xE4
|
#define CLK_RST_CONTROLLER_PLLX_MISC 0xE4
|
||||||
|
#define CLK_RST_CONTROLLER_PLLE_BASE 0xE8
|
||||||
|
#define CLK_RST_CONTROLLER_PLLE_MISC 0xEC
|
||||||
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRA 0xF8
|
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRA 0xF8
|
||||||
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRB 0xFC
|
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRB 0xFC
|
||||||
#define CLK_RST_CONTROLLER_CLK_SOURCE_I2C1 0x124
|
#define CLK_RST_CONTROLLER_CLK_SOURCE_I2C1 0x124
|
||||||
|
@ -96,6 +98,7 @@
|
||||||
#define CLK_RST_CONTROLLER_CLK_ENB_W_CLR 0x44C
|
#define CLK_RST_CONTROLLER_CLK_ENB_W_CLR 0x44C
|
||||||
#define CLK_RST_CONTROLLER_RST_CPUG_CMPLX_CLR 0x454
|
#define CLK_RST_CONTROLLER_RST_CPUG_CMPLX_CLR 0x454
|
||||||
#define CLK_RST_CONTROLLER_UTMIP_PLL_CFG2 0x488
|
#define CLK_RST_CONTROLLER_UTMIP_PLL_CFG2 0x488
|
||||||
|
#define CLK_RST_CONTROLLER_PLLE_AUX 0x48C
|
||||||
#define CLK_RST_CONTROLLER_AUDIO_SYNC_CLK_I2S0 0x4A0
|
#define CLK_RST_CONTROLLER_AUDIO_SYNC_CLK_I2S0 0x4A0
|
||||||
#define CLK_RST_CONTROLLER_PLLX_MISC_3 0x518
|
#define CLK_RST_CONTROLLER_PLLX_MISC_3 0x518
|
||||||
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRE 0x554
|
#define CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRE 0x554
|
||||||
|
@ -141,6 +144,7 @@ void clock_disable_sor1();
|
||||||
void clock_enable_kfuse();
|
void clock_enable_kfuse();
|
||||||
void clock_disable_kfuse();
|
void clock_disable_kfuse();
|
||||||
void clock_enable_cl_dvfs();
|
void clock_enable_cl_dvfs();
|
||||||
|
void clock_disable_cl_dvfs();
|
||||||
void clock_enable_coresight();
|
void clock_enable_coresight();
|
||||||
void clock_sdmmc_config_clock_source(u32 *pout, u32 id, u32 val);
|
void clock_sdmmc_config_clock_source(u32 *pout, u32 id, u32 val);
|
||||||
void clock_sdmmc_get_params(u32 *pout, u16 *pdivisor, u32 type);
|
void clock_sdmmc_get_params(u32 *pout, u16 *pdivisor, u32 type);
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cluster.h"
|
#include "cluster.h"
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
|
@ -28,7 +28,7 @@ void _cluster_enable_power()
|
||||||
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_AME_GPIO, tmp & 0xDF);
|
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_AME_GPIO, tmp & 0xDF);
|
||||||
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_GPIO5, 0x09);
|
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_GPIO5, 0x09);
|
||||||
|
|
||||||
//Enable cores power.
|
// Enable cores power.
|
||||||
i2c_send_byte(I2C_5, 0x1B, 0x2, 0x20);
|
i2c_send_byte(I2C_5, 0x1B, 0x2, 0x20);
|
||||||
i2c_send_byte(I2C_5, 0x1B, 0x3, 0x8D);
|
i2c_send_byte(I2C_5, 0x1B, 0x3, 0x8D);
|
||||||
i2c_send_byte(I2C_5, 0x1B, 0x0, 0xB7);
|
i2c_send_byte(I2C_5, 0x1B, 0x0, 0xB7);
|
||||||
|
@ -37,7 +37,7 @@ void _cluster_enable_power()
|
||||||
|
|
||||||
int _cluster_pmc_enable_partition(u32 part, u32 toggle)
|
int _cluster_pmc_enable_partition(u32 part, u32 toggle)
|
||||||
{
|
{
|
||||||
//Check if the partition has already been turned on.
|
// Check if the partition has already been turned on.
|
||||||
if (PMC(APBDEV_PMC_PWRGATE_STATUS) & part)
|
if (PMC(APBDEV_PMC_PWRGATE_STATUS) & part)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ int _cluster_pmc_enable_partition(u32 part, u32 toggle)
|
||||||
|
|
||||||
void cluster_boot_cpu0(u32 entry)
|
void cluster_boot_cpu0(u32 entry)
|
||||||
{
|
{
|
||||||
//Set ACTIVE_CLUSER to FAST.
|
// Set ACTIVE_CLUSER to FAST.
|
||||||
FLOW_CTLR(FLOW_CTLR_BPMP_CLUSTER_CONTROL) &= 0xFFFFFFFE;
|
FLOW_CTLR(FLOW_CTLR_BPMP_CLUSTER_CONTROL) &= 0xFFFFFFFE;
|
||||||
|
|
||||||
_cluster_enable_power();
|
_cluster_enable_power();
|
||||||
|
@ -83,45 +83,45 @@ void cluster_boot_cpu0(u32 entry)
|
||||||
while (!(CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) & 0x8000000))
|
while (!(CLOCK(CLK_RST_CONTROLLER_PLLX_BASE) & 0x8000000))
|
||||||
;
|
;
|
||||||
|
|
||||||
//Configure MSELECT source and enable clock.
|
// Configure MSELECT source and enable clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) & 0x1FFFFF00) | 6;
|
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_MSELECT) & 0x1FFFFF00) | 6;
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_V) = (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_V) & 0xFFFFFFF7) | 8;
|
CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_V) = (CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_V) & 0xFFFFFFF7) | 8;
|
||||||
|
|
||||||
//Configure initial CPU clock frequency and enable clock.
|
// Configure initial CPU clock frequency and enable clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CCLK_BURST_POLICY) = 0x20008888;
|
CLOCK(CLK_RST_CONTROLLER_CCLK_BURST_POLICY) = 0x20008888;
|
||||||
CLOCK(CLK_RST_CONTROLLER_SUPER_CCLK_DIVIDER) = 0x80000000;
|
CLOCK(CLK_RST_CONTROLLER_SUPER_CCLK_DIVIDER) = 0x80000000;
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_V_SET) = 1;
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_V_SET) = 1;
|
||||||
|
|
||||||
clock_enable_coresight();
|
clock_enable_coresight();
|
||||||
|
|
||||||
//CAR2PMC_CPU_ACK_WIDTH should be set to 0.
|
// CAR2PMC_CPU_ACK_WIDTH should be set to 0.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CPU_SOFTRST_CTRL2) &= 0xFFFFF000;
|
CLOCK(CLK_RST_CONTROLLER_CPU_SOFTRST_CTRL2) &= 0xFFFFF000;
|
||||||
|
|
||||||
//Enable CPU rail.
|
// Enable CPU rail.
|
||||||
_cluster_pmc_enable_partition(1, 0);
|
_cluster_pmc_enable_partition(1, 0);
|
||||||
//Enable cluster 0 non-CPU.
|
//Enable cluster 0 non-CPU.
|
||||||
_cluster_pmc_enable_partition(0x8000, 15);
|
_cluster_pmc_enable_partition(0x8000, 15);
|
||||||
//Enable CE0.
|
// Enable CE0.
|
||||||
_cluster_pmc_enable_partition(0x4000, 14);
|
_cluster_pmc_enable_partition(0x4000, 14);
|
||||||
|
|
||||||
//Request and wait for RAM repair.
|
// Request and wait for RAM repair.
|
||||||
FLOW_CTLR(FLOW_CTLR_RAM_REPAIR) = 1;
|
FLOW_CTLR(FLOW_CTLR_RAM_REPAIR) = 1;
|
||||||
while (!(FLOW_CTLR(FLOW_CTLR_RAM_REPAIR) & 2))
|
while (!(FLOW_CTLR(FLOW_CTLR_RAM_REPAIR) & 2))
|
||||||
;
|
;
|
||||||
|
|
||||||
EXCP_VEC(0x100) = 0;
|
EXCP_VEC(0x100) = 0;
|
||||||
|
|
||||||
//Set reset vector.
|
// Set reset vector.
|
||||||
SB(SB_AA64_RESET_LOW) = entry | 1;
|
SB(SB_AA64_RESET_LOW) = entry | 1;
|
||||||
SB(SB_AA64_RESET_HIGH) = 0;
|
SB(SB_AA64_RESET_HIGH) = 0;
|
||||||
//Non-secure reset vector write disable.
|
// Non-secure reset vector write disable.
|
||||||
SB(SB_CSR) = 2;
|
SB(SB_CSR) = 2;
|
||||||
(void)SB(SB_CSR);
|
(void)SB(SB_CSR);
|
||||||
|
|
||||||
//Clear MSELECT reset.
|
// Clear MSELECT reset.
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_DEVICES_V) &= 0xFFFFFFF7;
|
CLOCK(CLK_RST_CONTROLLER_RST_DEVICES_V) &= 0xFFFFFFF7;
|
||||||
//Clear NONCPU reset.
|
// Clear NONCPU reset.
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_CPUG_CMPLX_CLR) = 0x20000000;
|
CLOCK(CLK_RST_CONTROLLER_RST_CPUG_CMPLX_CLR) = 0x20000000;
|
||||||
//Clear CPU{0,1,2,3} POR and CORE, CX0, L2, and DBG reset.
|
// Clear CPU{0,1,2,3} POR and CORE, CX0, L2, and DBG reset.
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_CPUG_CMPLX_CLR) = 0x411F000F;
|
CLOCK(CLK_RST_CONTROLLER_RST_CPUG_CMPLX_CLR) = 0x411F000F;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CLUSTER_H_
|
#ifndef _CLUSTER_H_
|
||||||
#define _CLUSTER_H_
|
#define _CLUSTER_H_
|
||||||
|
|
44
ipl/config.c
44
ipl/config.c
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -198,9 +198,7 @@ void config_autoboot()
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ments[i], 0, sizeof(ment_t));
|
memset(&ments[i], 0, sizeof(ment_t));
|
||||||
menu_t menu = {
|
menu_t menu = {ments, "Disable or select entry to auto boot", 0, 0};
|
||||||
ments, "Disable or select entry to auto boot", 0, 0
|
|
||||||
};
|
|
||||||
temp_autoboot = (u32 *)tui_do_menu(&gfx_con, &menu);
|
temp_autoboot = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_autoboot != NULL)
|
if (temp_autoboot != NULL)
|
||||||
{
|
{
|
||||||
|
@ -282,9 +280,7 @@ void config_bootdelay()
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ments[i + 2], 0, sizeof(ment_t));
|
memset(&ments[i + 2], 0, sizeof(ment_t));
|
||||||
menu_t menu = {
|
menu_t menu = {ments, "Time delay for entering bootloader menu", 0, 0};
|
||||||
ments, "Time delay for entering bootloader menu", 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
u32 *temp_bootwait = (u32 *)tui_do_menu(&gfx_con, &menu);
|
u32 *temp_bootwait = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_bootwait != NULL)
|
if (temp_bootwait != NULL)
|
||||||
|
@ -343,9 +339,7 @@ void config_customlogo()
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ments[4], 0, sizeof(ment_t));
|
memset(&ments[4], 0, sizeof(ment_t));
|
||||||
menu_t menu = {
|
menu_t menu = {ments, "Custom bootlogo", 0, 0};
|
||||||
ments, "Custom bootlogo", 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
u32 *temp_customlogo = (u32 *)tui_do_menu(&gfx_con, &menu);
|
u32 *temp_customlogo = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_customlogo != NULL)
|
if (temp_customlogo != NULL)
|
||||||
|
@ -410,9 +404,7 @@ void config_verification()
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&ments[5], 0, sizeof(ment_t));
|
memset(&ments[5], 0, sizeof(ment_t));
|
||||||
menu_t menu = {
|
menu_t menu = {ments, "Backup & Restore verification", 0, 0};
|
||||||
ments, "Backup & Restore verification", 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
u32 *temp_verification = (u32 *)tui_do_menu(&gfx_con, &menu);
|
u32 *temp_verification = (u32 *)tui_do_menu(&gfx_con, &menu);
|
||||||
if (temp_verification != NULL)
|
if (temp_verification != NULL)
|
||||||
|
|
30
ipl/config.h
30
ipl/config.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CONFIG_H_
|
#ifndef _CONFIG_H_
|
||||||
#define _CONFIG_H_
|
#define _CONFIG_H_
|
||||||
|
@ -28,7 +28,7 @@ typedef struct _hekate_config
|
||||||
// Global temporary config.
|
// Global temporary config.
|
||||||
int se_keygen_done;
|
int se_keygen_done;
|
||||||
u32 sbar_time_keeping;
|
u32 sbar_time_keeping;
|
||||||
}hekate_config;
|
} hekate_config;
|
||||||
|
|
||||||
void set_default_configuration();
|
void set_default_configuration();
|
||||||
int create_config_entry();
|
int create_config_entry();
|
||||||
|
|
69
ipl/di.c
69
ipl/di.c
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -41,11 +41,11 @@ static void _display_dsi_wait(u32 timeout, u32 off, u32 mask)
|
||||||
|
|
||||||
void display_init()
|
void display_init()
|
||||||
{
|
{
|
||||||
//Power on.
|
// Power on.
|
||||||
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_LDO0_CFG, 0xD0); //Configure to 1.2V.
|
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_LDO0_CFG, 0xD0); // Configure to 1.2V.
|
||||||
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_GPIO7, 0x09);
|
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_GPIO7, 0x09);
|
||||||
|
|
||||||
//Enable MIPI CAL, DSI, DISP1, HOST1X, UART_FST_MIPI_CAL, DSIA LP clocks.
|
// Enable MIPI CAL, DSI, DISP1, HOST1X, UART_FST_MIPI_CAL, DSIA LP clocks.
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_CLR) = 0x1010000;
|
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_CLR) = 0x1010000;
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = 0x1010000;
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = 0x1010000;
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_L_CLR) = 0x18000000;
|
CLOCK(CLK_RST_CONTROLLER_RST_DEV_L_CLR) = 0x18000000;
|
||||||
|
@ -55,32 +55,32 @@ void display_init()
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_SET) = 0x80000;
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_SET) = 0x80000;
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DSIA_LP) = 0xA;
|
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DSIA_LP) = 0xA;
|
||||||
|
|
||||||
//DPD idle.
|
// DPD idle.
|
||||||
PMC(APBDEV_PMC_IO_DPD_REQ) = 0x40000000;
|
PMC(APBDEV_PMC_IO_DPD_REQ) = 0x40000000;
|
||||||
PMC(APBDEV_PMC_IO_DPD2_REQ) = 0x40000000;
|
PMC(APBDEV_PMC_IO_DPD2_REQ) = 0x40000000;
|
||||||
|
|
||||||
//Config pins.
|
// Config pins.
|
||||||
PINMUX_AUX(PINMUX_AUX_NFC_EN) &= ~PINMUX_TRISTATE;
|
PINMUX_AUX(PINMUX_AUX_NFC_EN) &= ~PINMUX_TRISTATE;
|
||||||
PINMUX_AUX(PINMUX_AUX_NFC_INT) &= ~PINMUX_TRISTATE;
|
PINMUX_AUX(PINMUX_AUX_NFC_INT) &= ~PINMUX_TRISTATE;
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) &= ~PINMUX_TRISTATE;
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) &= ~PINMUX_TRISTATE;
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_EN) &= ~PINMUX_TRISTATE;
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_EN) &= ~PINMUX_TRISTATE;
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_RST) &= ~PINMUX_TRISTATE;
|
PINMUX_AUX(PINMUX_AUX_LCD_RST) &= ~PINMUX_TRISTATE;
|
||||||
|
|
||||||
gpio_config(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_MODE_GPIO); //Backlight +-5V.
|
gpio_config(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_MODE_GPIO); // Backlight +-5V.
|
||||||
gpio_output_enable(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_OUTPUT_ENABLE); //Backlight +-5V.
|
gpio_output_enable(GPIO_PORT_I, GPIO_PIN_0 | GPIO_PIN_1, GPIO_OUTPUT_ENABLE); // Backlight +-5V.
|
||||||
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_HIGH); //Backlight +5V enable.
|
gpio_write(GPIO_PORT_I, GPIO_PIN_0, GPIO_HIGH); // Backlight +5V enable.
|
||||||
|
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
|
||||||
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_HIGH); //Backlight -5V enable.
|
gpio_write(GPIO_PORT_I, GPIO_PIN_1, GPIO_HIGH); // Backlight -5V enable.
|
||||||
|
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
|
||||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_MODE_GPIO); //Backlight PWM, Enable, Reset.
|
gpio_config(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_MODE_GPIO); // Backlight PWM, Enable, Reset.
|
||||||
gpio_output_enable(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_OUTPUT_ENABLE);
|
gpio_output_enable(GPIO_PORT_V, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_OUTPUT_ENABLE);
|
||||||
gpio_write(GPIO_PORT_V, GPIO_PIN_1, GPIO_HIGH); //Backlight Enable enable.
|
gpio_write(GPIO_PORT_V, GPIO_PIN_1, GPIO_HIGH); // Backlight Enable enable.
|
||||||
|
|
||||||
//Config display interface and display.
|
// Config display interface and display.
|
||||||
MIPI_CAL(0x60) = 0;
|
MIPI_CAL(0x60) = 0;
|
||||||
|
|
||||||
exec_cfg((u32 *)CLOCK_BASE, _display_config_1, 4);
|
exec_cfg((u32 *)CLOCK_BASE, _display_config_1, 4);
|
||||||
|
@ -89,7 +89,7 @@ void display_init()
|
||||||
|
|
||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
|
||||||
gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_HIGH); //Backlight Reset enable.
|
gpio_write(GPIO_PORT_V, GPIO_PIN_2, GPIO_HIGH); // Backlight Reset enable.
|
||||||
|
|
||||||
usleep(60000);
|
usleep(60000);
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ void display_init()
|
||||||
|
|
||||||
void display_backlight(u8 enable)
|
void display_backlight(u8 enable)
|
||||||
{
|
{
|
||||||
gpio_write(GPIO_PORT_V, GPIO_PIN_0, enable ? GPIO_HIGH : GPIO_LOW); //Backlight PWM.
|
gpio_write(GPIO_PORT_V, GPIO_PIN_0, enable ? GPIO_HIGH : GPIO_LOW); // Backlight PWM.
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_end()
|
void display_end()
|
||||||
|
@ -192,7 +192,7 @@ void display_end()
|
||||||
DSI(_DSIREG(DSI_PAD_CONTROL_0)) = DSI_PAD_CONTROL_VS1_PULLDN_CLK | DSI_PAD_CONTROL_VS1_PULLDN(0xF) | DSI_PAD_CONTROL_VS1_PDIO_CLK | DSI_PAD_CONTROL_VS1_PDIO(0xF);
|
DSI(_DSIREG(DSI_PAD_CONTROL_0)) = DSI_PAD_CONTROL_VS1_PULLDN_CLK | DSI_PAD_CONTROL_VS1_PULLDN(0xF) | DSI_PAD_CONTROL_VS1_PDIO_CLK | DSI_PAD_CONTROL_VS1_PDIO(0xF);
|
||||||
DSI(_DSIREG(DSI_POWER_CONTROL)) = 0;*/
|
DSI(_DSIREG(DSI_POWER_CONTROL)) = 0;*/
|
||||||
|
|
||||||
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_SPIO); //Backlight PWM.
|
gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_SPIO); // Backlight PWM.
|
||||||
|
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_TRISTATE) | PINMUX_TRISTATE;
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) & ~PINMUX_TRISTATE) | PINMUX_TRISTATE;
|
||||||
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) >> 2) << 2 | 1;
|
PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) = (PINMUX_AUX(PINMUX_AUX_LCD_BL_PWM) >> 2) << 2 | 1;
|
||||||
|
@ -202,7 +202,7 @@ void display_color_screen(u32 color)
|
||||||
{
|
{
|
||||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_one_color, 8);
|
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_one_color, 8);
|
||||||
|
|
||||||
//Configure display to show single color.
|
// Configure display to show single color.
|
||||||
DISPLAY_A(_DIREG(DC_WIN_AD_WIN_OPTIONS)) = 0;
|
DISPLAY_A(_DIREG(DC_WIN_AD_WIN_OPTIONS)) = 0;
|
||||||
DISPLAY_A(_DIREG(DC_WIN_BD_WIN_OPTIONS)) = 0;
|
DISPLAY_A(_DIREG(DC_WIN_BD_WIN_OPTIONS)) = 0;
|
||||||
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
||||||
|
@ -216,15 +216,12 @@ void display_color_screen(u32 color)
|
||||||
|
|
||||||
u32 *display_init_framebuffer()
|
u32 *display_init_framebuffer()
|
||||||
{
|
{
|
||||||
//Sanitize framebuffer area.
|
// Sanitize framebuffer area.
|
||||||
memset((u32 *)0xC0000000, 0, 0x3C0000);
|
memset((u32 *)0xC0000000, 0, 0x3C0000);
|
||||||
//This configures the framebuffer @ 0xC0000000 with a resolution of 1280x720 (line stride 768).
|
// This configures the framebuffer @ 0xC0000000 with a resolution of 1280x720 (line stride 768).
|
||||||
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer, 32);
|
exec_cfg((u32 *)DISPLAY_A_BASE, cfg_display_framebuffer, 32);
|
||||||
|
|
||||||
usleep(35000);
|
usleep(35000);
|
||||||
|
|
||||||
//Enable backlight
|
|
||||||
//display_backlight(1);
|
|
||||||
|
|
||||||
return (u32 *)0xC0000000;
|
return (u32 *)0xC0000000;
|
||||||
}
|
}
|
||||||
|
|
34
ipl/di.h
34
ipl/di.h
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _DI_H_
|
#ifndef _DI_H_
|
||||||
#define _DI_H_
|
#define _DI_H_
|
||||||
|
@ -175,7 +175,7 @@
|
||||||
#define DC_WIN_BD_WIN_OPTIONS 0xD80
|
#define DC_WIN_BD_WIN_OPTIONS 0xD80
|
||||||
#define DC_WIN_CD_WIN_OPTIONS 0xF80
|
#define DC_WIN_CD_WIN_OPTIONS 0xF80
|
||||||
|
|
||||||
//The following registers are A/B/C shadows of the 0xB80/0xD80/0xF80 registers (see DISPLAY_WINDOW_HEADER).
|
// The following registers are A/B/C shadows of the 0xB80/0xD80/0xF80 registers (see DISPLAY_WINDOW_HEADER).
|
||||||
#define DC_WIN_WIN_OPTIONS 0x700
|
#define DC_WIN_WIN_OPTIONS 0x700
|
||||||
#define H_DIRECTION (1 << 0)
|
#define H_DIRECTION (1 << 0)
|
||||||
#define V_DIRECTION (1 << 2)
|
#define V_DIRECTION (1 << 2)
|
||||||
|
@ -228,7 +228,7 @@
|
||||||
#define DC_WIN_LINE_STRIDE 0x70A
|
#define DC_WIN_LINE_STRIDE 0x70A
|
||||||
#define DC_WIN_DV_CONTROL 0x70E
|
#define DC_WIN_DV_CONTROL 0x70E
|
||||||
|
|
||||||
//The following registers are A/B/C shadows of the 0xBC0/0xDC0/0xFC0 registers (see DISPLAY_WINDOW_HEADER).
|
// The following registers are A/B/C shadows of the 0xBC0/0xDC0/0xFC0 registers (see DISPLAY_WINDOW_HEADER).
|
||||||
#define DC_WINBUF_START_ADDR 0x800
|
#define DC_WINBUF_START_ADDR 0x800
|
||||||
#define DC_WINBUF_ADDR_H_OFFSET 0x806
|
#define DC_WINBUF_ADDR_H_OFFSET 0x806
|
||||||
#define DC_WINBUF_ADDR_V_OFFSET 0x808
|
#define DC_WINBUF_ADDR_V_OFFSET 0x808
|
||||||
|
|
38
ipl/emc.h
38
ipl/emc.h
|
@ -1,23 +1,23 @@
|
||||||
/*
|
/*
|
||||||
* arch/arm/mach-tegra/tegra21_emc.h
|
* arch/arm/mach-tegra/tegra21_emc.h
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
|
* Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
|
||||||
*
|
*
|
||||||
* 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
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License along
|
* You should have received a copy of the GNU General Public License along
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _EMC_H_
|
#ifndef _EMC_H_
|
||||||
#define _EMC_H_
|
#define _EMC_H_
|
||||||
|
|
10
ipl/ff.c
10
ipl/ff.c
|
@ -3312,7 +3312,7 @@ static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */
|
||||||
return FR_NO_FILESYSTEM; /* Check exFAT version (must be version 1.0) */
|
return FR_NO_FILESYSTEM; /* Check exFAT version (must be version 1.0) */
|
||||||
|
|
||||||
if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) { /* (BPB_BytsPerSecEx must be equal to the physical sector size) */
|
if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) { /* (BPB_BytsPerSecEx must be equal to the physical sector size) */
|
||||||
EFSPRINTF("EX_SPS");
|
EFSPRINTF("EXSPS");
|
||||||
return FR_NO_FILESYSTEM;
|
return FR_NO_FILESYSTEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3324,7 +3324,7 @@ static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */
|
||||||
|
|
||||||
fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */
|
fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */
|
||||||
if (fs->n_fats != 1) {
|
if (fs->n_fats != 1) {
|
||||||
EFSPRINTF("EX_FNF");
|
EFSPRINTF("EXFNF");
|
||||||
return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */
|
return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3348,14 +3348,14 @@ static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */
|
||||||
|
|
||||||
/* Check if bitmap location is in assumption (at the first cluster) */
|
/* Check if bitmap location is in assumption (at the first cluster) */
|
||||||
if (move_window(fs, clst2sect(fs, fs->dirbase)) != FR_OK) {
|
if (move_window(fs, clst2sect(fs, fs->dirbase)) != FR_OK) {
|
||||||
EFSPRINTF("EX_BM1C");
|
EFSPRINTF("EXBM1C");
|
||||||
return FR_DISK_ERR;
|
return FR_DISK_ERR;
|
||||||
}
|
}
|
||||||
for (i = 0; i < SS(fs); i += SZDIRE) {
|
for (i = 0; i < SS(fs); i += SZDIRE) {
|
||||||
if (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break; /* 81 entry with cluster #2? */
|
if (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break; /* 81 entry with cluster #2? */
|
||||||
}
|
}
|
||||||
if (i == SS(fs)) {
|
if (i == SS(fs)) {
|
||||||
EFSPRINTF("EX_BMM");
|
EFSPRINTF("EXBMM");
|
||||||
return FR_NO_FILESYSTEM;
|
return FR_NO_FILESYSTEM;
|
||||||
}
|
}
|
||||||
#if !FF_FS_READONLY
|
#if !FF_FS_READONLY
|
||||||
|
@ -3366,7 +3366,7 @@ static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */
|
||||||
#endif /* FF_FS_EXFAT */
|
#endif /* FF_FS_EXFAT */
|
||||||
{
|
{
|
||||||
if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) {
|
if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) {
|
||||||
EFSPRINTF("32_SPS");
|
EFSPRINTF("32SPS");
|
||||||
return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */
|
return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
28
ipl/fuse.c
28
ipl/fuse.c
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "fuse.h"
|
#include "fuse.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
|
|
28
ipl/fuse.h
28
ipl/fuse.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _FUSE_H_
|
#ifndef _FUSE_H_
|
||||||
#define _FUSE_H_
|
#define _FUSE_H_
|
||||||
|
|
222
ipl/gfx.c
222
ipl/gfx.c
|
@ -1,120 +1,120 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "gfx.h"
|
#include "gfx.h"
|
||||||
|
|
||||||
static const u8 _gfx_font[] = {
|
static const u8 _gfx_font[] = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Char 032 ( )
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Char 032 ( )
|
||||||
0x00, 0x30, 0x30, 0x18, 0x18, 0x00, 0x0C, 0x00, // Char 033 (!)
|
0x00, 0x30, 0x30, 0x18, 0x18, 0x00, 0x0C, 0x00, // Char 033 (!)
|
||||||
0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, // Char 034 (")
|
0x00, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, // Char 034 (")
|
||||||
0x00, 0x66, 0x66, 0xFF, 0x66, 0xFF, 0x66, 0x66, // Char 035 (#)
|
0x00, 0x66, 0x66, 0xFF, 0x66, 0xFF, 0x66, 0x66, // Char 035 (#)
|
||||||
0x00, 0x18, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x18, // Char 036 ($)
|
0x00, 0x18, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x18, // Char 036 ($)
|
||||||
0x00, 0x46, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x62, // Char 037 (%)
|
0x00, 0x46, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x62, // Char 037 (%)
|
||||||
0x00, 0x3C, 0x66, 0x3C, 0x1C, 0xE6, 0x66, 0xFC, // Char 038 (&)
|
0x00, 0x3C, 0x66, 0x3C, 0x1C, 0xE6, 0x66, 0xFC, // Char 038 (&)
|
||||||
0x00, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, // Char 039 (')
|
0x00, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, // Char 039 (')
|
||||||
0x00, 0x30, 0x18, 0x0C, 0x0C, 0x18, 0x30, 0x00, // Char 040 (()
|
0x00, 0x30, 0x18, 0x0C, 0x0C, 0x18, 0x30, 0x00, // Char 040 (()
|
||||||
0x00, 0x0C, 0x18, 0x30, 0x30, 0x18, 0x0C, 0x00, // Char 041 ())
|
0x00, 0x0C, 0x18, 0x30, 0x30, 0x18, 0x0C, 0x00, // Char 041 ())
|
||||||
0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, // Char 042 (*)
|
0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, // Char 042 (*)
|
||||||
0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, // Char 043 (+)
|
0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, // Char 043 (+)
|
||||||
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 044 (,)
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 044 (,)
|
||||||
0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, // Char 045 (-)
|
0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, // Char 045 (-)
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, // Char 046 (.)
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, // Char 046 (.)
|
||||||
0x00, 0x40, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, // Char 047 (/)
|
0x00, 0x40, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, // Char 047 (/)
|
||||||
0x00, 0x3C, 0x66, 0x76, 0x6E, 0x66, 0x3C, 0x00, // Char 048 (0)
|
0x00, 0x3C, 0x66, 0x76, 0x6E, 0x66, 0x3C, 0x00, // Char 048 (0)
|
||||||
0x00, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x7E, 0x00, // Char 049 (1)
|
0x00, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x7E, 0x00, // Char 049 (1)
|
||||||
0x00, 0x3C, 0x62, 0x30, 0x0C, 0x06, 0x7E, 0x00, // Char 050 (2)
|
0x00, 0x3C, 0x62, 0x30, 0x0C, 0x06, 0x7E, 0x00, // Char 050 (2)
|
||||||
0x00, 0x3C, 0x62, 0x38, 0x60, 0x66, 0x3C, 0x00, // Char 051 (3)
|
0x00, 0x3C, 0x62, 0x38, 0x60, 0x66, 0x3C, 0x00, // Char 051 (3)
|
||||||
0x00, 0x6C, 0x6C, 0x66, 0xFE, 0x60, 0x60, 0x00, // Char 052 (4)
|
0x00, 0x6C, 0x6C, 0x66, 0xFE, 0x60, 0x60, 0x00, // Char 052 (4)
|
||||||
0x00, 0x7E, 0x06, 0x7E, 0x60, 0x66, 0x3C, 0x00, // Char 053 (5)
|
0x00, 0x7E, 0x06, 0x7E, 0x60, 0x66, 0x3C, 0x00, // Char 053 (5)
|
||||||
0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3C, 0x00, // Char 054 (6)
|
0x00, 0x3C, 0x06, 0x3E, 0x66, 0x66, 0x3C, 0x00, // Char 054 (6)
|
||||||
0x00, 0x7E, 0x30, 0x30, 0x18, 0x18, 0x18, 0x00, // Char 055 (7)
|
0x00, 0x7E, 0x30, 0x30, 0x18, 0x18, 0x18, 0x00, // Char 055 (7)
|
||||||
0x00, 0x3C, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, // Char 056 (8)
|
0x00, 0x3C, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, // Char 056 (8)
|
||||||
0x00, 0x3C, 0x66, 0x7C, 0x60, 0x66, 0x3C, 0x00, // Char 057 (9)
|
0x00, 0x3C, 0x66, 0x7C, 0x60, 0x66, 0x3C, 0x00, // Char 057 (9)
|
||||||
0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, // Char 058 (:)
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, // Char 058 (:)
|
||||||
0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 059 (;)
|
0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x0C, 0x00, // Char 059 (;)
|
||||||
0x00, 0x70, 0x1C, 0x06, 0x06, 0x1C, 0x70, 0x00, // Char 060 (<)
|
0x00, 0x70, 0x1C, 0x06, 0x06, 0x1C, 0x70, 0x00, // Char 060 (<)
|
||||||
0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, // Char 061 (=)
|
0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, // Char 061 (=)
|
||||||
0x00, 0x0E, 0x38, 0x60, 0x60, 0x38, 0x0E, 0x00, // Char 062 (>)
|
0x00, 0x0E, 0x38, 0x60, 0x60, 0x38, 0x0E, 0x00, // Char 062 (>)
|
||||||
0x00, 0x3C, 0x66, 0x30, 0x18, 0x00, 0x18, 0x00, // Char 063 (?)
|
0x00, 0x3C, 0x66, 0x30, 0x18, 0x00, 0x18, 0x00, // Char 063 (?)
|
||||||
0x00, 0x3C, 0x66, 0x76, 0x76, 0x06, 0x46, 0x3C, // Char 064 (@)
|
0x00, 0x3C, 0x66, 0x76, 0x76, 0x06, 0x46, 0x3C, // Char 064 (@)
|
||||||
0x00, 0x3C, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 065 (A)
|
0x00, 0x3C, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 065 (A)
|
||||||
0x00, 0x3E, 0x66, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 066 (B)
|
0x00, 0x3E, 0x66, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 066 (B)
|
||||||
0x00, 0x3C, 0x66, 0x06, 0x06, 0x66, 0x3C, 0x00, // Char 067 (C)
|
0x00, 0x3C, 0x66, 0x06, 0x06, 0x66, 0x3C, 0x00, // Char 067 (C)
|
||||||
0x00, 0x1E, 0x36, 0x66, 0x66, 0x36, 0x1E, 0x00, // Char 068 (D)
|
0x00, 0x1E, 0x36, 0x66, 0x66, 0x36, 0x1E, 0x00, // Char 068 (D)
|
||||||
0x00, 0x7E, 0x06, 0x1E, 0x06, 0x06, 0x7E, 0x00, // Char 069 (E)
|
0x00, 0x7E, 0x06, 0x1E, 0x06, 0x06, 0x7E, 0x00, // Char 069 (E)
|
||||||
0x00, 0x3E, 0x06, 0x1E, 0x06, 0x06, 0x06, 0x00, // Char 070 (F)
|
0x00, 0x3E, 0x06, 0x1E, 0x06, 0x06, 0x06, 0x00, // Char 070 (F)
|
||||||
0x00, 0x3C, 0x66, 0x06, 0x76, 0x66, 0x3C, 0x00, // Char 071 (G)
|
0x00, 0x3C, 0x66, 0x06, 0x76, 0x66, 0x3C, 0x00, // Char 071 (G)
|
||||||
0x00, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 072 (H)
|
0x00, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // Char 072 (H)
|
||||||
0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 073 (I)
|
0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 073 (I)
|
||||||
0x00, 0x78, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, // Char 074 (J)
|
0x00, 0x78, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, // Char 074 (J)
|
||||||
0x00, 0x66, 0x36, 0x1E, 0x1E, 0x36, 0x66, 0x00, // Char 075 (K)
|
0x00, 0x66, 0x36, 0x1E, 0x1E, 0x36, 0x66, 0x00, // Char 075 (K)
|
||||||
0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7E, 0x00, // Char 076 (L)
|
0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7E, 0x00, // Char 076 (L)
|
||||||
0x00, 0x46, 0x6E, 0x7E, 0x56, 0x46, 0x46, 0x00, // Char 077 (M)
|
0x00, 0x46, 0x6E, 0x7E, 0x56, 0x46, 0x46, 0x00, // Char 077 (M)
|
||||||
0x00, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00, // Char 078 (N)
|
0x00, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00, // Char 078 (N)
|
||||||
0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 079 (O)
|
0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 079 (O)
|
||||||
0x00, 0x3E, 0x66, 0x3E, 0x06, 0x06, 0x06, 0x00, // Char 080 (P)
|
0x00, 0x3E, 0x66, 0x3E, 0x06, 0x06, 0x06, 0x00, // Char 080 (P)
|
||||||
0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x70, 0x00, // Char 081 (Q)
|
0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x70, 0x00, // Char 081 (Q)
|
||||||
0x00, 0x3E, 0x66, 0x3E, 0x1E, 0x36, 0x66, 0x00, // Char 082 (R)
|
0x00, 0x3E, 0x66, 0x3E, 0x1E, 0x36, 0x66, 0x00, // Char 082 (R)
|
||||||
0x00, 0x3C, 0x66, 0x0C, 0x30, 0x66, 0x3C, 0x00, // Char 083 (S)
|
0x00, 0x3C, 0x66, 0x0C, 0x30, 0x66, 0x3C, 0x00, // Char 083 (S)
|
||||||
0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // Char 084 (T)
|
0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // Char 084 (T)
|
||||||
0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 085 (U)
|
0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 085 (U)
|
||||||
0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 086 (V)
|
0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 086 (V)
|
||||||
0x00, 0x46, 0x46, 0x56, 0x7E, 0x6E, 0x46, 0x00, // Char 087 (W)
|
0x00, 0x46, 0x46, 0x56, 0x7E, 0x6E, 0x46, 0x00, // Char 087 (W)
|
||||||
0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, // Char 088 (X)
|
0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, // Char 088 (X)
|
||||||
0x00, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, // Char 089 (Y)
|
0x00, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, // Char 089 (Y)
|
||||||
0x00, 0x7E, 0x30, 0x18, 0x0C, 0x06, 0x7E, 0x00, // Char 090 (Z)
|
0x00, 0x7E, 0x30, 0x18, 0x0C, 0x06, 0x7E, 0x00, // Char 090 (Z)
|
||||||
0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, // Char 091 ([)
|
0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, // Char 091 ([)
|
||||||
0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00, // Char 092 (\)
|
0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00, // Char 092 (\)
|
||||||
0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, // Char 093 (])
|
0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, // Char 093 (])
|
||||||
0x00, 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, // Char 094 (^)
|
0x00, 0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, // Char 094 (^)
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, // Char 095 (_)
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, // Char 095 (_)
|
||||||
0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, // Char 096 (`)
|
0x00, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, // Char 096 (`)
|
||||||
0x00, 0x00, 0x3C, 0x60, 0x7C, 0x66, 0x7C, 0x00, // Char 097 (a)
|
0x00, 0x00, 0x3C, 0x60, 0x7C, 0x66, 0x7C, 0x00, // Char 097 (a)
|
||||||
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 098 (b)
|
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3E, 0x00, // Char 098 (b)
|
||||||
0x00, 0x00, 0x3C, 0x06, 0x06, 0x06, 0x3C, 0x00, // Char 099 (c)
|
0x00, 0x00, 0x3C, 0x06, 0x06, 0x06, 0x3C, 0x00, // Char 099 (c)
|
||||||
0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00, // Char 100 (d)
|
0x00, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00, // Char 100 (d)
|
||||||
0x00, 0x00, 0x3C, 0x66, 0x7E, 0x06, 0x3C, 0x00, // Char 101 (e)
|
0x00, 0x00, 0x3C, 0x66, 0x7E, 0x06, 0x3C, 0x00, // Char 101 (e)
|
||||||
0x00, 0x38, 0x0C, 0x3E, 0x0C, 0x0C, 0x0C, 0x00, // Char 102 (f)
|
0x00, 0x38, 0x0C, 0x3E, 0x0C, 0x0C, 0x0C, 0x00, // Char 102 (f)
|
||||||
0x00, 0x00, 0x7C, 0x66, 0x7C, 0x40, 0x3C, 0x00, // Char 103 (g)
|
0x00, 0x00, 0x7C, 0x66, 0x7C, 0x40, 0x3C, 0x00, // Char 103 (g)
|
||||||
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x00, // Char 104 (h)
|
0x00, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x00, // Char 104 (h)
|
||||||
0x00, 0x18, 0x00, 0x1C, 0x18, 0x18, 0x3C, 0x00, // Char 105 (i)
|
0x00, 0x18, 0x00, 0x1C, 0x18, 0x18, 0x3C, 0x00, // Char 105 (i)
|
||||||
0x00, 0x30, 0x00, 0x30, 0x30, 0x30, 0x1E, 0x00, // Char 106 (j)
|
0x00, 0x30, 0x00, 0x30, 0x30, 0x30, 0x1E, 0x00, // Char 106 (j)
|
||||||
0x00, 0x06, 0x06, 0x36, 0x1E, 0x36, 0x66, 0x00, // Char 107 (k)
|
0x00, 0x06, 0x06, 0x36, 0x1E, 0x36, 0x66, 0x00, // Char 107 (k)
|
||||||
0x00, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 108 (l)
|
0x00, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // Char 108 (l)
|
||||||
0x00, 0x00, 0x66, 0xFE, 0xFE, 0xD6, 0xC6, 0x00, // Char 109 (m)
|
0x00, 0x00, 0x66, 0xFE, 0xFE, 0xD6, 0xC6, 0x00, // Char 109 (m)
|
||||||
0x00, 0x00, 0x3E, 0x66, 0x66, 0x66, 0x66, 0x00, // Char 110 (n)
|
0x00, 0x00, 0x3E, 0x66, 0x66, 0x66, 0x66, 0x00, // Char 110 (n)
|
||||||
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 111 (o)
|
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, // Char 111 (o)
|
||||||
0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x00, // Char 112 (p)
|
0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x00, // Char 112 (p)
|
||||||
0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x00, // Char 113 (q)
|
0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x00, // Char 113 (q)
|
||||||
0x00, 0x00, 0x3E, 0x66, 0x06, 0x06, 0x06, 0x00, // Char 114 (r)
|
0x00, 0x00, 0x3E, 0x66, 0x06, 0x06, 0x06, 0x00, // Char 114 (r)
|
||||||
0x00, 0x00, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x00, // Char 115 (s)
|
0x00, 0x00, 0x7C, 0x06, 0x3C, 0x60, 0x3E, 0x00, // Char 115 (s)
|
||||||
0x00, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x70, 0x00, // Char 116 (t)
|
0x00, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x70, 0x00, // Char 116 (t)
|
||||||
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, // Char 117 (u)
|
0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, // Char 117 (u)
|
||||||
0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 118 (v)
|
0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // Char 118 (v)
|
||||||
0x00, 0x00, 0xC6, 0xD6, 0xFE, 0x7C, 0x6C, 0x00, // Char 119 (w)
|
0x00, 0x00, 0xC6, 0xD6, 0xFE, 0x7C, 0x6C, 0x00, // Char 119 (w)
|
||||||
0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, // Char 120 (x)
|
0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, // Char 120 (x)
|
||||||
0x00, 0x00, 0x66, 0x66, 0x7C, 0x60, 0x3C, 0x00, // Char 121 (y)
|
0x00, 0x00, 0x66, 0x66, 0x7C, 0x60, 0x3C, 0x00, // Char 121 (y)
|
||||||
0x00, 0x00, 0x7E, 0x30, 0x18, 0x0C, 0x7E, 0x00, // Char 122 (z)
|
0x00, 0x00, 0x7E, 0x30, 0x18, 0x0C, 0x7E, 0x00, // Char 122 (z)
|
||||||
0x00, 0x18, 0x08, 0x08, 0x04, 0x08, 0x08, 0x18, // Char 123 ({)
|
0x00, 0x18, 0x08, 0x08, 0x04, 0x08, 0x08, 0x18, // Char 123 ({)
|
||||||
0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, // Char 124 (|)
|
0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, // Char 124 (|)
|
||||||
0x00, 0x0C, 0x08, 0x08, 0x10, 0x08, 0x08, 0x0C, // Char 125 (})
|
0x00, 0x0C, 0x08, 0x08, 0x10, 0x08, 0x08, 0x0C, // Char 125 (})
|
||||||
0x00, 0x00, 0x00, 0x4C, 0x32, 0x00, 0x00, 0x00 // Char 126 (~)
|
0x00, 0x00, 0x00, 0x4C, 0x32, 0x00, 0x00, 0x00 // Char 126 (~)
|
||||||
};
|
};
|
||||||
|
|
||||||
void gfx_init_ctxt(gfx_ctxt_t *ctxt, u32 *fb, u32 width, u32 height, u32 stride)
|
void gfx_init_ctxt(gfx_ctxt_t *ctxt, u32 *fb, u32 width, u32 height, u32 stride)
|
||||||
|
@ -138,7 +138,7 @@ void gfx_clear_color(gfx_ctxt_t *ctxt, u32 color)
|
||||||
|
|
||||||
void gfx_clear_partial_grey(gfx_ctxt_t *ctxt, u8 color, u32 pos_x, u32 height)
|
void gfx_clear_partial_grey(gfx_ctxt_t *ctxt, u8 color, u32 pos_x, u32 height)
|
||||||
{
|
{
|
||||||
memset(ctxt->fb + pos_x * ctxt->stride , color, height * 4 * ctxt->stride);
|
memset(ctxt->fb + pos_x * ctxt->stride, color, height * 4 * ctxt->stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfx_con_init(gfx_con_t *con, gfx_ctxt_t *ctxt)
|
void gfx_con_init(gfx_con_t *con, gfx_ctxt_t *ctxt)
|
||||||
|
|
30
ipl/gfx.h
30
ipl/gfx.h
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _GFX_H_
|
#ifndef _GFX_H_
|
||||||
#define _GFX_H_
|
#define _GFX_H_
|
||||||
|
|
28
ipl/gpio.c
28
ipl/gpio.c
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
|
|
28
ipl/gpio.h
28
ipl/gpio.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _GPIO_H_
|
#ifndef _GPIO_H_
|
||||||
#define _GPIO_H_
|
#define _GPIO_H_
|
||||||
|
|
36
ipl/heap.c
36
ipl/heap.c
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
|
@ -37,12 +37,12 @@ static void _heap_create(heap_t *heap, u32 start)
|
||||||
heap->first = NULL;
|
heap->first = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 _heap_alloc(heap_t *heap, u32 size)
|
static u32 _heap_alloc(heap_t *heap, u32 size, u32 alignment)
|
||||||
{
|
{
|
||||||
hnode_t *node, *new;
|
hnode_t *node, *new;
|
||||||
int search = 1;
|
int search = 1;
|
||||||
|
|
||||||
size = ALIGN(size, 0x10);
|
size = ALIGN(size, alignment);
|
||||||
|
|
||||||
if (!heap->first)
|
if (!heap->first)
|
||||||
{
|
{
|
||||||
|
@ -119,12 +119,12 @@ void heap_init(u32 base)
|
||||||
|
|
||||||
void *malloc(u32 size)
|
void *malloc(u32 size)
|
||||||
{
|
{
|
||||||
return (void *)_heap_alloc(&_heap, size);
|
return (void *)_heap_alloc(&_heap, size, 0x10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *calloc(u32 num, u32 size)
|
void *calloc(u32 num, u32 size)
|
||||||
{
|
{
|
||||||
void *res = (void *)_heap_alloc(&_heap, num * size);
|
void *res = (void *)_heap_alloc(&_heap, num * size, 0x10);
|
||||||
memset(res, 0, num * size);
|
memset(res, 0, num * size);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
28
ipl/heap.h
28
ipl/heap.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _HEAP_H_
|
#ifndef _HEAP_H_
|
||||||
#define _HEAP_H_
|
#define _HEAP_H_
|
||||||
|
|
|
@ -1,28 +1,27 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _HEKATE_LOGOS_H_
|
#ifndef _HEKATE_LOGOS_H_
|
||||||
#define _HEKATE_LOGOS_H_
|
#define _HEKATE_LOGOS_H_
|
||||||
|
|
||||||
#ifdef MENU_LOGO_ENABLE
|
#ifdef MENU_LOGO_ENABLE
|
||||||
//119 x 57 @24bpp RGB RAW positioned at 577 x 1199
|
// 119 x 57 @24bpp RGB RAW positioned at 577 x 1199
|
||||||
#define SZ_MENU_LOGO 20349
|
#define SZ_MENU_LOGO 20349
|
||||||
#define SZ_MENU_LOGO_BLZ 7592
|
#define SZ_MENU_LOGO_BLZ 7592
|
||||||
static unsigned char Kc_MENU_LOGO_blz[SZ_MENU_LOGO_BLZ] =
|
static unsigned char Kc_MENU_LOGO_blz[SZ_MENU_LOGO_BLZ] = {
|
||||||
{
|
|
||||||
0x01, 0x10, 0x80, 0x2D, 0xF0, 0x99, 0x30, 0x84, 0xB0, 0x1C, 0x6C, 0x60, 0x51, 0xF0, 0x59, 0x31,
|
0x01, 0x10, 0x80, 0x2D, 0xF0, 0x99, 0x30, 0x84, 0xB0, 0x1C, 0x6C, 0x60, 0x51, 0xF0, 0x59, 0x31,
|
||||||
0x03, 0x30, 0xF7, 0x0F, 0xF0, 0x0F, 0xF0, 0x42, 0xF0, 0xFE, 0xF4, 0x15, 0x6C, 0xCF, 0x30, 0xCC,
|
0x03, 0x30, 0xF7, 0x0F, 0xF0, 0x0F, 0xF0, 0x42, 0xF0, 0xFE, 0xF4, 0x15, 0x6C, 0xCF, 0x30, 0xCC,
|
||||||
0x20, 0x1D, 0x7F, 0x1F, 0x52, 0x6D, 0xD8, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
|
0x20, 0x1D, 0x7F, 0x1F, 0x52, 0x6D, 0xD8, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F,
|
||||||
|
@ -502,13 +501,12 @@ static unsigned char Kc_MENU_LOGO_blz[SZ_MENU_LOGO_BLZ] =
|
||||||
|
|
||||||
#endif //MENU_LOGO_ENABLE
|
#endif //MENU_LOGO_ENABLE
|
||||||
|
|
||||||
//68 x 192 @8bpp Grayscale RAW
|
// 68 x 192 @8bpp Grayscale RAW.
|
||||||
#define X_BOOTLOGO 68
|
#define X_BOOTLOGO 68
|
||||||
#define Y_BOOTLOGO 192
|
#define Y_BOOTLOGO 192
|
||||||
#define SZ_BOOTLOGO 13056
|
#define SZ_BOOTLOGO 13056
|
||||||
#define SZ_BOOTLOGO_BLZ 6704
|
#define SZ_BOOTLOGO_BLZ 6704
|
||||||
static u8 BOOTLOGO_BLZ[SZ_BOOTLOGO_BLZ] =
|
static u8 BOOTLOGO_BLZ[SZ_BOOTLOGO_BLZ] = {
|
||||||
{
|
|
||||||
0x0F, 0xF0, 0x80, 0x1B, 0x1B, 0x77, 0xF0, 0x6A, 0x08, 0x41, 0x80, 0x0F, 0x4D, 0x21, 0x40, 0x29,
|
0x0F, 0xF0, 0x80, 0x1B, 0x1B, 0x77, 0xF0, 0x6A, 0x08, 0x41, 0x80, 0x0F, 0x4D, 0x21, 0x40, 0x29,
|
||||||
0xF0, 0xFC, 0x34, 0xED, 0x34, 0x10, 0x23, 0x26, 0x27, 0x23, 0x76, 0x30, 0x0F, 0xF0, 0xC3, 0xC9,
|
0xF0, 0xFC, 0x34, 0xED, 0x34, 0x10, 0x23, 0x26, 0x27, 0x23, 0x76, 0x30, 0x0F, 0xF0, 0xC3, 0xC9,
|
||||||
0xF0, 0x3F, 0x7F, 0xC6, 0x53, 0x80, 0x2E, 0x33, 0xDB, 0x2D, 0xBA, 0x20, 0x8F, 0x1C, 0xE7, 0x76,
|
0xF0, 0x3F, 0x7F, 0xC6, 0x53, 0x80, 0x2E, 0x33, 0xDB, 0x2D, 0xBA, 0x20, 0x8F, 0x1C, 0xE7, 0x76,
|
||||||
|
|
104
ipl/hos.c
104
ipl/hos.c
|
@ -1,23 +1,24 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 st4rk
|
* Copyright (c) 2018 st4rk
|
||||||
* Copyright (c) 2018 Ced2911
|
* Copyright (c) 2018 Ced2911
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "hos.h"
|
#include "hos.h"
|
||||||
#include "sdmmc.h"
|
#include "sdmmc.h"
|
||||||
#include "nx_emmc.h"
|
#include "nx_emmc.h"
|
||||||
|
@ -36,6 +37,7 @@
|
||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
#include "di.h"
|
#include "di.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "mc.h"
|
||||||
|
|
||||||
#include "gfx.h"
|
#include "gfx.h"
|
||||||
extern gfx_ctxt_t gfx_ctxt;
|
extern gfx_ctxt_t gfx_ctxt;
|
||||||
|
@ -178,7 +180,7 @@ int keygen(u8 *keyblob, u32 kb, void *tsec_fw)
|
||||||
|
|
||||||
// Decrypt keyblob and set keyslots.
|
// Decrypt keyblob and set keyslots.
|
||||||
se_aes_crypt_ctr(13, keyblob + 0x20, 0x90, keyblob + 0x20, 0x90, keyblob + 0x10);
|
se_aes_crypt_ctr(13, keyblob + 0x20, 0x90, keyblob + 0x20, 0x90, keyblob + 0x10);
|
||||||
se_aes_key_set(11, keyblob + 0x20 + 0x80, 0x10); //Package1 key.
|
se_aes_key_set(11, keyblob + 0x20 + 0x80, 0x10); // Package1 key.
|
||||||
se_aes_key_set(12, keyblob + 0x20, 0x10);
|
se_aes_key_set(12, keyblob + 0x20, 0x10);
|
||||||
se_aes_key_set(13, keyblob + 0x20, 0x10);
|
se_aes_key_set(13, keyblob + 0x20, 0x10);
|
||||||
|
|
||||||
|
@ -186,24 +188,24 @@ int keygen(u8 *keyblob, u32 kb, void *tsec_fw)
|
||||||
|
|
||||||
switch (kb)
|
switch (kb)
|
||||||
{
|
{
|
||||||
case KB_FIRMWARE_VERSION_100_200:
|
case KB_FIRMWARE_VERSION_100_200:
|
||||||
case KB_FIRMWARE_VERSION_300:
|
case KB_FIRMWARE_VERSION_300:
|
||||||
case KB_FIRMWARE_VERSION_301:
|
case KB_FIRMWARE_VERSION_301:
|
||||||
se_aes_unwrap_key(13, 15, console_keyseed);
|
se_aes_unwrap_key(13, 15, console_keyseed);
|
||||||
se_aes_unwrap_key(12, 12, master_keyseed_retail);
|
se_aes_unwrap_key(12, 12, master_keyseed_retail);
|
||||||
break;
|
break;
|
||||||
case KB_FIRMWARE_VERSION_400:
|
case KB_FIRMWARE_VERSION_400:
|
||||||
se_aes_unwrap_key(13, 15, console_keyseed_4xx_5xx);
|
se_aes_unwrap_key(13, 15, console_keyseed_4xx_5xx);
|
||||||
se_aes_unwrap_key(15, 15, console_keyseed);
|
se_aes_unwrap_key(15, 15, console_keyseed);
|
||||||
se_aes_unwrap_key(14, 12, master_keyseed_4xx_5xx);
|
se_aes_unwrap_key(14, 12, master_keyseed_4xx_5xx);
|
||||||
se_aes_unwrap_key(12, 12, master_keyseed_retail);
|
se_aes_unwrap_key(12, 12, master_keyseed_retail);
|
||||||
break;
|
break;
|
||||||
case KB_FIRMWARE_VERSION_500:
|
case KB_FIRMWARE_VERSION_500:
|
||||||
se_aes_unwrap_key(10, 15, console_keyseed_4xx_5xx);
|
se_aes_unwrap_key(10, 15, console_keyseed_4xx_5xx);
|
||||||
se_aes_unwrap_key(15, 15, console_keyseed);
|
se_aes_unwrap_key(15, 15, console_keyseed);
|
||||||
se_aes_unwrap_key(14, 12, master_keyseed_4xx_5xx);
|
se_aes_unwrap_key(14, 12, master_keyseed_4xx_5xx);
|
||||||
se_aes_unwrap_key(12, 12, master_keyseed_retail);
|
se_aes_unwrap_key(12, 12, master_keyseed_retail);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Package2 key.
|
// Package2 key.
|
||||||
|
@ -287,7 +289,7 @@ static int _read_emmc_pkg2(launch_ctxt_t *ctxt)
|
||||||
u32 pkg2_size = hdr[0] ^ hdr[2] ^ hdr[3];
|
u32 pkg2_size = hdr[0] ^ hdr[2] ^ hdr[3];
|
||||||
free(tmp);
|
free(tmp);
|
||||||
DPRINTF("pkg2 size on emmc is %08X\n", pkg2_size);
|
DPRINTF("pkg2 size on emmc is %08X\n", pkg2_size);
|
||||||
//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);
|
||||||
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);
|
||||||
|
@ -394,20 +396,21 @@ static int _config_kip1patch(launch_ctxt_t *ctxt, const char *value)
|
||||||
|
|
||||||
if (ctxt->kip1_patches == NULL)
|
if (ctxt->kip1_patches == NULL)
|
||||||
{
|
{
|
||||||
ctxt->kip1_patches = malloc(valueLen+1);
|
ctxt->kip1_patches = malloc(valueLen + 1);
|
||||||
memcpy(ctxt->kip1_patches, value, valueLen);
|
memcpy(ctxt->kip1_patches, value, valueLen);
|
||||||
ctxt->kip1_patches[valueLen] = 0;
|
ctxt->kip1_patches[valueLen] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char* oldAlloc = ctxt->kip1_patches;
|
char *oldAlloc = ctxt->kip1_patches;
|
||||||
int oldSize = strlen(oldAlloc);
|
int oldSize = strlen(oldAlloc);
|
||||||
ctxt->kip1_patches = malloc(oldSize+1+valueLen+1);
|
ctxt->kip1_patches = malloc(oldSize + 1 + valueLen + 1);
|
||||||
memcpy(ctxt->kip1_patches, oldAlloc, oldSize);
|
memcpy(ctxt->kip1_patches, oldAlloc, oldSize);
|
||||||
free(oldAlloc); oldAlloc = NULL;
|
free(oldAlloc);
|
||||||
|
oldAlloc = NULL;
|
||||||
ctxt->kip1_patches[oldSize++] = ',';
|
ctxt->kip1_patches[oldSize++] = ',';
|
||||||
memcpy(&ctxt->kip1_patches[oldSize], value, valueLen);
|
memcpy(&ctxt->kip1_patches[oldSize], value, valueLen);
|
||||||
ctxt->kip1_patches[oldSize+valueLen] = 0;
|
ctxt->kip1_patches[oldSize + valueLen] = 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -568,13 +571,13 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
LIST_FOREACH_ENTRY(merge_kip_t, mki, &ctxt.kip1_list, link)
|
LIST_FOREACH_ENTRY(merge_kip_t, mki, &ctxt.kip1_list, link)
|
||||||
pkg2_merge_kip(&kip1_info, (pkg2_kip1_t *)mki->kip1);
|
pkg2_merge_kip(&kip1_info, (pkg2_kip1_t *)mki->kip1);
|
||||||
|
|
||||||
// Patch kip1s in memory if needed
|
// Patch kip1s in memory if needed.
|
||||||
const char* unappliedPatch = pkg2_patch_kips(&kip1_info, ctxt.kip1_patches);
|
const char* unappliedPatch = pkg2_patch_kips(&kip1_info, ctxt.kip1_patches);
|
||||||
if (unappliedPatch != NULL)
|
if (unappliedPatch != NULL)
|
||||||
{
|
{
|
||||||
gfx_printf(&gfx_con, "%kREQUESTED PATCH '%s' NOT APPLIED!%k\n", 0xFFFF0000, unappliedPatch, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "%kREQUESTED PATCH '%s' NOT APPLIED!%k\n", 0xFFFF0000, unappliedPatch, 0xFFCCCCCC);
|
||||||
sd_unmount(); //just exiting is not enough until pkg2_patch_kips stops modifying the string passed into it
|
sd_unmount(); // Just exiting is not enough until pkg2_patch_kips stops modifying the string passed into it.
|
||||||
while(1) {} //MUST stop here, because if user requests 'nogc' but it's not applied, their GC controller gets updated!
|
while(1) {} // MUST stop here, because if user requests 'nogc' but it's not applied, their GC controller gets updated!
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rebuild and encrypt package2.
|
// Rebuild and encrypt package2.
|
||||||
|
@ -595,7 +598,7 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
case KB_FIRMWARE_VERSION_100_200:
|
case KB_FIRMWARE_VERSION_100_200:
|
||||||
if (!exoFwNumber)
|
if (!exoFwNumber)
|
||||||
{
|
{
|
||||||
if(!strcmp(ctxt.pkg1_id->id, "20161121183008"))
|
if (!strcmp(ctxt.pkg1_id->id, "20161121183008"))
|
||||||
exoFwNumber = 1;
|
exoFwNumber = 1;
|
||||||
else
|
else
|
||||||
exoFwNumber = 2;
|
exoFwNumber = 2;
|
||||||
|
@ -634,7 +637,7 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
|
|
||||||
// Copy BCT if debug mode is enabled.
|
// Copy BCT if debug mode is enabled.
|
||||||
memset((void *)0x4003D000, 0, 0x3000);
|
memset((void *)0x4003D000, 0, 0x3000);
|
||||||
if(ctxt.debugmode)
|
if (ctxt.debugmode)
|
||||||
_copy_bootconfig(&ctxt);
|
_copy_bootconfig(&ctxt);
|
||||||
|
|
||||||
// Config Exosphère if booting Atmosphère.
|
// Config Exosphère if booting Atmosphère.
|
||||||
|
@ -647,13 +650,14 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
*mb_exo_fw_no = exoFwNumber;
|
*mb_exo_fw_no = exoFwNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lock SE before starting 'SecureMonitor'.
|
// Finalize MC carveout and lock SE before starting 'SecureMonitor'.
|
||||||
|
mc_config_carveout_finalize();
|
||||||
_se_lock();
|
_se_lock();
|
||||||
|
|
||||||
// < 4.0.0 Signals - 0: Nothing ready, 1: BCT ready, 2: DRAM and pkg2 ready, 3: Continue boot.
|
// < 4.0.0 Signals - 0: Nothing ready, 1: BCT ready, 2: DRAM and pkg2 ready, 3: Continue boot.
|
||||||
// >= 4.0.0 Signals - 0: Nothing ready, 1: BCT ready, 2: DRAM ready, 4: pkg2 ready and continue boot.
|
// >= 4.0.0 Signals - 0: Nothing ready, 1: BCT ready, 2: DRAM ready, 4: pkg2 ready and continue boot.
|
||||||
vu32 *mb_in = (vu32 *)0x40002EF8;
|
vu32 *mb_in = (vu32 *)0x40002EF8;
|
||||||
//Non-zero: Secmon ready
|
// Non-zero: Secmon ready.
|
||||||
vu32 *mb_out = (vu32 *)0x40002EFC;
|
vu32 *mb_out = (vu32 *)0x40002EFC;
|
||||||
|
|
||||||
// Start from DRAM ready signal.
|
// Start from DRAM ready signal.
|
||||||
|
@ -677,7 +681,7 @@ int hos_launch(ini_sec_t *cfg)
|
||||||
PMC(0x5BC) = 0xFFFFFFFF;
|
PMC(0x5BC) = 0xFFFFFFFF;
|
||||||
PMC(0x5C0) = 0xFFAAFFFF;*/
|
PMC(0x5C0) = 0xFFAAFFFF;*/
|
||||||
|
|
||||||
//Disable display.
|
// Disable display.
|
||||||
if (end_di)
|
if (end_di)
|
||||||
display_end();
|
display_end();
|
||||||
|
|
||||||
|
|
28
ipl/hos.h
28
ipl/hos.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _HOS_H_
|
#ifndef _HOS_H_
|
||||||
#define _HOS_H_
|
#define _HOS_H_
|
||||||
|
|
47
ipl/i2c.c
47
ipl/i2c.c
|
@ -1,25 +1,28 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static u32 i2c_addrs[] = { 0x7000C000, 0x7000C400, 0x7000C500, 0x7000C700, 0x7000D000, 0x7000D100 };
|
static u32 i2c_addrs[] = {
|
||||||
|
0x7000C000, 0x7000C400, 0x7000C500,
|
||||||
|
0x7000C700, 0x7000D000, 0x7000D100
|
||||||
|
};
|
||||||
|
|
||||||
static void _i2c_wait(vu32 *base)
|
static void _i2c_wait(vu32 *base)
|
||||||
{
|
{
|
||||||
|
@ -42,9 +45,9 @@ static int _i2c_send_pkt(u32 idx, u32 x, u8 *buf, u32 size)
|
||||||
|
|
||||||
vu32 *base = (vu32 *)i2c_addrs[idx];
|
vu32 *base = (vu32 *)i2c_addrs[idx];
|
||||||
base[1] = x << 1; //Set x (send mode).
|
base[1] = x << 1; //Set x (send mode).
|
||||||
base[3] = tmp; //Set value.
|
base[3] = tmp; //Set value.
|
||||||
base[0] = (2 * size - 2) | 0x2800; //Set size and send mode.
|
base[0] = (2 * size - 2) | 0x2800; //Set size and send mode.
|
||||||
_i2c_wait(base); //Kick transaction.
|
_i2c_wait(base); //Kick transaction.
|
||||||
|
|
||||||
base[0] = (base[0] & 0xFFFFFDFF) | 0x200;
|
base[0] = (base[0] & 0xFFFFFDFF) | 0x200;
|
||||||
while (base[7] & 0x100)
|
while (base[7] & 0x100)
|
||||||
|
@ -62,9 +65,9 @@ static int _i2c_recv_pkt(u32 idx, u8 *buf, u32 size, u32 x)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
vu32 *base = (vu32 *)i2c_addrs[idx];
|
vu32 *base = (vu32 *)i2c_addrs[idx];
|
||||||
base[1] = (x << 1) | 1; //Set x (recv mode).
|
base[1] = (x << 1) | 1; // Set x (recv mode).
|
||||||
base[0] = (2 * size - 2) | 0x2840; //Set size and recv mode.
|
base[0] = (2 * size - 2) | 0x2840; // Set size and recv mode.
|
||||||
_i2c_wait(base); //Kick transaction.
|
_i2c_wait(base); // Kick transaction.
|
||||||
|
|
||||||
base[0] = (base[0] & 0xFFFFFDFF) | 0x200;
|
base[0] = (base[0] & 0xFFFFFDFF) | 0x200;
|
||||||
while (base[7] & 0x100)
|
while (base[7] & 0x100)
|
||||||
|
@ -73,7 +76,7 @@ static int _i2c_recv_pkt(u32 idx, u8 *buf, u32 size, u32 x)
|
||||||
if (base[7] << 28)
|
if (base[7] << 28)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
u32 tmp = base[3]; //Get value.
|
u32 tmp = base[3]; // Get value.
|
||||||
memcpy(buf, &tmp, size);
|
memcpy(buf, &tmp, size);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -102,7 +105,7 @@ int i2c_send_buf_small(u32 idx, u32 x, u32 y, u8 *buf, u32 size)
|
||||||
{
|
{
|
||||||
u8 tmp[4];
|
u8 tmp[4];
|
||||||
|
|
||||||
if (size > 3)
|
if (size > 3)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tmp[0] = y;
|
tmp[0] = y;
|
||||||
|
|
28
ipl/i2c.h
28
ipl/i2c.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _I2C_H_
|
#ifndef _I2C_H_
|
||||||
#define _I2C_H_
|
#define _I2C_H_
|
||||||
|
|
37
ipl/ini.c
37
ipl/ini.c
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -40,16 +40,16 @@ int ini_parse(link_t *dst, char *ini_path)
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
//Fetch one line.
|
// Fetch one line.
|
||||||
lbuf[0] = 0;
|
lbuf[0] = 0;
|
||||||
f_gets(lbuf, 512, &fp);
|
f_gets(lbuf, 512, &fp);
|
||||||
lblen = strlen(lbuf);
|
lblen = strlen(lbuf);
|
||||||
|
|
||||||
//Remove trailing newline.
|
// Remove trailing newline.
|
||||||
if (lbuf[lblen - 1] == '\n')
|
if (lbuf[lblen - 1] == '\n')
|
||||||
lbuf[lblen - 1] = 0;
|
lbuf[lblen - 1] = 0;
|
||||||
|
|
||||||
if (lblen > 2 && lbuf[0] == '[') //Create new section.
|
if (lblen > 2 && lbuf[0] == '[') // Create new section.
|
||||||
{
|
{
|
||||||
if (csec)
|
if (csec)
|
||||||
{
|
{
|
||||||
|
@ -101,7 +101,6 @@ int ini_parse(link_t *dst, char *ini_path)
|
||||||
csec = (ini_sec_t *)malloc(sizeof(ini_sec_t));
|
csec = (ini_sec_t *)malloc(sizeof(ini_sec_t));
|
||||||
csec->name = _strdup(&lbuf[1]);
|
csec->name = _strdup(&lbuf[1]);
|
||||||
csec->type = INI_COMMENT;
|
csec->type = INI_COMMENT;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (lblen <= 1)
|
else if (lblen <= 1)
|
||||||
{
|
{
|
||||||
|
|
31
ipl/ini.h
31
ipl/ini.h
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _INI_H_
|
#ifndef _INI_H_
|
||||||
#define _INI_H_
|
#define _INI_H_
|
||||||
|
@ -49,3 +49,4 @@ ini_sec_t *ini_clone_section(ini_sec_t *cfg);
|
||||||
void ini_free_section(ini_sec_t *cfg);
|
void ini_free_section(ini_sec_t *cfg);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
28
ipl/kfuse.c
28
ipl/kfuse.c
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kfuse.h"
|
#include "kfuse.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
|
42
ipl/kfuse.h
42
ipl/kfuse.h
|
@ -1,32 +1,32 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _KFUSE_H_
|
#ifndef _KFUSE_H_
|
||||||
#define _KFUSE_H_
|
#define _KFUSE_H_
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#define KFUSE_STATE_SOFTRESET (1<<31)
|
#define KFUSE_STATE_SOFTRESET (1 << 31)
|
||||||
#define KFUSE_STATE_STOP (1<<25)
|
#define KFUSE_STATE_STOP (1 << 25)
|
||||||
#define KFUSE_STATE_RESTART (1<<24)
|
#define KFUSE_STATE_RESTART (1 << 24)
|
||||||
#define KFUSE_STATE_CRCPASS (1<<17)
|
#define KFUSE_STATE_CRCPASS (1 << 17)
|
||||||
#define KFUSE_STATE_DONE (1<<16)
|
#define KFUSE_STATE_DONE (1 << 16)
|
||||||
#define KFUSE_STATE_ERRBLOCK_MASK 0x3F00
|
#define KFUSE_STATE_ERRBLOCK_MASK 0x3F00
|
||||||
#define KFUSE_STATE_ERRBLOCK_SHIFT 8
|
#define KFUSE_STATE_ERRBLOCK_SHIFT 8
|
||||||
#define KFUSE_STATE_CURBLOCK_MASK 0x3F
|
#define KFUSE_STATE_CURBLOCK_MASK 0x3F
|
||||||
|
|
||||||
#define KFUSE_KEYADDR_AUTOINC (1<<16)
|
#define KFUSE_KEYADDR_AUTOINC (1<<16)
|
||||||
|
|
||||||
|
|
28
ipl/list.h
28
ipl/list.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LIST_H_
|
#ifndef _LIST_H_
|
||||||
#define _LIST_H_
|
#define _LIST_H_
|
||||||
|
|
251
ipl/main.c
251
ipl/main.c
|
@ -1,22 +1,22 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018 Rajko Stojadinovic
|
* Copyright (c) 2018 Rajko Stojadinovic
|
||||||
* Copyright (c) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
* Copyright (c) 2018 Reisyukaku
|
* Copyright (c) 2018 Reisyukaku
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -144,12 +144,13 @@ void *sd_file_read(char *path)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sd_save_to_file(void * buf, u32 size, const char * filename)
|
int sd_save_to_file(void *buf, u32 size, const char *filename)
|
||||||
{
|
{
|
||||||
FIL fp;
|
FIL fp;
|
||||||
u32 res = 0;
|
u32 res = 0;
|
||||||
res = f_open(&fp, filename, FA_CREATE_ALWAYS | FA_WRITE);
|
res = f_open(&fp, filename, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if (res) {
|
if (res)
|
||||||
|
{
|
||||||
EPRINTFARGS("Error (%d) creating file\n%s.\n", res, filename);
|
EPRINTFARGS("Error (%d) creating file\n%s.\n", res, filename);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -184,11 +185,10 @@ void emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t
|
||||||
else
|
else
|
||||||
itoa(storage->cid.serial, emmcSN, 16);
|
itoa(storage->cid.serial, emmcSN, 16);
|
||||||
|
|
||||||
|
u32 sub_dir_len = strlen(sub_dir); // Can be a null-terminator.
|
||||||
|
u32 filename_len = strlen(filename); // Can be a null-terminator.
|
||||||
|
|
||||||
u32 sub_dir_len = strlen(sub_dir); // Can be a null-terminator.
|
memcpy(path + strlen(path), "/", 2);
|
||||||
u32 filename_len = strlen(filename); // Can be a null-terminator.
|
|
||||||
|
|
||||||
memcpy(path + strlen(path), "/", 2);
|
|
||||||
memcpy(path + strlen(path), emmcSN, 9);
|
memcpy(path + strlen(path), emmcSN, 9);
|
||||||
f_mkdir(path);
|
f_mkdir(path);
|
||||||
memcpy(path + strlen(path), sub_dir, sub_dir_len + 1);
|
memcpy(path + strlen(path), sub_dir, sub_dir_len + 1);
|
||||||
|
@ -323,7 +323,7 @@ void config_se_brom()
|
||||||
memset((void *)0x7C010000, 0, 0x10000);
|
memset((void *)0x7C010000, 0, 0x10000);
|
||||||
PMC(APBDEV_PMC_CRYPTO_OP) = 0;
|
PMC(APBDEV_PMC_CRYPTO_OP) = 0;
|
||||||
SE(SE_INT_STATUS_REG_OFFSET) = 0x1F;
|
SE(SE_INT_STATUS_REG_OFFSET) = 0x1F;
|
||||||
//Lock SSK (although it's not set and unused anyways).
|
// Lock SSK (although it's not set and unused anyways).
|
||||||
SE(SE_KEY_TABLE_ACCESS_REG_OFFSET + 15 * 4) = 0x7E;
|
SE(SE_KEY_TABLE_ACCESS_REG_OFFSET + 15 * 4) = 0x7E;
|
||||||
// Clear the boot reason to avoid problems later
|
// Clear the boot reason to avoid problems later
|
||||||
PMC(APBDEV_PMC_SCRATCH200) = 0x0;
|
PMC(APBDEV_PMC_SCRATCH200) = 0x0;
|
||||||
|
@ -393,6 +393,27 @@ void config_hw()
|
||||||
sdram_lp0_save_params(sdram_get_params());
|
sdram_lp0_save_params(sdram_get_params());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reconfig_hw_workaround(int extra_reconfig)
|
||||||
|
{
|
||||||
|
// Re-enable clocks to Audio Processing Engine as a workaround to hanging.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_V) |= 0x400; // Enable AHUB clock.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_Y) |= 0x40; // Enable APE clock.
|
||||||
|
|
||||||
|
if (extra_reconfig)
|
||||||
|
{
|
||||||
|
PMC(APBDEV_PMC_PWR_DET_VAL) |= (1 << 12);
|
||||||
|
|
||||||
|
clock_disable_cl_dvfs();
|
||||||
|
|
||||||
|
// Disable Joy-con GPIOs.
|
||||||
|
gpio_config(GPIO_PORT_G, GPIO_PIN_0, GPIO_MODE_SPIO);
|
||||||
|
gpio_config(GPIO_PORT_D, GPIO_PIN_1, GPIO_MODE_SPIO);
|
||||||
|
gpio_config(GPIO_PORT_E, GPIO_PIN_6, GPIO_MODE_SPIO);
|
||||||
|
gpio_config(GPIO_PORT_H, GPIO_PIN_6, GPIO_MODE_SPIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void print_fuseinfo()
|
void print_fuseinfo()
|
||||||
{
|
{
|
||||||
gfx_clear_partial_grey(&gfx_ctxt, 0x1B, 0, 1256);
|
gfx_clear_partial_grey(&gfx_ctxt, 0x1B, 0, 1256);
|
||||||
|
@ -476,7 +497,7 @@ void print_mmc_info()
|
||||||
gfx_clear_partial_grey(&gfx_ctxt, 0x1B, 0, 1256);
|
gfx_clear_partial_grey(&gfx_ctxt, 0x1B, 0, 1256);
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
gfx_con_setpos(&gfx_con, 0, 0);
|
||||||
|
|
||||||
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
||||||
|
|
||||||
sdmmc_storage_t storage;
|
sdmmc_storage_t storage;
|
||||||
sdmmc_t sdmmc;
|
sdmmc_t sdmmc;
|
||||||
|
@ -497,33 +518,33 @@ void print_mmc_info()
|
||||||
case 0: /* MMC v1.0 - v1.2 */
|
case 0: /* MMC v1.0 - v1.2 */
|
||||||
case 1: /* MMC v1.4 */
|
case 1: /* MMC v1.4 */
|
||||||
gfx_printf(&gfx_con,
|
gfx_printf(&gfx_con,
|
||||||
" Vendor ID: %03X\n"
|
" Vendor ID: %03X\n"
|
||||||
" Model: %c%c%c%c%c%c%c\n"
|
" Model: %c%c%c%c%c%c%c\n"
|
||||||
" HW rev: %X\n"
|
" HW rev: %X\n"
|
||||||
" FW rev: %X\n"
|
" FW rev: %X\n"
|
||||||
" S/N: %03X\n"
|
" S/N: %03X\n"
|
||||||
" Month/Year: %02d/%04d\n\n",
|
" Month/Year: %02d/%04d\n\n",
|
||||||
storage.cid.manfid,
|
storage.cid.manfid,
|
||||||
storage.cid.prod_name[0], storage.cid.prod_name[1], storage.cid.prod_name[2],
|
storage.cid.prod_name[0], storage.cid.prod_name[1], storage.cid.prod_name[2],
|
||||||
storage.cid.prod_name[3], storage.cid.prod_name[4], storage.cid.prod_name[5],
|
storage.cid.prod_name[3], storage.cid.prod_name[4], storage.cid.prod_name[5],
|
||||||
storage.cid.prod_name[6], storage.cid.hwrev, storage.cid.fwrev,
|
storage.cid.prod_name[6], storage.cid.hwrev, storage.cid.fwrev,
|
||||||
storage.cid.serial, storage.cid.month, storage.cid.year);
|
storage.cid.serial, storage.cid.month, storage.cid.year);
|
||||||
break;
|
break;
|
||||||
case 2: /* MMC v2.0 - v2.2 */
|
case 2: /* MMC v2.0 - v2.2 */
|
||||||
case 3: /* MMC v3.1 - v3.3 */
|
case 3: /* MMC v3.1 - v3.3 */
|
||||||
case 4: /* MMC v4 */
|
case 4: /* MMC v4 */
|
||||||
gfx_printf(&gfx_con,
|
gfx_printf(&gfx_con,
|
||||||
" Vendor ID: %X\n"
|
" Vendor ID: %X\n"
|
||||||
" Card/BGA: %X\n"
|
" Card/BGA: %X\n"
|
||||||
" OEM ID: %02X\n"
|
" OEM ID: %02X\n"
|
||||||
" Model: %c%c%c%c%c%c\n"
|
" Model: %c%c%c%c%c%c\n"
|
||||||
" Prd Rev: %X\n"
|
" Prd Rev: %X\n"
|
||||||
" S/N: %04X\n"
|
" S/N: %04X\n"
|
||||||
" Month/Year: %02d/%04d\n\n",
|
" Month/Year: %02d/%04d\n\n",
|
||||||
storage.cid.manfid, storage.cid.card_bga, storage.cid.oemid,
|
storage.cid.manfid, storage.cid.card_bga, storage.cid.oemid,
|
||||||
storage.cid.prod_name[0], storage.cid.prod_name[1], storage.cid.prod_name[2],
|
storage.cid.prod_name[0], storage.cid.prod_name[1], storage.cid.prod_name[2],
|
||||||
storage.cid.prod_name[3], storage.cid.prod_name[4], storage.cid.prod_name[5],
|
storage.cid.prod_name[3], storage.cid.prod_name[4], storage.cid.prod_name[5],
|
||||||
storage.cid.prv, storage.cid.serial, storage.cid.month, storage.cid.year);
|
storage.cid.prv, storage.cid.serial, storage.cid.month, storage.cid.year);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
EPRINTFARGS("eMMC has unknown MMCA version %d", storage.csd.mmca_vsn);
|
EPRINTFARGS("eMMC has unknown MMCA version %d", storage.csd.mmca_vsn);
|
||||||
|
@ -628,7 +649,7 @@ out:
|
||||||
|
|
||||||
void print_sdcard_info()
|
void print_sdcard_info()
|
||||||
{
|
{
|
||||||
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
||||||
|
|
||||||
gfx_clear_partial_grey(&gfx_ctxt, 0x1B, 0, 1256);
|
gfx_clear_partial_grey(&gfx_ctxt, 0x1B, 0, 1256);
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
gfx_con_setpos(&gfx_con, 0, 0);
|
||||||
|
@ -703,9 +724,8 @@ void print_tsec_key()
|
||||||
goto out_wait;
|
goto out_wait;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
u8 keys[0x10 * 3];
|
u8 keys[0x10 * 3];
|
||||||
for(u32 i = 1; i <= 3; i++)
|
for (u32 i = 1; i <= 3; i++)
|
||||||
{
|
{
|
||||||
int res = tsec_query(keys + ((i - 1) * 0x10), i, pkg1 + pkg1_id->tsec_off);
|
int res = tsec_query(keys + ((i - 1) * 0x10), i, pkg1 + pkg1_id->tsec_off);
|
||||||
|
|
||||||
|
@ -737,10 +757,10 @@ void print_tsec_key()
|
||||||
else
|
else
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
out_wait:;
|
out_wait:
|
||||||
btn_wait();
|
btn_wait();
|
||||||
|
|
||||||
out:;
|
out:
|
||||||
free(pkg1);
|
free(pkg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -775,7 +795,7 @@ void power_off()
|
||||||
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_ONOFFCNFG1, MAX77620_ONOFFCNFG1_PWR_OFF);
|
i2c_send_byte(I2C_5, 0x3C, MAX77620_REG_ONOFFCNFG1, MAX77620_ONOFFCNFG1_PWR_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char* outFilename, emmc_part_t *part)
|
int dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char *outFilename, emmc_part_t *part)
|
||||||
{
|
{
|
||||||
FIL fp;
|
FIL fp;
|
||||||
u32 prevPct = 200;
|
u32 prevPct = 200;
|
||||||
|
@ -786,7 +806,7 @@ int dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char* outFilename,
|
||||||
|
|
||||||
if (f_open(&fp, outFilename, FA_READ) == FR_OK)
|
if (f_open(&fp, outFilename, FA_READ) == FR_OK)
|
||||||
{
|
{
|
||||||
u32 totalSectorsVer = (u32)((u64)f_size(&fp)>>(u64)9);
|
u32 totalSectorsVer = (u32)((u64)f_size(&fp) >> (u64)9);
|
||||||
|
|
||||||
u32 numSectorsPerIter = 0;
|
u32 numSectorsPerIter = 0;
|
||||||
if (totalSectorsVer > 0x200000)
|
if (totalSectorsVer > 0x200000)
|
||||||
|
@ -809,7 +829,7 @@ int dump_emmc_verify(sdmmc_storage_t *storage, u32 lba_curr, char* outFilename,
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
||||||
free(bufEm);
|
free(bufEm);
|
||||||
free(bufSd);
|
free(bufSd);
|
||||||
|
@ -981,7 +1001,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||||
}
|
}
|
||||||
|
|
||||||
FIL fp;
|
FIL fp;
|
||||||
gfx_con_getpos(&gfx_con, &gfx_con.savedx, &gfx_con.savedy);
|
gfx_con_getpos(&gfx_con, &gfx_con.savedx, &gfx_con.savedy);
|
||||||
gfx_printf(&gfx_con, "Filename: %s\n\n", outFilename);
|
gfx_printf(&gfx_con, "Filename: %s\n\n", outFilename);
|
||||||
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -1077,7 +1097,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create next part.
|
// Create next part.
|
||||||
gfx_con_setpos(&gfx_con, gfx_con.savedx, gfx_con.savedy);
|
gfx_con_setpos(&gfx_con, gfx_con.savedx, gfx_con.savedy);
|
||||||
gfx_printf(&gfx_con, "Filename: %s\n\n", outFilename);
|
gfx_printf(&gfx_con, "Filename: %s\n\n", outFilename);
|
||||||
lbaStartPart = lba_curr;
|
lbaStartPart = lba_curr;
|
||||||
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
res = f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
|
@ -1104,7 +1124,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||||
{
|
{
|
||||||
gfx_con.fntsz = 16;
|
gfx_con.fntsz = 16;
|
||||||
EPRINTFARGS("\nFailed to read %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
|
EPRINTFARGS("\nFailed to read %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
|
||||||
num, lba_curr);
|
num, lba_curr);
|
||||||
EPRINTF("\nPress any key and try again...\n");
|
EPRINTF("\nPress any key and try again...\n");
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
|
@ -1219,7 +1239,7 @@ static void dump_emmc_selected(emmcPartType_t dumpType)
|
||||||
emmc_part_t bootPart;
|
emmc_part_t bootPart;
|
||||||
memset(&bootPart, 0, sizeof(bootPart));
|
memset(&bootPart, 0, sizeof(bootPart));
|
||||||
bootPart.lba_start = 0;
|
bootPart.lba_start = 0;
|
||||||
bootPart.lba_end = (BOOT_PART_SIZE/NX_EMMC_BLOCKSIZE)-1;
|
bootPart.lba_end = (BOOT_PART_SIZE / NX_EMMC_BLOCKSIZE) - 1;
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
memcpy(bootPart.name, "BOOT", 5);
|
memcpy(bootPart.name, "BOOT", 5);
|
||||||
|
@ -1229,7 +1249,7 @@ static void dump_emmc_selected(emmcPartType_t dumpType)
|
||||||
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i,
|
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i,
|
||||||
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFCCCCCC);
|
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFCCCCCC);
|
||||||
|
|
||||||
sdmmc_storage_set_mmc_partition(&storage, i+1);
|
sdmmc_storage_set_mmc_partition(&storage, i + 1);
|
||||||
|
|
||||||
emmcsn_path_impl(sdPath, "", bootPart.name, &storage);
|
emmcsn_path_impl(sdPath, "", bootPart.name, &storage);
|
||||||
res = dump_emmc_part(sdPath, &storage, &bootPart);
|
res = dump_emmc_part(sdPath, &storage, &bootPart);
|
||||||
|
@ -1271,7 +1291,7 @@ static void dump_emmc_selected(emmcPartType_t dumpType)
|
||||||
emmc_part_t rawPart;
|
emmc_part_t rawPart;
|
||||||
memset(&rawPart, 0, sizeof(rawPart));
|
memset(&rawPart, 0, sizeof(rawPart));
|
||||||
rawPart.lba_start = 0;
|
rawPart.lba_start = 0;
|
||||||
rawPart.lba_end = RAW_AREA_NUM_SECTORS-1;
|
rawPart.lba_end = RAW_AREA_NUM_SECTORS - 1;
|
||||||
strcpy(rawPart.name, "rawnand.bin");
|
strcpy(rawPart.name, "rawnand.bin");
|
||||||
{
|
{
|
||||||
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i++,
|
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i++,
|
||||||
|
@ -1288,11 +1308,11 @@ static void dump_emmc_selected(emmcPartType_t dumpType)
|
||||||
gfx_printf(&gfx_con, "Time taken: %dm %ds.\n", timer / 60, timer % 60);
|
gfx_printf(&gfx_con, "Time taken: %dm %ds.\n", timer / 60, timer % 60);
|
||||||
sdmmc_storage_end(&storage);
|
sdmmc_storage_end(&storage);
|
||||||
if (res && h_cfg.verification)
|
if (res && h_cfg.verification)
|
||||||
gfx_printf(&gfx_con, "\n%kFinished and verified!%k\nPress any key...\n",0xFF96FF00, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "\n%kFinished and verified!%k\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC);
|
||||||
else if (res)
|
else if (res)
|
||||||
gfx_printf(&gfx_con, "\nFinished! Press any key...\n");
|
gfx_printf(&gfx_con, "\nFinished! Press any key...\n");
|
||||||
|
|
||||||
out:;
|
out:
|
||||||
sd_unmount();
|
sd_unmount();
|
||||||
btn_wait();
|
btn_wait();
|
||||||
}
|
}
|
||||||
|
@ -1314,7 +1334,6 @@ int restore_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part
|
||||||
gfx_con.fntsz = 8;
|
gfx_con.fntsz = 8;
|
||||||
|
|
||||||
FIL fp;
|
FIL fp;
|
||||||
gfx_con_getpos(&gfx_con, &gfx_con.savedx, &gfx_con.savedy);
|
|
||||||
gfx_printf(&gfx_con, "\nFilename: %s\n", outFilename);
|
gfx_printf(&gfx_con, "\nFilename: %s\n", outFilename);
|
||||||
|
|
||||||
res = f_open(&fp, outFilename, FA_READ);
|
res = f_open(&fp, outFilename, FA_READ);
|
||||||
|
@ -1326,7 +1345,7 @@ int restore_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//TODO: Should we keep this check?
|
//TODO: Should we keep this check?
|
||||||
else if (((u32)((u64)f_size(&fp)>>(u64)9)) != totalSectors)
|
else if (((u32)((u64)f_size(&fp) >> (u64)9)) != totalSectors)
|
||||||
{
|
{
|
||||||
gfx_con.fntsz = 16;
|
gfx_con.fntsz = 16;
|
||||||
EPRINTF("Size of the SD Card backup does not match,\neMMC's selected part size.\n");
|
EPRINTF("Size of the SD Card backup does not match,\neMMC's selected part size.\n");
|
||||||
|
@ -1335,7 +1354,7 @@ int restore_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gfx_printf(&gfx_con, "\nTotal restore size: %d MiB.\n\n", ((u32)((u64)f_size(&fp)>>(u64)9)) >> SECTORS_TO_MIB_COEFF);
|
gfx_printf(&gfx_con, "\nTotal restore size: %d MiB.\n\n", ((u32)((u64)f_size(&fp) >> (u64)9)) >> SECTORS_TO_MIB_COEFF);
|
||||||
|
|
||||||
u32 numSectorsPerIter = 0;
|
u32 numSectorsPerIter = 0;
|
||||||
if (totalSectors > 0x200000)
|
if (totalSectors > 0x200000)
|
||||||
|
@ -1378,7 +1397,7 @@ int restore_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part
|
||||||
{
|
{
|
||||||
gfx_con.fntsz = 16;
|
gfx_con.fntsz = 16;
|
||||||
EPRINTFARGS("\nFailed to write %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
|
EPRINTFARGS("\nFailed to write %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
|
||||||
num, lba_curr);
|
num, lba_curr);
|
||||||
EPRINTF("\nYour device may be in an inoperative state!\n\nPress any key and try again...\n");
|
EPRINTF("\nYour device may be in an inoperative state!\n\nPress any key and try again...\n");
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
|
@ -1441,7 +1460,7 @@ static void restore_emmc_selected(emmcPartType_t restoreType)
|
||||||
gfx_puts(&gfx_con, "partitions that it can find.\n");
|
gfx_puts(&gfx_con, "partitions that it can find.\n");
|
||||||
gfx_puts(&gfx_con, "If it is not found, it will be skipped\nand continue with the next.\n\n");
|
gfx_puts(&gfx_con, "If it is not found, it will be skipped\nand continue with the next.\n\n");
|
||||||
}
|
}
|
||||||
gfx_con_getpos(&gfx_con, &gfx_con.savedx, &gfx_con.savedy);
|
gfx_con_getpos(&gfx_con, &gfx_con.savedx, &gfx_con.savedy);
|
||||||
|
|
||||||
u8 value = 10;
|
u8 value = 10;
|
||||||
while (value > 0)
|
while (value > 0)
|
||||||
|
@ -1481,7 +1500,7 @@ static void restore_emmc_selected(emmcPartType_t restoreType)
|
||||||
emmc_part_t bootPart;
|
emmc_part_t bootPart;
|
||||||
memset(&bootPart, 0, sizeof(bootPart));
|
memset(&bootPart, 0, sizeof(bootPart));
|
||||||
bootPart.lba_start = 0;
|
bootPart.lba_start = 0;
|
||||||
bootPart.lba_end = (BOOT_PART_SIZE/NX_EMMC_BLOCKSIZE)-1;
|
bootPart.lba_end = (BOOT_PART_SIZE / NX_EMMC_BLOCKSIZE) - 1;
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
memcpy(bootPart.name, "BOOT", 4);
|
memcpy(bootPart.name, "BOOT", 4);
|
||||||
|
@ -1491,7 +1510,7 @@ static void restore_emmc_selected(emmcPartType_t restoreType)
|
||||||
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i,
|
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i,
|
||||||
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFCCCCCC);
|
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFCCCCCC);
|
||||||
|
|
||||||
sdmmc_storage_set_mmc_partition(&storage, i+1);
|
sdmmc_storage_set_mmc_partition(&storage, i + 1);
|
||||||
|
|
||||||
emmcsn_path_impl(sdPath, "/Restore", bootPart.name, &storage);
|
emmcsn_path_impl(sdPath, "/Restore", bootPart.name, &storage);
|
||||||
res = restore_emmc_part(sdPath, &storage, &bootPart);
|
res = restore_emmc_part(sdPath, &storage, &bootPart);
|
||||||
|
@ -1523,7 +1542,7 @@ static void restore_emmc_selected(emmcPartType_t restoreType)
|
||||||
emmc_part_t rawPart;
|
emmc_part_t rawPart;
|
||||||
memset(&rawPart, 0, sizeof(rawPart));
|
memset(&rawPart, 0, sizeof(rawPart));
|
||||||
rawPart.lba_start = 0;
|
rawPart.lba_start = 0;
|
||||||
rawPart.lba_end = RAW_AREA_NUM_SECTORS-1;
|
rawPart.lba_end = RAW_AREA_NUM_SECTORS - 1;
|
||||||
strcpy(rawPart.name, "rawnand.bin");
|
strcpy(rawPart.name, "rawnand.bin");
|
||||||
{
|
{
|
||||||
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i++,
|
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFF00DDFF, i++,
|
||||||
|
@ -1539,11 +1558,11 @@ static void restore_emmc_selected(emmcPartType_t restoreType)
|
||||||
gfx_printf(&gfx_con, "Time taken: %dm %ds.\n", timer / 60, timer % 60);
|
gfx_printf(&gfx_con, "Time taken: %dm %ds.\n", timer / 60, timer % 60);
|
||||||
sdmmc_storage_end(&storage);
|
sdmmc_storage_end(&storage);
|
||||||
if (res && h_cfg.verification)
|
if (res && h_cfg.verification)
|
||||||
gfx_printf(&gfx_con, "\n%kFinished and verified!%k\nPress any key...\n",0xFF96FF00, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "\n%kFinished and verified!%k\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC);
|
||||||
else if (res)
|
else if (res)
|
||||||
gfx_printf(&gfx_con, "\nFinished! Press any key...\n");
|
gfx_printf(&gfx_con, "\nFinished! Press any key...\n");
|
||||||
|
|
||||||
out:;
|
out:
|
||||||
sd_unmount();
|
sd_unmount();
|
||||||
btn_wait();
|
btn_wait();
|
||||||
}
|
}
|
||||||
|
@ -1611,7 +1630,6 @@ void dump_packages12()
|
||||||
gfx_printf(&gfx_con, "%kWarmboot addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->warmboot_base);
|
gfx_printf(&gfx_con, "%kWarmboot addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->warmboot_base);
|
||||||
gfx_printf(&gfx_con, "%kWarmboot size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->wb_size);
|
gfx_printf(&gfx_con, "%kWarmboot size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->wb_size);
|
||||||
|
|
||||||
|
|
||||||
char path[64];
|
char path[64];
|
||||||
// Dump package1.1.
|
// Dump package1.1.
|
||||||
emmcsn_path_impl(path, "/pkg1", "pkg1_decr.bin", &storage);
|
emmcsn_path_impl(path, "/pkg1", "pkg1_decr.bin", &storage);
|
||||||
|
@ -1663,7 +1681,7 @@ void dump_packages12()
|
||||||
|
|
||||||
// Display info.
|
// Display info.
|
||||||
u32 kernel_crc32 = crc32c(pkg2_hdr->data, pkg2_hdr->sec_size[PKG2_SEC_KERNEL]);
|
u32 kernel_crc32 = crc32c(pkg2_hdr->data, pkg2_hdr->sec_size[PKG2_SEC_KERNEL]);
|
||||||
gfx_printf(&gfx_con, "\n%kKernel CRC32C: %k0x%08X\n\n",0xFFC7EA46, 0xFFCCCCCC, kernel_crc32);
|
gfx_printf(&gfx_con, "\n%kKernel CRC32C: %k0x%08X\n\n", 0xFFC7EA46, 0xFFCCCCCC, kernel_crc32);
|
||||||
gfx_printf(&gfx_con, "%kKernel size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, pkg2_hdr->sec_size[PKG2_SEC_KERNEL]);
|
gfx_printf(&gfx_con, "%kKernel size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, pkg2_hdr->sec_size[PKG2_SEC_KERNEL]);
|
||||||
gfx_printf(&gfx_con, "%kINI1 size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, pkg2_hdr->sec_size[PKG2_SEC_INI1]);
|
gfx_printf(&gfx_con, "%kINI1 size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, pkg2_hdr->sec_size[PKG2_SEC_INI1]);
|
||||||
|
|
||||||
|
@ -1688,7 +1706,7 @@ void dump_packages12()
|
||||||
|
|
||||||
gfx_puts(&gfx_con, "\nDone. Press any key...\n");
|
gfx_puts(&gfx_con, "\nDone. Press any key...\n");
|
||||||
|
|
||||||
out:;
|
out:
|
||||||
free(pkg1);
|
free(pkg1);
|
||||||
free(secmon);
|
free(secmon);
|
||||||
free(warmboot);
|
free(warmboot);
|
||||||
|
@ -1962,7 +1980,7 @@ void auto_launch_firmware()
|
||||||
#endif //MENU_LOGO_ENABLE
|
#endif //MENU_LOGO_ENABLE
|
||||||
}
|
}
|
||||||
|
|
||||||
out:;
|
out:
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||||
ini_free(&ini_sections);
|
ini_free(&ini_sections);
|
||||||
ini_free_section(cfg_sec);
|
ini_free_section(cfg_sec);
|
||||||
|
@ -1974,7 +1992,8 @@ out:;
|
||||||
display_backlight(1);
|
display_backlight(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void toggle_autorcm(){
|
void toggle_autorcm()
|
||||||
|
{
|
||||||
sdmmc_storage_t storage;
|
sdmmc_storage_t storage;
|
||||||
sdmmc_t sdmmc;
|
sdmmc_t sdmmc;
|
||||||
|
|
||||||
|
@ -2004,7 +2023,7 @@ void toggle_autorcm(){
|
||||||
|
|
||||||
gfx_printf(&gfx_con, "%kAutoRCM mode toggled!%k\n\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "%kAutoRCM mode toggled!%k\n\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC);
|
||||||
|
|
||||||
out:;
|
out:
|
||||||
btn_wait();
|
btn_wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2054,7 +2073,7 @@ int fix_attributes(char *path, u32 *total, u32 is_root, u32 check_first_run)
|
||||||
|
|
||||||
// Set new directory or file.
|
// Set new directory or file.
|
||||||
memcpy(&path[dirLength], "/", 1);
|
memcpy(&path[dirLength], "/", 1);
|
||||||
memcpy(&path[dirLength+1], fno.fname, strlen(fno.fname) + 1);
|
memcpy(&path[dirLength + 1], fno.fname, strlen(fno.fname) + 1);
|
||||||
|
|
||||||
// Check if archive bit is set.
|
// Check if archive bit is set.
|
||||||
if (fno.fattrib & AM_ARC)
|
if (fno.fattrib & AM_ARC)
|
||||||
|
@ -2391,42 +2410,42 @@ void fix_battery_desync()
|
||||||
void about()
|
void about()
|
||||||
{
|
{
|
||||||
static const char credits[] =
|
static const char credits[] =
|
||||||
"\nhekate (C) 2018 naehrwert, st4rk\n\n"
|
"\nhekate (C) 2018 naehrwert, st4rk\n\n"
|
||||||
"CTCaer mod (C) 2018 CTCaer\n"
|
"CTCaer mod (C) 2018 CTCaer\n"
|
||||||
" ___________________________________________\n\n"
|
" ___________________________________________\n\n"
|
||||||
"Thanks to: %kderrek, nedwill, plutoo,\n"
|
"Thanks to: %kderrek, nedwill, plutoo,\n"
|
||||||
" shuffle2, smea, thexyz, yellows8%k\n"
|
" shuffle2, smea, thexyz, yellows8%k\n"
|
||||||
" ___________________________________________\n\n"
|
" ___________________________________________\n\n"
|
||||||
"Greetings to: fincs, hexkyz, SciresM,\n"
|
"Greetings to: fincs, hexkyz, SciresM,\n"
|
||||||
" Shiny Quagsire, WinterMute\n"
|
" Shiny Quagsire, WinterMute\n"
|
||||||
" ___________________________________________\n\n"
|
" ___________________________________________\n\n"
|
||||||
"Open source and free packages used:\n\n"
|
"Open source and free packages used:\n\n"
|
||||||
" - FatFs R0.13b,\n"
|
" - FatFs R0.13b,\n"
|
||||||
" Copyright (C) 2018, ChaN\n\n"
|
" Copyright (C) 2018, ChaN\n\n"
|
||||||
" - bcl-1.2.0,\n"
|
" - bcl-1.2.0,\n"
|
||||||
" Copyright (C) 2003-2006, Marcus Geelnard\n\n"
|
" Copyright (C) 2003-2006, Marcus Geelnard\n\n"
|
||||||
" - Atmosphere (SE sha256, prc id patches),\n"
|
" - Atmosphere (SE sha256, prc id patches),\n"
|
||||||
" Copyright (C) 2018, Atmosphere-NX\n"
|
" Copyright (C) 2018, Atmosphere-NX\n"
|
||||||
" ___________________________________________\n\n";
|
" ___________________________________________\n\n";
|
||||||
static const char octopus[] =
|
static const char octopus[] =
|
||||||
" %k___\n"
|
" %k___\n"
|
||||||
" .-' `'.\n"
|
" .-' `'.\n"
|
||||||
" / \\\n"
|
" / \\\n"
|
||||||
" | ;\n"
|
" | ;\n"
|
||||||
" | | ___.--,\n"
|
" | | ___.--,\n"
|
||||||
" _.._ |0) = (0) | _.---'`__.-( (_.\n"
|
" _.._ |0) = (0) | _.---'`__.-( (_.\n"
|
||||||
" __.--'`_.. '.__.\\ '--. \\_.-' ,.--'` `\"\"`\n"
|
" __.--'`_.. '.__.\\ '--. \\_.-' ,.--'` `\"\"`\n"
|
||||||
" ( ,.--'` ',__ /./; ;, '.__.'` __\n"
|
" ( ,.--'` ',__ /./; ;, '.__.'` __\n"
|
||||||
" _`) ) .---.__.' / | |\\ \\__..--\"\" \"\"\"--.,_\n"
|
" _`) ) .---.__.' / | |\\ \\__..--\"\" \"\"\"--.,_\n"
|
||||||
" `---' .'.''-._.-'`_./ /\\ '. \\ _.--''````'''--._`-.__.'\n"
|
" `---' .'.''-._.-'`_./ /\\ '. \\ _.--''````'''--._`-.__.'\n"
|
||||||
" | | .' _.-' | | \\ \\ '. `----`\n"
|
" | | .' _.-' | | \\ \\ '. `----`\n"
|
||||||
" \\ \\/ .' \\ \\ '. '-._)\n"
|
" \\ \\/ .' \\ \\ '. '-._)\n"
|
||||||
" \\/ / \\ \\ `=.__`'-.\n"
|
" \\/ / \\ \\ `=.__`'-.\n"
|
||||||
" / /\\ `) ) / / `\"\".`\\\n"
|
" / /\\ `) ) / / `\"\".`\\\n"
|
||||||
" , _.-'.'\\ \\ / / ( ( / /\n"
|
" , _.-'.'\\ \\ / / ( ( / /\n"
|
||||||
" `--'` ) ) .-'.' '.'. | (\n"
|
" `--'` ) ) .-'.' '.'. | (\n"
|
||||||
" (/` ( (` ) ) '-; %k[switchbrew]%k\n"
|
" (/` ( (` ) ) '-; %k[switchbrew]%k\n"
|
||||||
" ` '-; (-'%k";
|
" ` '-; (-'%k";
|
||||||
|
|
||||||
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
gfx_clear_grey(&gfx_ctxt, 0x1B);
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
gfx_con_setpos(&gfx_con, 0, 0);
|
||||||
|
|
|
@ -49,66 +49,66 @@ int max17050_get_property(enum MAX17050_reg reg, int *value)
|
||||||
|
|
||||||
switch (reg)
|
switch (reg)
|
||||||
{
|
{
|
||||||
case MAX17050_Age: //Age (percent). Based on 100% x (FullCAP Register/DesignCap).
|
case MAX17050_Age: // Age (percent). Based on 100% x (FullCAP Register/DesignCap).
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_Age);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_Age);
|
||||||
*value = data >> 8; /* Show MSB. 1% increments */
|
*value = data >> 8; /* Show MSB. 1% increments */
|
||||||
break;
|
break;
|
||||||
case MAX17050_Cycles: //Cycle count.
|
case MAX17050_Cycles: // Cycle count.
|
||||||
i2c_recv_buf_small((u8 *)value, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_Cycles);
|
i2c_recv_buf_small((u8 *)value, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_Cycles);
|
||||||
break;
|
break;
|
||||||
case MAX17050_MinVolt: //Voltage max/min
|
case MAX17050_MinVolt: // Voltage max/min
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_MinMaxVolt);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_MinMaxVolt);
|
||||||
*value = (data & 0xff) * 20; /* Voltage MIN. Units of 20mV */
|
*value = (data & 0xff) * 20; /* Voltage MIN. Units of 20mV */
|
||||||
break;
|
break;
|
||||||
case MAX17050_MaxVolt: //Voltage max/min
|
case MAX17050_MaxVolt: // Voltage max/min
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_MinMaxVolt);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_MinMaxVolt);
|
||||||
*value = (data >> 8) * 20; /* Voltage MAX. Units of LSB = 20mV */
|
*value = (data >> 8) * 20; /* Voltage MAX. Units of LSB = 20mV */
|
||||||
break;
|
break;
|
||||||
case MAX17050_V_empty: //Voltage min design.
|
case MAX17050_V_empty: // Voltage min design.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_V_empty);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_V_empty);
|
||||||
*value = (data >> 7) * 10; /* Units of LSB = 10mV */
|
*value = (data >> 7) * 10; /* Units of LSB = 10mV */
|
||||||
break;
|
break;
|
||||||
case MAX17050_VCELL: //Voltage now.
|
case MAX17050_VCELL: // Voltage now.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_VCELL);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_VCELL);
|
||||||
*value = data * 625 / 8 / 1000;
|
*value = data * 625 / 8 / 1000;
|
||||||
break;
|
break;
|
||||||
case MAX17050_AvgVCELL: //Voltage avg.
|
case MAX17050_AvgVCELL: // Voltage avg.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_AvgVCELL);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_AvgVCELL);
|
||||||
*value = data * 625 / 8 / 1000;
|
*value = data * 625 / 8 / 1000;
|
||||||
break;
|
break;
|
||||||
case MAX17050_OCVInternal: //Voltage ocv.
|
case MAX17050_OCVInternal: // Voltage ocv.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_OCVInternal);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_OCVInternal);
|
||||||
*value = data * 625 / 8 / 1000;
|
*value = data * 625 / 8 / 1000;
|
||||||
break;
|
break;
|
||||||
case MAX17050_RepSOC: //Capacity %.
|
case MAX17050_RepSOC: // Capacity %.
|
||||||
i2c_recv_buf_small((u8 *)value, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_RepSOC);
|
i2c_recv_buf_small((u8 *)value, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_RepSOC);
|
||||||
break;
|
break;
|
||||||
case MAX17050_DesignCap: //Charge full design.
|
case MAX17050_DesignCap: // Charge full design.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_DesignCap);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_DesignCap);
|
||||||
data = data * 5 / 10;
|
data = data * 5 / 10;
|
||||||
*value = data;
|
*value = data;
|
||||||
break;
|
break;
|
||||||
case MAX17050_FullCAP: //Charge full.
|
case MAX17050_FullCAP: // Charge full.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_FullCAP);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_FullCAP);
|
||||||
data = data * 5 / 10;
|
data = data * 5 / 10;
|
||||||
*value = data;
|
*value = data;
|
||||||
break;
|
break;
|
||||||
case MAX17050_RepCap: //Charge now.
|
case MAX17050_RepCap: // Charge now.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_RepCap);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_RepCap);
|
||||||
data = data * 5 / 10;
|
data = data * 5 / 10;
|
||||||
*value = data;
|
*value = data;
|
||||||
break;
|
break;
|
||||||
case MAX17050_TEMP: //Temp.
|
case MAX17050_TEMP: // Temp.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_TEMP);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_TEMP);
|
||||||
*value = (s16)data;
|
*value = (s16)data;
|
||||||
*value = *value * 10 / 256;
|
*value = *value * 10 / 256;
|
||||||
break;
|
break;
|
||||||
case MAX17050_Current: //Current now.
|
case MAX17050_Current: // Current now.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_Current);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_Current);
|
||||||
*value = (s16)data;
|
*value = (s16)data;
|
||||||
*value *= 1562500 / MAX17050_DEFAULT_SNS_RESISTOR;
|
*value *= 1562500 / MAX17050_DEFAULT_SNS_RESISTOR;
|
||||||
break;
|
break;
|
||||||
case MAX17050_AvgCurrent: //Current avg.
|
case MAX17050_AvgCurrent: // Current avg.
|
||||||
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_AvgCurrent);
|
i2c_recv_buf_small((u8 *)&data, 2, I2C_1, MAXIM17050_I2C_ADDR, MAX17050_AvgCurrent);
|
||||||
*value = (s16)data;
|
*value = (s16)data;
|
||||||
*value *= 1562500 / MAX17050_DEFAULT_SNS_RESISTOR;
|
*value *= 1562500 / MAX17050_DEFAULT_SNS_RESISTOR;
|
||||||
|
@ -125,10 +125,12 @@ static int _max17050_write_verify_reg(u8 reg, u16 value)
|
||||||
int ret;
|
int ret;
|
||||||
u16 read_value;
|
u16 read_value;
|
||||||
|
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
ret = i2c_send_buf_small(I2C_1, MAXIM17050_I2C_ADDR, reg, (u8 *)&value, 2);
|
ret = i2c_send_buf_small(I2C_1, MAXIM17050_I2C_ADDR, reg, (u8 *)&value, 2);
|
||||||
i2c_recv_buf_small((u8 *)&read_value, 2, I2C_1, MAXIM17050_I2C_ADDR, reg);
|
i2c_recv_buf_small((u8 *)&read_value, 2, I2C_1, MAXIM17050_I2C_ADDR, reg);
|
||||||
if (read_value != value) {
|
if (read_value != value)
|
||||||
|
{
|
||||||
ret = -1;
|
ret = -1;
|
||||||
retries--;
|
retries--;
|
||||||
}
|
}
|
||||||
|
@ -152,7 +154,6 @@ static void _max17050_load_new_capacity_params()
|
||||||
dp_acc = 0x5e09; // =||=
|
dp_acc = 0x5e09; // =||=
|
||||||
repSoc = 0x6400; // 100%.
|
repSoc = 0x6400; // 100%.
|
||||||
|
|
||||||
|
|
||||||
_max17050_write_verify_reg(MAX17050_RemCap, fullcap);
|
_max17050_write_verify_reg(MAX17050_RemCap, fullcap);
|
||||||
_max17050_write_verify_reg(MAX17050_RepCap, fullcap);
|
_max17050_write_verify_reg(MAX17050_RepCap, fullcap);
|
||||||
|
|
||||||
|
@ -182,7 +183,7 @@ static void _max17050_reset_vfsoc0_reg()
|
||||||
|
|
||||||
static void _max17050_update_capacity_regs()
|
static void _max17050_update_capacity_regs()
|
||||||
{
|
{
|
||||||
u16 value = 0x2476; //Set to 4667mAh design capacity.
|
u16 value = 0x2476; // Set to 4667mAh design capacity.
|
||||||
_max17050_write_verify_reg(MAX17050_FullCAP, value);
|
_max17050_write_verify_reg(MAX17050_FullCAP, value);
|
||||||
_max17050_write_verify_reg(MAX17050_FullCAPNom, value);
|
_max17050_write_verify_reg(MAX17050_FullCAPNom, value);
|
||||||
//i2c_send_buf_small(I2C_1, MAXIM17050_I2C_ADDR, MAX17050_DesignCap, config->design_cap, 2);
|
//i2c_send_buf_small(I2C_1, MAXIM17050_I2C_ADDR, MAX17050_DesignCap, config->design_cap, 2);
|
||||||
|
@ -218,7 +219,7 @@ static void _max17050_override_por_values()
|
||||||
//_max17050_override_por(MAX17050_TempCo, config->tcompc0); //0x1b22
|
//_max17050_override_por(MAX17050_TempCo, config->tcompc0); //0x1b22
|
||||||
|
|
||||||
//u16 k_empty0 = 0x439;
|
//u16 k_empty0 = 0x439;
|
||||||
//_max17050_override_por(map, MAX17050_K_empty0, k_empty0); // unknown cell data
|
//_max17050_override_por(map, MAX17050_K_empty0, k_empty0); // Unknown cell data
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _max17050_set_por_bit(u16 value)
|
static void _max17050_set_por_bit(u16 value)
|
||||||
|
@ -241,7 +242,6 @@ int max17050_fix_configuration()
|
||||||
/* Initialize configaration */
|
/* Initialize configaration */
|
||||||
_max17050_write_config_regs();
|
_max17050_write_config_regs();
|
||||||
|
|
||||||
|
|
||||||
/* update capacity params */
|
/* update capacity params */
|
||||||
_max17050_update_capacity_regs();
|
_max17050_update_capacity_regs();
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "max7762x.h"
|
#include "max7762x.h"
|
||||||
#include "max77620.h"
|
#include "max77620.h"
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _MAX7762X_H_
|
#ifndef _MAX7762X_H_
|
||||||
#define _MAX7762X_H_
|
#define _MAX7762X_H_
|
||||||
|
@ -24,11 +24,11 @@
|
||||||
* Name | Usage | uV step | uV min | uV default | uV max | Init
|
* Name | Usage | uV step | uV min | uV default | uV max | Init
|
||||||
*-------+---------------+---------+--------+------------+---------+------------------
|
*-------+---------------+---------+--------+------------+---------+------------------
|
||||||
* sd0 | core | 12500 | 600000 | 625000 | 1400000 | 1.125V (pkg1.1)
|
* sd0 | core | 12500 | 600000 | 625000 | 1400000 | 1.125V (pkg1.1)
|
||||||
* sd1 | SDRAM | 12500 | 600000 | 1125000 | 1125000 | 1.1V (pkg1.1)
|
* sd1 | SDRAM | 12500 | 600000 | 1125000 | 1125000 | 1.1V (pkg1.1)
|
||||||
* sd2 | ldo{0-1, 7-8} | 12500 | 600000 | 1325000 | 1350000 | 1.325V (pcv)
|
* sd2 | ldo{0-1, 7-8} | 12500 | 600000 | 1325000 | 1350000 | 1.325V (pcv)
|
||||||
* sd3 | 1.8V general | 12500 | 600000 | 1800000 | 1800000 |
|
* sd3 | 1.8V general | 12500 | 600000 | 1800000 | 1800000 |
|
||||||
* ldo0 | Display Panel | 25000 | 800000 | 1200000 | 1200000 | 1.2V (pkg1.1)
|
* ldo0 | Display Panel | 25000 | 800000 | 1200000 | 1200000 | 1.2V (pkg1.1)
|
||||||
* ldo1 | XUSB | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv)
|
* ldo1 | XUSB, PCIE | 25000 | 800000 | 1050000 | 1050000 | 1.05V (pcv)
|
||||||
* ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 |
|
* ldo2 | SDMMC1 | 50000 | 800000 | 1800000 | 3300000 |
|
||||||
* ldo3 | | 50000 | 800000 | 3100000 | 3100000 |
|
* ldo3 | | 50000 | 800000 | 3100000 | 3100000 |
|
||||||
* ldo4 | RTC | 12500 | 800000 | 850000 | 850000 |
|
* ldo4 | RTC | 12500 | 800000 | 850000 | 850000 |
|
||||||
|
|
43
ipl/mc.c
43
ipl/mc.c
|
@ -20,7 +20,7 @@ void mc_config_carveout()
|
||||||
MC(MC_VIDEO_PROTECT_SIZE_MB) = 0;
|
MC(MC_VIDEO_PROTECT_SIZE_MB) = 0;
|
||||||
MC(MC_VIDEO_PROTECT_REG_CTRL) = 1;
|
MC(MC_VIDEO_PROTECT_REG_CTRL) = 1;
|
||||||
|
|
||||||
//Configure TSEC carveout @ 0x90000000, 1MB.
|
// Configure TSEC carveout @ 0x90000000, 1MB.
|
||||||
//mc_config_tsec_carveout(0x90000000, 1, 0);
|
//mc_config_tsec_carveout(0x90000000, 1, 0);
|
||||||
mc_config_tsec_carveout(0, 0, 1);
|
mc_config_tsec_carveout(0, 0, 1);
|
||||||
|
|
||||||
|
@ -42,20 +42,7 @@ void mc_config_carveout()
|
||||||
MC(MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS3) = 0;
|
MC(MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS3) = 0;
|
||||||
MC(MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS4) = 0;
|
MC(MC_SECURITY_CARVEOUT1_CLIENT_FORCE_INTERNAL_ACCESS4) = 0;
|
||||||
MC(MC_SECURITY_CARVEOUT1_CFG0) = 0x4000006;
|
MC(MC_SECURITY_CARVEOUT1_CFG0) = 0x4000006;
|
||||||
MC(MC_SECURITY_CARVEOUT2_BOM) = 0x80020000;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_BOM_HI) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_SIZE_128KB) = 2;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS0) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS1) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS2) = 0x3000000;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS3) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS4) = 0x300;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS0) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS1) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS2) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS3) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS4) = 0;
|
|
||||||
MC(MC_SECURITY_CARVEOUT2_CFG0) = 0x440167E;
|
|
||||||
MC(MC_SECURITY_CARVEOUT3_BOM) = 0;
|
MC(MC_SECURITY_CARVEOUT3_BOM) = 0;
|
||||||
MC(MC_SECURITY_CARVEOUT3_BOM_HI) = 0;
|
MC(MC_SECURITY_CARVEOUT3_BOM_HI) = 0;
|
||||||
MC(MC_SECURITY_CARVEOUT3_SIZE_128KB) = 0;
|
MC(MC_SECURITY_CARVEOUT3_SIZE_128KB) = 0;
|
||||||
|
@ -100,6 +87,24 @@ void mc_config_carveout()
|
||||||
MC(MC_SECURITY_CARVEOUT5_CFG0) = 0x8F;
|
MC(MC_SECURITY_CARVEOUT5_CFG0) = 0x8F;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mc_config_carveout_finalize()
|
||||||
|
{
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_BOM) = 0x80020000;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_BOM_HI) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_SIZE_128KB) = 2;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS0) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS1) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS2) = 0x3000000;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS3) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_ACCESS4) = 0x300;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS0) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS1) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS2) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS3) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CLIENT_FORCE_INTERNAL_ACCESS4) = 0;
|
||||||
|
MC(MC_SECURITY_CARVEOUT2_CFG0) = 0x440167E;
|
||||||
|
}
|
||||||
|
|
||||||
void mc_enable_ahb_redirect()
|
void mc_enable_ahb_redirect()
|
||||||
{
|
{
|
||||||
CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) = (CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) & 0xFFF7FFFF) | 0x80000;
|
CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) = (CLOCK(CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD) & 0xFFF7FFFF) | 0x80000;
|
||||||
|
@ -112,7 +117,7 @@ void mc_disable_ahb_redirect()
|
||||||
{
|
{
|
||||||
MC(MC_IRAM_BOM) = 0xFFFFF000;
|
MC(MC_IRAM_BOM) = 0xFFFFF000;
|
||||||
MC(MC_IRAM_TOM) = 0;
|
MC(MC_IRAM_TOM) = 0;
|
||||||
//Disable IRAM_CFG_WRITE_ACCESS (sticky).
|
// Disable IRAM_CFG_WRITE_ACCESS (sticky).
|
||||||
//MC(MC_IRAM_REG_CTRL) = MC(MC_IRAM_REG_CTRL) & 0xFFFFFFFE | 1;
|
//MC(MC_IRAM_REG_CTRL) = MC(MC_IRAM_REG_CTRL) & 0xFFFFFFFE | 1;
|
||||||
CLOCK(0x3A4) &= 0xFFF7FFFF;
|
CLOCK(0x3A4) &= 0xFFF7FFFF;
|
||||||
}
|
}
|
||||||
|
@ -120,11 +125,11 @@ void mc_disable_ahb_redirect()
|
||||||
void mc_enable()
|
void mc_enable()
|
||||||
{
|
{
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) & 0x1FFFFFFF) | 0x40000000;
|
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) & 0x1FFFFFFF) | 0x40000000;
|
||||||
//Enable MIPI CAL clock.
|
// Enable MIPI CAL clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) & 0xFDFFFFFF) | 0x2000000;
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) & 0xFDFFFFFF) | 0x2000000;
|
||||||
//Enable MC clock.
|
// Enable MC clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) & 0xFFFFFFFE) | 1;
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) & 0xFFFFFFFE) | 1;
|
||||||
//Enable EMC DLL clock.
|
// Enable EMC DLL clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) = (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) & 0xFFFFBFFF) | 0x4000;
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) = (CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) & 0xFFFFBFFF) | 0x4000;
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_SET) = 0x2000001; //Clear EMC and MC reset.
|
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_SET) = 0x2000001; //Clear EMC and MC reset.
|
||||||
usleep(5);
|
usleep(5);
|
||||||
|
|
1
ipl/mc.h
1
ipl/mc.h
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
void mc_config_tsec_carveout(u32 bom, u32 size1mb, int lock);
|
void mc_config_tsec_carveout(u32 bom, u32 size1mb, int lock);
|
||||||
void mc_config_carveout();
|
void mc_config_carveout();
|
||||||
|
void mc_config_carveout_finalize();
|
||||||
void mc_enable_ahb_redirect();
|
void mc_enable_ahb_redirect();
|
||||||
void mc_disable_ahb_redirect();
|
void mc_disable_ahb_redirect();
|
||||||
void mc_enable();
|
void mc_enable();
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, NVIDIA Corporation. All rights reserved.
|
* Copyright (c) 2014, NVIDIA Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This software is licensed under the terms of the GNU General Public
|
* This software is licensed under the terms of the GNU General Public
|
||||||
* License version 2, as published by the Free Software Foundation, and
|
* License version 2, as published by the Free Software Foundation, and
|
||||||
* may be copied, distributed, and modified under those terms.
|
* may be copied, distributed, and modified under those terms.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _MC_T210_H_
|
#ifndef _MC_T210_H_
|
||||||
#define _MC_T210_H_
|
#define _MC_T210_H_
|
||||||
|
|
42
ipl/mmc.h
42
ipl/mmc.h
|
@ -1,25 +1,25 @@
|
||||||
/*
|
/*
|
||||||
* Header for MultiMediaCard (MMC)
|
* Header for MultiMediaCard (MMC)
|
||||||
*
|
*
|
||||||
* Copyright 2002 Hewlett-Packard Company
|
* Copyright 2002 Hewlett-Packard Company
|
||||||
*
|
*
|
||||||
* Use consistent with the GNU GPL is permitted,
|
* Use consistent with the GNU GPL is permitted,
|
||||||
* provided that this copyright notice is
|
* provided that this copyright notice is
|
||||||
* preserved in its entirety in all copies and derived works.
|
* preserved in its entirety in all copies and derived works.
|
||||||
*
|
*
|
||||||
* HEWLETT-PACKARD COMPANY MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
|
* HEWLETT-PACKARD COMPANY MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
|
||||||
* AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
|
* AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
|
||||||
* FITNESS FOR ANY PARTICULAR PURPOSE.
|
* FITNESS FOR ANY PARTICULAR PURPOSE.
|
||||||
*
|
*
|
||||||
* Many thanks to Alessandro Rubini and Jonathan Corbet!
|
* Many thanks to Alessandro Rubini and Jonathan Corbet!
|
||||||
*
|
*
|
||||||
* Based strongly on code by:
|
* Based strongly on code by:
|
||||||
*
|
*
|
||||||
* Author: Yong-iL Joh <tolkien@mizi.com>
|
* Author: Yong-iL Joh <tolkien@mizi.com>
|
||||||
*
|
*
|
||||||
* Author: Andrew Christian
|
* Author: Andrew Christian
|
||||||
* 15 May 2002
|
* 15 May 2002
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef LINUX_MMC_MMC_H
|
#ifndef LINUX_MMC_MMC_H
|
||||||
#define LINUX_MMC_MMC_H
|
#define LINUX_MMC_MMC_H
|
||||||
|
|
|
@ -1,20 +1,21 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "nx_emmc.h"
|
#include "nx_emmc.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
@ -61,7 +62,7 @@ emmc_part_t *nx_emmc_part_find(link_t *gpt, const char *name)
|
||||||
|
|
||||||
int nx_emmc_part_read(sdmmc_storage_t *storage, emmc_part_t *part, u32 sector_off, u32 num_sectors, void *buf)
|
int nx_emmc_part_read(sdmmc_storage_t *storage, emmc_part_t *part, u32 sector_off, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
//The last LBA is inclusive.
|
// The last LBA is inclusive.
|
||||||
if (part->lba_start + sector_off > part->lba_end)
|
if (part->lba_start + sector_off > part->lba_end)
|
||||||
return 0;
|
return 0;
|
||||||
return sdmmc_storage_read(storage, part->lba_start + sector_off, num_sectors, buf);
|
return sdmmc_storage_read(storage, part->lba_start + sector_off, num_sectors, buf);
|
||||||
|
@ -69,7 +70,7 @@ int nx_emmc_part_read(sdmmc_storage_t *storage, emmc_part_t *part, u32 sector_of
|
||||||
|
|
||||||
int nx_emmc_part_write(sdmmc_storage_t *storage, emmc_part_t *part, u32 sector_off, u32 num_sectors, void *buf)
|
int nx_emmc_part_write(sdmmc_storage_t *storage, emmc_part_t *part, u32 sector_off, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
//The last LBA is inclusive.
|
// The last LBA is inclusive.
|
||||||
if (part->lba_start + sector_off > part->lba_end)
|
if (part->lba_start + sector_off > part->lba_end)
|
||||||
return 0;
|
return 0;
|
||||||
return sdmmc_storage_write(storage, part->lba_start + sector_off, num_sectors, buf);
|
return sdmmc_storage_write(storage, part->lba_start + sector_off, num_sectors, buf);
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _NX_EMMC_H_
|
#ifndef _NX_EMMC_H_
|
||||||
#define _NX_EMMC_H_
|
#define _NX_EMMC_H_
|
||||||
|
|
28
ipl/pinmux.c
28
ipl/pinmux.c
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pinmux.h"
|
#include "pinmux.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
|
|
30
ipl/pinmux.h
30
ipl/pinmux.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PINMUX_H_
|
#ifndef _PINMUX_H_
|
||||||
#define _PINMUX_H_
|
#define _PINMUX_H_
|
||||||
|
@ -41,6 +41,8 @@
|
||||||
#define PINMUX_AUX_DMIC3_CLK 0xB4
|
#define PINMUX_AUX_DMIC3_CLK 0xB4
|
||||||
#define PINMUX_AUX_UART2_TX 0xF4
|
#define PINMUX_AUX_UART2_TX 0xF4
|
||||||
#define PINMUX_AUX_UART3_TX 0x104
|
#define PINMUX_AUX_UART3_TX 0x104
|
||||||
|
#define PINMUX_AUX_WIFI_EN 0x1B4
|
||||||
|
#define PINMUX_AUX_WIFI_RST 0x1B8
|
||||||
#define PINMUX_AUX_NFC_EN 0x1D0
|
#define PINMUX_AUX_NFC_EN 0x1D0
|
||||||
#define PINMUX_AUX_NFC_INT 0x1D4
|
#define PINMUX_AUX_NFC_INT 0x1D4
|
||||||
#define PINMUX_AUX_LCD_BL_PWM 0x1FC
|
#define PINMUX_AUX_LCD_BL_PWM 0x1FC
|
||||||
|
|
63
ipl/pkg1.c
63
ipl/pkg1.c
|
@ -1,29 +1,30 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 st4rk
|
* Copyright (c) 2018 st4rk
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "pkg1.h"
|
#include "pkg1.h"
|
||||||
#include "arm64.h"
|
#include "arm64.h"
|
||||||
#include "se.h"
|
#include "se.h"
|
||||||
|
|
||||||
#define SM_100_ADR 0x4002B020
|
#define SM_100_ADR 0x4002B020
|
||||||
PATCHSET_DEF(_secmon_1_patchset,
|
PATCHSET_DEF(_secmon_1_patchset,
|
||||||
//Patch the relocator to be able to run from SM_100_ADR.
|
// Patch the relocator to be able to run from SM_100_ADR.
|
||||||
{ 0x1E0, _ADRP(0, 0x7C013000 - _PAGEOFF(SM_100_ADR)) },
|
{ 0x1E0, _ADRP(0, 0x7C013000 - _PAGEOFF(SM_100_ADR)) },
|
||||||
//Patch package2 decryption and signature/hash checks.
|
//Patch package2 decryption and signature/hash checks.
|
||||||
{ 0x9F0 + 0xADC, _NOP() }, //Header signature.
|
{ 0x9F0 + 0xADC, _NOP() }, //Header signature.
|
||||||
|
@ -32,14 +33,14 @@ PATCHSET_DEF(_secmon_1_patchset,
|
||||||
);
|
);
|
||||||
|
|
||||||
PATCHSET_DEF(_secmon_2_patchset,
|
PATCHSET_DEF(_secmon_2_patchset,
|
||||||
//Patch package2 decryption and signature/hash checks.
|
// Patch package2 decryption and signature/hash checks.
|
||||||
{ 0xAC8 + 0xAAC, _NOP() }, //Header signature.
|
{ 0xAC8 + 0xAAC, _NOP() }, //Header signature.
|
||||||
{ 0xAC8 + 0xB3C, _NOP() }, //Version.
|
{ 0xAC8 + 0xB3C, _NOP() }, //Version.
|
||||||
{ 0xAC8 + 0xB58, _NOP() } //Sections SHA2.
|
{ 0xAC8 + 0xB58, _NOP() } //Sections SHA2.
|
||||||
);
|
);
|
||||||
|
|
||||||
PATCHSET_DEF(_secmon_3_patchset,
|
PATCHSET_DEF(_secmon_3_patchset,
|
||||||
//Patch package2 decryption and signature/hash checks.
|
// Patch package2 decryption and signature/hash checks.
|
||||||
{ 0xAC8 + 0xA30, _NOP() }, //Header signature.
|
{ 0xAC8 + 0xA30, _NOP() }, //Header signature.
|
||||||
{ 0xAC8 + 0xAB4, _NOP() }, //package2 structure.
|
{ 0xAC8 + 0xAB4, _NOP() }, //package2 structure.
|
||||||
{ 0xAC8 + 0xAC0, _NOP() }, //Version.
|
{ 0xAC8 + 0xAC0, _NOP() }, //Version.
|
||||||
|
@ -47,7 +48,7 @@ PATCHSET_DEF(_secmon_3_patchset,
|
||||||
);
|
);
|
||||||
|
|
||||||
PATCHSET_DEF(_secmon_4_patchset,
|
PATCHSET_DEF(_secmon_4_patchset,
|
||||||
//Patch package2 decryption and signature/hash checks.
|
// Patch package2 decryption and signature/hash checks.
|
||||||
{ 0x2300 + 0x5D80, _NOP() }, //package2 structure.
|
{ 0x2300 + 0x5D80, _NOP() }, //package2 structure.
|
||||||
{ 0x2300 + 0x5D8C, _NOP() }, //Version.
|
{ 0x2300 + 0x5D8C, _NOP() }, //Version.
|
||||||
{ 0x2300 + 0x5EFC, _NOP() }, //Header signature.
|
{ 0x2300 + 0x5EFC, _NOP() }, //Header signature.
|
||||||
|
@ -55,7 +56,7 @@ PATCHSET_DEF(_secmon_4_patchset,
|
||||||
);
|
);
|
||||||
|
|
||||||
PATCHSET_DEF(_secmon_5_patchset,
|
PATCHSET_DEF(_secmon_5_patchset,
|
||||||
//Patch package2 decryption and signature/hash checks.
|
// Patch package2 decryption and signature/hash checks.
|
||||||
{ 0xDA8 + 0x9D8 , _NOP() }, //package2 structure.
|
{ 0xDA8 + 0x9D8 , _NOP() }, //package2 structure.
|
||||||
{ 0xDA8 + 0x9E4 , _NOP() }, //Version.
|
{ 0xDA8 + 0x9E4 , _NOP() }, //Version.
|
||||||
{ 0xDA8 + 0xC9C , _NOP() }, //Header signature.
|
{ 0xDA8 + 0xC9C , _NOP() }, //Header signature.
|
||||||
|
@ -63,15 +64,15 @@ PATCHSET_DEF(_secmon_5_patchset,
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* package1.1 header: <wb, ldr, sm>
|
* package1.1 header: <wb, ldr, sm>
|
||||||
* package1.1 layout:
|
* package1.1 layout:
|
||||||
* 1.0: {sm, ldr, wb} { 2, 1, 0 }
|
* 1.0: {sm, ldr, wb} { 2, 1, 0 }
|
||||||
* 2.0: {wb, ldr, sm} { 0, 1, 2 }
|
* 2.0: {wb, ldr, sm} { 0, 1, 2 }
|
||||||
* 3.0: {wb, ldr, sm} { 0, 1, 2 }
|
* 3.0: {wb, ldr, sm} { 0, 1, 2 }
|
||||||
* 3.1: {wb, ldr, sm} { 0, 1, 2 }
|
* 3.1: {wb, ldr, sm} { 0, 1, 2 }
|
||||||
* 4.0: {ldr, sm, wb} { 1, 2, 0 }
|
* 4.0: {ldr, sm, wb} { 1, 2, 0 }
|
||||||
* 5.0: {ldr, sm, wb} { 1, 2, 0 }
|
* 5.0: {ldr, sm, wb} { 1, 2, 0 }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const pkg1_id_t _pkg1_ids[] = {
|
static const pkg1_id_t _pkg1_ids[] = {
|
||||||
{ "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, SM_100_ADR, 0x8000D000, 1, _secmon_1_patchset }, //1.0.0 (Patched relocator)
|
{ "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, SM_100_ADR, 0x8000D000, 1, _secmon_1_patchset }, //1.0.0 (Patched relocator)
|
||||||
|
@ -94,7 +95,7 @@ const pkg1_id_t *pkg1_identify(u8 *pkg1)
|
||||||
|
|
||||||
void pkg1_decrypt(const pkg1_id_t *id, u8 *pkg1)
|
void pkg1_decrypt(const pkg1_id_t *id, u8 *pkg1)
|
||||||
{
|
{
|
||||||
//Decrypt package1.
|
// Decrypt package1.
|
||||||
u8 *pkg11 = pkg1 + id->pkg11_off;
|
u8 *pkg11 = pkg1 + id->pkg11_off;
|
||||||
u32 pkg11_size = *(u32 *)pkg11;
|
u32 pkg11_size = *(u32 *)pkg11;
|
||||||
se_aes_crypt_ctr(11, pkg11 + 0x20, pkg11_size, pkg11 + 0x20, pkg11_size, pkg11 + 0x10);
|
se_aes_crypt_ctr(11, pkg11 + 0x20, pkg11_size, pkg11 + 0x20, pkg11_size, pkg11 + 0x10);
|
||||||
|
|
28
ipl/pkg1.h
28
ipl/pkg1.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PKG1_H_
|
#ifndef _PKG1_H_
|
||||||
#define _PKG1_H_
|
#define _PKG1_H_
|
||||||
|
|
61
ipl/pkg2.c
61
ipl/pkg2.c
|
@ -1,22 +1,23 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
* Copyright (c) 2018 Atmosphère-NX
|
* Copyright (c) 2018 Atmosphère-NX
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "pkg2.h"
|
#include "pkg2.h"
|
||||||
#include "arm64.h"
|
#include "arm64.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
|
@ -486,7 +487,7 @@ int pkg2_decompress_kip(pkg2_kip1_info_t* ki, u32 sectsToDecomp)
|
||||||
{
|
{
|
||||||
u32 compClearMask = ~sectsToDecomp;
|
u32 compClearMask = ~sectsToDecomp;
|
||||||
if ((ki->kip1->flags & compClearMask) == ki->kip1->flags)
|
if ((ki->kip1->flags & compClearMask) == ki->kip1->flags)
|
||||||
return 0; //already decompressed, nothing to do
|
return 0; // Already decompressed, nothing to do.
|
||||||
|
|
||||||
pkg2_kip1_t hdr;
|
pkg2_kip1_t hdr;
|
||||||
memcpy(&hdr, ki->kip1, sizeof(hdr));
|
memcpy(&hdr, ki->kip1, sizeof(hdr));
|
||||||
|
@ -495,7 +496,7 @@ int pkg2_decompress_kip(pkg2_kip1_info_t* ki, u32 sectsToDecomp)
|
||||||
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
|
||||||
|
@ -508,7 +509,7 @@ int pkg2_decompress_kip(pkg2_kip1_info_t* ki, u32 sectsToDecomp)
|
||||||
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;
|
||||||
//easy copy path for uncompressed or ones we dont want to uncompress
|
// Easy copy path for uncompressed or ones we dont want to uncompress.
|
||||||
if (sectIdx >= 3 || !(sectsToDecomp & sectCompBit) || !(hdr.flags & sectCompBit))
|
if (sectIdx >= 3 || !(sectsToDecomp & sectCompBit) || !(hdr.flags & sectCompBit))
|
||||||
{
|
{
|
||||||
unsigned int dataSize = hdr.sections[sectIdx].size_comp;
|
unsigned int dataSize = hdr.sections[sectIdx].size_comp;
|
||||||
|
@ -528,6 +529,7 @@ int pkg2_decompress_kip(pkg2_kip1_info_t* ki, u32 sectsToDecomp)
|
||||||
{
|
{
|
||||||
gfx_printf(&gfx_con, "%kERROR decomping sect %d of %s KIP!%k\n", 0xFFFF0000, sectIdx, (char*)hdr.name, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "%kERROR decomping sect %d of %s KIP!%k\n", 0xFFFF0000, sectIdx, (char*)hdr.name, 0xFFCCCCCC);
|
||||||
free(newKip);
|
free(newKip);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -546,6 +548,7 @@ int pkg2_decompress_kip(pkg2_kip1_info_t* ki, u32 sectsToDecomp)
|
||||||
free(ki->kip1);
|
free(ki->kip1);
|
||||||
ki->kip1 = newKip;
|
ki->kip1 = newKip;
|
||||||
ki->size = newKipSize;
|
ki->size = newKipSize;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,10 +577,10 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 patchesApplied = 0; //bitset over patches
|
u32 patchesApplied = 0; // Bitset over patches.
|
||||||
for (u32 i=0; i<numPatches; i++)
|
for (u32 i=0; i<numPatches; i++)
|
||||||
{
|
{
|
||||||
//eliminate leading spaces
|
// Eliminate leading spaces.
|
||||||
for (const char* p=patches[i]; *p!=0; p++)
|
for (const char* p=patches[i]; *p!=0; p++)
|
||||||
{
|
{
|
||||||
if (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
|
if (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
|
||||||
|
@ -589,7 +592,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
if (valueLen == 0)
|
if (valueLen == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//eliminate trailing spaces
|
// Eliminate trailing spaces.
|
||||||
for (int chIdx=valueLen-1; chIdx>=0; chIdx--)
|
for (int chIdx=valueLen-1; chIdx>=0; chIdx--)
|
||||||
{
|
{
|
||||||
const char* p = patches[i] + chIdx;
|
const char* p = patches[i] + chIdx;
|
||||||
|
@ -606,7 +609,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
u32 shaBuf[32/sizeof(u32)];
|
u32 shaBuf[32/sizeof(u32)];
|
||||||
LIST_FOREACH_ENTRY(pkg2_kip1_info_t, ki, info, link)
|
LIST_FOREACH_ENTRY(pkg2_kip1_info_t, ki, info, link)
|
||||||
{
|
{
|
||||||
shaBuf[0] = 0; //sha256 for this kip not yet calculated
|
shaBuf[0] = 0; // sha256 for this kip not yet calculated.
|
||||||
for (u32 currKipIdx=0; currKipIdx<(sizeof(_kip_ids)/sizeof(_kip_ids[0])); currKipIdx++)
|
for (u32 currKipIdx=0; currKipIdx<(sizeof(_kip_ids)/sizeof(_kip_ids[0])); currKipIdx++)
|
||||||
{
|
{
|
||||||
if (strncmp((const char*)ki->kip1->name, _kip_ids[currKipIdx].name, sizeof(ki->kip1->name)) != 0)
|
if (strncmp((const char*)ki->kip1->name, _kip_ids[currKipIdx].name, sizeof(ki->kip1->name)) != 0)
|
||||||
|
@ -620,14 +623,14 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
{
|
{
|
||||||
if (strcmp(currPatchset->name, patches[i]) != 0)
|
if (strcmp(currPatchset->name, patches[i]) != 0)
|
||||||
{
|
{
|
||||||
bitsAffected = i+1;
|
bitsAffected = i + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
currPatchset++;
|
currPatchset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// dont bother even hashing this KIP if we dont have any patches enabled for it
|
// Dont bother even hashing this KIP if we dont have any patches enabled for it.
|
||||||
if (bitsAffected == 0)
|
if (bitsAffected == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -640,7 +643,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
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;
|
||||||
|
|
||||||
//find out which sections are affected by the enabled patches, to know which to decompress
|
// Find out which sections are affected by the enabled patches, to know which to decompress.
|
||||||
bitsAffected = 0;
|
bitsAffected = 0;
|
||||||
currPatchset = _kip_ids[currKipIdx].patchset;
|
currPatchset = _kip_ids[currKipIdx].patchset;
|
||||||
while (currPatchset != NULL && currPatchset->name != NULL)
|
while (currPatchset != NULL && currPatchset->name != NULL)
|
||||||
|
@ -659,12 +662,12 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
currPatchset++;
|
currPatchset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// got patches to apply to this kip, have to decompress it
|
// Got patches to apply to this kip, have to decompress it.
|
||||||
#ifdef DEBUG_PRINTING
|
#ifdef DEBUG_PRINTING
|
||||||
u32 preDecompTime = get_tmr_us();
|
u32 preDecompTime = get_tmr_us();
|
||||||
#endif
|
#endif
|
||||||
if (pkg2_decompress_kip(ki, bitsAffected))
|
if (pkg2_decompress_kip(ki, bitsAffected))
|
||||||
return (const char*)ki->kip1->name; //failed to decompress
|
return (const char*)ki->kip1->name; // Failed to decompress.
|
||||||
|
|
||||||
#ifdef DEBUG_PRINTING
|
#ifdef DEBUG_PRINTING
|
||||||
u32 postDecompTime = get_tmr_us();
|
u32 postDecompTime = get_tmr_us();
|
||||||
|
@ -705,7 +708,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames)
|
||||||
if (memcmp(&kipSectData[currOffset], currPatch->srcData, currPatch->length) != 0)
|
if (memcmp(&kipSectData[currOffset], currPatch->srcData, currPatch->length) != 0)
|
||||||
{
|
{
|
||||||
gfx_printf(&gfx_con, "%kDATA MISMATCH FOR PATCH AT OFFSET 0x%x!!!%k\n", 0xFFFF0000, currOffset, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "%kDATA MISMATCH FOR PATCH AT OFFSET 0x%x!!!%k\n", 0xFFFF0000, currOffset, 0xFFCCCCCC);
|
||||||
return currPatchset->name; //MUST stop here as kip is likely corrupt
|
return currPatchset->name; // MUST stop here as kip is likely corrupt.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
30
ipl/pkg2.h
30
ipl/pkg2.h
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PKG2_H_
|
#ifndef _PKG2_H_
|
||||||
#define _PKG2_H_
|
#define _PKG2_H_
|
||||||
|
|
32
ipl/pmc.h
32
ipl/pmc.h
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 st4rk
|
* Copyright (c) 2018 st4rk
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _PMC_H_
|
#ifndef _PMC_H_
|
||||||
#define _PMC_H_
|
#define _PMC_H_
|
||||||
|
@ -42,6 +42,8 @@
|
||||||
#define APBDEV_PMC_SECURE_SCRATCH49 0x3A4
|
#define APBDEV_PMC_SECURE_SCRATCH49 0x3A4
|
||||||
#define APBDEV_PMC_CNTRL2 0x440
|
#define APBDEV_PMC_CNTRL2 0x440
|
||||||
#define APBDEV_PMC_IO_DPD4_REQ 0x464
|
#define APBDEV_PMC_IO_DPD4_REQ 0x464
|
||||||
|
#define APBDEV_PMC_UTMIP_PAD_CFG1 0x4C4
|
||||||
|
#define APBDEV_PMC_UTMIP_PAD_CFG3 0x4CC
|
||||||
#define APBDEV_PMC_DDR_CNTRL 0x4E4
|
#define APBDEV_PMC_DDR_CNTRL 0x4E4
|
||||||
#define APBDEV_PMC_SCRATCH188 0x810
|
#define APBDEV_PMC_SCRATCH188 0x810
|
||||||
#define APBDEV_PMC_SCRATCH190 0x818
|
#define APBDEV_PMC_SCRATCH190 0x818
|
||||||
|
|
38
ipl/reloc.S
38
ipl/reloc.S
|
@ -1,25 +1,25 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: the placement of the relocator is a bit fragile atm, maybe we
|
* TODO: the placement of the relocator is a bit fragile atm, maybe we
|
||||||
* should include it in start.S and copy it to some known good
|
* should include it in start.S and copy it to some known good
|
||||||
* place in IRAM instead. Basically we want it as far back atm
|
* place in IRAM instead. Basically we want it as far back atm
|
||||||
* as it might be overwritten during relocation.
|
* as it might be overwritten during relocation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.section .text.reloc
|
.section .text.reloc
|
||||||
.arm
|
.arm
|
||||||
|
|
20
ipl/sd.h
20
ipl/sd.h
|
@ -1,14 +1,14 @@
|
||||||
/*
|
/*
|
||||||
* 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
|
||||||
* the Free Software Foundation; either version 2 of the License, or (at
|
* the Free Software Foundation; either version 2 of the License, or (at
|
||||||
* your option) any later version.
|
* your option) any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef LINUX_MMC_SD_H
|
#ifndef LINUX_MMC_SD_H
|
||||||
#define LINUX_MMC_SD_H
|
#define LINUX_MMC_SD_H
|
||||||
|
|
35
ipl/sdmmc.c
35
ipl/sdmmc.c
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "sdmmc.h"
|
#include "sdmmc.h"
|
||||||
|
@ -945,7 +945,8 @@ static int _sd_storage_get_ssr(sdmmc_storage_t *storage, u8 *buf)
|
||||||
reqbuf.is_multi_block = 0;
|
reqbuf.is_multi_block = 0;
|
||||||
reqbuf.is_auto_cmd12 = 0;
|
reqbuf.is_auto_cmd12 = 0;
|
||||||
|
|
||||||
if (!(storage->csd.cmdclass & CCC_APP_SPEC)) {
|
if (!(storage->csd.cmdclass & CCC_APP_SPEC))
|
||||||
|
{
|
||||||
DPRINTF("[SD] ssr: Card lacks mandatory SD Status function\n");
|
DPRINTF("[SD] ssr: Card lacks mandatory SD Status function\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1124,7 +1125,7 @@ int sdmmc_storage_init_sd(sdmmc_storage_t *storage, sdmmc_t *sdmmc, u32 id, u32
|
||||||
|
|
||||||
sdmmc_sd_clock_ctrl(sdmmc, 1);
|
sdmmc_sd_clock_ctrl(sdmmc, 1);
|
||||||
|
|
||||||
// Parse additional card info from sd status
|
// Parse additional card info from sd status.
|
||||||
if (_sd_storage_get_ssr(storage, buf))
|
if (_sd_storage_get_ssr(storage, buf))
|
||||||
DPRINTF("[SD] got sd status\n");
|
DPRINTF("[SD] got sd status\n");
|
||||||
|
|
||||||
|
|
33
ipl/sdmmc.h
33
ipl/sdmmc.h
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SDMMC_H_
|
#ifndef _SDMMC_H_
|
||||||
#define _SDMMC_H_
|
#define _SDMMC_H_
|
||||||
|
@ -73,7 +73,8 @@ typedef struct _sd_scr
|
||||||
u8 cmds;
|
u8 cmds;
|
||||||
} sd_scr_t;
|
} sd_scr_t;
|
||||||
|
|
||||||
typedef struct _sd_ssr {
|
typedef struct _sd_ssr
|
||||||
|
{
|
||||||
u8 bus_width;
|
u8 bus_width;
|
||||||
u8 speed_class;
|
u8 speed_class;
|
||||||
u8 uhs_grade;
|
u8 uhs_grade;
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SDMMC_DRIVER_H_
|
#ifndef _SDMMC_DRIVER_H_
|
||||||
#define _SDMMC_DRIVER_H_
|
#define _SDMMC_DRIVER_H_
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SDMMC_T210_H_
|
#ifndef _SDMMC_T210_H_
|
||||||
#define _SDMMC_T210_H_
|
#define _SDMMC_T210_H_
|
||||||
|
|
28
ipl/sdram.c
28
ipl/sdram.c
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
|
|
28
ipl/sdram.h
28
ipl/sdram.h
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SDRAM_H_
|
#ifndef _SDRAM_H_
|
||||||
#define _SDRAM_H_
|
#define _SDRAM_H_
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const u8 _dram_cfg_0[1896] = {
|
static const u8 _dram_cfg_0[1896] = {
|
||||||
0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
|
0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
|
||||||
|
|
|
@ -47,7 +47,7 @@ void sdram_lp0_save_params(const void *params)
|
||||||
#define c32(value, pmcreg) pmc->pmcreg = value
|
#define c32(value, pmcreg) pmc->pmcreg = value
|
||||||
|
|
||||||
//TODO: pkg1.1 (1.X - 3.X) reads them from MC.
|
//TODO: pkg1.1 (1.X - 3.X) reads them from MC.
|
||||||
//Patch carveout parameters.
|
// Patch carveout parameters.
|
||||||
/*sdram->McGeneralizedCarveout1Bom = 0;
|
/*sdram->McGeneralizedCarveout1Bom = 0;
|
||||||
sdram->McGeneralizedCarveout1BomHi = 0;
|
sdram->McGeneralizedCarveout1BomHi = 0;
|
||||||
sdram->McGeneralizedCarveout1Size128kb = 0;
|
sdram->McGeneralizedCarveout1Size128kb = 0;
|
||||||
|
@ -120,14 +120,14 @@ void sdram_lp0_save_params(const void *params)
|
||||||
sdram->McGeneralizedCarveout5Cfg0 = 0x8F;*/
|
sdram->McGeneralizedCarveout5Cfg0 = 0x8F;*/
|
||||||
|
|
||||||
//TODO: this is 4.X+ behaviour which seems to work fine for < 4.X.
|
//TODO: this is 4.X+ behaviour which seems to work fine for < 4.X.
|
||||||
//Patch carveout parameters.
|
// Patch carveout parameters.
|
||||||
sdram->McGeneralizedCarveout1Cfg0 = 0;
|
sdram->McGeneralizedCarveout1Cfg0 = 0;
|
||||||
sdram->McGeneralizedCarveout2Cfg0 = 0;
|
sdram->McGeneralizedCarveout2Cfg0 = 0;
|
||||||
sdram->McGeneralizedCarveout3Cfg0 = 0;
|
sdram->McGeneralizedCarveout3Cfg0 = 0;
|
||||||
sdram->McGeneralizedCarveout4Cfg0 = 0;
|
sdram->McGeneralizedCarveout4Cfg0 = 0;
|
||||||
sdram->McGeneralizedCarveout5Cfg0 = 0;
|
sdram->McGeneralizedCarveout5Cfg0 = 0;
|
||||||
|
|
||||||
//Patch SDRAM parameters.
|
// Patch SDRAM parameters.
|
||||||
u32 t0 = sdram->EmcSwizzleRank0Byte0 << 5 >> 29 > sdram->EmcSwizzleRank0Byte0 << 1 >> 29;
|
u32 t0 = sdram->EmcSwizzleRank0Byte0 << 5 >> 29 > sdram->EmcSwizzleRank0Byte0 << 1 >> 29;
|
||||||
u32 t1 = (t0 & 0xFFFFFFEF) | ((sdram->EmcSwizzleRank1Byte0 << 5 >> 29 > sdram->EmcSwizzleRank1Byte0 << 1 >> 29) << 4);
|
u32 t1 = (t0 & 0xFFFFFFEF) | ((sdram->EmcSwizzleRank1Byte0 << 5 >> 29 > sdram->EmcSwizzleRank1Byte0 << 1 >> 29) << 4);
|
||||||
u32 t2 = (t1 & 0xFFFFFFFD) | ((sdram->EmcSwizzleRank0Byte1 << 5 >> 29 > sdram->EmcSwizzleRank0Byte1 << 1 >> 29) << 1);
|
u32 t2 = (t1 & 0xFFFFFFFD) | ((sdram->EmcSwizzleRank0Byte1 << 5 >> 29 > sdram->EmcSwizzleRank0Byte1 << 1 >> 29) << 1);
|
||||||
|
@ -837,7 +837,8 @@ void sdram_lp0_save_params(const void *params)
|
||||||
s(EmcAutoCalWait, 9:0, scratch101, 31:22);
|
s(EmcAutoCalWait, 9:0, scratch101, 31:22);
|
||||||
s(SwizzleRankByteEncode, 15:0, scratch190, 15:0);
|
s(SwizzleRankByteEncode, 15:0, scratch190, 15:0);
|
||||||
|
|
||||||
switch (sdram->MemoryType) {
|
switch (sdram->MemoryType)
|
||||||
|
{
|
||||||
case NvBootMemoryType_LpDdr2:
|
case NvBootMemoryType_LpDdr2:
|
||||||
case NvBootMemoryType_LpDdr4:
|
case NvBootMemoryType_LpDdr4:
|
||||||
s(EmcMrwLpddr2ZcalWarmBoot, 23:16, scratch5, 7:0);
|
s(EmcMrwLpddr2ZcalWarmBoot, 23:16, scratch5, 7:0);
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const u8 _dram_cfg_lz[1262] = {
|
static const u8 _dram_cfg_lz[1262] = {
|
||||||
0x17, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00,
|
0x17, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00,
|
||||||
|
|
|
@ -37,7 +37,8 @@
|
||||||
/**
|
/**
|
||||||
* Defines the SDRAM parameter structure
|
* Defines the SDRAM parameter structure
|
||||||
*/
|
*/
|
||||||
typedef struct _sdram_params {
|
typedef struct _sdram_params
|
||||||
|
{
|
||||||
/* Specifies the type of memory device */
|
/* Specifies the type of memory device */
|
||||||
u32 memory_type;
|
u32 memory_type;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,8 @@
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
|
{
|
||||||
/* Specifies the memory type to be undefined */
|
/* Specifies the memory type to be undefined */
|
||||||
NvBootMemoryType_None = 0,
|
NvBootMemoryType_None = 0,
|
||||||
|
|
||||||
|
@ -56,7 +57,8 @@ enum {
|
||||||
/**
|
/**
|
||||||
* Defines the SDRAM parameter structure
|
* Defines the SDRAM parameter structure
|
||||||
*/
|
*/
|
||||||
struct sdram_params {
|
struct sdram_params
|
||||||
|
{
|
||||||
|
|
||||||
/* Specifies the type of memory device */
|
/* Specifies the type of memory device */
|
||||||
u32 MemoryType;
|
u32 MemoryType;
|
||||||
|
|
33
ipl/se.c
33
ipl/se.c
|
@ -1,22 +1,23 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 CTCaer
|
* Copyright (c) 2018 CTCaer
|
||||||
* Copyright (c) 2018 Atmosphère-NX
|
* Copyright (c) 2018 Atmosphère-NX
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "se.h"
|
#include "se.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
|
|
|
@ -92,6 +92,8 @@
|
||||||
|
|
||||||
/*! Misc registers. */
|
/*! Misc registers. */
|
||||||
#define APB_MISC_PP_PINMUX_GLOBAL 0x40
|
#define APB_MISC_PP_PINMUX_GLOBAL 0x40
|
||||||
|
#define APB_MISC_GP_WIFI_EN_CFGPADCTRL 0xB64
|
||||||
|
#define APB_MISC_GP_WIFI_RST_CFGPADCTRL 0xB68
|
||||||
|
|
||||||
/*! System registers. */
|
/*! System registers. */
|
||||||
#define AHB_ARBITRATION_XBAR_CTRL 0xE0
|
#define AHB_ARBITRATION_XBAR_CTRL 0xE0
|
||||||
|
|
29
ipl/tsec.c
29
ipl/tsec.c
|
@ -1,20 +1,21 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "tsec.h"
|
#include "tsec.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
#include "t210.h"
|
#include "t210.h"
|
||||||
|
|
32
ipl/tui.c
32
ipl/tui.c
|
@ -1,24 +1,24 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tui.h"
|
#include "tui.h"
|
||||||
#include "btn.h"
|
#include "btn.h"
|
||||||
#include "max17050.h"
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "max17050.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#ifdef MENU_LOGO_ENABLE
|
#ifdef MENU_LOGO_ENABLE
|
||||||
|
|
34
ipl/util.h
34
ipl/util.h
|
@ -1,27 +1,27 @@
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
* version 2, as published by the Free Software Foundation.
|
* version 2, as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
* more details.
|
* more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _UTIL_H_
|
#ifndef _UTIL_H_
|
||||||
#define _UTIL_H_
|
#define _UTIL_H_
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#define byte_swap_32(num) ((num>>24)&0xff) | ((num<<8)&0xff0000) | \
|
#define byte_swap_32(num) ((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | \
|
||||||
((num>>8)&0xff00) | ((num<<24)&0xff000000) \
|
((num >> 8 )& 0xff00) | ((num << 24) & 0xff000000)
|
||||||
|
|
||||||
typedef struct _cfg_op_t
|
typedef struct _cfg_op_t
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue