Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9be1a36e79 | ||
|
|
d4103efaa9 | ||
|
|
3a0a226c4c | ||
|
|
919bf99cb2 | ||
|
|
59d25a3be5 | ||
|
|
5796ead851 | ||
|
|
240e465d86 | ||
|
|
b74dde3b6d | ||
|
|
1521315450 | ||
|
|
236ac03331 | ||
|
|
55d920bf00 | ||
|
|
7a22dddb01 | ||
|
|
7a771f4855 | ||
|
|
746a557deb | ||
|
|
b2762d737d | ||
|
|
e268222dae | ||
|
|
81eb1d0972 | ||
|
|
997e250c43 | ||
|
|
03729bddd5 |
2
Makefile
2
Makefile
@@ -44,7 +44,7 @@ OBJS = $(addprefix $(BUILD)/, \
|
||||
OBJS += $(addprefix $(BUILD)/, diskio.o ff.o ffunicode.o)
|
||||
|
||||
ARCH := -march=armv4t -mtune=arm7tdmi -mthumb -mthumb-interwork
|
||||
CFLAGS = $(ARCH) -Os -nostdlib -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-inline -std=gnu11# -Wall
|
||||
CFLAGS = $(ARCH) -O2 -nostdlib -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-inline -std=gnu11# -Wall
|
||||
LDFLAGS = $(ARCH) -nostartfiles -lgcc -Wl,--nmagic,--gc-sections
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
46
README.md
46
README.md
@@ -4,13 +4,49 @@
|
||||
|
||||
Nintendo Switch bootloader, firmware patcher, and more.
|
||||
|
||||
|
||||
## ipl config
|
||||
|
||||
The ipl can be configured via 'hekate_ipl.ini' (if it is present on the SD card). Each ini section represents a boot entry, except for the special section 'config' that controls the global configuration.
|
||||
|
||||
Possible key/value combinations:
|
||||
### Possible key/value combinations:
|
||||
|
||||
- warmboot={SD path}
|
||||
- secmon={SD path}
|
||||
- kernel={SD path}
|
||||
- kip1={SD path}
|
||||
| Config option | Description |
|
||||
| ------------------ | ---------------------------------------------------------- |
|
||||
| warmboot={SD path} | Replaces the warmboot binary |
|
||||
| secmon={SD path} | Replaces the security monitor binary |
|
||||
| kernel={SD path} | Replaces the kernel binary |
|
||||
| kip1={SD path} | Replaces/Adds kernel initial process. Multiple can be set. |
|
||||
| fullsvcperm=1 | Disables SVC verification |
|
||||
| debugmode=1 | Enables Debug mode |
|
||||
|
||||
|
||||
|
||||
```
|
||||
hekate (C) 2018 naehrwert, st4rk.
|
||||
|
||||
Thanks to: derrek, nedwill, plutoo, shuffle2, smea, thexyz, yellows8.
|
||||
Greetings to: fincs, hexkyz, SciresM, Shiny Quagsire, WinterMute.
|
||||
|
||||
Open source and free packages used:
|
||||
- FatFs R0.13a, Copyright (C) 2017, ChaN
|
||||
- bcl-1.2.0, Copyright (C) 2003-2006, Marcus Geelnard
|
||||
|
||||
___
|
||||
.-' `'.
|
||||
/ \
|
||||
| ;
|
||||
| | ___.--,
|
||||
_.._ |0) = (0) | _.---'`__.-( (_.
|
||||
__.--'`_.. '.__.\ '--. \_.-' ,.--'` `""`
|
||||
( ,.--'` ',__ /./; ;, '.__.'` __
|
||||
_`) ) .---.__.' / | |\ \__..--"" """--.,_
|
||||
`---' .'.''-._.-'`_./ /\ '. \ _.--''````'''--._`-.__.'
|
||||
| | .' _.-' | | \ \ '. `----`
|
||||
\ \/ .' \ \ '. '-._)
|
||||
\/ / \ \ `=.__`'-.
|
||||
/ /\ `) ) / / `"".`\
|
||||
, _.-'.'\ \ / / ( ( / /
|
||||
`--'` ) ) .-'.' '.'. | (
|
||||
(/` ( (` ) ) '-; [switchbrew]
|
||||
```
|
||||
15
ipl/btn.c
15
ipl/btn.c
@@ -34,9 +34,24 @@ u32 btn_read()
|
||||
u32 btn_wait()
|
||||
{
|
||||
u32 res = 0, btn = btn_read();
|
||||
int pwr = 0;
|
||||
|
||||
// Power button down, raise a filter.
|
||||
if (btn & BTN_POWER)
|
||||
{
|
||||
pwr = 1;
|
||||
btn &= 0xFFFFFFFE;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
res = btn_read();
|
||||
// Power button up, remove filter.
|
||||
if (!(res & BTN_POWER) && pwr)
|
||||
pwr = 0;
|
||||
// Power button still down.
|
||||
else if (pwr)
|
||||
res &= 0xFFFFFFFE;
|
||||
} while (btn == res);
|
||||
return res;
|
||||
}
|
||||
|
||||
693
ipl/ctc_logo2.h
Normal file
693
ipl/ctc_logo2.h
Normal file
@@ -0,0 +1,693 @@
|
||||
#define SZ_HEKATE_LOGO 36024
|
||||
#define SZ_HEKATE_LOGOLZ 10993
|
||||
static unsigned char Kc_HEKATE_LOGOlz[SZ_HEKATE_LOGOLZ] =
|
||||
{
|
||||
0xAE, 0x1B, 0x1B, 0x1B,
|
||||
0x1B, 0xAE, 0x04, 0x04, 0xAE, 0x08, 0x08, 0xAE, 0x10, 0x10, 0xAE, 0x07, 0x07, 0x1C, 0x1B, 0x1B,
|
||||
0x1E, 0x1B, 0x1B, 0x1F, 0x1B, 0x1B, 0x1F, 0xAE, 0x05, 0x06, 0x1E, 0x1B, 0x1B, 0x1D, 0xAE, 0x05,
|
||||
0x15, 0xAE, 0x24, 0x39, 0x1D, 0xAE, 0x05, 0x2D, 0xAE, 0x06, 0x06, 0xAE, 0x0C, 0x0C, 0xAE, 0x18,
|
||||
0x18, 0xAE, 0x1E, 0x1E, 0xAE, 0x24, 0x75, 0xAE, 0x09, 0x78, 0xAE, 0x0F, 0x81, 0x34, 0xAE, 0x27,
|
||||
0x3C, 0xAE, 0x27, 0x82, 0x14, 0xAE, 0x4D, 0x4D, 0xAE, 0x6D, 0x6D, 0xAE, 0x07, 0x83, 0x4E, 0x1A,
|
||||
0x1B, 0x23, 0x1A, 0x1B, 0x27, 0x1A, 0x1B, 0x2B, 0x19, 0x1B, 0x2F, 0x19, 0x1B, 0x30, 0x18, 0x1B,
|
||||
0x30, 0x19, 0x1B, 0x2E, 0x19, 0x1B, 0x2A, 0x19, 0x1B, 0x26, 0x1A, 0x1B, 0x22, 0x1A, 0x1B, 0x1F,
|
||||
0xAE, 0x17, 0x82, 0x71, 0x1D, 0xAE, 0x05, 0x3C, 0x24, 0x1A, 0x1B, 0x28, 0x1A, 0x1B, 0x29, 0x19,
|
||||
0x1B, 0x29, 0x19, 0xAE, 0x06, 0x06, 0xAE, 0x0C, 0x0C, 0xAE, 0x18, 0x18, 0xAE, 0x16, 0x18, 0x28,
|
||||
0xAE, 0x0B, 0x72, 0xAE, 0x18, 0x83, 0x24, 0xAE, 0x04, 0x75, 0x1B, 0x1B, 0x21, 0x1A, 0xAE, 0x04,
|
||||
0x2A, 0x2A, 0xAE, 0x05, 0x81, 0x28, 0x30, 0xAE, 0x05, 0x81, 0x34, 0x2F, 0x19, 0x1B, 0x2B, 0x19,
|
||||
0x1B, 0x28, 0xAE, 0x05, 0x81, 0x4C, 0x1F, 0x1A, 0xAE, 0x81, 0x7A, 0x83, 0x66, 0xAE, 0x06, 0x83,
|
||||
0x54, 0x22, 0xAE, 0x05, 0x83, 0x12, 0x32, 0x18, 0x1C, 0x3D, 0x17, 0x1C, 0x47, 0x16, 0x1C, 0x4F,
|
||||
0x15, 0x1C, 0x55, 0x14, 0x1C, 0x59, 0x14, 0x1C, 0x58, 0x14, 0x1C, 0x53, 0x14, 0x1C, 0x4D, 0x15,
|
||||
0x1C, 0x45, 0x16, 0x1C, 0x3B, 0x17, 0x1C, 0x31, 0x18, 0x1B, 0x28, 0x1A, 0x1B, 0x21, 0x1A, 0x1B,
|
||||
0x1D, 0xAE, 0x0E, 0x42, 0x20, 0xAE, 0x05, 0x84, 0x0D, 0x39, 0x18, 0x1C, 0x44, 0x16, 0x1C, 0x4B,
|
||||
0x15, 0xAE, 0x04, 0x30, 0x4D, 0xAE, 0x06, 0x06, 0xAE, 0x0C, 0x0C, 0xAE, 0x18, 0x18, 0xAE, 0x11,
|
||||
0x12, 0x4C, 0x15, 0x1C, 0x49, 0x16, 0x1C, 0x41, 0x17, 0x1C, 0x33, 0x18, 0x1C, 0x26, 0xAE, 0x05,
|
||||
0x83, 0x1B, 0xAE, 0x12, 0x83, 0x54, 0x20, 0xAE, 0x05, 0x84, 0x46, 0x30, 0x18, 0x1B, 0x3A, 0x17,
|
||||
0xAE, 0x04, 0x75, 0x4E, 0x15, 0x1C, 0x54, 0xAE, 0x05, 0x81, 0x2E, 0x58, 0x14, 0x1C, 0x55, 0x14,
|
||||
0x1C, 0x4F, 0x15, 0x1C, 0x47, 0x16, 0x1C, 0x3E, 0xAE, 0x05, 0x42, 0x2A, 0x19, 0x1B, 0x22, 0xAE,
|
||||
0x81, 0x72, 0x83, 0x60, 0xAE, 0x06, 0x83, 0x15, 0x28, 0x19, 0x1B, 0x37, 0x18, 0x1C, 0x49, 0x16,
|
||||
0x1C, 0x5A, 0x13, 0x1C, 0x6B, 0x11, 0x1D, 0x80, 0x0F, 0x1D, 0xA2, 0x0B, 0x1E, 0xC4, 0x06, 0x1F,
|
||||
0xC5, 0x06, 0x1F, 0xC5, 0x06, 0x1F, 0xC4, 0x06, 0x1F, 0xAA, 0x0A, 0x1E, 0x94, 0x0D, 0x1E, 0x69,
|
||||
0x12, 0x1D, 0x58, 0x14, 0x1C, 0x45, 0x16, 0x1C, 0x34, 0x18, 0x1C, 0x27, 0xAE, 0x0B, 0x86, 0x4E,
|
||||
0x1D, 0x1B, 0x1B, 0x27, 0x1A, 0x1B, 0x3B, 0x17, 0x1C, 0x74, 0x11, 0x1D, 0x9B, 0x0C, 0x1E, 0xA0,
|
||||
0x0B, 0x1E, 0xA2, 0x0B, 0x1E, 0xA2, 0xAE, 0x06, 0x06, 0xAE, 0x0C, 0x0C, 0xAE, 0x18, 0x18, 0xAE,
|
||||
0x11, 0x12, 0xA1, 0x0B, 0x1E, 0x9F, 0x0B, 0x1E, 0x97, 0x0D, 0x1E, 0x7A, 0x11, 0x1D, 0x31, 0x18,
|
||||
0x1B, 0x21, 0x1A, 0xAE, 0x0D, 0x81, 0x31, 0x1F, 0x1B, 0x1B, 0x26, 0x1A, 0x1B, 0x32, 0x18, 0x1C,
|
||||
0x43, 0x16, 0x1C, 0x56, 0x14, 0x1C, 0x67, 0x12, 0x1D, 0x73, 0x11, 0x1D, 0xA2, 0x0B, 0x1E, 0xBD,
|
||||
0x07, 0x1E, 0xAE, 0x09, 0x81, 0x31, 0xB4, 0x09, 0x1E, 0x9E, 0x0B, 0x1E, 0x6B, 0x11, 0x1D, 0x5C,
|
||||
0x13, 0x1C, 0x49, 0x15, 0x1C, 0x38, 0x18, 0x1C, 0x29, 0x19, 0x1B, 0x20, 0xAE, 0x0E, 0x85, 0x11,
|
||||
0xAE, 0x81, 0x5B, 0x83, 0x57, 0x1D, 0xAE, 0x05, 0x87, 0x2B, 0x2F, 0x19, 0x1B, 0x42, 0x16, 0x1C,
|
||||
0x5D, 0x13, 0x1C, 0x7F, 0x0F, 0x1D, 0xBD, 0x07, 0x1E, 0xEA, 0x02, 0x1F, 0xFF, 0x00, 0x20, 0xFF,
|
||||
0x00, 0x20, 0xAE, 0x06, 0x06, 0xAE, 0x0C, 0x0C, 0xF8, 0x01, 0x20, 0xD4, 0x04, 0x1F, 0x9C, 0x0C,
|
||||
0x1E, 0x59, 0x14, 0x1C, 0x3F, 0x17, 0x1C, 0x2B, 0xAE, 0x05, 0x82, 0x2C, 0xAE, 0x06, 0x87, 0x73,
|
||||
0x2C, 0x19, 0x1B, 0x4C, 0x15, 0x1C, 0xC1, 0x06, 0xAE, 0x19, 0x3C, 0xAE, 0x18, 0x18, 0xAE, 0x1E,
|
||||
0x1E, 0xDF, 0x03, 0x1F, 0x3C, 0x17, 0x1C, 0x24, 0xAE, 0x08, 0x83, 0x5A, 0xAE, 0x09, 0x88, 0x1D,
|
||||
0x3D, 0x17, 0x1C, 0x56, 0x14, 0x1C, 0x6F, 0x11, 0x1D, 0xB4, 0x08, 0x1E, 0xDC, 0x03, 0xAE, 0x1C,
|
||||
0x75, 0xDC, 0x03, 0x1F, 0xB1, 0x09, 0x1E, 0x5F, 0x13, 0x1C, 0x45, 0x16, 0x1C, 0x30, 0x19, 0x1B,
|
||||
0x23, 0xAE, 0x81, 0x63, 0x83, 0x5D, 0x1D, 0x1B, 0x1B, 0x23, 0xAE, 0x05, 0x85, 0x7A, 0x4B, 0x15,
|
||||
0x1C, 0x6B, 0x11, 0x1D, 0xAC, 0x09, 0x1E, 0xF8, 0x01, 0xAE, 0x28, 0x82, 0x71, 0xDB, 0x03, 0x1F,
|
||||
0x73, 0x11, 0x1D, 0x45, 0x16, 0x1C, 0x2E, 0xAE, 0x05, 0x83, 0x5D, 0x1F, 0x1A, 0x1B, 0x30, 0x19,
|
||||
0x1B, 0x55, 0x14, 0x1C, 0xC4, 0xAE, 0x50, 0x83, 0x5A, 0xE1, 0x03, 0x1F, 0x42, 0x16, 0x1C, 0x25,
|
||||
0xAE, 0x05, 0x83, 0x5A, 0x1C, 0xAE, 0x05, 0x8E, 0x53, 0x2E, 0x19, 0x1B, 0x44, 0x16, 0x1C, 0x63,
|
||||
0x12, 0x1D, 0x9A, 0x0C, 0xAE, 0x1C, 0x85, 0x05, 0xAE, 0x0F, 0x0F, 0xEA, 0x02, 0x1F, 0x90, 0x0D,
|
||||
0x1E, 0x4D, 0x15, 0x1C, 0x32, 0x18, 0x1C, 0xAE, 0x81, 0x5E, 0x83, 0x5D, 0x1C, 0xAE, 0x05, 0x87,
|
||||
0x2E, 0x32, 0x18, 0x1C, 0x4F, 0x15, 0x1C, 0x73, 0x11, 0x1D, 0xD5, 0x04, 0xAE, 0x31, 0x83, 0x12,
|
||||
0xF8, 0x01, 0x20, 0x8E, 0x0E, 0x1E, 0x46, 0x16, 0x1C, 0x2C, 0xAE, 0x05, 0x8D, 0x46, 0x2F, 0x19,
|
||||
0x1B, 0x52, 0xAE, 0x56, 0x83, 0x5A, 0x41, 0x17, 0x1C, 0x25, 0xAE, 0x05, 0x88, 0x1A, 0x20, 0x1A,
|
||||
0x1B, 0x2D, 0x19, 0x1B, 0x47, 0x16, 0x1C, 0x6A, 0x12, 0x1D, 0xB5, 0x08, 0x1E, 0xAE, 0x33, 0x4E,
|
||||
0xB0, 0x09, 0x1E, 0x4F, 0x15, 0x1C, 0xAE, 0x06, 0x8B, 0x5F, 0xAE, 0x81, 0x58, 0x8E, 0x74, 0x1F,
|
||||
0xAE, 0x05, 0x83, 0x0C, 0x4B, 0xAE, 0x05, 0x83, 0x57, 0xE3, 0xAE, 0x1D, 0x89, 0x4E, 0xAE, 0x1E,
|
||||
0x83, 0x5D, 0x8B, 0x0E, 0x1E, 0x40, 0x17, 0x1C, 0x29, 0x19, 0x1B, 0x2C, 0x19, 0x1B, 0x46, 0x16,
|
||||
0x1C, 0xBE, 0x07, 0xAE, 0x4F, 0x83, 0x5A, 0xDE, 0x03, 0x1F, 0x39, 0xAE, 0x05, 0x86, 0x66, 0x1F,
|
||||
0x1B, 0x1B, 0x29, 0x19, 0x1B, 0x43, 0x16, 0x1C, 0x69, 0x12, 0x1D, 0xC5, 0xAE, 0x3B, 0x84, 0x40,
|
||||
0xAF, 0x09, 0x1E, 0x49, 0x16, 0x1C, 0x2B, 0x19, 0xAE, 0x04, 0x51, 0xAE, 0x81, 0x52, 0x83, 0x57,
|
||||
0x1E, 0x1B, 0x1B, 0x28, 0x1A, 0x1B, 0x41, 0x16, 0x1C, 0x6B, 0x12, 0xAE, 0x19, 0x87, 0x2E, 0xD1,
|
||||
0x04, 0x1F, 0xAB, 0x0A, 0x1E, 0x93, 0x0E, 0x1E, 0x93, 0x0E, 0x1E, 0xA2, 0x0C, 0x1E, 0xC1, 0x06,
|
||||
0x1F, 0xF1, 0xAE, 0x14, 0x8B, 0x2C, 0xF1, 0x01, 0x20, 0x68, 0x13, 0x1C, 0x36, 0xAE, 0x05, 0x95,
|
||||
0x00, 0x35, 0x18, 0x1C, 0x86, 0x0F, 0x1D, 0xBA, 0x08, 0x1E, 0xBD, 0x07, 0x1F, 0xBE, 0x07, 0x1F,
|
||||
0xBE, 0xAE, 0x06, 0x06, 0xAE, 0x05, 0x06, 0xBF, 0x07, 0x1F, 0xAE, 0x06, 0x93, 0x10, 0xAE, 0x12,
|
||||
0x42, 0xC4, 0x06, 0x1F, 0xC1, 0xAE, 0x11, 0x30, 0xBE, 0x07, 0x1F, 0xBC, 0x07, 0x1F, 0xB8, 0x08,
|
||||
0x1E, 0x9A, 0x0D, 0x1E, 0x2C, 0x19, 0x1B, 0x21, 0xAE, 0x05, 0x9A, 0x50, 0x39, 0x17, 0x1C, 0x60,
|
||||
0x13, 0xAE, 0x19, 0x87, 0x2E, 0xE2, 0x03, 0x1F, 0xB5, 0x09, 0xAE, 0x07, 0x81, 0x31, 0x96, 0x0D,
|
||||
0x1E, 0xC1, 0x07, 0x1F, 0xAE, 0x18, 0x85, 0x32, 0x8A, 0x0E, 0x1E, 0x3C, 0xAE, 0x08, 0x88, 0x08,
|
||||
0xAE, 0x81, 0x4F, 0x83, 0x5A, 0x21, 0x1A, 0x1B, 0x35, 0x18, 0x1C, 0x5A, 0x13, 0x1C, 0xAC, 0x09,
|
||||
0xAE, 0x13, 0x82, 0x26, 0xD9, 0x04, 0x1F, 0x65, 0x13, 0x1C, 0x43, 0x16, 0x1C, 0x39, 0x17, 0x1C,
|
||||
0x36, 0x18, 0x1C, 0x36, 0x18, 0x1C, 0x3B, 0x17, 0x1C, 0x48, 0x16, 0x1C, 0x5E, 0x13, 0x1C, 0xBB,
|
||||
0x07, 0xAE, 0x13, 0x8F, 0x0C, 0xC9, 0x06, 0x1F, 0x47, 0xAE, 0x05, 0x8B, 0x14, 0x28, 0xAE, 0x05,
|
||||
0x88, 0x08, 0x37, 0xAE, 0x05, 0x30, 0x3C, 0x17, 0x1C, 0x3C, 0xAE, 0x06, 0x06, 0xAE, 0x05, 0x06,
|
||||
0x42, 0x16, 0x1C, 0x5B, 0x13, 0x1C, 0x7C, 0x10, 0x1D, 0xAE, 0x12, 0x6F, 0x68, 0x12, 0x1D, 0x49,
|
||||
0x16, 0xAE, 0x10, 0x30, 0x3C, 0x17, 0x1C, 0x3A, 0x17, 0x1C, 0x34, 0x18, 0x1C, 0x2B, 0xAE, 0x05,
|
||||
0x8B, 0x6B, 0xAE, 0x06, 0x8E, 0x5F, 0x4F, 0x15, 0x1C, 0x8E, 0x0E, 0x1D, 0xAE, 0x12, 0x81, 0x01,
|
||||
0xE9, 0x02, 0x1F, 0x84, 0x0F, 0x1D, 0x48, 0xAE, 0x05, 0x9B, 0x15, 0xAE, 0x06, 0x81, 0x31, 0x39,
|
||||
0xAE, 0x05, 0x9A, 0x08, 0x58, 0x14, 0x1C, 0x9D, 0x0C, 0x1E, 0xAE, 0x12, 0x85, 0x11, 0xEA, 0x02,
|
||||
0x1F, 0x51, 0x15, 0x1C, 0x2E, 0xAE, 0x1A, 0x87, 0x37, 0x1C, 0x1C, 0x1C, 0x1E, 0x1E, 0x1E, 0x1F,
|
||||
0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x1F, 0x1F, 0x1E, 0x1E,
|
||||
0x1E, 0x1D, 0x1D, 0x1D, 0x1C, 0x1C, 0xAE, 0x31, 0x84, 0x0F, 0xAE, 0x0F, 0x4E, 0xAE, 0x06, 0x09,
|
||||
0x1E, 0x1E, 0x1E, 0xAE, 0x24, 0x4B, 0xAE, 0x0F, 0x24, 0xAE, 0x0C, 0x4B, 0xAE, 0x06, 0x06, 0xAE,
|
||||
0x0C, 0x81, 0x13, 0x1D, 0xAE, 0x05, 0x87, 0x31, 0x45, 0x16, 0x1C, 0x73, 0x11, 0x1D, 0xAE, 0x12,
|
||||
0x81, 0x76, 0xD1, 0x04, 0x1F, 0x4A, 0xAE, 0x05, 0x8D, 0x0A, 0x26, 0xAE, 0x05, 0x82, 0x50, 0x1F,
|
||||
0x1A, 0x1B, 0x20, 0xAE, 0x05, 0xA0, 0x2F, 0x28, 0xAE, 0x05, 0x9D, 0x2C, 0x57, 0x14, 0x1C, 0xAA,
|
||||
0x0A, 0xAE, 0x13, 0x84, 0x0D, 0x68, 0x13, 0x1C, 0x33, 0x18, 0x1C, 0xAE, 0x06, 0x30, 0x21, 0xAE,
|
||||
0x05, 0x30, 0x22, 0xAE, 0x06, 0x06, 0xAE, 0x08, 0x09, 0x29, 0xAE, 0x05, 0x8B, 0x2C, 0x73, 0x11,
|
||||
0xAE, 0x13, 0x83, 0x5A, 0x54, 0x14, 0x1C, 0x30, 0x18, 0xAE, 0x13, 0x33, 0x21, 0xAE, 0x05, 0x7B,
|
||||
0xAE, 0x06, 0xA4, 0x4E, 0x24, 0x1A, 0x1B, 0x3C, 0x17, 0x1C, 0x68, 0xAE, 0x14, 0x88, 0x62, 0xE9,
|
||||
0x02, 0x1F, 0x62, 0x13, 0x1C, 0x37, 0x18, 0x1C, 0x28, 0xAE, 0x05, 0x84, 0x04, 0xAE, 0x06, 0x93,
|
||||
0x4F, 0x21, 0xAE, 0x05, 0xA2, 0x6D, 0x33, 0x18, 0x1C, 0x4D, 0x15, 0x1C, 0x8A, 0x0F, 0xAE, 0x13,
|
||||
0x84, 0x0D, 0xA0, 0x0C, 0x1E, 0x39, 0x17, 0x1C, 0x22, 0xAE, 0x0B, 0x9A, 0x4D, 0xAE, 0x09, 0x82,
|
||||
0x38, 0x20, 0x20, 0x20, 0x26, 0x26, 0x26, 0x2B, 0x2B, 0x2B, 0x30, 0x30, 0x30, 0x33, 0x33, 0x33,
|
||||
0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x30, 0x30, 0x30, 0x2C, 0x2C, 0x2C, 0x27, 0x27, 0x27, 0x21,
|
||||
0x21, 0x21, 0x1F, 0x1F, 0x1F, 0xAE, 0x27, 0x83, 0x60, 0x1D, 0x1D, 0x1D, 0x1F, 0x1F, 0x1F, 0x25,
|
||||
0x25, 0x25, 0x2A, 0x2A, 0x2A, 0x2F, 0x2F, 0x2F, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x32, 0x32,
|
||||
0x32, 0x2F, 0x2F, 0x2F, 0x29, 0x29, 0x29, 0x24, 0x24, 0x24, 0xAE, 0x1B, 0x4B, 0xAE, 0x06, 0x3C,
|
||||
0xAE, 0x0C, 0x84, 0x55, 0x1F, 0x1F, 0x1F, 0x24, 0x24, 0x24, 0x2A, 0x2A, 0x2A, 0x30, 0x30, 0x30,
|
||||
0x32, 0x32, 0x32, 0x31, 0x31, 0x31, 0x2C, 0x2C, 0x2C, 0x25, 0x25, 0x25, 0xAE, 0x09, 0x45, 0x1F,
|
||||
0x1A, 0x1B, 0x31, 0x18, 0x1B, 0x59, 0x14, 0x1C, 0xAE, 0x12, 0x89, 0x57, 0xF1, 0x01, 0x20, 0x60,
|
||||
0x14, 0x1C, 0x2F, 0xAE, 0x08, 0x99, 0x4C, 0xAE, 0x0F, 0x96, 0x49, 0x25, 0x1A, 0x1B, 0x3A, 0x17,
|
||||
0x1C, 0x63, 0xAE, 0x14, 0x82, 0x5F, 0xB5, 0x08, 0x1E, 0x3D, 0x17, 0x1C, 0x23, 0xAE, 0x0E, 0x82,
|
||||
0x29, 0xAE, 0x0C, 0x0C, 0x22, 0x1A, 0x1B, 0x40, 0x17, 0x1C, 0x70, 0xAE, 0x14, 0x83, 0x5A, 0x4F,
|
||||
0x15, 0x1C, 0x2A, 0x19, 0xAE, 0x1F, 0x8C, 0x3C, 0x2B, 0xAE, 0x05, 0x9A, 0x53, 0x8E, 0x0E, 0xAE,
|
||||
0x13, 0x3F, 0x82, 0x0F, 0x1D, 0x35, 0xAE, 0x14, 0x95, 0x6F, 0xAE, 0x06, 0x96, 0x49, 0x32, 0x18,
|
||||
0x1C, 0x58, 0x14, 0x1C, 0xB4, 0xAE, 0x11, 0x81, 0x6A, 0xDA, 0x03, 0x1F, 0x47, 0x16, 0x1C, 0x28,
|
||||
0xAE, 0x0B, 0x81, 0x67, 0x1D, 0x1D, 0x1D, 0x20, 0x20, 0x20, 0x28, 0x28, 0x28, 0x31, 0x31, 0x31,
|
||||
0x3C, 0x3C, 0x3C, 0x46, 0x46, 0x46, 0x4C, 0x4C, 0x4C, 0x4F, 0x4F, 0x4F, 0x50, 0x50, 0x50, 0x4F,
|
||||
0x4F, 0x4F, 0x4C, 0x4C, 0x4C, 0x47, 0x47, 0x47, 0x3F, 0x3F, 0x3F, 0x35, 0x35, 0x35, 0x2A, 0x2A,
|
||||
0x2A, 0x21, 0x21, 0x21, 0x1D, 0x1D, 0xAE, 0x1C, 0x96, 0x60, 0x1C, 0x1C, 0x1C, 0xAE, 0x06, 0x83,
|
||||
0x54, 0x2F, 0x2F, 0x2F, 0x39, 0x39, 0x39, 0x43, 0x43, 0x43, 0x4A, 0x4A, 0x4A, 0x4E, 0x4E, 0x4E,
|
||||
0xAE, 0x06, 0x4E, 0x4A, 0x4A, 0x4A, 0x43, 0x43, 0x43, 0x39, 0x39, 0x39, 0x2D, 0x2D, 0x2D, 0x23,
|
||||
0x23, 0x23, 0x1E, 0x1E, 0xAE, 0x10, 0xA3, 0x0A, 0x1C, 0x1C, 0x1C, 0x21, 0x21, 0x21, 0x28, 0x28,
|
||||
0x28, 0x2D, 0x2D, 0x2D, 0x2A, 0x2A, 0x2A, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x2E, 0x2E, 0x2E,
|
||||
0x39, 0x39, 0x39, 0x44, 0x44, 0x44, 0x4B, 0x4B, 0x4B, 0x4E, 0x4E, 0x4E, 0x4A, 0x4A, 0x4A, 0x40,
|
||||
0x40, 0x40, 0x30, 0x30, 0x30, 0x24, 0x24, 0x24, 0xAE, 0x06, 0x81, 0x0D, 0x23, 0xAE, 0x05, 0x86,
|
||||
0x00, 0x6A, 0x12, 0xAE, 0x13, 0x92, 0x39, 0xA8, 0x0B, 0x1E, 0x39, 0x18, 0x1C, 0x22, 0xAE, 0x17,
|
||||
0x8D, 0x01, 0xAE, 0x06, 0x82, 0x62, 0x4E, 0x15, 0xAE, 0x13, 0x87, 0x37, 0xE2, 0x03, 0x1F, 0x45,
|
||||
0x16, 0x1C, 0x27, 0xAE, 0x56, 0x83, 0x5A, 0x1F, 0x1A, 0x1B, 0x34, 0x18, 0x1C, 0x5D, 0x13, 0x1C,
|
||||
0xAE, 0x12, 0x8F, 0x27, 0xD0, 0x04, 0x1F, 0x41, 0x16, 0x1C, 0x26, 0xAE, 0x17, 0x99, 0x46, 0x1C,
|
||||
0xAE, 0x05, 0xA2, 0x40, 0x43, 0x16, 0x1C, 0x7D, 0xAE, 0x14, 0x8C, 0x06, 0x51, 0x15, 0x1C, 0x2C,
|
||||
0x19, 0xAE, 0x07, 0x39, 0x1E, 0x1E, 0x1E, 0x23, 0x23, 0x23, 0x2E, 0x2E, 0x2E, 0x3D, 0x3D, 0x3D,
|
||||
0x4B, 0x4B, 0x4B, 0x57, 0x57, 0x57, 0x97, 0x97, 0x97, 0xB4, 0xB4, 0xB4, 0xD6, 0xD6, 0xD6, 0xD6,
|
||||
0xAE, 0x04, 0x04, 0xD6, 0xCE, 0xCE, 0xCE, 0xB3, 0xB3, 0xB3, 0x8A, 0x8A, 0x8A, 0x4F, 0x4F, 0x4F,
|
||||
0x41, 0x41, 0x41, 0x31, 0x31, 0x31, 0x25, 0x25, 0x25, 0xAE, 0x12, 0x83, 0x12, 0xAE, 0x09, 0x84,
|
||||
0x25, 0x21, 0x21, 0x21, 0x2A, 0x2A, 0x2A, 0x39, 0x39, 0x39, 0x48, 0x48, 0x48, 0x54, 0x54, 0x54,
|
||||
0x80, 0x80, 0x80, 0xB4, 0xB4, 0xB4, 0xCE, 0xCE, 0xCE, 0xAE, 0x06, 0x4E, 0xC6, 0xC6, 0xC6, 0xA1,
|
||||
0xA1, 0xA1, 0x62, 0x62, 0x62, 0x45, 0x45, 0x45, 0x35, 0x35, 0x35, 0x28, 0x28, 0x28, 0x1F, 0x1F,
|
||||
0xAE, 0x0D, 0x8C, 0x1A, 0x1E, 0x1E, 0x1E, 0x28, 0x28, 0x28, 0x37, 0x37, 0x37, 0x6F, 0x6F, 0x6F,
|
||||
0x5E, 0x5E, 0x5E, 0x36, 0x36, 0x36, 0x39, 0x39, 0x39, 0x45, 0x45, 0x45, 0x53, 0x53, 0x53, 0x81,
|
||||
0x81, 0x81, 0xAE, 0x06, 0x81, 0x19, 0xD5, 0xD5, 0xD5, 0xD3, 0xD3, 0xD3, 0x85, 0x85, 0x85, 0x27,
|
||||
0x27, 0x27, 0x1E, 0x1E, 0x1E, 0xAE, 0x06, 0x8B, 0x0B, 0x48, 0x16, 0x1C, 0x80, 0x0F, 0xAE, 0x10,
|
||||
0x81, 0x6D, 0xF8, 0x01, 0x20, 0x4F, 0x15, 0x1C, 0x2B, 0x19, 0xAE, 0x13, 0xA7, 0x4B, 0xAE, 0x09,
|
||||
0x82, 0x29, 0x24, 0x1A, 0x1B, 0x3E, 0x17, 0x1C, 0x69, 0x12, 0xAE, 0x13, 0x82, 0x29, 0xAE, 0x06,
|
||||
0x86, 0x03, 0xAE, 0x54, 0x83, 0x5A, 0x23, 0x1A, 0x1B, 0x3D, 0x17, 0x1C, 0x6B, 0x11, 0x1D, 0xAE,
|
||||
0x12, 0x9D, 0x3E, 0x82, 0x0F, 0x1D, 0x32, 0x18, 0x1C, 0x1F, 0xAE, 0x1A, 0x78, 0x21, 0x1A, 0x1B,
|
||||
0x36, 0xAE, 0x05, 0x84, 0x16, 0xAE, 0x12, 0x85, 0x47, 0x8A, 0x0F, 0x1D, 0x2F, 0xAE, 0x05, 0x81,
|
||||
0x6D, 0x1D, 0x1D, 0x1D, 0x24, 0x24, 0x24, 0x31, 0x31, 0x31, 0x44, 0x44, 0x44, 0x55, 0x55, 0x55,
|
||||
0xA2, 0xA2, 0xA2, 0xE6, 0xE6, 0xE6, 0xF5, 0xF5, 0xF5, 0xD5, 0xD5, 0xD5, 0xBB, 0xBB, 0xBB, 0xB1,
|
||||
0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0xBB, 0xBB, 0xBB, 0xD6, 0xD6, 0xD6, 0xF5, 0xF5, 0xF5, 0xE6, 0xE6,
|
||||
0xE6, 0x9F, 0x9F, 0x9F, 0x48, 0x48, 0x48, 0x33, 0x33, 0x33, 0x25, 0x25, 0x25, 0xAE, 0x12, 0x87,
|
||||
0x3A, 0xAE, 0x06, 0x86, 0x6F, 0x2D, 0x2D, 0x2D, 0x3F, 0x3F, 0x3F, 0x51, 0x51, 0x51, 0x8D, 0x8D,
|
||||
0x8D, 0xAE, 0x06, 0x39, 0xDD, 0xDD, 0xDD, 0xAE, 0x06, 0x4E, 0xB2, 0xB2, 0xB2, 0xCE, 0xCE, 0xCE,
|
||||
0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xB4, 0xB4, 0xB4, 0x4E, 0x4E, 0x4E, 0x39, 0x39, 0x39, 0xAE,
|
||||
0x0F, 0x83, 0x5D, 0x1F, 0x1F, 0x1F, 0x30, 0x30, 0x30, 0x45, 0x45, 0x45, 0xD4, 0xD4, 0xD4, 0xB0,
|
||||
0xB0, 0xB0, 0x4E, 0x4E, 0x4E, 0x51, 0x51, 0x51, 0x80, 0x80, 0x80, 0xAE, 0x06, 0x4B, 0xDE, 0xDE,
|
||||
0xDE, 0xBA, 0xBA, 0xBA, 0xAF, 0xAF, 0xAF, 0xAB, 0xAB, 0xAB, 0x83, 0x83, 0x83, 0xAE, 0x06, 0x84,
|
||||
0x64, 0x1E, 0x1B, 0x1B, 0x2D, 0xAE, 0x05, 0x9C, 0x79, 0xAC, 0xAE, 0x11, 0x86, 0x78, 0xD1, 0x04,
|
||||
0xAE, 0x07, 0x9C, 0x3A, 0xAE, 0x1E, 0x86, 0x3F, 0x30, 0x18, 0x1B, 0x4F, 0x15, 0x1C, 0xE1, 0xAE,
|
||||
0x11, 0x82, 0x29, 0x62, 0x14, 0x1D, 0x26, 0xAE, 0x1A, 0x94, 0x6E, 0xAE, 0x39, 0x83, 0x5A, 0xAE,
|
||||
0x06, 0x86, 0x78, 0x47, 0xAE, 0x14, 0x85, 0x0B, 0xF1, 0x01, 0x20, 0x4B, 0x15, 0x1C, 0x29, 0x19,
|
||||
0xAE, 0x1C, 0x95, 0x63, 0x1F, 0xAE, 0x05, 0x88, 0x68, 0x47, 0x16, 0x1C, 0xBD, 0xAE, 0x11, 0x9B,
|
||||
0x0F, 0x9C, 0x0D, 0x1E, 0x2B, 0x19, 0x1B, 0x1F, 0xAE, 0x05, 0x83, 0x09, 0x30, 0x30, 0x30, 0x46,
|
||||
0x46, 0x46, 0x67, 0x67, 0x67, 0xD6, 0xD6, 0xD6, 0xED, 0xED, 0xED, 0xB0, 0xB0, 0xB0, 0x59, 0x59,
|
||||
0x59, 0x41, 0x41, 0x41, 0x3B, 0x3B, 0x3B, 0x39, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x3E, 0x3E, 0x3E,
|
||||
0x45, 0x45, 0x45, 0x5F, 0x5F, 0x5F, 0xB3, 0xB3, 0xB3, 0xEE, 0xEE, 0xEE, 0xC4, 0xC4, 0xC4, 0x48,
|
||||
0x48, 0x48, 0x30, 0x30, 0x30, 0x21, 0x21, 0x21, 0xAE, 0x0F, 0x83, 0x57, 0x20, 0x20, 0x20, 0x2C,
|
||||
0x2C, 0x2C, 0x40, 0x40, 0x40, 0x55, 0x55, 0x55, 0xB4, 0xB4, 0xB4, 0xF5, 0xF5, 0xF5, 0xC3, 0xC3,
|
||||
0xC3, 0x68, 0x68, 0x68, 0x41, 0x41, 0x41, 0x3C, 0x3C, 0x3C, 0x3B, 0x3B, 0x3B, 0x3D, 0x3D, 0x3D,
|
||||
0x45, 0x45, 0x45, 0x60, 0x60, 0x60, 0xAB, 0xAB, 0xAB, 0xEE, 0xEE, 0xEE, 0xDE, 0xDE, 0xDE, 0x60,
|
||||
0x60, 0x60, 0x39, 0x39, 0x39, 0x26, 0x26, 0x26, 0xAE, 0x09, 0x88, 0x05, 0x20, 0x20, 0x20, 0x33,
|
||||
0x33, 0x33, 0x4F, 0x4F, 0x4F, 0xD7, 0xD7, 0xD7, 0xB8, 0xB8, 0xB8, 0x65, 0x65, 0x65, 0x85, 0x85,
|
||||
0x85, 0xED, 0xED, 0xED, 0xCC, 0xCC, 0xCC, 0x69, 0x69, 0x69, 0xAE, 0x06, 0x81, 0x19, 0x37, 0x37,
|
||||
0x37, 0x30, 0x30, 0x30, 0x28, 0x28, 0x28, 0x20, 0x20, 0x20, 0x1C, 0x1C, 0x1C, 0x1F, 0x1B, 0x1B,
|
||||
0x32, 0x18, 0x1C, 0x5C, 0xAE, 0x14, 0x89, 0x5A, 0xA9, 0x0A, 0x1E, 0x39, 0x18, 0x1C, 0x20, 0xAE,
|
||||
0x1D, 0x83, 0x5A, 0xAE, 0x06, 0x8E, 0x6E, 0x35, 0x18, 0x1C, 0x77, 0x12, 0x1D, 0x8C, 0x0F, 0x1D,
|
||||
0x8F, 0x0E, 0x1D, 0x8F, 0x0E, 0x1D, 0x8A, 0x0F, 0x1D, 0x81, 0x10, 0x1D, 0x45, 0x17, 0xAE, 0x0D,
|
||||
0xAB, 0x5E, 0xAE, 0x48, 0x83, 0x5A, 0xAE, 0x06, 0x8C, 0x03, 0x50, 0x15, 0x1C, 0xA2, 0x0B, 0xAE,
|
||||
0x14, 0x85, 0x0B, 0xAE, 0x08, 0xA5, 0x1F, 0xAE, 0x1B, 0x84, 0x19, 0x23, 0xAE, 0x05, 0x90, 0x58,
|
||||
0x65, 0x13, 0x1D, 0x8A, 0xAE, 0x08, 0x81, 0x31, 0x8B, 0x0F, 0x1D, 0x84, 0x10, 0x1D, 0x5B, 0x15,
|
||||
0x1D, 0x25, 0x1A, 0x1B, 0x21, 0x1F, 0x1F, 0x2A, 0x2A, 0x2A, 0x41, 0x41, 0x41, 0x66, 0x66, 0x66,
|
||||
0xDE, 0xDE, 0xDE, 0xDD, 0xDD, 0xDD, 0x59, 0x59, 0x59, 0x39, 0x39, 0x39, 0x2E, 0x2E, 0x2E, 0x28,
|
||||
0x28, 0x28, 0x24, 0x24, 0x24, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0xAE, 0x06, 0x92, 0x54, 0x36,
|
||||
0x36, 0x36, 0x48, 0x48, 0x48, 0x80, 0x80, 0x80, 0xEE, 0xEE, 0xEE, 0xBB, 0xBB, 0xBB, 0x40, 0x40,
|
||||
0x40, 0x28, 0x28, 0x28, 0xAE, 0x0C, 0x87, 0x37, 0xAE, 0x06, 0x8A, 0x46, 0x3B, 0x3B, 0x3B, 0x53,
|
||||
0x53, 0x53, 0xBD, 0xBD, 0xBD, 0xED, 0xED, 0xED, 0x84, 0x84, 0x84, 0x3D, 0x3D, 0x3D, 0xAE, 0x06,
|
||||
0x83, 0x03, 0x25, 0x25, 0x25, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x2B, 0x2B, 0x2B, 0x35, 0x35,
|
||||
0x35, 0x46, 0x46, 0x46, 0x7F, 0x7F, 0x7F, 0xDF, 0xDF, 0xDF, 0xDE, 0xDE, 0xDE, 0x5B, 0x5B, 0x5B,
|
||||
0x32, 0x32, 0x32, 0xAE, 0x09, 0x84, 0x28, 0x20, 0x20, 0x20, 0x35, 0x35, 0x35, 0x55, 0x55, 0x55,
|
||||
0xD9, 0xD9, 0xD9, 0xBE, 0xBE, 0xBE, 0x91, 0x91, 0x91, 0xEE, 0xEE, 0xEE, 0xA6, 0xA6, 0xA6, 0x40,
|
||||
0x40, 0x40, 0x31, 0x31, 0x31, 0xAE, 0x06, 0x4B, 0x22, 0x22, 0x22, 0xAE, 0x06, 0x92, 0x60, 0xAE,
|
||||
0x06, 0x81, 0x01, 0x20, 0x1A, 0x1B, 0x38, 0x18, 0x1C, 0x64, 0xAE, 0x14, 0x8E, 0x65, 0x8F, 0x0E,
|
||||
0xAE, 0x05, 0x89, 0x5A, 0xAE, 0x20, 0xA5, 0x3A, 0x1F, 0xAE, 0x05, 0x8B, 0x14, 0x2B, 0xAE, 0x05,
|
||||
0xB6, 0x2D, 0x32, 0x18, 0x1C, 0x32, 0x18, 0x1C, 0x30, 0xAE, 0x05, 0xB6, 0x75, 0xAE, 0x06, 0xB2,
|
||||
0x4D, 0xAE, 0x51, 0x83, 0x5A, 0x1F, 0x1B, 0x1B, 0x30, 0x19, 0x1B, 0x58, 0x14, 0xAE, 0x13, 0x85,
|
||||
0x0B, 0xBE, 0x07, 0x1F, 0x3B, 0xAE, 0x11, 0x95, 0x60, 0xAE, 0x15, 0x84, 0x1C, 0xAE, 0x06, 0x97,
|
||||
0x1D, 0x2F, 0xAE, 0x05, 0xB5, 0x4A, 0x32, 0x18, 0x1C, 0x30, 0x18, 0x1B, 0x2B, 0x19, 0x1B, 0x25,
|
||||
0x1A, 0x1B, 0x20, 0x1C, 0x1C, 0x23, 0x22, 0x22, 0x35, 0x35, 0x35, 0x50, 0x50, 0x50, 0xBE, 0xBE,
|
||||
0xBE, 0xE6, 0xE6, 0xE6, 0x59, 0x59, 0x59, 0x31, 0x31, 0x31, 0x24, 0x24, 0x24, 0xAE, 0x12, 0x99,
|
||||
0x16, 0x1D, 0x1D, 0x1D, 0x22, 0x22, 0x22, 0x31, 0x31, 0x31, 0x49, 0x49, 0x49, 0x98, 0x98, 0x98,
|
||||
0xF5, 0xF5, 0xF5, 0x6A, 0x6A, 0x6A, 0x31, 0x31, 0x31, 0xAE, 0x09, 0x8A, 0x46, 0x1C, 0x1C, 0x1C,
|
||||
0x22, 0x22, 0x22, 0x33, 0x33, 0x33, 0x4C, 0x4C, 0x4C, 0xA2, 0xA2, 0xA2, 0xF5, 0xF5, 0xF5, 0x76,
|
||||
0x76, 0x76, 0x37, 0x37, 0x37, 0x27, 0x27, 0x27, 0xAE, 0x0F, 0x96, 0x04, 0xAE, 0x06, 0x8F, 0x09,
|
||||
0x2E, 0x2E, 0x2E, 0x43, 0x43, 0x43, 0x75, 0x75, 0x75, 0xEE, 0xEE, 0xEE, 0xBC, 0xBC, 0xBC, 0x41,
|
||||
0x41, 0x41, 0x29, 0x29, 0x29, 0xAE, 0x06, 0x87, 0x37, 0x20, 0x20, 0x20, 0x36, 0x36, 0x36, 0x59,
|
||||
0x59, 0x59, 0xDB, 0xDB, 0xDB, 0xBF, 0xBF, 0xBF, 0xD9, 0xD9, 0xD9, 0xBA, 0xBA, 0xBA, 0x3C, 0x3C,
|
||||
0x3C, 0x29, 0x29, 0x29, 0xAE, 0x18, 0x96, 0x4F, 0x21, 0xAE, 0x05, 0xB3, 0x12, 0x6B, 0xAE, 0x14,
|
||||
0x83, 0x5A, 0x72, 0x11, 0x1D, 0x2E, 0xAE, 0x08, 0x90, 0x52, 0xAE, 0x21, 0xAC, 0x71, 0xAE, 0x0C,
|
||||
0xBD, 0x64, 0xAE, 0x24, 0xBD, 0x67, 0xAE, 0x3A, 0x83, 0x5A, 0xAE, 0x05, 0x99, 0x3D, 0xAE, 0x15,
|
||||
0x92, 0x3F, 0xA9, 0x0A, 0x1E, 0x38, 0xAE, 0x20, 0x88, 0x65, 0xAE, 0x15, 0xC0, 0x49, 0xAE, 0x0A,
|
||||
0xC0, 0x4C, 0x1C, 0x1C, 0x26, 0x26, 0x26, 0x3C, 0x3C, 0x3C, 0x63, 0x63, 0x63, 0xF5, 0xF5, 0xF5,
|
||||
0x90, 0x90, 0x90, 0x36, 0x36, 0x36, 0x22, 0x22, 0x22, 0xAE, 0x18, 0x99, 0x0A, 0x1C, 0x1C, 0x1C,
|
||||
0x25, 0x25, 0x25, 0x3A, 0x3A, 0x3A, 0x56, 0x56, 0x56, 0xAE, 0x06, 0x8D, 0x6D, 0x39, 0x39, 0x39,
|
||||
0x23, 0x23, 0x23, 0xAE, 0x09, 0x87, 0x31, 0x29, 0x29, 0x29, 0xAE, 0x06, 0x87, 0x7F, 0xED, 0xED,
|
||||
0xED, 0xA6, 0xA6, 0xA6, 0x39, 0x39, 0x39, 0xAE, 0x18, 0x92, 0x69, 0xAE, 0x06, 0x8F, 0x0F, 0x30,
|
||||
0x30, 0x30, 0x49, 0x49, 0x49, 0xA3, 0xA3, 0xA3, 0xF5, 0xF5, 0xF5, 0x6C, 0x6C, 0x6C, 0x33, 0x33,
|
||||
0x33, 0x20, 0x20, 0x20, 0xAE, 0x06, 0x83, 0x5A, 0x37, 0x37, 0x37, 0x5C, 0x5C, 0x5C, 0xDB, 0xDB,
|
||||
0xDB, 0xDB, 0xDB, 0xDB, 0xE7, 0xE7, 0xE7, 0x46, 0x46, 0x46, 0x2B, 0x2B, 0x2B, 0xAE, 0x0F, 0x92,
|
||||
0x69, 0xAE, 0x0F, 0x83, 0x5A, 0x3D, 0x17, 0x1C, 0x6D, 0x11, 0xAE, 0x13, 0x9B, 0x63, 0x52, 0xAE,
|
||||
0x05, 0x92, 0x3F, 0xAE, 0x57, 0xA2, 0x1C, 0xAE, 0x3C, 0x83, 0x5A, 0x36, 0x18, 0x1C, 0x62, 0x13,
|
||||
0x1D, 0xAE, 0x12, 0xB3, 0x51, 0x92, 0x0E, 0x1E, 0x35, 0xAE, 0x1D, 0x92, 0x3F, 0xAE, 0x24, 0x9C,
|
||||
0x70, 0x27, 0x27, 0x27, 0x3B, 0x3B, 0x3B, 0x9B, 0x9B, 0x9B, 0xF5, 0xF5, 0xF5, 0x3F, 0x3F, 0x3F,
|
||||
0x2A, 0x2A, 0x2A, 0xAE, 0x1E, 0x99, 0x4F, 0x1F, 0x1F, 0x1F, 0x31, 0x31, 0x31, 0x4E, 0x4E, 0x4E,
|
||||
0xB5, 0xB5, 0xB5, 0xD5, 0xD5, 0xD5, 0x3F, 0x3F, 0x3F, 0x27, 0x27, 0x27, 0xAE, 0x07, 0x82, 0x5C,
|
||||
0x21, 0x21, 0x33, 0x33, 0x33, 0x4D, 0x4D, 0x4D, 0xB4, 0xB4, 0xB4, 0xD5, 0xD5, 0xD5, 0xAE, 0x0C,
|
||||
0x87, 0x04, 0xAE, 0x18, 0x84, 0x28, 0x24, 0x24, 0x24, 0x39, 0x39, 0x39, 0x57, 0x57, 0x57, 0xE6,
|
||||
0xE6, 0xE6, 0xC4, 0xC4, 0xC4, 0x3D, 0x3D, 0x3D, 0x25, 0x25, 0x25, 0xAE, 0x06, 0x83, 0x5A, 0x38,
|
||||
0x38, 0x38, 0x5E, 0x5E, 0x5E, 0xDB, 0xDB, 0xDB, 0xF5, 0xF5, 0xF5, 0xA0, 0xA0, 0xA0, 0x37, 0x37,
|
||||
0x37, 0xAE, 0x0F, 0x8F, 0x54, 0xAE, 0x12, 0x82, 0x62, 0x3F, 0x17, 0x1C, 0x6F, 0xAE, 0x35, 0x95,
|
||||
0x24, 0xAE, 0x75, 0x83, 0x5A, 0xAE, 0x06, 0x8C, 0x3F, 0x65, 0xAE, 0x14, 0x88, 0x65, 0x90, 0x0E,
|
||||
0x1D, 0x33, 0xAE, 0x20, 0x8C, 0x3F, 0xAE, 0x21, 0xA3, 0x62, 0xAE, 0x06, 0x96, 0x16, 0x93, 0x93,
|
||||
0x93, 0xB3, 0xB3, 0xB3, 0x2F, 0x2F, 0x2F, 0x22, 0x22, 0x22, 0xAE, 0x1F, 0x8B, 0x5C, 0x1E, 0x1E,
|
||||
0x2D, 0x2D, 0x2D, 0x49, 0x49, 0x49, 0xA2, 0xA2, 0xA2, 0xED, 0xED, 0xED, 0x41, 0x41, 0x41, 0x28,
|
||||
0x28, 0x28, 0xAE, 0x06, 0x84, 0x25, 0x26, 0x26, 0x26, 0x3D, 0x3D, 0x3D, 0x56, 0x56, 0x56, 0xED,
|
||||
0xED, 0xED, 0x9A, 0x9A, 0x9A, 0x34, 0x34, 0x34, 0xAE, 0x1E, 0x83, 0x0C, 0xAE, 0x06, 0x84, 0x28,
|
||||
0x2F, 0x2F, 0x2F, 0x4B, 0x4B, 0x4B, 0xAC, 0xAC, 0xAC, 0xE6, 0xE6, 0xE6, 0x45, 0x45, 0x45, 0x2A,
|
||||
0x2A, 0x2A, 0xAE, 0x06, 0x93, 0x07, 0x38, 0x38, 0x38, 0x5B, 0x5B, 0x5B, 0xDA, 0xDA, 0xDA, 0xF5,
|
||||
0xF5, 0xF5, 0x5D, 0x5D, 0x5D, 0x2D, 0x2D, 0x2D, 0xAE, 0x1B, 0x84, 0x25, 0xAE, 0x3F, 0x98, 0x7E,
|
||||
0xAE, 0x78, 0x83, 0x5A, 0x39, 0x18, 0x1C, 0x66, 0xAE, 0x59, 0x83, 0x5A, 0xAE, 0x09, 0xA4, 0x24,
|
||||
0x29, 0x29, 0x29, 0xAE, 0x15, 0xA0, 0x35, 0xAE, 0x12, 0x87, 0x67, 0x2B, 0x2B, 0x2B, 0x47, 0x47,
|
||||
0x47, 0x8E, 0x8E, 0x8E, 0xF5, 0xF5, 0xF5, 0x43, 0x43, 0x43, 0x29, 0x29, 0x29, 0xAE, 0x06, 0x83,
|
||||
0x72, 0x2C, 0x2C, 0x2C, 0x47, 0x47, 0x47, 0x97, 0x97, 0x97, 0xED, 0xED, 0xED, 0x49, 0x49, 0x49,
|
||||
0x30, 0x30, 0x30, 0xAE, 0x06, 0x91, 0x65, 0xAE, 0x06, 0xA9, 0x20, 0xAE, 0x09, 0x09, 0xAE, 0x0C,
|
||||
0x0C, 0x22, 0x22, 0x22, 0x2D, 0x2D, 0x2D, 0x47, 0x47, 0x47, 0x83, 0x83, 0x83, 0xF5, 0xF5, 0xF5,
|
||||
0x68, 0x68, 0x68, 0x2F, 0x2F, 0x2F, 0xAE, 0x06, 0xA6, 0x08, 0x36, 0x36, 0x36, 0x57, 0x57, 0x57,
|
||||
0xD8, 0xD8, 0xD8, 0xD6, 0xD6, 0xD6, 0x42, 0x42, 0x42, 0xAE, 0x09, 0x88, 0x1A, 0xAE, 0x82, 0x26,
|
||||
0x87, 0x34, 0xAE, 0x0F, 0xAB, 0x0A, 0xAE, 0x06, 0xAB, 0x04, 0x1C, 0x1C, 0x1C, 0xAE, 0x06, 0xA7,
|
||||
0x4B, 0x1F, 0x1F, 0x1F, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0xAE, 0x04,
|
||||
0x04, 0xAE, 0x04, 0x04, 0x24, 0x24, 0x24, 0x30, 0x30, 0x30, 0x4B, 0x4B, 0x4B, 0x8F, 0x8F, 0x8F,
|
||||
0xF5, 0xF5, 0xF5, 0x44, 0x44, 0x44, 0x2A, 0x2A, 0x2A, 0xAE, 0x09, 0x8B, 0x26, 0x50, 0x50, 0x50,
|
||||
0xC0, 0xC0, 0xC0, 0xD0, 0xD0, 0xD0, 0x53, 0x53, 0x53, 0xAE, 0x06, 0xA5, 0x31, 0x35, 0xAE, 0x04,
|
||||
0x04, 0xAE, 0x08, 0x08, 0xAE, 0x10, 0x10, 0xAE, 0x04, 0x04, 0x3D, 0x3D, 0x3D, 0x52, 0x52, 0x52,
|
||||
0x65, 0x65, 0x65, 0xF5, 0xF5, 0xF5, 0x84, 0x84, 0x84, 0xAE, 0x06, 0x93, 0x13, 0xAE, 0x06, 0x96,
|
||||
0x1C, 0x52, 0x52, 0x52, 0xD7, 0xD7, 0xD7, 0xB2, 0xB2, 0xB2, 0x3C, 0x3C, 0x3C, 0x24, 0x24, 0x24,
|
||||
0xAE, 0x21, 0xB0, 0x0C, 0x3E, 0xAE, 0x05, 0x8E, 0x68, 0xAE, 0x15, 0xA3, 0x14, 0xAE, 0x81, 0x19,
|
||||
0x8E, 0x68, 0x63, 0x13, 0xAE, 0x13, 0x83, 0x5A, 0x91, 0x0E, 0x1D, 0x34, 0xAE, 0x3E, 0x8E, 0x68,
|
||||
0xAE, 0x15, 0xAB, 0x2B, 0x23, 0x23, 0x23, 0x28, 0x28, 0x28, 0x2E, 0x2E, 0x2E, 0x32, 0x32, 0x32,
|
||||
0xAE, 0x06, 0xA3, 0x7D, 0xAE, 0x06, 0x9D, 0x53, 0x3A, 0xAE, 0x04, 0x04, 0x3A, 0x3C, 0x3C, 0x3C,
|
||||
0x47, 0x47, 0x47, 0x5D, 0x5D, 0x5D, 0x95, 0x95, 0x95, 0xF5, 0xF5, 0xF5, 0xAE, 0x06, 0x8A, 0x40,
|
||||
0xAE, 0x09, 0x91, 0x74, 0x58, 0x58, 0x58, 0xD9, 0xD9, 0xD9, 0xBC, 0xBC, 0xBC, 0x67, 0x67, 0x67,
|
||||
0x56, 0x56, 0x56, 0x51, 0x51, 0x51, 0x51, 0xAE, 0x04, 0x04, 0xAE, 0x08, 0x08, 0xAE, 0x10, 0x10,
|
||||
0xAE, 0x04, 0x04, 0x55, 0x55, 0x55, 0x63, 0x63, 0x63, 0x6E, 0x6E, 0x6E, 0xF5, 0xF5, 0xF5, 0x83,
|
||||
0x83, 0x83, 0x30, 0x30, 0x30, 0xAE, 0x09, 0x83, 0x5A, 0x51, 0x51, 0x51, 0xD6, 0xD6, 0xD6, 0xB0,
|
||||
0xB0, 0xB0, 0xAE, 0x0C, 0x93, 0x28, 0xAE, 0x1B, 0x83, 0x5A, 0x3B, 0xAE, 0x05, 0xA3, 0x50, 0xAE,
|
||||
0x12, 0xB0, 0x0C, 0x54, 0x14, 0x1C, 0x2D, 0xAE, 0x1D, 0x9F, 0x76, 0xAE, 0x78, 0x83, 0x5A, 0x34,
|
||||
0x18, 0x1C, 0x5F, 0x13, 0x1C, 0xAE, 0x12, 0xAD, 0x2D, 0x93, 0x0E, 0x1E, 0x36, 0xAE, 0x26, 0x96,
|
||||
0x1C, 0xAE, 0x2A, 0x8B, 0x17, 0xAE, 0x06, 0xAB, 0x1C, 0x41, 0x41, 0x41, 0x49, 0x49, 0x49, 0x4F,
|
||||
0x4F, 0x4F, 0x52, 0x52, 0x52, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x56, 0xAE,
|
||||
0x04, 0x04, 0x56, 0x58, 0x58, 0x58, 0x61, 0x61, 0x61, 0x72, 0x72, 0x72, 0x9E, 0x9E, 0x9E, 0xF5,
|
||||
0xF5, 0xF5, 0x47, 0x47, 0x47, 0xAE, 0x06, 0x83, 0x5A, 0x21, 0x21, 0x21, 0x39, 0x39, 0x39, 0x5D,
|
||||
0x5D, 0x5D, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xE8, 0xD9, 0xD9, 0xD9, 0xD7, 0xD7, 0xD7, 0xAE, 0x09,
|
||||
0xA9, 0x1D, 0xAE, 0x09, 0x09, 0xAE, 0x12, 0x12, 0xD6, 0xD6, 0xD6, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8,
|
||||
0xD8, 0xF5, 0xF5, 0xF5, 0x7E, 0x7E, 0x7E, 0x2B, 0x2B, 0x2B, 0xAE, 0x06, 0x8B, 0x0E, 0xAE, 0x0F,
|
||||
0x83, 0x5A, 0xAE, 0x21, 0x90, 0x01, 0xAE, 0x1B, 0x8D, 0x37, 0x76, 0x11, 0x1D, 0x30, 0x18, 0xAE,
|
||||
0x1C, 0x9D, 0x14, 0xAE, 0x0F, 0xD5, 0x3D, 0xAE, 0x09, 0xB3, 0x54, 0xAE, 0x06, 0xB3, 0x63, 0xAE,
|
||||
0x1E, 0x99, 0x79, 0xAE, 0x3C, 0x9D, 0x50, 0x31, 0x18, 0x1B, 0x5A, 0xAE, 0x14, 0x9D, 0x50, 0xAB,
|
||||
0x0A, 0x1E, 0x39, 0x17, 0x1C, 0xAE, 0x1B, 0xA2, 0x1F, 0xAE, 0x27, 0x81, 0x31, 0xAE, 0x12, 0xAB,
|
||||
0x67, 0x75, 0x75, 0x75, 0xA2, 0xA2, 0xA2, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xEE, 0xEE, 0xEE,
|
||||
0xF5, 0xF5, 0xF5, 0xF5, 0xAE, 0x04, 0x04, 0xAE, 0x08, 0x08, 0xAE, 0x0B, 0x0B, 0x48, 0x48, 0x48,
|
||||
0xAE, 0x06, 0x83, 0x5A, 0x22, 0x22, 0x22, 0x3B, 0x3B, 0x3B, 0x5D, 0x5D, 0x5D, 0xF5, 0xF5, 0xF5,
|
||||
0xCB, 0xCB, 0xCB, 0xB6, 0xB6, 0xB6, 0xB1, 0xB1, 0xB1, 0xB0, 0xB0, 0xB0, 0xB0, 0xAE, 0x04, 0x04,
|
||||
0xAE, 0x08, 0x08, 0xAE, 0x10, 0x10, 0xAE, 0x07, 0x07, 0xB1, 0xB1, 0xB1, 0xAF, 0xAF, 0xAF, 0xAC,
|
||||
0xAC, 0xAC, 0x59, 0x59, 0x59, 0xAE, 0x06, 0xA9, 0x32, 0xAE, 0x33, 0x83, 0x5A, 0x1F, 0xAE, 0x05,
|
||||
0xA4, 0x42, 0x61, 0xAE, 0x14, 0x89, 0x5D, 0xAE, 0x06, 0x86, 0x03, 0xAE, 0x1E, 0x89, 0x5D, 0xAE,
|
||||
0x06, 0xC5, 0x33, 0x29, 0x19, 0x1B, 0x34, 0xAE, 0x05, 0xBB, 0x05, 0x3F, 0x17, 0x1C, 0x3F, 0x17,
|
||||
0x1C, 0x39, 0xAE, 0x05, 0xD5, 0x2B, 0xAE, 0x06, 0xD1, 0x4B, 0xAE, 0x54, 0xA5, 0x04, 0x2E, 0x19,
|
||||
0x1B, 0x53, 0xAE, 0x14, 0xC7, 0x08, 0xBF, 0x07, 0x1F, 0x3F, 0xAE, 0x0B, 0xCD, 0x7D, 0xAE, 0x19,
|
||||
0xA2, 0x5B, 0xAE, 0x05, 0xD5, 0x3D, 0x31, 0xAE, 0x05, 0xD5, 0x3D, 0xAE, 0x06, 0x81, 0x31, 0x3B,
|
||||
0xAE, 0x05, 0xD5, 0x2B, 0xAE, 0x07, 0xD1, 0x4B, 0xAE, 0x05, 0x9C, 0x58, 0x2E, 0x2E, 0x2E, 0x40,
|
||||
0x40, 0x40, 0x52, 0x52, 0x52, 0x84, 0x84, 0x84, 0xCF, 0xCF, 0xCF, 0xF5, 0xF5, 0xF5, 0xED, 0xED,
|
||||
0xED, 0xCD, 0xCD, 0xCD, 0xB0, 0xB0, 0xB0, 0x91, 0x91, 0x91, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84,
|
||||
0x84, 0xAE, 0x04, 0x04, 0x84, 0x85, 0x85, 0x85, 0x8B, 0x8B, 0x8B, 0x95, 0x95, 0x95, 0xB5, 0xB5,
|
||||
0xB5, 0xAE, 0x0C, 0x87, 0x34, 0x22, 0x22, 0x22, 0x3A, 0x3A, 0x3A, 0x5A, 0x5A, 0x5A, 0xAE, 0x06,
|
||||
0x9E, 0x18, 0x4F, 0x4F, 0x4F, 0x3C, 0x3C, 0x3C, 0xAE, 0x06, 0x8B, 0x4A, 0xAE, 0x06, 0x06, 0xAE,
|
||||
0x0C, 0x0C, 0xAE, 0x12, 0x12, 0x35, 0x35, 0x35, 0x2F, 0x2F, 0x2F, 0x26, 0x26, 0x26, 0xAE, 0x06,
|
||||
0x9D, 0x32, 0xAE, 0x34, 0x83, 0x5A, 0x1B, 0x1B, 0x30, 0xAE, 0x05, 0xB7, 0x43, 0xCD, 0x05, 0xAE,
|
||||
0x10, 0x82, 0x29, 0xAC, 0x09, 0xAE, 0x1F, 0xB7, 0x0A, 0xAE, 0x06, 0x3F, 0x2A, 0x19, 0x1B, 0x40,
|
||||
0x17, 0x1C, 0x59, 0x14, 0x1C, 0x6B, 0x12, 0x1D, 0x6F, 0x11, 0x1D, 0x6E, 0x11, 0x1D, 0x64, 0x12,
|
||||
0x1D, 0x4E, 0x15, 0x1C, 0xAE, 0x06, 0xB6, 0x4B, 0xAE, 0x51, 0xAC, 0x38, 0x1D, 0xAE, 0x05, 0xC6,
|
||||
0x25, 0x4C, 0xAE, 0x14, 0xB4, 0x61, 0xD2, 0x04, 0xAE, 0x07, 0xB7, 0x0A, 0xAE, 0x1E, 0xA2, 0x55,
|
||||
0x27, 0xAE, 0x05, 0xC3, 0x0D, 0x52, 0xAE, 0x05, 0xD5, 0x3D, 0x6F, 0x11, 0x1D, 0x6F, 0x11, 0x1D,
|
||||
0x67, 0x12, 0x1D, 0x54, 0x14, 0x1C, 0x3B, 0x17, 0xAE, 0x04, 0x3C, 0x22, 0x1F, 0x1F, 0x2C, 0x2C,
|
||||
0x2C, 0x41, 0x41, 0x41, 0x59, 0x59, 0x59, 0xB6, 0xB6, 0xB6, 0xAE, 0x06, 0xB0, 0x09, 0x90, 0x90,
|
||||
0x90, 0x45, 0x45, 0x45, 0x3D, 0x3D, 0x3D, 0xAE, 0x06, 0x82, 0x74, 0xAE, 0x06, 0xBB, 0x23, 0x33,
|
||||
0xAE, 0x04, 0x04, 0x33, 0x35, 0x35, 0x35, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x94, 0x94, 0x94,
|
||||
0xAE, 0x0C, 0x8E, 0x68, 0xAE, 0x06, 0x8B, 0x0E, 0x55, 0x55, 0x55, 0xF5, 0xF5, 0xF5, 0x89, 0x89,
|
||||
0x89, 0x3D, 0x3D, 0x3D, 0x28, 0x28, 0x28, 0xAE, 0x0C, 0x92, 0x7B, 0xAE, 0x0C, 0x0C, 0xAE, 0x12,
|
||||
0x12, 0xAE, 0x06, 0xBB, 0x77, 0xAE, 0x09, 0xA5, 0x79, 0xAE, 0x33, 0x83, 0x5A, 0xAE, 0x09, 0xB7,
|
||||
0x0A, 0xB3, 0xAE, 0x11, 0xC2, 0x4E, 0xAE, 0x09, 0x82, 0x29, 0xAE, 0x1E, 0x8A, 0x55, 0x38, 0xAE,
|
||||
0x17, 0xB2, 0x3B, 0x73, 0x12, 0x1D, 0xAE, 0x1B, 0x3C, 0xAE, 0x3C, 0xB0, 0x12, 0x25, 0x1A, 0x1B,
|
||||
0x42, 0x16, 0x1C, 0x88, 0xAE, 0x14, 0xB0, 0x12, 0x52, 0x15, 0x1C, 0x2D, 0xAE, 0x1A, 0xB5, 0x1D,
|
||||
0xAE, 0x09, 0xBD, 0x0D, 0x52, 0x14, 0x1C, 0xC3, 0xAE, 0x12, 0xA5, 0x43, 0x0B, 0x1E, 0x2F, 0x1B,
|
||||
0x1D, 0x29, 0x26, 0x26, 0x3B, 0x3B, 0x3B, 0x56, 0x56, 0x56, 0xC7, 0xC7, 0xC7, 0xF5, 0xF5, 0xF5,
|
||||
0x9E, 0x9E, 0x9E, 0x42, 0x42, 0x42, 0x34, 0x34, 0x34, 0x2B, 0x2B, 0x2B, 0xAE, 0x0C, 0xAB, 0x1C,
|
||||
0xAE, 0x09, 0xC1, 0x44, 0x20, 0x20, 0x20, 0xAE, 0x06, 0x9D, 0x50, 0xAE, 0x06, 0x99, 0x76, 0xAE,
|
||||
0x09, 0x96, 0x1C, 0xAE, 0x06, 0x99, 0x28, 0x52, 0x52, 0x52, 0xDE, 0xDE, 0xDE, 0xB1, 0xB1, 0xB1,
|
||||
0x3A, 0x3A, 0x3A, 0xAE, 0x21, 0x91, 0x74, 0xAE, 0x1C, 0x8E, 0x35, 0xAE, 0x32, 0x83, 0x5A, 0x1C,
|
||||
0xAE, 0x05, 0xDB, 0x04, 0x42, 0x16, 0x1C, 0x87, 0xAE, 0x14, 0x82, 0x29, 0x58, 0x14, 0x1C, 0x31,
|
||||
0x18, 0x1B, 0xAE, 0x18, 0x8B, 0x11, 0x1D, 0x1B, 0x1B, 0x28, 0x19, 0x1B, 0x48, 0x16, 0x1C, 0x74,
|
||||
0xAE, 0x14, 0xB9, 0x6F, 0xAE, 0x5A, 0xB7, 0x46, 0x21, 0xAE, 0x05, 0x90, 0x1C, 0x65, 0x12, 0xAE,
|
||||
0x13, 0x93, 0x76, 0x7D, 0x10, 0x1D, 0xAE, 0x1B, 0xBC, 0x51, 0xAE, 0x06, 0xB8, 0x77, 0x3F, 0xAE,
|
||||
0x17, 0xAA, 0x4E, 0x8A, 0x0F, 0x1D, 0x31, 0x1D, 0x1F, 0x31, 0x2F, 0x2F, 0x49, 0x49, 0x49, 0x9A,
|
||||
0x9A, 0x9A, 0xAE, 0x06, 0x83, 0x57, 0x3D, 0x3D, 0x3D, 0x2A, 0x2A, 0x2A, 0x20, 0x20, 0x20, 0xAE,
|
||||
0x18, 0xA5, 0x0A, 0x1D, 0x1D, 0x1D, 0x2A, 0x2A, 0x2A, 0x46, 0x46, 0x46, 0x8D, 0x8D, 0x8D, 0xAE,
|
||||
0x12, 0x99, 0x76, 0x4E, 0x4E, 0x4E, 0xD6, 0xD6, 0xD6, 0xBB, 0xBB, 0xBB, 0xAE, 0x0C, 0xA5, 0x1C,
|
||||
0xAE, 0x66, 0x83, 0x5A, 0xAE, 0x06, 0x82, 0x29, 0x37, 0xAE, 0x05, 0xA7, 0x30, 0xAE, 0x12, 0xB9,
|
||||
0x6F, 0x9B, 0x0C, 0x1E, 0x43, 0x16, 0x1C, 0x28, 0xAE, 0x14, 0x86, 0x06, 0xAE, 0x06, 0xC1, 0x23,
|
||||
0x35, 0xAE, 0x05, 0xB4, 0x28, 0xAD, 0xAE, 0x11, 0x87, 0x70, 0xE1, 0x03, 0xAE, 0x1F, 0xB2, 0x77,
|
||||
0xAE, 0x3D, 0xBE, 0x7A, 0x1B, 0x1B, 0x2F, 0xAE, 0x05, 0xD9, 0x4D, 0xCC, 0xAE, 0x11, 0x8C, 0x42,
|
||||
0xC2, 0x06, 0x1F, 0x4D, 0xAE, 0x06, 0xC9, 0x52, 0xAE, 0x14, 0x83, 0x5D, 0x1F, 0xAE, 0x05, 0xCA,
|
||||
0x3E, 0x51, 0x15, 0x1C, 0x85, 0xAE, 0x11, 0x85, 0x47, 0xFF, 0x00, 0x20, 0x4B, 0x15, 0x1C, 0x2F,
|
||||
0x1F, 0x21, 0x38, 0x37, 0x37, 0x54, 0x54, 0x54, 0xDF, 0xDF, 0xDF, 0xC5, 0xC5, 0xC5, 0xAE, 0x06,
|
||||
0x83, 0x27, 0xAE, 0x1B, 0xAB, 0x1C, 0xAE, 0x06, 0xA1, 0x12, 0x2B, 0x2B, 0x2B, 0x49, 0x49, 0x49,
|
||||
0xAE, 0x06, 0x9D, 0x50, 0xAE, 0x09, 0x8B, 0x0E, 0xAE, 0x06, 0xA1, 0x2A, 0x48, 0x48, 0x48, 0xB4,
|
||||
0xB4, 0xB4, 0xDE, 0xDE, 0xDE, 0x48, 0x48, 0x48, 0xAE, 0x21, 0xA4, 0x36, 0xAE, 0x51, 0x83, 0x5A,
|
||||
0xAE, 0x06, 0xDF, 0x50, 0xAE, 0x15, 0x8B, 0x11, 0xEA, 0x02, 0x1F, 0x62, 0x13, 0x1D, 0x3D, 0xAE,
|
||||
0x05, 0xD4, 0x66, 0x20, 0xAE, 0x05, 0x94, 0x3E, 0x1E, 0xAE, 0x08, 0xAE, 0x4C, 0x23, 0xAE, 0x05,
|
||||
0xDC, 0x2C, 0x4B, 0x15, 0x1C, 0x74, 0x10, 0xAE, 0x13, 0xAB, 0x43, 0xB2, 0x09, 0x1E, 0x37, 0xAE,
|
||||
0x1D, 0x99, 0x01, 0xAE, 0x3C, 0x83, 0x5A, 0xAE, 0x06, 0x8E, 0x2C, 0x43, 0xAE, 0x14, 0x88, 0x68,
|
||||
0xF8, 0x01, 0x20, 0x83, 0x0F, 0x1D, 0x45, 0x16, 0x1C, 0x2D, 0xAE, 0x05, 0xB4, 0x6D, 0xAE, 0x06,
|
||||
0xAF, 0x6B, 0xAE, 0x06, 0x81, 0x31, 0x21, 0xAE, 0x05, 0xB5, 0x11, 0x43, 0xAE, 0x05, 0xD3, 0x20,
|
||||
0xBE, 0x07, 0xAE, 0x10, 0x81, 0x6A, 0xD8, 0x04, 0x1F, 0x3F, 0x17, 0x1C, 0x2C, 0x22, 0x23, 0x3C,
|
||||
0x3C, 0x3C, 0xAE, 0x06, 0x91, 0x77, 0x94, 0x94, 0x94, 0xAE, 0x25, 0x91, 0x29, 0xAE, 0x05, 0x87,
|
||||
0x1C, 0x52, 0x52, 0x52, 0xAE, 0x06, 0x8E, 0x68, 0xAE, 0x09, 0x92, 0x42, 0xAE, 0x06, 0xAD, 0x03,
|
||||
0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0xF5, 0xF5, 0xF5, 0x6F, 0x6F, 0x6F, 0x38, 0x38, 0x38, 0xAE,
|
||||
0x1B, 0xB0, 0x5D, 0xAE, 0x54, 0x83, 0x5A, 0xAE, 0x06, 0x89, 0x24, 0x3C, 0xAE, 0x05, 0xE7, 0x04,
|
||||
0xAE, 0x12, 0xB0, 0x18, 0xD4, 0x04, 0x1F, 0x62, 0x13, 0x1D, 0x46, 0x16, 0x1C, 0x35, 0x18, 0x1C,
|
||||
0x2E, 0xAE, 0x05, 0xED, 0x52, 0x2C, 0x19, 0x1B, 0x31, 0x18, 0x1B, 0x3B, 0x17, 0x1C, 0x50, 0x15,
|
||||
0x1C, 0x6F, 0x11, 0x1D, 0xAE, 0x12, 0x87, 0x31, 0xFF, 0x00, 0x20, 0x6E, 0x12, 0x1D, 0x2C, 0xAE,
|
||||
0x1D, 0x8D, 0x70, 0xAE, 0x3F, 0xA9, 0x56, 0x20, 0xAE, 0x05, 0x9D, 0x56, 0x5A, 0xAE, 0x14, 0x8F,
|
||||
0x60, 0xEA, 0x02, 0x1F, 0x77, 0x11, 0x1D, 0x4B, 0x15, 0x1C, 0x39, 0x18, 0x1C, 0xAE, 0x06, 0xEF,
|
||||
0x03, 0x2B, 0xAE, 0x05, 0xEF, 0x12, 0x39, 0x18, 0x1C, 0x49, 0x15, 0x1C, 0x67, 0x12, 0x1D, 0x92,
|
||||
0x0D, 0xAE, 0x13, 0x81, 0x67, 0xA4, 0x0B, 0x1E, 0x33, 0x18, 0x1C, 0x28, 0x23, 0x24, 0x3E, 0x3E,
|
||||
0x3E, 0x80, 0x80, 0x80, 0xF5, 0xF5, 0xF5, 0x87, 0x87, 0x87, 0x36, 0x36, 0x36, 0xAE, 0x06, 0xB2,
|
||||
0x6B, 0xAE, 0x1B, 0xA1, 0x4B, 0x25, 0x25, 0x25, 0x3D, 0x3D, 0x3D, 0x61, 0x61, 0x61, 0xBD, 0xBD,
|
||||
0xBD, 0xF5, 0xF5, 0xF5, 0x49, 0x49, 0x49, 0xAE, 0x06, 0x83, 0x5A, 0xAE, 0x06, 0x92, 0x45, 0xAE,
|
||||
0x06, 0xA4, 0x39, 0xE6, 0xE6, 0xE6, 0xC5, 0xC5, 0xC5, 0x46, 0x46, 0x46, 0x2C, 0x2C, 0x2C, 0xAE,
|
||||
0x1E, 0x88, 0x02, 0xAE, 0x0C, 0xA6, 0x05, 0xAE, 0x0C, 0xB8, 0x38, 0xAE, 0x36, 0x83, 0x5A, 0xAE,
|
||||
0x06, 0x89, 0x60, 0x2D, 0x19, 0x1B, 0x4D, 0x15, 0x1C, 0xB1, 0xAE, 0x14, 0x83, 0x27, 0xD4, 0x04,
|
||||
0x1F, 0x7D, 0x10, 0x1D, 0x5F, 0x13, 0x1C, 0x53, 0x14, 0x1C, 0x50, 0x15, 0x1C, 0x52, 0x15, 0x1C,
|
||||
0x59, 0x14, 0x1C, 0x68, 0x12, 0x1D, 0x78, 0x10, 0x1D, 0xBE, 0xAE, 0x14, 0xD5, 0x16, 0xCE, 0x05,
|
||||
0x1F, 0x3B, 0xAE, 0x05, 0x98, 0x7E, 0xAE, 0x54, 0x9D, 0x50, 0xAE, 0x0C, 0xD2, 0x70, 0x43, 0x16,
|
||||
0x1C, 0x84, 0xAE, 0x14, 0x8A, 0x58, 0xEA, 0x02, 0x1F, 0x8B, 0x0E, 0x1D, 0x63, 0x12, 0x1D, 0x55,
|
||||
0xAE, 0x05, 0x81, 0x31, 0x50, 0x15, 0x1C, 0x56, 0x14, 0x1C, 0x63, 0x12, 0x1D, 0x74, 0x10, 0x1D,
|
||||
0xA5, 0x0A, 0xAE, 0x13, 0xD5, 0x16, 0xF0, 0x01, 0x20, 0x45, 0xAE, 0x05, 0x90, 0x16, 0x25, 0x23,
|
||||
0x23, 0x3B, 0x3B, 0x3B, 0x66, 0x66, 0x66, 0xAE, 0x06, 0x95, 0x51, 0xAE, 0x1E, 0x91, 0x77, 0x1D,
|
||||
0x1D, 0x1D, 0x23, 0x23, 0x23, 0x31, 0x31, 0x31, 0x4F, 0x4F, 0x4F, 0x7D, 0x7D, 0x7D, 0xEF, 0xEF,
|
||||
0xEF, 0xAE, 0x0F, 0x83, 0x5A, 0xAE, 0x06, 0x8B, 0x29, 0x44, 0x44, 0x44, 0xA1, 0xA1, 0xA1, 0xF5,
|
||||
0xF5, 0xF5, 0x72, 0x72, 0x72, 0x3C, 0x3C, 0x3C, 0xAE, 0x12, 0xC9, 0x64, 0xAE, 0x0F, 0x8B, 0x5C,
|
||||
0x22, 0x22, 0x22, 0x28, 0x28, 0x28, 0xAE, 0x06, 0xBE, 0x4D, 0xAE, 0x09, 0xBA, 0x7C, 0xAE, 0x39,
|
||||
0x83, 0x5A, 0xAE, 0x06, 0xC0, 0x6A, 0x37, 0x18, 0x1C, 0x5A, 0x14, 0x1C, 0xDB, 0xAE, 0x14, 0xDA,
|
||||
0x6F, 0xF8, 0x01, 0x20, 0xCD, 0x05, 0x1F, 0xAC, 0x09, 0x1E, 0xA2, 0x0B, 0x1E, 0xA3, 0x0B, 0x1E,
|
||||
0xAD, 0x09, 0x1E, 0xCD, 0x05, 0xAE, 0x16, 0xDC, 0x4A, 0xF8, 0x01, 0x20, 0x5A, 0x14, 0x1C, 0x2C,
|
||||
0xAE, 0x20, 0xDE, 0x73, 0xAE, 0x42, 0xB1, 0x0A, 0x20, 0xAE, 0x05, 0x8C, 0x0F, 0x50, 0x15, 0x1C,
|
||||
0xBA, 0xAE, 0x11, 0x8A, 0x5B, 0xAE, 0x06, 0x06, 0xD5, 0x04, 0x1F, 0xB5, 0x08, 0xAE, 0x07, 0xEF,
|
||||
0x4B, 0xA3, 0x0A, 0x1E, 0xC5, 0x06, 0x1F, 0xAE, 0x18, 0xE7, 0x76, 0x8B, 0x0F, 0x1D, 0x31, 0x18,
|
||||
0xAE, 0x04, 0x51, 0xAE, 0x06, 0x86, 0x66, 0x53, 0x53, 0x53, 0xEE, 0xEE, 0xEE, 0xAC, 0xAC, 0xAC,
|
||||
0x47, 0x47, 0x47, 0x2D, 0x2D, 0x2D, 0xAE, 0x06, 0xC4, 0x7D, 0xAE, 0x12, 0xA8, 0x76, 0x27, 0x27,
|
||||
0x27, 0x33, 0x33, 0x33, 0x46, 0x46, 0x46, 0x62, 0x62, 0x62, 0xDB, 0xDB, 0xDB, 0xE2, 0xE2, 0xE2,
|
||||
0xAE, 0x0F, 0x83, 0x5A, 0x1C, 0x1C, 0x1C, 0x23, 0x23, 0x23, 0x35, 0x35, 0x35, 0x4F, 0x4F, 0x4F,
|
||||
0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0xDE, 0x52, 0x52, 0x52, 0x3A, 0x3A, 0x3A, 0x29, 0x29, 0x29, 0xAE,
|
||||
0x12, 0x93, 0x13, 0xAE, 0x09, 0x54, 0x32, 0x32, 0x32, 0x3A, 0x3A, 0x3A, 0x4C, 0x4C, 0x4C, 0x2F,
|
||||
0x2F, 0x2F, 0x23, 0x23, 0x23, 0xAE, 0x07, 0xC2, 0x21, 0xAE, 0x38, 0x83, 0x5A, 0xAE, 0x06, 0x8E,
|
||||
0x6E, 0x27, 0xAE, 0x05, 0xBB, 0x2C, 0x6E, 0x12, 0xAE, 0x13, 0x92, 0x4B, 0xAE, 0x2A, 0xE3, 0x7E,
|
||||
0x7D, 0x11, 0x1D, 0x32, 0xAE, 0x05, 0xD8, 0x6A, 0xAE, 0x57, 0xBE, 0x7A, 0xAE, 0x0F, 0x85, 0x0E,
|
||||
0x36, 0xAE, 0x05, 0xD9, 0x74, 0xD3, 0xAE, 0x32, 0xE9, 0x06, 0xAE, 0x09, 0x09, 0xA5, 0x0B, 0x1E,
|
||||
0x39, 0xAE, 0x05, 0xCB, 0x6F, 0x1D, 0xAE, 0x05, 0x8E, 0x35, 0x2D, 0x2D, 0x2D, 0x48, 0x48, 0x48,
|
||||
0xC6, 0xC6, 0xC6, 0xE7, 0xE7, 0xE7, 0x67, 0x67, 0x67, 0x42, 0x42, 0x42, 0x30, 0x30, 0x30, 0x26,
|
||||
0x26, 0x26, 0xAE, 0x06, 0x9C, 0x64, 0x21, 0x21, 0x21, 0xAE, 0x06, 0xAC, 0x47, 0x30, 0x30, 0x30,
|
||||
0x3B, 0x3B, 0x3B, 0x4A, 0x4A, 0x4A, 0x5A, 0x5A, 0x5A, 0xC8, 0xC8, 0xC8, 0xE1, 0xE1, 0xE1, 0xA8,
|
||||
0xA8, 0xA8, 0xAE, 0x06, 0x83, 0x5A, 0x2C, 0x2C, 0x2C, 0xAE, 0x09, 0x84, 0x0A, 0xAE, 0x06, 0xC6,
|
||||
0x2E, 0x3C, 0x3C, 0x3C, 0x6F, 0x6F, 0x6F, 0xEE, 0xEE, 0xEE, 0xC6, 0xC6, 0xC6, 0x53, 0x53, 0x53,
|
||||
0xAE, 0x06, 0xD1, 0x6C, 0x28, 0x28, 0x28, 0x23, 0x23, 0x23, 0xAE, 0x09, 0x54, 0x27, 0x27, 0x27,
|
||||
0x2F, 0x2F, 0x2F, 0x3B, 0x3B, 0x3B, 0x49, 0x49, 0x49, 0x5F, 0x5F, 0x5F, 0xDB, 0xDB, 0xDB, 0x91,
|
||||
0x91, 0x91, 0xAE, 0x09, 0xCE, 0x33, 0xAE, 0x3C, 0x83, 0x5A, 0xAE, 0x06, 0x8B, 0x14, 0x29, 0x19,
|
||||
0x1B, 0x3F, 0x17, 0x1C, 0x6D, 0x12, 0xAE, 0x13, 0x8D, 0x40, 0xAE, 0x27, 0x83, 0x57, 0x35, 0x18,
|
||||
0x1C, 0x24, 0xAE, 0x23, 0xED, 0x5B, 0xAE, 0x06, 0xB4, 0x64, 0x6E, 0xAE, 0x14, 0x83, 0x5A, 0x4D,
|
||||
0xAE, 0x05, 0xCD, 0x26, 0xAE, 0x27, 0x85, 0x0E, 0x26, 0xAE, 0x05, 0x9A, 0x02, 0x56, 0x14, 0x1C,
|
||||
0xCA, 0xAE, 0x11, 0x96, 0x28, 0xAE, 0x24, 0x81, 0x34, 0xA4, 0x0B, 0x1E, 0x3B, 0x17, 0x1C, 0x27,
|
||||
0xAE, 0x08, 0xC7, 0x59, 0xAE, 0x06, 0x8E, 0x38, 0x39, 0x39, 0x39, 0x61, 0x61, 0x61, 0xEE, 0xEE,
|
||||
0xEE, 0xDF, 0xDF, 0xDF, 0x69, 0x69, 0x69, 0x4B, 0x4B, 0x4B, 0x3F, 0x3F, 0x3F, 0x39, 0x39, 0x39,
|
||||
0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x3A, 0x3A, 0x3A, 0x41, 0x41, 0x41, 0x4A, 0x4A, 0x4A, 0x54,
|
||||
0x54, 0x54, 0x81, 0x81, 0x81, 0xAE, 0x06, 0x87, 0x0D, 0x71, 0x71, 0x71, 0xAE, 0x06, 0xB0, 0x12,
|
||||
0x4A, 0x4A, 0x4A, 0x2F, 0x2F, 0x2F, 0xAE, 0x0C, 0x87, 0x10, 0x1F, 0x1F, 0x1F, 0x2B, 0x2B, 0x2B,
|
||||
0x3F, 0x3F, 0x3F, 0x7C, 0x7C, 0x7C, 0xEE, 0xEE, 0xEE, 0xD7, 0xD7, 0xD7, 0x74, 0x74, 0x74, 0x4D,
|
||||
0x4D, 0x4D, 0x41, 0x41, 0x41, 0x3A, 0x3A, 0x3A, 0xAE, 0x06, 0x54, 0x39, 0x39, 0x39, 0x40, 0x40,
|
||||
0x40, 0x49, 0x49, 0x49, 0x55, 0x55, 0x55, 0x80, 0x80, 0x80, 0xDD, 0xDD, 0xDD, 0xC0, 0xC0, 0xC0,
|
||||
0x31, 0x31, 0x31, 0xAE, 0x09, 0x92, 0x72, 0x20, 0x20, 0x20, 0x34, 0x34, 0x34, 0x4F, 0x4F, 0x4F,
|
||||
0xD6, 0xD6, 0xD6, 0xAF, 0xAF, 0xAF, 0xAE, 0x06, 0x93, 0x0D, 0xAE, 0x2E, 0xEB, 0x38, 0xAE, 0x05,
|
||||
0x9D, 0x23, 0x3A, 0x17, 0x1C, 0x55, 0x14, 0x1C, 0xC0, 0x07, 0x1F, 0xAE, 0x2A, 0xF2, 0x66, 0xCE,
|
||||
0x05, 0x1F, 0x5B, 0x14, 0x1C, 0x32, 0xAE, 0x26, 0x83, 0x57, 0xAE, 0x09, 0x9D, 0x14, 0x63, 0xAE,
|
||||
0x14, 0xD5, 0x4F, 0xAE, 0x06, 0x8D, 0x73, 0xAE, 0x2A, 0x88, 0x6B, 0xAE, 0x06, 0xCE, 0x63, 0x4E,
|
||||
0x15, 0x1C, 0xA2, 0xAE, 0x14, 0xE3, 0x5A, 0xAE, 0x18, 0x81, 0x31, 0xE0, 0x03, 0x1F, 0x7D, 0x11,
|
||||
0x1D, 0x38, 0xAE, 0x08, 0xFB, 0x51, 0xAE, 0x0C, 0x83, 0x09, 0x2A, 0x2A, 0x2A, 0x3E, 0x3E, 0x3E,
|
||||
0xAE, 0x06, 0x83, 0x09, 0xE7, 0xE7, 0xE7, 0xA3, 0xA3, 0xA3, 0x67, 0x67, 0x67, 0x55, 0x55, 0x55,
|
||||
0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x55, 0x55, 0x55, 0x5A, 0x5A, 0x5A, 0x97, 0x97, 0x97, 0xC5,
|
||||
0xC5, 0xC5, 0xF5, 0xF5, 0xF5, 0xB8, 0xB8, 0xB8, 0x57, 0x57, 0x57, 0x4B, 0x4B, 0x4B, 0x7E, 0x7E,
|
||||
0x7E, 0xF5, 0xF5, 0xF5, 0x7F, 0x7F, 0x7F, 0xAE, 0x06, 0xBA, 0x52, 0xAE, 0x12, 0xD1, 0x3F, 0x3E,
|
||||
0x3E, 0x3E, 0x7A, 0x7A, 0x7A, 0xDE, 0xDE, 0xDE, 0xEE, 0xEE, 0xEE, 0xBD, 0xBD, 0xBD, 0x75, 0x75,
|
||||
0x75, 0x56, 0x56, 0x56, 0xAE, 0x06, 0x54, 0x54, 0x54, 0x54, 0x59, 0x59, 0x59, 0x82, 0x82, 0x82,
|
||||
0xAE, 0x06, 0x54, 0xB7, 0xB7, 0xB7, 0xAE, 0x0F, 0xD5, 0x19, 0xAE, 0x06, 0xD5, 0x16, 0x47, 0x47,
|
||||
0x47, 0xD4, 0xD4, 0xD4, 0xAC, 0xAC, 0xAC, 0x33, 0x33, 0x33, 0xAE, 0x21, 0xBF, 0x45, 0xAE, 0x15,
|
||||
0x83, 0x5D, 0x25, 0xAE, 0x05, 0xA3, 0x29, 0x45, 0x16, 0x1C, 0x68, 0x12, 0x1C, 0xBF, 0x07, 0xAE,
|
||||
0x16, 0x8E, 0x50, 0xAE, 0x09, 0x87, 0x28, 0xCF, 0x05, 0x1F, 0x7D, 0x10, 0x1D, 0x3D, 0x17, 0x1C,
|
||||
0xAE, 0x06, 0xEA, 0x49, 0xAE, 0x27, 0xF5, 0x09, 0xAE, 0x06, 0xCD, 0x29, 0x4C, 0x15, 0x1C, 0xAE,
|
||||
0x12, 0x54, 0xAE, 0x06, 0xEE, 0x6B, 0xAE, 0x2D, 0xEC, 0x6F, 0x23, 0xAE, 0x05, 0x9D, 0x29, 0x3F,
|
||||
0xAE, 0x05, 0x85, 0x11, 0xAC, 0x0A, 0x1E, 0xE9, 0xAE, 0x1D, 0x8C, 0x4E, 0xD8, 0x04, 0x1F, 0x98,
|
||||
0x0D, 0x1D, 0x41, 0x16, 0x1C, 0x30, 0x18, 0x1B, 0x24, 0xAE, 0x11, 0xCF, 0x07, 0xAE, 0x06, 0x83,
|
||||
0x09, 0x2B, 0x2B, 0x2B, 0xAE, 0x06, 0xAF, 0x50, 0xC4, 0xC4, 0xC4, 0xAE, 0x06, 0xAF, 0x6B, 0xDE,
|
||||
0xDE, 0xDE, 0xAE, 0x06, 0xB3, 0x09, 0xAE, 0x06, 0xD8, 0x7C, 0xED, 0xED, 0xED, 0xC2, 0xC2, 0xC2,
|
||||
0x72, 0x72, 0x72, 0x37, 0x37, 0x37, 0x2F, 0x2F, 0x2F, 0x35, 0x35, 0x35, 0x41, 0x41, 0x41, 0xAE,
|
||||
0x06, 0xA1, 0x5D, 0x2A, 0x2A, 0x2A, 0xAE, 0x0F, 0x9D, 0x38, 0xAE, 0x06, 0x54, 0x29, 0x29, 0x29,
|
||||
0x38, 0x38, 0x38, 0x48, 0x48, 0x48, 0x9E, 0x9E, 0x9E, 0xAE, 0x06, 0x45, 0xEE, 0xEE, 0xEE, 0xAE,
|
||||
0x09, 0xB3, 0x60, 0xAE, 0x06, 0x66, 0xCB, 0xCB, 0xCB, 0x7F, 0x7F, 0x7F, 0x36, 0x36, 0x36, 0xAE,
|
||||
0x06, 0x83, 0x57, 0xAE, 0x09, 0x8B, 0x56, 0x1F, 0x1F, 0x1F, 0x29, 0x29, 0x29, 0x39, 0x39, 0x39,
|
||||
0xD2, 0xD2, 0xD2, 0xA8, 0xA8, 0xA8, 0xAE, 0x1E, 0xCA, 0x02, 0xAE, 0x1E, 0x94, 0x7A, 0xAE, 0x06,
|
||||
0x81, 0x83, 0x74, 0x33, 0x18, 0x1C, 0x40, 0x17, 0x1C, 0x4D, 0x15, 0x1C, 0x75, 0x11, 0x1D, 0x9E,
|
||||
0x0C, 0xAE, 0x07, 0xEE, 0x53, 0xBD, 0xAE, 0x05, 0xEE, 0x17, 0x90, 0x0E, 0x1D, 0x7E, 0x10, 0xAE,
|
||||
0x07, 0xEA, 0x16, 0x2F, 0xAE, 0x05, 0xCF, 0x79, 0xAE, 0x1B, 0x81, 0x88, 0x19, 0xAE, 0x18, 0xD5,
|
||||
0x4F, 0x32, 0x18, 0x1C, 0x41, 0x16, 0x1C, 0x4B, 0x15, 0x1C, 0x4F, 0x15, 0xAE, 0x07, 0x81, 0x85,
|
||||
0x79, 0x39, 0xAE, 0x05, 0xE7, 0x10, 0xAE, 0x30, 0x81, 0x35, 0xAE, 0x06, 0xAF, 0x68, 0x26, 0xAE,
|
||||
0x05, 0x92, 0x54, 0x3D, 0x17, 0x1C, 0x49, 0x15, 0x1C, 0x65, 0x13, 0x1C, 0x92, 0x0E, 0xAE, 0x0A,
|
||||
0xF0, 0x04, 0xBC, 0x07, 0x1F, 0x9C, 0x0C, 0x1D, 0x8C, 0x0F, 0x1D, 0x4B, 0x15, 0x1C, 0x3E, 0xAE,
|
||||
0x09, 0xB1, 0x31, 0xAE, 0x18, 0xA5, 0x2B, 0xAE, 0x05, 0xB7, 0x43, 0x28, 0x28, 0x28, 0x32, 0x32,
|
||||
0x32, 0x3F, 0x3F, 0x3F, 0x59, 0x59, 0x59, 0x85, 0x85, 0x85, 0xAE, 0x06, 0xB3, 0x06, 0xAF, 0xAF,
|
||||
0xAF, 0x9B, 0x9B, 0x9B, 0x81, 0x81, 0x81, 0x41, 0x41, 0x41, 0x37, 0x37, 0x37, 0x2D, 0x2D, 0x2D,
|
||||
0x25, 0x25, 0x25, 0x21, 0x21, 0x21, 0x25, 0x25, 0x25, 0x2C, 0x2C, 0x2C, 0x30, 0x30, 0x30, 0x2B,
|
||||
0x2B, 0x2B, 0x22, 0x22, 0x22, 0xAE, 0x15, 0xDC, 0x50, 0xAE, 0x0C, 0xE3, 0x7E, 0x45, 0x45, 0x45,
|
||||
0x77, 0x77, 0x77, 0x9C, 0x9C, 0x9C, 0xAE, 0x06, 0x54, 0xAF, 0xAF, 0xAF, 0x82, 0x82, 0x82, 0x53,
|
||||
0x53, 0x53, 0xAE, 0x06, 0xD5, 0x7F, 0xAE, 0x06, 0x96, 0x16, 0xAE, 0x12, 0xE0, 0x66, 0xAE, 0x09,
|
||||
0xE3, 0x7E, 0xAE, 0x09, 0x92, 0x5A, 0xAE, 0x39, 0xFE, 0x03, 0x1F, 0x1A, 0x1B, 0x25, 0x1A, 0x1B,
|
||||
0x2A, 0xAE, 0x05, 0xD4, 0x72, 0x36, 0x18, 0x1C, 0x3A, 0xAE, 0x05, 0xB2, 0x17, 0x3A, 0x17, 0x1C,
|
||||
0x38, 0x18, 0x1C, 0x33, 0xAE, 0x05, 0x9D, 0x5F, 0xAE, 0x07, 0x81, 0x8B, 0x2E, 0xAE, 0x35, 0x81,
|
||||
0x87, 0x4B, 0x1E, 0xAE, 0x08, 0x81, 0x8C, 0x05, 0x28, 0x19, 0xAE, 0x04, 0x63, 0x29, 0xAE, 0x3E,
|
||||
0x4E, 0xAE, 0x09, 0xD6, 0x23, 0x23, 0xAE, 0x05, 0x51, 0x2F, 0xAE, 0x05, 0xF3, 0x64, 0x39, 0xAE,
|
||||
0x05, 0x81, 0x31, 0x3B, 0x17, 0x1C, 0x39, 0x18, 0x1C, 0x34, 0xAE, 0x05, 0x9D, 0x5F, 0x29, 0x19,
|
||||
0x1B, 0x24, 0xAE, 0x05, 0x83, 0x54, 0xAE, 0x21, 0x82, 0x18, 0x1E, 0x1E, 0x1E, 0xAE, 0x06, 0x82,
|
||||
0x4D, 0x2E, 0x2E, 0x2E, 0x33, 0x33, 0x33, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37,
|
||||
0x33, 0x33, 0x33, 0x2F, 0x2F, 0x2F, 0xAE, 0x06, 0x92, 0x00, 0xAE, 0x06, 0x86, 0x57, 0xAE, 0x09,
|
||||
0x9D, 0x02, 0xAE, 0x09, 0xAF, 0x47, 0xAE, 0x21, 0xBB, 0x77, 0x2B, 0x2B, 0x2B, 0x31, 0x31, 0x31,
|
||||
0x35, 0x35, 0x35, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x35, 0x35, 0x35, 0x30, 0x30, 0x30, 0x2A,
|
||||
0x2A, 0x2A, 0xAE, 0x06, 0xEB, 0x35, 0xAE, 0x15, 0x83, 0x36, 0xAE, 0x0F, 0xEB, 0x32, 0xAE, 0x48,
|
||||
0x81, 0x81, 0x66, 0x1F, 0xAE, 0x05, 0x87, 0x46, 0xAE, 0x06, 0xB9, 0x51, 0xAE, 0x09, 0xEE, 0x14,
|
||||
0xAE, 0x2A, 0x81, 0x93, 0x1E, 0xAE, 0x78, 0x81, 0x91, 0x70, 0xAE, 0x09, 0x81, 0x31, 0xAE, 0x24,
|
||||
0xBC, 0x33, 0xAE, 0x1E, 0xA0, 0x38, 0xAE, 0x06, 0x95, 0x45, 0xAE, 0x0F, 0xB3, 0x03, 0xAE, 0x3F,
|
||||
0xC3, 0x2E, 0x20, 0x20, 0x20, 0xAE, 0x06, 0x54, 0xAE, 0x0C, 0xDC, 0x02, 0xAE, 0x82, 0x07, 0x81,
|
||||
0x95, 0x34, 0xAE, 0x82, 0x0A, 0x82, 0x0A, 0xAE, 0x84, 0x14, 0x84, 0x14, 0xAE, 0x88, 0x28, 0x88,
|
||||
0x28, 0xAE, 0x82, 0x40, 0x82, 0x40, 0xAE, 0x09, 0x81, 0x83, 0x0E, 0xAE, 0x09, 0x93, 0x2B, 0xAE,
|
||||
0x09, 0x94, 0x08, 0xAE, 0x0F, 0x0F, 0xAE, 0x1E, 0x1E, 0xAE, 0x3C, 0x3C, 0xAE, 0x78, 0x78, 0xAE,
|
||||
0x81, 0x4F, 0x81, 0x4F, 0x20, 0x20, 0x20, 0xAE, 0x06, 0x81, 0x85, 0x43, 0xAE, 0x09, 0xA2, 0x1F,
|
||||
0xAE, 0x06, 0x81, 0x81, 0x75, 0x32, 0x32, 0x32, 0x34, 0x34, 0x34, 0x34, 0xAE, 0x04, 0x04, 0xAE,
|
||||
0x08, 0x08, 0xAE, 0x10, 0x10, 0xAE, 0x20, 0x20, 0xAE, 0x40, 0x40, 0xAE, 0x81, 0x00, 0x81, 0x00,
|
||||
0xAE, 0x81, 0x3C, 0x81, 0x3C, 0xAE, 0x06, 0x9E, 0x69, 0x29, 0x29, 0x29, 0xAE, 0x06, 0xA2, 0x2B,
|
||||
0xAE, 0x06, 0xB8, 0x65, 0x2E, 0x2E, 0x2E, 0x3B, 0x3B, 0x3B, 0x44, 0x44, 0x44, 0x47, 0x47, 0x47,
|
||||
0x47, 0xAE, 0x04, 0x04, 0xAE, 0x08, 0x08, 0xAE, 0x10, 0x10, 0xAE, 0x20, 0x20, 0xAE, 0x40, 0x40,
|
||||
0xAE, 0x81, 0x00, 0x81, 0x00, 0xAE, 0x81, 0x3C, 0x81, 0x3C, 0x45, 0x45, 0x45, 0x3E, 0x3E, 0x3E,
|
||||
0x33, 0x33, 0x33, 0xAE, 0x06, 0xFE, 0x2D, 0xAE, 0x09, 0x81, 0x83, 0x14, 0xAE, 0x06, 0xF3, 0x19,
|
||||
0xAE, 0x06, 0x06, 0xAE, 0x0C, 0x0C, 0xAE, 0x18, 0x18, 0xAE, 0x30, 0x30, 0xAE, 0x60, 0x60, 0xAE,
|
||||
0x81, 0x40, 0x81, 0x40, 0xAE, 0x4B, 0x4B, 0xAE, 0x09, 0xAC, 0x74, 0xAE, 0x06, 0xAD, 0x2D, 0x32,
|
||||
0x32, 0x32, 0x38, 0x38, 0x38, 0xAE, 0x09, 0xE5, 0x2F, 0xAE, 0x09, 0x09, 0xAE, 0x12, 0x12, 0xAE,
|
||||
0x24, 0x24, 0xAE, 0x48, 0x48, 0xAE, 0x81, 0x10, 0x81, 0x10, 0xAE, 0x81, 0x1C, 0x81, 0x1C, 0xAE,
|
||||
0x06, 0xDA, 0x0C, 0x2C, 0x2C, 0x2C, 0xAE, 0x09, 0xAC, 0x56, 0xAE, 0x06, 0xE0, 0x5D, 0xAE, 0x06,
|
||||
0x81, 0x82, 0x7C, 0xAE, 0x06, 0xC3, 0x28, 0xAE, 0x06, 0x06, 0xAE, 0x0C, 0x0C, 0xAE, 0x18, 0x18,
|
||||
0xAE, 0x30, 0x30, 0xAE, 0x60, 0x60, 0xAE, 0x81, 0x40, 0x81, 0x40, 0xAE, 0x3C, 0x3C, 0x27, 0x27,
|
||||
0x27, 0xAE, 0x06, 0xC0, 0x22, 0xAE, 0x42, 0xA9, 0x7D, 0xAE, 0x93, 0x10, 0xA9, 0x65, 0xAE, 0x83,
|
||||
0x33, 0xAD, 0x15, 0xAE, 0x06, 0xC0, 0x3D, 0xAE, 0x06, 0x97, 0x0B, 0xAE, 0x09, 0x81, 0x87, 0x4B,
|
||||
0xAE, 0x06, 0x97, 0x17, 0xAE, 0x06, 0x1E, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0xAE, 0x06, 0xDA,
|
||||
0x5D, 0xAE, 0x06, 0xAD, 0x42, 0xAE, 0x2D, 0xC0, 0x5E, 0xAE, 0x06, 0x9F, 0x13, 0xAE, 0x15, 0x36,
|
||||
0xAE, 0x09, 0xAE, 0x13, 0xAE, 0x48, 0x51, 0xAE, 0x73, 0x81, 0xC7, 0x37, 0xAE, 0x08, 0xC2, 0x7E,
|
||||
0xAE, 0x21, 0x81, 0xAE, 0x66, 0xAE, 0x12, 0xE4, 0x34, 0xAE, 0x5D, 0x81, 0x19, 0xAE, 0x06, 0xF4,
|
||||
0x5F, 0x36, 0x36, 0x36, 0x2B, 0x2B, 0x2B, 0xAE, 0x06, 0x9E, 0x36, 0x2D, 0x2D, 0x2D, 0xAE, 0x06,
|
||||
0x0C, 0xAE, 0x09, 0x1E, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x2F, 0x2F, 0x2F, 0xAE, 0x06, 0x81,
|
||||
0xB3, 0x08, 0x2F, 0x2F, 0x2F, 0xAE, 0x15, 0x81, 0xA8, 0x75, 0xAE, 0x1B, 0x63, 0x31, 0x31, 0x31,
|
||||
0x37, 0x37, 0x37, 0xAE, 0x06, 0x81, 0x96, 0x15, 0xAE, 0x0F, 0x1B, 0xAE, 0x06, 0x81, 0xB4, 0x72,
|
||||
0xAE, 0x2D, 0xF5, 0x3C, 0xAE, 0x1B, 0x51, 0xAE, 0x21, 0x83, 0x03, 0xAE, 0x4E, 0xC5, 0x75, 0xAE,
|
||||
0x06, 0x81, 0x9B, 0x59, 0x2C, 0x2C, 0x2C, 0x2E, 0x2E, 0x2E, 0xAE, 0x1E, 0x81, 0x43, 0x1E, 0x1E,
|
||||
0x1E, 0x27, 0x27, 0x27, 0xAE, 0x06, 0x81, 0xA4, 0x1D, 0xAE, 0x48, 0xCA, 0x26, 0xAE, 0x1E, 0x1E,
|
||||
0x23, 0x23, 0x23, 0x3F, 0x3F, 0x3F, 0xA5, 0xA5, 0xA5, 0x63, 0x63, 0x63, 0x23, 0x23, 0x23, 0x29,
|
||||
0x29, 0x29, 0x6C, 0x6C, 0x6C, 0x83, 0x83, 0x83, 0x24, 0x24, 0x24, 0xAE, 0x06, 0x81, 0x9E, 0x0B,
|
||||
0x41, 0x41, 0x41, 0x93, 0x93, 0x93, 0xAA, 0xAA, 0xAA, 0x8A, 0x8A, 0x8A, 0xAE, 0x06, 0xE2, 0x50,
|
||||
0x9A, 0x9A, 0x9A, 0x46, 0x46, 0x46, 0xAE, 0x2A, 0x82, 0x20, 0x25, 0x25, 0x25, 0x48, 0x48, 0x48,
|
||||
0xBB, 0xBB, 0xBB, 0x31, 0x31, 0x31, 0xAE, 0x12, 0x7E, 0x3D, 0x3D, 0x3D, 0xA3, 0xA3, 0xA3, 0x2B,
|
||||
0x2B, 0x2B, 0xAE, 0x2A, 0x81, 0x34, 0xAE, 0x1B, 0x51, 0xAE, 0x1B, 0x83, 0x03, 0xAE, 0x06, 0xAE,
|
||||
0x7F, 0x2E, 0x2E, 0x2E, 0xAE, 0x30, 0xDB, 0x64, 0xAE, 0x1E, 0x57, 0x25, 0x25, 0x25, 0x4E, 0x4E,
|
||||
0x4E, 0x9A, 0x9A, 0x9A, 0x26, 0x26, 0x26, 0xAE, 0x1E, 0x85, 0x0E, 0x34, 0x34, 0x34, 0x87, 0x87,
|
||||
0x87, 0x60, 0x60, 0x60, 0xAE, 0x12, 0xD9, 0x0B, 0xAE, 0x09, 0x8A, 0x0D, 0x22, 0x22, 0x22, 0xAE,
|
||||
0x09, 0x8A, 0x22, 0xAE, 0x06, 0xE8, 0x44, 0xAE, 0x06, 0x81, 0xA8, 0x24, 0xAE, 0x0F, 0x81, 0xA3,
|
||||
0x3D, 0xAE, 0x1B, 0x1B, 0xAE, 0x06, 0xD2, 0x46, 0x23, 0x23, 0x23, 0x2B, 0x2B, 0x2B, 0x4A, 0x4A,
|
||||
0x4A, 0xA7, 0xA7, 0xA7, 0x67, 0x67, 0x67, 0xAE, 0x06, 0x81, 0xA8, 0x18, 0x56, 0x56, 0x56, 0x68,
|
||||
0x68, 0x68, 0xAE, 0x06, 0x5D, 0x32, 0x32, 0x32, 0x6A, 0x6A, 0x6A, 0xA6, 0xA6, 0xA6, 0x3F, 0x3F,
|
||||
0x3F, 0xAE, 0x06, 0xD0, 0x0E, 0x2E, 0x2E, 0x2E, 0x7B, 0x7B, 0x7B, 0x36, 0x36, 0x36, 0xAE, 0x0C,
|
||||
0xA6, 0x20, 0xAE, 0x0C, 0x8B, 0x2F, 0xAE, 0x0C, 0x88, 0x7D, 0xAE, 0x06, 0x81, 0x28, 0x2E, 0x2E,
|
||||
0x2E, 0x54, 0x54, 0x54, 0xBB, 0xBB, 0xBB, 0x36, 0x36, 0x36, 0xAE, 0x12, 0x83, 0x24, 0x43, 0x43,
|
||||
0x43, 0xA4, 0xA4, 0xA4, 0x33, 0x33, 0x33, 0xAE, 0x12, 0x45, 0xAE, 0x12, 0x60, 0xAE, 0x06, 0x81,
|
||||
0x43, 0x28, 0x28, 0x28, 0x51, 0x51, 0x51, 0xAE, 0x06, 0x51, 0xAE, 0x09, 0x8B, 0x50, 0xAE, 0x0C,
|
||||
0xD1, 0x27, 0xAE, 0x09, 0x81, 0x76, 0xAE, 0x09, 0x33, 0xAE, 0x06, 0x87, 0x67, 0x65, 0x65, 0x65,
|
||||
0x90, 0x90, 0x90, 0xAE, 0x0C, 0xDC, 0x4A, 0xAE, 0x15, 0x60, 0xAE, 0x2D, 0x83, 0x5A, 0x23, 0x23,
|
||||
0x23, 0xAE, 0x06, 0xDD, 0x03, 0x25, 0x25, 0x25, 0xAE, 0x09, 0x81, 0x0D, 0xAE, 0x06, 0x82, 0x5C,
|
||||
0xAE, 0x0C, 0x54, 0xAE, 0x06, 0x81, 0x86, 0x17, 0x8A, 0x8A, 0x8A, 0x63, 0x63, 0x63, 0xAE, 0x0F,
|
||||
0x84, 0x5B, 0xAE, 0x06, 0x45, 0x2D, 0x2D, 0x2D, 0x35, 0x35, 0x35, 0xAE, 0x06, 0x81, 0xAF, 0x40,
|
||||
0x3D, 0x3D, 0x3D, 0x34, 0x34, 0x34, 0x30, 0x30, 0x30, 0x38, 0x38, 0x38, 0x3F, 0x3F, 0x3F, 0x3D,
|
||||
0x3D, 0x3D, 0x2E, 0x2E, 0x2E, 0x21, 0x21, 0x21, 0xAE, 0x06, 0x81, 0x61, 0xAE, 0x06, 0x89, 0x69,
|
||||
0x3A, 0x3A, 0x3A, 0x40, 0x40, 0x40, 0xAE, 0x06, 0x81, 0xAB, 0x57, 0xAE, 0x09, 0xA9, 0x2F, 0xAE,
|
||||
0x06, 0xD7, 0x2D, 0x38, 0x38, 0x38, 0x3E, 0x3E, 0x3E, 0x42, 0x42, 0x42, 0x56, 0x56, 0x56, 0xAE,
|
||||
0x06, 0x83, 0x5A, 0x23, 0x23, 0x23, 0xAE, 0x06, 0x81, 0x8F, 0x08, 0xAE, 0x06, 0x81, 0xBA, 0x54,
|
||||
0x27, 0x27, 0x27, 0x43, 0x43, 0x43, 0x7C, 0x7C, 0x7C, 0x92, 0x92, 0x92, 0x41, 0x41, 0x41, 0xAE,
|
||||
0x06, 0xD7, 0x39, 0x2C, 0x2C, 0x2C, 0xAE, 0x06, 0x81, 0xB7, 0x60, 0xAE, 0x09, 0xE3, 0x0C, 0x32,
|
||||
0x32, 0x32, 0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x3E, 0x34, 0x34, 0x34, 0xAE, 0x06, 0x8B, 0x26, 0xAE,
|
||||
0x06, 0x7E, 0x2D, 0x2D, 0x2D, 0x3B, 0x3B, 0x3B, 0x3E, 0x3E, 0x3E, 0x43, 0x43, 0x43, 0x5D, 0x5D,
|
||||
0x5D, 0xAE, 0x18, 0x83, 0x5A, 0x44, 0x44, 0x44, 0xA5, 0xA5, 0xA5, 0x42, 0x42, 0x42, 0x3D, 0x3D,
|
||||
0x3D, 0x3F, 0x3F, 0x3F, 0x37, 0x37, 0x37, 0x26, 0x26, 0x26, 0xAE, 0x06, 0x81, 0x28, 0xAE, 0x06,
|
||||
0x89, 0x42, 0x35, 0x35, 0x35, 0xAE, 0x06, 0x81, 0x5E, 0x31, 0x31, 0x31, 0xAE, 0x06, 0x81, 0x43,
|
||||
0xAE, 0x09, 0x83, 0x5A, 0xAE, 0x06, 0x81, 0xA1, 0x5C, 0x2D, 0x2D, 0x2D, 0x33, 0x33, 0x33, 0xAE,
|
||||
0x06, 0xFD, 0x7A, 0xAE, 0x0F, 0x81, 0x76, 0xAE, 0x06, 0x33, 0xAE, 0x06, 0x48, 0x45, 0x45, 0x45,
|
||||
0x7F, 0x7F, 0x7F, 0xA9, 0xA9, 0xA9, 0x44, 0x44, 0x44, 0xAE, 0x06, 0x81, 0x28, 0xAE, 0x18, 0x60,
|
||||
0xAE, 0x33, 0x8D, 0x4F, 0xAE, 0x06, 0x81, 0xAB, 0x30, 0xAE, 0x06, 0x0C, 0xAE, 0x06, 0x81, 0x95,
|
||||
0x0E, 0xAE, 0x06, 0x82, 0x14, 0x33, 0x33, 0x33, 0xAE, 0x06, 0x81, 0xBC, 0x5C, 0xAE, 0x1B, 0x83,
|
||||
0x5A, 0xAE, 0x06, 0xF0, 0x13, 0x61, 0x61, 0x61, 0x80, 0x80, 0x80, 0x77, 0x77, 0x77, 0x9E, 0x9E,
|
||||
0x9E, 0xA5, 0xA5, 0xA5, 0x80, 0x80, 0x80, 0x4E, 0x4E, 0x4E, 0x7D, 0x7D, 0x7D, 0xA5, 0xA5, 0xA5,
|
||||
0xA5, 0xA5, 0xA5, 0x73, 0x73, 0x73, 0x2F, 0x2F, 0x2F, 0xAE, 0x06, 0x8C, 0x4E, 0x2E, 0x2E, 0x2E,
|
||||
0x44, 0x44, 0x44, 0x7F, 0x7F, 0x7F, 0xAE, 0x06, 0x1B, 0x7C, 0x7C, 0x7C, 0x36, 0x36, 0x36, 0xAE,
|
||||
0x06, 0x81, 0x67, 0x29, 0x29, 0x29, 0x3F, 0x3F, 0x3F, 0x77, 0x77, 0x77, 0xA4, 0xA4, 0xA4, 0x9F,
|
||||
0x9F, 0x9F, 0x83, 0x83, 0x83, 0xA8, 0xA8, 0xA8, 0x68, 0x68, 0x68, 0x25, 0x25, 0x25, 0x29, 0x29,
|
||||
0x29, 0x5A, 0x5A, 0x5A, 0x74, 0x74, 0x74, 0x27, 0x27, 0x27, 0x2A, 0x2A, 0x2A, 0x7B, 0x7B, 0x7B,
|
||||
0xAD, 0xAD, 0xAD, 0xB1, 0xB1, 0xB1, 0xA3, 0xA3, 0xA3, 0x50, 0x50, 0x50, 0x25, 0x25, 0x25, 0x38,
|
||||
0x38, 0x38, 0x8E, 0x8E, 0x8E, 0x29, 0x29, 0x29, 0xAE, 0x06, 0x84, 0x6A, 0x37, 0x37, 0x37, 0x5D,
|
||||
0x5D, 0x5D, 0x98, 0x98, 0x98, 0xA4, 0xA4, 0xA4, 0x90, 0x90, 0x90, 0x46, 0x46, 0x46, 0x25, 0x25,
|
||||
0x25, 0x20, 0x20, 0x20, 0x2E, 0x2E, 0x2E, 0x45, 0x45, 0x45, 0x8C, 0x8C, 0x8C, 0xA4, 0xA4, 0xA4,
|
||||
0x99, 0x99, 0x99, 0x7B, 0x7B, 0x7B, 0xAE, 0x18, 0x83, 0x5A, 0x46, 0x46, 0x46, 0xA7, 0xA7, 0xA7,
|
||||
0x5C, 0x5C, 0x5C, 0x97, 0x97, 0x97, 0xA5, 0xA5, 0xA5, 0x98, 0x98, 0x98, 0x46, 0x46, 0x46, 0xAE,
|
||||
0x09, 0x83, 0x42, 0x3D, 0x3D, 0x3D, 0x6F, 0x6F, 0x6F, 0x9E, 0x9E, 0x9E, 0xA4, 0xA4, 0xA4, 0x82,
|
||||
0x82, 0x82, 0x35, 0x35, 0x35, 0xAE, 0x06, 0xEB, 0x11, 0xAE, 0x06, 0x83, 0x5A, 0x3D, 0x3D, 0x3D,
|
||||
0x32, 0x32, 0x32, 0x47, 0x47, 0x47, 0x8F, 0x8F, 0x8F, 0x71, 0x71, 0x71, 0x23, 0x23, 0x23, 0xAE,
|
||||
0x06, 0xE4, 0x19, 0x83, 0x83, 0x83, 0xA4, 0xA4, 0xA4, 0xAE, 0x09, 0x33, 0xAE, 0x06, 0x90, 0x1F,
|
||||
0x7C, 0x7C, 0x7C, 0xAD, 0xAD, 0xAD, 0xB6, 0xB6, 0xB6, 0xA4, 0xA4, 0xA4, 0x50, 0x50, 0x50, 0xAE,
|
||||
0x06, 0x81, 0xC1, 0x04, 0xAE, 0x15, 0x60, 0xAE, 0x30, 0x8D, 0x4F, 0xAE, 0x09, 0x82, 0x14, 0xAE,
|
||||
0x06, 0x85, 0x29, 0xA1, 0xA1, 0xA1, 0x6C, 0x6C, 0x6C, 0xAE, 0x06, 0x81, 0x4F, 0x8B, 0x8B, 0x8B,
|
||||
0x38, 0x38, 0x38, 0x23, 0x23, 0x23, 0xAE, 0x1E, 0x83, 0x5A, 0x31, 0x31, 0x31, 0x72, 0x72, 0x72,
|
||||
0xAC, 0xAC, 0xAC, 0x81, 0x81, 0x81, 0x38, 0x38, 0x38, 0x54, 0x54, 0x54, 0xA8, 0xA8, 0xA8, 0xA1,
|
||||
0xA1, 0xA1, 0x80, 0x80, 0x80, 0x3A, 0x3A, 0x3A, 0x54, 0x54, 0x54, 0xAB, 0xAB, 0xAB, 0x66, 0x66,
|
||||
0x66, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x40, 0x40, 0x40, 0x93, 0x93, 0x93, 0x96, 0x96, 0x96,
|
||||
0x45, 0x45, 0x45, 0x4D, 0x4D, 0x4D, 0x99, 0x99, 0x99, 0x90, 0x90, 0x90, 0xAE, 0x06, 0x8F, 0x69,
|
||||
0x3A, 0x3A, 0x3A, 0x79, 0x79, 0x79, 0xA4, 0xA4, 0xA4, 0x45, 0x45, 0x45, 0x3F, 0x3F, 0x3F, 0x8C,
|
||||
0x8C, 0x8C, 0xB6, 0xB6, 0xB6, 0xAE, 0x06, 0x83, 0x5A, 0x2E, 0x2E, 0x2E, 0x6A, 0x6A, 0x6A, 0x87,
|
||||
0x87, 0x87, 0xAE, 0x06, 0x8A, 0x7C, 0x3A, 0x3A, 0x3A, 0x72, 0x72, 0x72, 0x8C, 0x8C, 0x8C, 0x34,
|
||||
0x34, 0x34, 0x20, 0x20, 0x20, 0x25, 0x25, 0x25, 0x41, 0x41, 0x41, 0xA4, 0xA4, 0xA4, 0x2E, 0x2E,
|
||||
0x2E, 0xAE, 0x06, 0xFC, 0x4C, 0x56, 0x56, 0x56, 0xAB, 0xAB, 0xAB, 0x6A, 0x6A, 0x6A, 0x41, 0x41,
|
||||
0x41, 0x71, 0x71, 0x71, 0xA5, 0xA5, 0xA5, 0xAE, 0x06, 0x81, 0xBE, 0x67, 0xAE, 0x06, 0x7E, 0x8F,
|
||||
0x8F, 0x8F, 0x37, 0x37, 0x37, 0x4F, 0x4F, 0x4F, 0x99, 0x99, 0x99, 0xAE, 0x18, 0x83, 0x5A, 0x47,
|
||||
0x47, 0x47, 0xA7, 0xA7, 0xA7, 0x98, 0x98, 0x98, 0xAE, 0x06, 0x81, 0xBF, 0x71, 0x8E, 0x8E, 0x8E,
|
||||
0x98, 0x98, 0x98, 0x2C, 0x2C, 0x2C, 0xAE, 0x06, 0x81, 0x8B, 0x7C, 0x72, 0x72, 0x72, 0xA5, 0xA5,
|
||||
0xA5, 0x56, 0x56, 0x56, 0x43, 0x43, 0x43, 0x87, 0x87, 0x87, 0x90, 0x90, 0x90, 0x2D, 0x2D, 0x2D,
|
||||
0x29, 0x29, 0x29, 0xAE, 0x06, 0x83, 0x5A, 0x4E, 0x4E, 0x4E, 0x4C, 0x4C, 0x4C, 0x9A, 0x9A, 0x9A,
|
||||
0x95, 0x95, 0x95, 0x28, 0x28, 0x28, 0xAE, 0x06, 0x81, 0x90, 0x4E, 0x8E, 0x8E, 0x8E, 0x7F, 0x7F,
|
||||
0x7F, 0x3A, 0x3A, 0x3A, 0x42, 0x42, 0x42, 0x8D, 0x8D, 0x8D, 0x8F, 0x8F, 0x8F, 0x2B, 0x2B, 0x2B,
|
||||
0xAE, 0x06, 0x8F, 0x51, 0x7A, 0x7A, 0x7A, 0xA7, 0xA7, 0xA7, 0x3A, 0x3A, 0x3A, 0xAE, 0x06, 0x8D,
|
||||
0x52, 0xAE, 0x18, 0x60, 0xAE, 0x0F, 0x8D, 0x37, 0xAE, 0x06, 0x94, 0x59, 0xAE, 0x06, 0x81, 0x89,
|
||||
0x5F, 0xAE, 0x12, 0x91, 0x7D, 0xAE, 0x0C, 0x82, 0x14, 0xAE, 0x09, 0x84, 0x73, 0x91, 0x91, 0x91,
|
||||
0x43, 0x43, 0x43, 0x4D, 0x4D, 0x4D, 0x9A, 0x9A, 0x9A, 0x91, 0x91, 0x91, 0xAE, 0x06, 0x8A, 0x04,
|
||||
0xAE, 0x18, 0x83, 0x5A, 0xAE, 0x06, 0x82, 0x4A, 0xAE, 0x06, 0x82, 0x3E, 0x32, 0x32, 0x32, 0xAE,
|
||||
0x06, 0x86, 0x30, 0x79, 0x79, 0x79, 0x98, 0x98, 0x98, 0xAE, 0x06, 0x8A, 0x6A, 0x37, 0x37, 0x37,
|
||||
0x7D, 0x7D, 0x7D, 0x88, 0x88, 0x88, 0xAE, 0x06, 0x95, 0x3F, 0x5E, 0x5E, 0x5E, 0xA5, 0xA5, 0xA5,
|
||||
0xAE, 0x06, 0x83, 0x12, 0x29, 0x29, 0x29, 0x46, 0x46, 0x46, 0xA5, 0xA5, 0xA5, 0x50, 0x50, 0x50,
|
||||
0x2B, 0x2B, 0x2B, 0x45, 0x45, 0x45, 0xAB, 0xAB, 0xAB, 0x52, 0x52, 0x52, 0x22, 0x22, 0x22, 0x2A,
|
||||
0x2A, 0x2A, 0x4E, 0x4E, 0x4E, 0xAC, 0xAC, 0xAC, 0xAE, 0x06, 0x83, 0x5A, 0x2F, 0x2F, 0x2F, 0x6B,
|
||||
0x6B, 0x6B, 0xAE, 0x06, 0x83, 0x5A, 0xAE, 0x06, 0x81, 0xA8, 0x18, 0xAE, 0x09, 0x0F, 0xAE, 0x0C,
|
||||
0x8E, 0x17, 0xAE, 0x06, 0xF4, 0x3B, 0x3F, 0x3F, 0x3F, 0x96, 0x96, 0x96, 0x7B, 0x7B, 0x7B, 0x43,
|
||||
0x43, 0x43, 0x42, 0x42, 0x42, 0x55, 0x55, 0x55, 0x96, 0x96, 0x96, 0x71, 0x71, 0x71, 0x34, 0x34,
|
||||
0x34, 0x55, 0x55, 0x55, 0xB0, 0xB0, 0xB0, 0x35, 0x35, 0x35, 0x20, 0x20, 0x20, 0x2F, 0x2F, 0x2F,
|
||||
0x61, 0x61, 0x61, 0xAE, 0x18, 0x83, 0x5A, 0x45, 0x45, 0x45, 0xA6, 0xA6, 0xA6, 0x51, 0x51, 0x51,
|
||||
0x22, 0x22, 0x22, 0x2B, 0x2B, 0x2B, 0x50, 0x50, 0x50, 0xB0, 0xB0, 0xB0, 0xAE, 0x06, 0x81, 0xBF,
|
||||
0x74, 0x47, 0x47, 0x47, 0xAC, 0xAC, 0xAC, 0x5C, 0x5C, 0x5C, 0x3F, 0x3F, 0x3F, 0x45, 0x45, 0x45,
|
||||
0x5B, 0x5B, 0x5B, 0xAC, 0xAC, 0xAC, 0x43, 0x43, 0x43, 0x2B, 0x2B, 0x2B, 0xAE, 0x06, 0x8F, 0x39,
|
||||
0x68, 0x68, 0x68, 0x9C, 0x9C, 0x9C, 0x97, 0x97, 0x97, 0x2C, 0x2C, 0x2C, 0x1E, 0x1E, 0x1E, 0xAE,
|
||||
0x06, 0xF2, 0x33, 0x56, 0x56, 0x56, 0x38, 0x38, 0x38, 0xAE, 0x06, 0x81, 0xC6, 0x75, 0x58, 0x58,
|
||||
0x58, 0xA5, 0xA5, 0xA5, 0xAE, 0x06, 0x85, 0x08, 0x33, 0x33, 0x33, 0xAE, 0x06, 0x83, 0x48, 0x2F,
|
||||
0x2F, 0x2F, 0xAE, 0x09, 0x84, 0x55, 0xAE, 0x15, 0x60, 0xAE, 0x09, 0x83, 0x3F, 0xAE, 0x06, 0x81,
|
||||
0xB5, 0x5B, 0x30, 0x30, 0x30, 0x3E, 0x3E, 0x3E, 0x40, 0x40, 0x40, 0x36, 0x36, 0x36, 0xAE, 0x12,
|
||||
0x98, 0x15, 0xAE, 0x0C, 0x82, 0x14, 0x28, 0x28, 0x28, 0x52, 0x52, 0x52, 0xAE, 0x06, 0x88, 0x4D,
|
||||
0xAE, 0x06, 0x8C, 0x18, 0x4B, 0x4B, 0x4B, 0xB0, 0xB0, 0xB0, 0x43, 0x43, 0x43, 0xAE, 0x06, 0x81,
|
||||
0xB2, 0x67, 0xAE, 0x18, 0x83, 0x5A, 0x30, 0x30, 0x30, 0x6C, 0x6C, 0x6C, 0x88, 0x88, 0x88, 0xAE,
|
||||
0x06, 0x81, 0xB5, 0x6A, 0xAE, 0x09, 0x0F, 0xAE, 0x06, 0x83, 0x06, 0xAE, 0x09, 0x0F, 0xAE, 0x06,
|
||||
0x99, 0x46, 0x7F, 0x7F, 0x7F, 0x8A, 0x8A, 0x8A, 0xAE, 0x06, 0x81, 0xA8, 0x18, 0xAE, 0x06, 0x85,
|
||||
0x32, 0x8D, 0x8D, 0x8D, 0x78, 0x78, 0x78, 0x30, 0x30, 0x30, 0x48, 0x48, 0x48, 0xAE, 0x06, 0x82,
|
||||
0x3E, 0xAE, 0x06, 0x93, 0x5B, 0xAE, 0x06, 0x86, 0x36, 0x67, 0x67, 0x67, 0xAE, 0x2D, 0x83, 0x5A,
|
||||
0xAE, 0x06, 0x8A, 0x49, 0xA8, 0xA8, 0xA8, 0x8F, 0x8F, 0x8F, 0x8A, 0x8A, 0x8A, 0x8B, 0x8B, 0x8B,
|
||||
0x8E, 0x8E, 0x8E, 0xA5, 0xA5, 0xA5, 0x86, 0x86, 0x86, 0x37, 0x37, 0x37, 0x6E, 0x6E, 0x6E, 0xAE,
|
||||
0x06, 0x82, 0x71, 0xAE, 0x0F, 0x91, 0x71, 0xAE, 0x18, 0x92, 0x42, 0x31, 0x31, 0x31, 0x1C, 0x1C,
|
||||
0x1C, 0x28, 0x28, 0x28, 0x4F, 0x4F, 0x4F, 0xBB, 0xBB, 0xBB, 0x35, 0x35, 0x35, 0x25, 0x25, 0x25,
|
||||
0x4C, 0x4C, 0x4C, 0xB2, 0xB2, 0xB2, 0xAE, 0x09, 0x60, 0x8F, 0x8F, 0x8F, 0xB0, 0xB0, 0xB0, 0x60,
|
||||
0x60, 0x60, 0x2B, 0x2B, 0x2B, 0x56, 0x56, 0x56, 0xBB, 0xBB, 0xBB, 0xA0, 0xA0, 0xA0, 0xA8, 0xA8,
|
||||
0xA8, 0x3F, 0x3F, 0x3F, 0xAE, 0x06, 0x8A, 0x43, 0xAE, 0x06, 0x8D, 0x31, 0x3E, 0x3E, 0x3E, 0x5A,
|
||||
0x5A, 0x5A, 0x83, 0x83, 0x83, 0x8C, 0x8C, 0x8C, 0x91, 0x91, 0x91, 0xA6, 0xA6, 0xA6, 0xAE, 0x06,
|
||||
0x8D, 0x22, 0xAE, 0x12, 0x83, 0x5A, 0xAE, 0x18, 0x60, 0xAE, 0x0C, 0x81, 0xB9, 0x35, 0x23, 0x23,
|
||||
0x23, 0x56, 0x56, 0x56, 0xA3, 0xA3, 0xA3, 0xA4, 0xA4, 0xA4, 0xA1, 0xA1, 0xA1, 0x50, 0x50, 0x50,
|
||||
0xAE, 0x1E, 0x83, 0x5A, 0xAE, 0x0C, 0x81, 0x6A, 0x25, 0x25, 0x25, 0x42, 0x42, 0x42, 0x9F, 0x9F,
|
||||
0x9F, 0x64, 0x64, 0x64, 0x27, 0x27, 0x27, 0xAE, 0x1B, 0x83, 0x5A, 0xAE, 0x1B, 0x82, 0x77, 0xAE,
|
||||
0x0C, 0x0F, 0xAE, 0x06, 0x92, 0x66, 0x8C, 0x8C, 0x8C, 0x8A, 0x8A, 0x8A, 0x2B, 0x2B, 0x2B, 0xAE,
|
||||
0x06, 0x81, 0x1F, 0xAE, 0x06, 0x83, 0x5A, 0x87, 0x87, 0x87, 0xAE, 0x06, 0xF0, 0x0D, 0xAE, 0x06,
|
||||
0x87, 0x4F, 0xAE, 0x3F, 0x83, 0x5A, 0x45, 0x45, 0x45, 0xA7, 0xA7, 0xA7, 0x6F, 0x6F, 0x6F, 0x65,
|
||||
0x65, 0x65, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64, 0x62, 0x62, 0x62, 0xAE, 0x06, 0x81, 0xC6, 0x66,
|
||||
0x6E, 0x6E, 0x6E, 0x8A, 0x8A, 0x8A, 0xAE, 0x06, 0x89, 0x5A, 0x29, 0x29, 0x29, 0xAE, 0x06, 0x85,
|
||||
0x4A, 0xAE, 0x1B, 0x83, 0x5A, 0xAE, 0x06, 0x82, 0x6E, 0xAE, 0x0C, 0x82, 0x1A, 0x25, 0x25, 0x25,
|
||||
0x4A, 0x4A, 0x4A, 0xAC, 0xAC, 0xAC, 0x6F, 0x6F, 0x6F, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x65,
|
||||
0x65, 0x65, 0x61, 0x61, 0x61, 0x36, 0x36, 0x36, 0x2A, 0x2A, 0x2A, 0x55, 0x55, 0x55, 0xBB, 0xBB,
|
||||
0xBB, 0x94, 0x94, 0x94, 0xA6, 0xA6, 0xA6, 0x73, 0x73, 0x73, 0xAE, 0x06, 0x81, 0x8C, 0x17, 0x23,
|
||||
0x23, 0x23, 0x3C, 0x3C, 0x3C, 0x80, 0x80, 0x80, 0xA4, 0xA4, 0xA4, 0x6F, 0x6F, 0x6F, 0x68, 0x68,
|
||||
0x68, 0x74, 0x74, 0x74, 0xAE, 0x06, 0x83, 0x4B, 0x1E, 0x1E, 0x1E, 0x32, 0x32, 0x32, 0xAE, 0x0F,
|
||||
0x83, 0x5A, 0xAE, 0x18, 0x60, 0xAE, 0x0F, 0xF6, 0x5E, 0x25, 0x25, 0x25, 0x2D, 0x2D, 0x2D, 0xAE,
|
||||
0x06, 0x8A, 0x6D, 0xAE, 0x12, 0x96, 0x40, 0xAE, 0x15, 0x83, 0x5A, 0x37, 0x37, 0x37, 0xAE, 0x06,
|
||||
0x82, 0x5C, 0x42, 0x42, 0x42, 0x93, 0x93, 0x93, 0xAE, 0x48, 0x83, 0x5A, 0x2B, 0x2B, 0x2B, 0x2D,
|
||||
0x2D, 0x2D, 0x6D, 0x6D, 0x6D, 0x92, 0x92, 0x92, 0xAE, 0x06, 0x9F, 0x4F, 0x2D, 0x2D, 0x2D, 0x46,
|
||||
0x46, 0x46, 0x92, 0x92, 0x92, 0x62, 0x62, 0x62, 0x2A, 0x2A, 0x2A, 0x45, 0x45, 0x45, 0xB6, 0xB6,
|
||||
0xB6, 0x3E, 0x3E, 0x3E, 0xAE, 0x06, 0xCE, 0x39, 0x4F, 0x4F, 0x4F, 0xA7, 0xA7, 0xA7, 0xAE, 0x33,
|
||||
0x8B, 0x0E, 0x3E, 0x3E, 0x3E, 0xA6, 0xA6, 0xA6, 0x5C, 0x5C, 0x5C, 0x31, 0x31, 0x31, 0xAE, 0x06,
|
||||
0x75, 0x2B, 0x2B, 0x2B, 0x24, 0x24, 0x24, 0x2B, 0x2B, 0x2B, 0x65, 0x65, 0x65, 0xA5, 0xA5, 0xA5,
|
||||
0xAE, 0x06, 0x81, 0xBB, 0x3D, 0x33, 0x33, 0x33, 0x59, 0x59, 0x59, 0xAE, 0x33, 0x83, 0x5A, 0x45,
|
||||
0x45, 0x45, 0xB0, 0xB0, 0xB0, 0x45, 0x45, 0x45, 0x2E, 0x2E, 0x2E, 0xAE, 0x06, 0x60, 0xAE, 0x06,
|
||||
0x81, 0x80, 0x68, 0xAE, 0x09, 0x89, 0x75, 0x4A, 0x4A, 0x4A, 0x4F, 0x4F, 0x4F, 0xAB, 0xAB, 0xAB,
|
||||
0x56, 0x56, 0x56, 0xAE, 0x06, 0xBD, 0x5B, 0xAE, 0x06, 0x33, 0x42, 0x42, 0x42, 0xAE, 0x06, 0x81,
|
||||
0xA6, 0x6A, 0x54, 0x54, 0x54, 0xA5, 0xA5, 0xA5, 0x30, 0x30, 0x30, 0x1E, 0x1E, 0x1E, 0x2F, 0x2F,
|
||||
0x2F, 0x71, 0x71, 0x71, 0xA6, 0xA6, 0xA6, 0x34, 0x34, 0x34, 0x1E, 0x1E, 0x1E, 0xAE, 0x1B, 0x60,
|
||||
0xAE, 0x2D, 0x92, 0x42, 0xAE, 0x15, 0x8B, 0x0E, 0x40, 0x40, 0x40, 0x25, 0x25, 0x25, 0x30, 0x30,
|
||||
0x30, 0x4D, 0x4D, 0x4D, 0xA5, 0xA5, 0xA5, 0x58, 0x58, 0x58, 0xAE, 0x1B, 0x8B, 0x0E, 0xAE, 0x06,
|
||||
0x81, 0xB6, 0x5C, 0x68, 0x68, 0x68, 0x86, 0x86, 0x86, 0xAE, 0x06, 0x81, 0xCF, 0x4B, 0xAE, 0x0F,
|
||||
0x0F, 0xAE, 0x09, 0x0F, 0xAE, 0x06, 0x81, 0xC6, 0x03, 0x3D, 0x3D, 0x3D, 0xAB, 0xAB, 0xAB, 0xAE,
|
||||
0x06, 0xFF, 0x70, 0x46, 0x46, 0x46, 0x61, 0x61, 0x61, 0xAA, 0xAA, 0xAA, 0xAE, 0x06, 0x90, 0x4C,
|
||||
0x38, 0x38, 0x38, 0x99, 0x99, 0x99, 0x7F, 0x7F, 0x7F, 0x42, 0x42, 0x42, 0x45, 0x45, 0x45, 0x65,
|
||||
0x65, 0x65, 0xB1, 0xB1, 0xB1, 0xAE, 0x06, 0x87, 0x34, 0xAE, 0x1B, 0x63, 0xAE, 0x06, 0x81, 0x46,
|
||||
0x3F, 0x3F, 0x3F, 0xA3, 0xA3, 0xA3, 0x2D, 0x2D, 0x2D, 0xAE, 0x06, 0x8F, 0x78, 0x7D, 0x7D, 0x7D,
|
||||
0x9F, 0x9F, 0x9F, 0x46, 0x46, 0x46, 0x3E, 0x3E, 0x3E, 0x3F, 0x3F, 0x3F, 0x58, 0x58, 0x58, 0xAE,
|
||||
0x06, 0x8A, 0x49, 0x3F, 0x3F, 0x3F, 0xB0, 0xB0, 0xB0, 0x5F, 0x5F, 0x5F, 0x3F, 0x3F, 0x3F, 0x48,
|
||||
0x48, 0x48, 0x76, 0x76, 0x76, 0xBB, 0xBB, 0xBB, 0x34, 0x34, 0x34, 0xAE, 0x12, 0x82, 0x17, 0xAE,
|
||||
0x09, 0x51, 0x1B, 0x1B, 0x1B, 0x27, 0x27, 0x27, 0x4C, 0x4C, 0x4C, 0xAE, 0x06, 0x2A, 0x21, 0x21,
|
||||
0x21, 0xAE, 0x06, 0x81, 0x28, 0x86, 0x86, 0x86, 0x42, 0x42, 0x42, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E,
|
||||
0x3E, 0x5F, 0x5F, 0x5F, 0x22, 0x22, 0x22, 0xAE, 0x09, 0x27, 0xAE, 0x06, 0xF2, 0x48, 0x61, 0x61,
|
||||
0x61, 0xA4, 0xA4, 0xA4, 0x43, 0x43, 0x43, 0x2A, 0x2A, 0x2A, 0x40, 0x40, 0x40, 0xB0, 0xB0, 0xB0,
|
||||
0x4B, 0x4B, 0x4B, 0x3D, 0x3D, 0x3D, 0x48, 0x48, 0x48, 0x85, 0x85, 0x85, 0xAE, 0x06, 0x8B, 0x0E,
|
||||
0x1D, 0x1D, 0x1D, 0x29, 0x29, 0x29, 0x5C, 0x5C, 0x5C, 0xA6, 0xA6, 0xA6, 0x41, 0x41, 0x41, 0x27,
|
||||
0x27, 0x27, 0xAE, 0x09, 0x82, 0x08, 0xAE, 0x12, 0x60, 0xAE, 0x30, 0x83, 0x5A, 0xAE, 0x09, 0x81,
|
||||
0x43, 0x28, 0x28, 0x28, 0xAE, 0x06, 0x90, 0x01, 0x6E, 0x6E, 0x6E, 0xAE, 0x06, 0x81, 0x79, 0x6E,
|
||||
0x6E, 0x6E, 0xAF, 0xAF, 0xAF, 0xAE, 0x06, 0xC6, 0x22, 0x37, 0x37, 0x37, 0x88, 0x88, 0x88, 0x62,
|
||||
0x62, 0x62, 0xAE, 0x0F, 0x63, 0xAE, 0x06, 0x81, 0xBA, 0x1E, 0x60, 0x60, 0x60, 0x82, 0x82, 0x82,
|
||||
0xAE, 0x06, 0x98, 0x15, 0xAE, 0x0F, 0x0F, 0xAE, 0x0C, 0x0F, 0xAE, 0x06, 0x8C, 0x72, 0x5F, 0x5F,
|
||||
0x5F, 0xAA, 0xAA, 0xAA, 0x92, 0x92, 0x92, 0x91, 0x91, 0x91, 0xAA, 0xAA, 0xAA, 0x56, 0x56, 0x56,
|
||||
0xAE, 0x06, 0x81, 0xD8, 0x45, 0x27, 0x27, 0x27, 0x49, 0x49, 0x49, 0xAA, 0xAA, 0xAA, 0x91, 0x91,
|
||||
0x91, 0x8A, 0x8A, 0x8A, 0x9F, 0x9F, 0x9F, 0xAA, 0xAA, 0xAA, 0x5F, 0x5F, 0x5F, 0x21, 0x21, 0x21,
|
||||
0xAE, 0x1B, 0x54, 0xAE, 0x09, 0x81, 0xBE, 0x79, 0xA1, 0xA1, 0xA1, 0x26, 0x26, 0x26, 0xAE, 0x09,
|
||||
0x99, 0x76, 0x90, 0x90, 0x90, 0xA4, 0xA4, 0xA4, 0x8A, 0x8A, 0x8A, 0x96, 0x96, 0x96, 0x9A, 0x9A,
|
||||
0x9A, 0xAE, 0x06, 0x81, 0xC2, 0x62, 0x2C, 0x2C, 0x2C, 0x61, 0x61, 0x61, 0xAF, 0xAF, 0xAF, 0x8A,
|
||||
0x8A, 0x8A, 0x90, 0x90, 0x90, 0x93, 0x93, 0x93, 0xBB, 0xBB, 0xBB, 0xAE, 0x12, 0xA4, 0x69, 0xAE,
|
||||
0x0C, 0x51, 0xAE, 0x06, 0x90, 0x10, 0x3A, 0x3A, 0x3A, 0xAE, 0x06, 0x2A, 0xAE, 0x06, 0x81, 0x28,
|
||||
0x48, 0x48, 0x48, 0xA4, 0xA4, 0xA4, 0x98, 0x98, 0x98, 0x8A, 0x8A, 0x8A, 0xA3, 0xA3, 0xA3, 0x7A,
|
||||
0x7A, 0x7A, 0xAE, 0x06, 0xA0, 0x05, 0xAE, 0x09, 0x27, 0x20, 0x20, 0x20, 0x30, 0x30, 0x30, 0x75,
|
||||
0x75, 0x75, 0x91, 0x91, 0x91, 0x26, 0x26, 0x26, 0x30, 0x30, 0x30, 0x7A, 0x7A, 0x7A, 0xAE, 0x06,
|
||||
0x81, 0x10, 0x97, 0x97, 0x97, 0x85, 0x85, 0x85, 0xB5, 0xB5, 0xB5, 0xAE, 0x06, 0x88, 0x71, 0x23,
|
||||
0x23, 0x23, 0x3B, 0x3B, 0x3B, 0xAA, 0xAA, 0xAA, 0x8F, 0x8F, 0x8F, 0x5C, 0x5C, 0x5C, 0x21, 0x21,
|
||||
0x21, 0xAE, 0x18, 0x60, 0xAE, 0x2E, 0x81, 0xE5, 0x0D, 0xAE, 0x0B, 0x81, 0x43, 0xAE, 0x09, 0x83,
|
||||
0x5A, 0x9C, 0x9C, 0x9C, 0x90, 0x90, 0x90, 0x8C, 0x8C, 0x8C, 0xAF, 0xAF, 0xAF, 0xAE, 0x06, 0x82,
|
||||
0x77, 0x1F, 0x1F, 0x1F, 0x2C, 0x2C, 0x2C, 0x83, 0x83, 0x83, 0x5C, 0x5C, 0x5C, 0xAE, 0x0F, 0xF6,
|
||||
0x7C, 0xAE, 0x09, 0xAF, 0x1D, 0xAE, 0x06, 0xD5, 0x2E, 0xAE, 0x0F, 0x0F, 0xAE, 0x0F, 0x0F, 0xAE,
|
||||
0x06, 0x8B, 0x3E, 0xAE, 0x06, 0x81, 0x8A, 0x09, 0x63, 0x63, 0x63, 0xAE, 0x06, 0x90, 0x76, 0xAE,
|
||||
0x06, 0xA1, 0x45, 0xAE, 0x09, 0xA0, 0x62, 0x31, 0x31, 0x31, 0x62, 0x62, 0x62, 0x56, 0x56, 0x56,
|
||||
0xAE, 0x0C, 0xD6, 0x05, 0xAE, 0x1E, 0x54, 0xAE, 0x06, 0x9E, 0x72, 0xAE, 0x06, 0xF4, 0x44, 0xAE,
|
||||
0x09, 0x81, 0x8F, 0x17, 0x2B, 0x2B, 0x2B, 0x40, 0x40, 0x40, 0x61, 0x61, 0x61, 0x4A, 0x4A, 0x4A,
|
||||
0xAE, 0x06, 0x87, 0x6A, 0xAE, 0x06, 0x9F, 0x40, 0xAE, 0x06, 0x99, 0x7C, 0x60, 0x60, 0x60, 0x4A,
|
||||
0x4A, 0x4A, 0xAE, 0x09, 0x8D, 0x25, 0xAE, 0x12, 0xA6, 0x56, 0xAE, 0x0F, 0x51, 0xAE, 0x06, 0xCB,
|
||||
0x6F, 0xAE, 0x06, 0x2A, 0xAE, 0x06, 0x81, 0x28, 0x2E, 0x2E, 0x2E, 0x4D, 0x4D, 0x4D, 0x60, 0x60,
|
||||
0x60, 0xAE, 0x06, 0x81, 0xB7, 0x69, 0xAE, 0x06, 0xD7, 0x2A, 0xAE, 0x09, 0x27, 0xAE, 0x06, 0xA2,
|
||||
0x16, 0xAE, 0x06, 0x81, 0xCE, 0x59, 0xAE, 0x06, 0xF2, 0x6C, 0x2B, 0x2B, 0x2B, 0x4C, 0x4C, 0x4C,
|
||||
0x60, 0x60, 0x60, 0x3D, 0x3D, 0x3D, 0x2B, 0x2B, 0x2B, 0xAE, 0x09, 0x78, 0xAE, 0x06, 0x85, 0x29,
|
||||
0xAE, 0x06, 0x87, 0x19, 0x42, 0x42, 0x42, 0xAE, 0x06, 0xD4, 0x18, 0xAE, 0x15, 0x60, 0xAE, 0x30,
|
||||
0xB0, 0x12, 0xAE, 0x09, 0x81, 0x43, 0xAE, 0x09, 0x8B, 0x0E, 0x48, 0x48, 0x48, 0x57, 0x57, 0x57,
|
||||
0x61, 0x61, 0x61, 0x3B, 0x3B, 0x3B, 0xAE, 0x06, 0x81, 0x85, 0x4C, 0xAE, 0x06, 0x81, 0x28, 0xAE,
|
||||
0x36, 0xA5, 0x6A, 0xAE, 0x1B, 0xE0, 0x5D, 0xAE, 0x12, 0x81, 0xCC, 0x33, 0xAE, 0x09, 0x1B, 0xAE,
|
||||
0x42, 0xB0, 0x7B, 0xAE, 0x18, 0x4B, 0xAE, 0x48, 0x63, 0xAE, 0x30, 0xAF, 0x4A, 0xAE, 0x1B, 0x30,
|
||||
0xAE, 0x15, 0x81, 0x13, 0xAE, 0x4B, 0xB0, 0x2A, 0xAE, 0x09, 0x8C, 0x27, 0xAE, 0x06, 0x81, 0x99,
|
||||
0x03, 0xAE, 0x81, 0x07, 0xB5, 0x0E, 0xAE, 0x82, 0x44, 0xBA, 0x13, 0xAE, 0x0C, 0x8C, 0x27, 0xAE,
|
||||
0x83, 0x4E, 0xBD, 0x6D, 0xAE, 0x0F, 0x8C, 0x4E, 0xAE, 0x83, 0x78, 0xC1, 0x74
|
||||
} ;
|
||||
46
ipl/di.c
46
ipl/di.c
@@ -87,31 +87,31 @@ void display_init()
|
||||
|
||||
sleep(60000);
|
||||
|
||||
DSI(_DSIREG(DSI_DSI_BTA_TIMING)) = 0x50204;
|
||||
DSI(_DSIREG(DSI_DSI_WR_DATA)) = 0x337;
|
||||
DSI(_DSIREG(DSI_DSI_TRIGGER)) = 0x2;
|
||||
_display_dsi_wait(250000, _DSIREG(DSI_DSI_TRIGGER), 3);
|
||||
DSI(_DSIREG(DSI_BTA_TIMING)) = 0x50204;
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x337;
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
||||
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO);
|
||||
|
||||
DSI(_DSIREG(DSI_DSI_WR_DATA)) = 0x406;
|
||||
DSI(_DSIREG(DSI_DSI_TRIGGER)) = 0x2;
|
||||
_display_dsi_wait(250000, _DSIREG(DSI_DSI_TRIGGER), 3);
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x406;
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
||||
_display_dsi_wait(250000, _DSIREG(DSI_TRIGGER), DSI_TRIGGER_HOST | DSI_TRIGGER_VIDEO);
|
||||
|
||||
DSI(_DSIREG(DSI_HOST_DSI_CONTROL)) = 0x200B;
|
||||
_display_dsi_wait(150000, _DSIREG(DSI_HOST_DSI_CONTROL), 8);
|
||||
DSI(_DSIREG(DSI_HOST_CONTROL)) = DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_IMM_BTA | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC;
|
||||
_display_dsi_wait(150000, _DSIREG(DSI_HOST_CONTROL), DSI_HOST_CONTROL_IMM_BTA);
|
||||
|
||||
sleep(5000);
|
||||
|
||||
_display_ver = DSI(_DSIREG(DSI_DSI_RD_DATA));
|
||||
_display_ver = DSI(_DSIREG(DSI_RD_DATA));
|
||||
if (_display_ver == 0x10)
|
||||
exec_cfg((u32 *)DSI_BASE, _display_config_4, 43);
|
||||
|
||||
DSI(_DSIREG(DSI_DSI_WR_DATA)) = 0x1105;
|
||||
DSI(_DSIREG(DSI_DSI_TRIGGER)) = 0x2;
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x1105;
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
||||
|
||||
sleep(180000);
|
||||
|
||||
DSI(_DSIREG(DSI_DSI_WR_DATA)) = 0x2905;
|
||||
DSI(_DSIREG(DSI_DSI_TRIGGER)) = 0x2;
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x2905;
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
||||
|
||||
sleep(20000);
|
||||
|
||||
@@ -134,15 +134,15 @@ void display_init()
|
||||
void display_end()
|
||||
{
|
||||
GPIO_6(0x24) &= 0xFFFFFFFE;
|
||||
DSI(_DSIREG(DSI_DSI_VID_MODE_CONTROL)) = 1;
|
||||
DSI(_DSIREG(DSI_DSI_WR_DATA)) = 0x2805;
|
||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = 1;
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x2805;
|
||||
|
||||
u32 end = HOST1X(0x30A4) + 5;
|
||||
while (HOST1X(0x30A4) < end)
|
||||
;
|
||||
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_ACCESS)) = 5;
|
||||
DSI(_DSIREG(DSI_DSI_VID_MODE_CONTROL)) = 0;
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_ACCESS)) = READ_MUX | WRITE_MUX;
|
||||
DSI(_DSIREG(DSI_VIDEO_MODE_CONTROL)) = 0;
|
||||
|
||||
exec_cfg((u32 *)DISPLAY_A_BASE, _display_config_12, 17);
|
||||
exec_cfg((u32 *)DSI_BASE, _display_config_13, 16);
|
||||
@@ -152,8 +152,8 @@ void display_end()
|
||||
if (_display_ver == 0x10)
|
||||
exec_cfg((u32 *)DSI_BASE, _display_config_14, 22);
|
||||
|
||||
DSI(_DSIREG(DSI_DSI_WR_DATA)) = 0x1005;
|
||||
DSI(_DSIREG(DSI_DSI_TRIGGER)) = 2;
|
||||
DSI(_DSIREG(DSI_WR_DATA)) = 0x1005;
|
||||
DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST;
|
||||
|
||||
sleep(50000);
|
||||
|
||||
@@ -175,8 +175,8 @@ void display_end()
|
||||
CLOCK(0x300) = 0x18000000;
|
||||
CLOCK(0x324) = 0x18000000;
|
||||
|
||||
DSI(_DSIREG(DSI_PAD_CONTROL)) = 0x10F010F;
|
||||
DSI(_DSIREG(DSI_DSI_POWER_CONTROL)) = 0;
|
||||
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;
|
||||
|
||||
GPIO_6(0x04) &= 0xFFFFFFFE;
|
||||
|
||||
@@ -193,7 +193,7 @@ void display_color_screen(u32 color)
|
||||
DISPLAY_A(_DIREG(DC_WIN_BD_WIN_OPTIONS)) = 0;
|
||||
DISPLAY_A(_DIREG(DC_WIN_CD_WIN_OPTIONS)) = 0;
|
||||
DISPLAY_A(_DIREG(DC_DISP_BLEND_BACKGROUND_COLOR)) = color;
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE | 1;
|
||||
DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) = DISPLAY_A(_DIREG(DC_CMD_STATE_CONTROL)) & 0xFFFFFFFE | GENERAL_ACT_REQ;
|
||||
|
||||
sleep(35000);
|
||||
|
||||
|
||||
317
ipl/di.h
317
ipl/di.h
@@ -21,44 +21,319 @@
|
||||
|
||||
/*! Display registers. */
|
||||
#define _DIREG(reg) ((reg) * 4)
|
||||
|
||||
#define DC_CMD_GENERAL_INCR_SYNCPT 0x00
|
||||
|
||||
#define DC_CMD_GENERAL_INCR_SYNCPT_CNTRL 0x01
|
||||
#define SYNCPT_CNTRL_NO_STALL (1 << 8)
|
||||
#define SYNCPT_CNTRL_SOFT_RESET (1 << 0)
|
||||
|
||||
#define DC_CMD_CONT_SYNCPT_VSYNC 0x28
|
||||
#define SYNCPT_VSYNC_ENABLE (1 << 8)
|
||||
|
||||
#define DC_CMD_DISPLAY_COMMAND_OPTION0 0x031
|
||||
|
||||
#define DC_CMD_DISPLAY_COMMAND 0x32
|
||||
#define DISP_CTRL_MODE_STOP (0 << 5)
|
||||
#define DISP_CTRL_MODE_C_DISPLAY (1 << 5)
|
||||
#define DISP_CTRL_MODE_NC_DISPLAY (2 << 5)
|
||||
#define DISP_CTRL_MODE_MASK (3 << 5)
|
||||
|
||||
#define DC_CMD_DISPLAY_POWER_CONTROL 0x36
|
||||
#define PW0_ENABLE (1 << 0)
|
||||
#define PW1_ENABLE (1 << 2)
|
||||
#define PW2_ENABLE (1 << 4)
|
||||
#define PW3_ENABLE (1 << 6)
|
||||
#define PW4_ENABLE (1 << 8)
|
||||
#define PM0_ENABLE (1 << 16)
|
||||
#define PM1_ENABLE (1 << 18)
|
||||
|
||||
#define DC_CMD_INT_MASK 0x38
|
||||
#define DC_CMD_INT_ENABLE 0x39
|
||||
|
||||
#define DC_CMD_STATE_ACCESS 0x40
|
||||
#define READ_MUX (1 << 0)
|
||||
#define WRITE_MUX (1 << 2)
|
||||
|
||||
#define DC_CMD_STATE_CONTROL 0x41
|
||||
#define GENERAL_ACT_REQ (1 << 0)
|
||||
#define WIN_A_ACT_REQ (1 << 1)
|
||||
#define WIN_B_ACT_REQ (1 << 2)
|
||||
#define WIN_C_ACT_REQ (1 << 3)
|
||||
#define CURSOR_ACT_REQ (1 << 7)
|
||||
#define GENERAL_UPDATE (1 << 8)
|
||||
#define WIN_A_UPDATE (1 << 9)
|
||||
#define WIN_B_UPDATE (1 << 10)
|
||||
#define WIN_C_UPDATE (1 << 11)
|
||||
#define CURSOR_UPDATE (1 << 15)
|
||||
#define NC_HOST_TRIG (1 << 24)
|
||||
|
||||
#define DC_CMD_DISPLAY_WINDOW_HEADER 0x42
|
||||
#define WINDOW_A_SELECT (1 << 4)
|
||||
#define WINDOW_B_SELECT (1 << 5)
|
||||
#define WINDOW_C_SELECT (1 << 6)
|
||||
|
||||
#define DC_CMD_REG_ACT_CONTROL 0x043
|
||||
|
||||
#define DC_COM_CRC_CONTROL 0x300
|
||||
#define DC_COM_PIN_OUTPUT_ENABLE(x) (0x302 + (x))
|
||||
#define DC_COM_PIN_OUTPUT_POLARITY(x) (0x306 + (x))
|
||||
|
||||
#define DC_DISP_DISP_WIN_OPTIONS 0x402
|
||||
#define HDMI_ENABLE (1 << 30)
|
||||
#define DSI_ENABLE (1 << 29)
|
||||
#define SOR1_TIMING_CYA (1 << 27)
|
||||
#define SOR1_ENABLE (1 << 26)
|
||||
#define SOR_ENABLE (1 << 25)
|
||||
#define CURSOR_ENABLE (1 << 16)
|
||||
|
||||
#define DC_DISP_DISP_MEM_HIGH_PRIORITY 0x403
|
||||
#define DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER 0x404
|
||||
#define DC_DISP_DISP_TIMING_OPTIONS 0x405
|
||||
#define DC_DISP_REF_TO_SYNC 0x406
|
||||
#define DC_DISP_SYNC_WIDTH 0x407
|
||||
#define DC_DISP_BACK_PORCH 0x408
|
||||
#define DC_DISP_ACTIVE 0x409
|
||||
#define DC_DISP_FRONT_PORCH 0x40A
|
||||
|
||||
#define DC_DISP_DISP_CLOCK_CONTROL 0x42E
|
||||
#define PIXEL_CLK_DIVIDER_PCD1 (0 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD1H (1 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD2 (2 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD3 (3 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD4 (4 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD6 (5 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD8 (6 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD9 (7 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD12 (8 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD16 (9 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD18 (10 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD24 (11 << 8)
|
||||
#define PIXEL_CLK_DIVIDER_PCD13 (12 << 8)
|
||||
#define SHIFT_CLK_DIVIDER(x) ((x) & 0xff)
|
||||
|
||||
#define DC_DISP_DISP_INTERFACE_CONTROL 0x42F
|
||||
#define DISP_DATA_FORMAT_DF1P1C (0 << 0)
|
||||
#define DISP_DATA_FORMAT_DF1P2C24B (1 << 0)
|
||||
#define DISP_DATA_FORMAT_DF1P2C18B (2 << 0)
|
||||
#define DISP_DATA_FORMAT_DF1P2C16B (3 << 0)
|
||||
#define DISP_DATA_FORMAT_DF2S (4 << 0)
|
||||
#define DISP_DATA_FORMAT_DF3S (5 << 0)
|
||||
#define DISP_DATA_FORMAT_DFSPI (6 << 0)
|
||||
#define DISP_DATA_FORMAT_DF1P3C24B (7 << 0)
|
||||
#define DISP_DATA_FORMAT_DF1P3C18B (8 << 0)
|
||||
#define DISP_ALIGNMENT_MSB (0 << 8)
|
||||
#define DISP_ALIGNMENT_LSB (1 << 8)
|
||||
#define DISP_ORDER_RED_BLUE (0 << 9)
|
||||
#define DISP_ORDER_BLUE_RED (1 << 9)
|
||||
|
||||
#define DC_DISP_DISP_COLOR_CONTROL 0x430
|
||||
#define DITHER_CONTROL_MASK (3 << 8)
|
||||
#define DITHER_CONTROL_DISABLE (0 << 8)
|
||||
#define DITHER_CONTROL_ORDERED (2 << 8)
|
||||
#define DITHER_CONTROL_ERRDIFF (3 << 8)
|
||||
#define BASE_COLOR_SIZE_MASK (0xf << 0)
|
||||
#define BASE_COLOR_SIZE_666 (0 << 0)
|
||||
#define BASE_COLOR_SIZE_111 (1 << 0)
|
||||
#define BASE_COLOR_SIZE_222 (2 << 0)
|
||||
#define BASE_COLOR_SIZE_333 (3 << 0)
|
||||
#define BASE_COLOR_SIZE_444 (4 << 0)
|
||||
#define BASE_COLOR_SIZE_555 (5 << 0)
|
||||
#define BASE_COLOR_SIZE_565 (6 << 0)
|
||||
#define BASE_COLOR_SIZE_332 (7 << 0)
|
||||
#define BASE_COLOR_SIZE_888 (8 << 0)
|
||||
|
||||
#define DC_DISP_SHIFT_CLOCK_OPTIONS 0x431
|
||||
#define SC1_H_QUALIFIER_NONE (1 << 16)
|
||||
#define SC0_H_QUALIFIER_NONE (1 << 0)
|
||||
|
||||
#define DC_DISP_DATA_ENABLE_OPTIONS 0x432
|
||||
#define DE_SELECT_ACTIVE_BLANK (0 << 0)
|
||||
#define DE_SELECT_ACTIVE (1 << 0)
|
||||
#define DE_SELECT_ACTIVE_IS (2 << 0)
|
||||
#define DE_CONTROL_ONECLK (0 << 2)
|
||||
#define DE_CONTROL_NORMAL (1 << 2)
|
||||
#define DE_CONTROL_EARLY_EXT (2 << 2)
|
||||
#define DE_CONTROL_EARLY (3 << 2)
|
||||
#define DE_CONTROL_ACTIVE_BLANK (4 << 2)
|
||||
|
||||
#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480
|
||||
#define DC_DISP_BLEND_BACKGROUND_COLOR 0x4E4
|
||||
|
||||
#define DC_WIN_CSC_YOF 0x611
|
||||
#define DC_WIN_CSC_KYRGB 0x612
|
||||
#define DC_WIN_CSC_KUR 0x613
|
||||
#define DC_WIN_CSC_KVR 0x614
|
||||
#define DC_WIN_CSC_KUG 0x615
|
||||
#define DC_WIN_CSC_KVG 0x616
|
||||
#define DC_WIN_CSC_KUB 0x617
|
||||
#define DC_WIN_CSC_KVB 0x618
|
||||
#define DC_WIN_AD_WIN_OPTIONS 0xB80
|
||||
#define DC_WIN_BD_WIN_OPTIONS 0xD80
|
||||
#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).
|
||||
#define DC_X_WIN_XD_WIN_OPTIONS 0x700
|
||||
#define DC_X_WIN_XD_COLOR_DEPTH 0x703
|
||||
#define DC_X_WIN_XD_POSITION 0x704
|
||||
#define DC_X_WIN_XD_SIZE 0x705
|
||||
#define DC_X_WIN_XD_PRESCALED_SIZE 0x706
|
||||
#define DC_X_WIN_XD_H_INITIAL_DDA 0x707
|
||||
#define DC_X_WIN_XD_V_INITIAL_DDA 0x708
|
||||
#define DC_X_WIN_XD_DDA_INCREMENT 0x709
|
||||
#define DC_X_WIN_XD_LINE_STRIDE 0x70A
|
||||
#define DC_WIN_WIN_OPTIONS 0x700
|
||||
#define H_DIRECTION (1 << 0)
|
||||
#define V_DIRECTION (1 << 2)
|
||||
#define COLOR_EXPAND (1 << 6)
|
||||
#define CSC_ENABLE (1 << 18)
|
||||
#define WIN_ENABLE (1 << 30)
|
||||
|
||||
#define DC_WIN_COLOR_DEPTH 0x703
|
||||
#define WIN_COLOR_DEPTH_P1 0x0
|
||||
#define WIN_COLOR_DEPTH_P2 0x1
|
||||
#define WIN_COLOR_DEPTH_P4 0x2
|
||||
#define WIN_COLOR_DEPTH_P8 0x3
|
||||
#define WIN_COLOR_DEPTH_B4G4R4A4 0x4
|
||||
#define WIN_COLOR_DEPTH_B5G5R5A 0x5
|
||||
#define WIN_COLOR_DEPTH_B5G6R5 0x6
|
||||
#define WIN_COLOR_DEPTH_AB5G5R5 0x7
|
||||
#define WIN_COLOR_DEPTH_B8G8R8A8 0xC
|
||||
#define WIN_COLOR_DEPTH_R8G8B8A8 0xD
|
||||
#define WIN_COLOR_DEPTH_B6x2G6x2R6x2A8 0xE
|
||||
#define WIN_COLOR_DEPTH_R6x2G6x2B6x2A8 0xF
|
||||
#define WIN_COLOR_DEPTH_YCbCr422 0x10
|
||||
#define WIN_COLOR_DEPTH_YUV422 0x11
|
||||
#define WIN_COLOR_DEPTH_YCbCr420P 0x12
|
||||
#define WIN_COLOR_DEPTH_YUV420P 0x13
|
||||
#define WIN_COLOR_DEPTH_YCbCr422P 0x14
|
||||
#define WIN_COLOR_DEPTH_YUV422P 0x15
|
||||
#define WIN_COLOR_DEPTH_YCbCr422R 0x16
|
||||
#define WIN_COLOR_DEPTH_YUV422R 0x17
|
||||
#define WIN_COLOR_DEPTH_YCbCr422RA 0x18
|
||||
#define WIN_COLOR_DEPTH_YUV422RA 0x19
|
||||
|
||||
#define DC_WIN_BUFFER_CONTROL 0x702
|
||||
#define DC_WIN_POSITION 0x704
|
||||
|
||||
#define DC_WIN_SIZE 0x705
|
||||
#define H_SIZE(x) (((x) & 0x1fff) << 0)
|
||||
#define V_SIZE(x) (((x) & 0x1fff) << 16)
|
||||
|
||||
#define DC_WIN_PRESCALED_SIZE 0x706
|
||||
#define H_PRESCALED_SIZE(x) (((x) & 0x7fff) << 0)
|
||||
#define V_PRESCALED_SIZE(x) (((x) & 0x1fff) << 16)
|
||||
|
||||
#define DC_WIN_H_INITIAL_DDA 0x707
|
||||
#define DC_WIN_V_INITIAL_DDA 0x708
|
||||
|
||||
#define DC_WIN_DDA_INC 0x709
|
||||
#define H_DDA_INC(x) (((x) & 0xffff) << 0)
|
||||
#define V_DDA_INC(x) (((x) & 0xffff) << 16)
|
||||
|
||||
#define DC_WIN_LINE_STRIDE 0x70A
|
||||
#define DC_WIN_DV_CONTROL 0x70E
|
||||
|
||||
//The following registers are A/B/C shadows of the 0xBC0/0xDC0/0xFC0 registers (see DISPLAY_WINDOW_HEADER).
|
||||
#define DC_X_WINBUF_XD_START_ADDR 0x800
|
||||
#define DC_X_WINBUF_XD_ADDR_H_OFFSET 0x806
|
||||
#define DC_X_WINBUF_XD_ADDR_V_OFFSET 0x808
|
||||
#define DC_X_WINBUF_XD_SURFACE_KIND 0x80B
|
||||
#define DC_WINBUF_START_ADDR 0x800
|
||||
#define DC_WINBUF_ADDR_H_OFFSET 0x806
|
||||
#define DC_WINBUF_ADDR_V_OFFSET 0x808
|
||||
#define DC_WINBUF_SURFACE_KIND 0x80B
|
||||
|
||||
/*! Display serial interface registers. */
|
||||
#define _DSIREG(reg) ((reg) * 4)
|
||||
#define DSI_DSI_RD_DATA 0x9
|
||||
#define DSI_DSI_WR_DATA 0xA
|
||||
#define DSI_DSI_POWER_CONTROL 0xB
|
||||
#define DSI_HOST_DSI_CONTROL 0xF
|
||||
#define DSI_DSI_TRIGGER 0x13
|
||||
#define DSI_DSI_BTA_TIMING 0x3F
|
||||
#define DSI_PAD_CONTROL 0x4B
|
||||
#define DSI_DSI_VID_MODE_CONTROL 0x4E
|
||||
|
||||
#define DSI_RD_DATA 0x9
|
||||
#define DSI_WR_DATA 0xA
|
||||
|
||||
#define DSI_POWER_CONTROL 0xB
|
||||
#define DSI_POWER_CONTROL_ENABLE 1
|
||||
|
||||
#define DSI_INT_ENABLE 0xC
|
||||
#define DSI_INT_STATUS 0xD
|
||||
#define DSI_INT_MASK 0xE
|
||||
|
||||
#define DSI_HOST_CONTROL 0xF
|
||||
#define DSI_HOST_CONTROL_FIFO_RESET (1 << 21)
|
||||
#define DSI_HOST_CONTROL_CRC_RESET (1 << 20)
|
||||
#define DSI_HOST_CONTROL_TX_TRIG_SOL (0 << 12)
|
||||
#define DSI_HOST_CONTROL_TX_TRIG_FIFO (1 << 12)
|
||||
#define DSI_HOST_CONTROL_TX_TRIG_HOST (2 << 12)
|
||||
#define DSI_HOST_CONTROL_RAW (1 << 6)
|
||||
#define DSI_HOST_CONTROL_HS (1 << 5)
|
||||
#define DSI_HOST_CONTROL_FIFO_SEL (1 << 4)
|
||||
#define DSI_HOST_CONTROL_IMM_BTA (1 << 3)
|
||||
#define DSI_HOST_CONTROL_PKT_BTA (1 << 2)
|
||||
#define DSI_HOST_CONTROL_CS (1 << 1)
|
||||
#define DSI_HOST_CONTROL_ECC (1 << 0)
|
||||
|
||||
#define DSI_CONTROL 0x10
|
||||
#define DSI_CONTROL_HS_CLK_CTRL (1 << 20)
|
||||
#define DSI_CONTROL_CHANNEL(c) (((c) & 0x3) << 16)
|
||||
#define DSI_CONTROL_FORMAT(f) (((f) & 0x3) << 12)
|
||||
#define DSI_CONTROL_TX_TRIG(x) (((x) & 0x3) << 8)
|
||||
#define DSI_CONTROL_LANES(n) (((n) & 0x3) << 4)
|
||||
#define DSI_CONTROL_DCS_ENABLE (1 << 3)
|
||||
#define DSI_CONTROL_SOURCE(s) (((s) & 0x1) << 2)
|
||||
#define DSI_CONTROL_VIDEO_ENABLE (1 << 1)
|
||||
#define DSI_CONTROL_HOST_ENABLE (1 << 0)
|
||||
|
||||
#define DSI_SOL_DELAY 0x11
|
||||
#define DSI_MAX_THRESHOLD 0x12
|
||||
|
||||
#define DSI_TRIGGER 0x13
|
||||
#define DSI_TRIGGER_HOST (1 << 1)
|
||||
#define DSI_TRIGGER_VIDEO (1 << 0)
|
||||
|
||||
#define DSI_TX_CRC 0x14
|
||||
#define DSI_STATUS 0x15
|
||||
#define DSI_INIT_SEQ_CONTROL 0x1A
|
||||
#define DSI_INIT_SEQ_DATA_0 0x1B
|
||||
#define DSI_INIT_SEQ_DATA_1 0x1C
|
||||
#define DSI_INIT_SEQ_DATA_2 0x1D
|
||||
#define DSI_INIT_SEQ_DATA_3 0x1E
|
||||
#define DSI_PKT_SEQ_0_LO 0x23
|
||||
#define DSI_PKT_SEQ_0_HI 0x24
|
||||
#define DSI_PKT_SEQ_1_LO 0x25
|
||||
#define DSI_PKT_SEQ_1_HI 0x26
|
||||
#define DSI_PKT_SEQ_2_LO 0x27
|
||||
#define DSI_PKT_SEQ_2_HI 0x28
|
||||
#define DSI_PKT_SEQ_3_LO 0x29
|
||||
#define DSI_PKT_SEQ_3_HI 0x2A
|
||||
#define DSI_PKT_SEQ_4_LO 0x2B
|
||||
#define DSI_PKT_SEQ_4_HI 0x2C
|
||||
#define DSI_PKT_SEQ_5_LO 0x2D
|
||||
#define DSI_PKT_SEQ_5_HI 0x2E
|
||||
#define DSI_DCS_CMDS 0x33
|
||||
#define DSI_PKT_LEN_0_1 0x34
|
||||
#define DSI_PKT_LEN_2_3 0x35
|
||||
#define DSI_PKT_LEN_4_5 0x36
|
||||
#define DSI_PKT_LEN_6_7 0x37
|
||||
#define DSI_PHY_TIMING_0 0x3C
|
||||
#define DSI_PHY_TIMING_1 0x3D
|
||||
#define DSI_PHY_TIMING_2 0x3E
|
||||
#define DSI_BTA_TIMING 0x3F
|
||||
|
||||
#define DSI_TIMEOUT_0 0x44
|
||||
#define DSI_TIMEOUT_LRX(x) (((x) & 0xffff) << 16)
|
||||
#define DSI_TIMEOUT_HTX(x) (((x) & 0xffff) << 0)
|
||||
|
||||
#define DSI_TIMEOUT_1 0x45
|
||||
#define DSI_TIMEOUT_PR(x) (((x) & 0xffff) << 16)
|
||||
#define DSI_TIMEOUT_TA(x) (((x) & 0xffff) << 0)
|
||||
|
||||
#define DSI_TO_TALLY 0x46
|
||||
|
||||
#define DSI_PAD_CONTROL_0 0x4B
|
||||
#define DSI_PAD_CONTROL_VS1_PULLDN_CLK (1 << 24)
|
||||
#define DSI_PAD_CONTROL_VS1_PULLDN(x) (((x) & 0xf) << 16)
|
||||
#define DSI_PAD_CONTROL_VS1_PDIO_CLK (1 << 8)
|
||||
#define DSI_PAD_CONTROL_VS1_PDIO(x) (((x) & 0xf) << 0)
|
||||
|
||||
#define DSI_PAD_CONTROL_CD 0x4c
|
||||
#define DSI_VIDEO_MODE_CONTROL 0x4E
|
||||
|
||||
#define DSI_PAD_CONTROL_1 0x4F
|
||||
#define DSI_PAD_CONTROL_2 0x50
|
||||
|
||||
#define DSI_PAD_CONTROL_3 0x51
|
||||
#define DSI_PAD_PREEMP_PD_CLK(x) (((x) & 0x3) << 12)
|
||||
#define DSI_PAD_PREEMP_PU_CLK(x) (((x) & 0x3) << 8)
|
||||
#define DSI_PAD_PREEMP_PD(x) (((x) & 0x3) << 4)
|
||||
#define DSI_PAD_PREEMP_PU(x) (((x) & 0x3) << 0)
|
||||
|
||||
#define DSI_PAD_CONTROL_4 0x52
|
||||
|
||||
void display_init();
|
||||
void display_end();
|
||||
|
||||
888
ipl/di.inl
888
ipl/di.inl
@@ -18,263 +18,269 @@
|
||||
static const cfg_op_t _display_config_1[4] = {
|
||||
{0x4E, 0x40000000}, //CLK_RST_CONTROLLER_CLK_SOURCE_DISP1
|
||||
{0x34, 0x4830A001}, //CLK_RST_CONTROLLER_PLLD_BASE
|
||||
{0x36, 0x20}, //CLK_RST_CONTROLLER_PLLD_MISC1
|
||||
{0x37, 0x2D0AAA} //CLK_RST_CONTROLLER_PLLD_MISC
|
||||
{0x36, 0x20}, //CLK_RST_CONTROLLER_PLLD_MISC1
|
||||
{0x37, 0x2D0AAA} //CLK_RST_CONTROLLER_PLLD_MISC
|
||||
};
|
||||
|
||||
//Display A config.
|
||||
static const cfg_op_t _display_config_2[94] = {
|
||||
{0x40, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{0x43, 0x54},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{0x42, 0x10},
|
||||
{0x42, 0x20},
|
||||
{0x42, 0x40},
|
||||
{0x480, 0},
|
||||
{0x403, 0},
|
||||
{0x404, 0},
|
||||
{0x36, 0x50155},
|
||||
{1, 0x100},
|
||||
{0x28, 0x109},
|
||||
{DC_CMD_STATE_CONTROL, 0xF00},
|
||||
{DC_CMD_STATE_CONTROL, 0xF},
|
||||
{0x40, 0},
|
||||
{0x42, 0x10},
|
||||
{0x700, 0},
|
||||
{0x42, 0x10},
|
||||
{0x70E, 0},
|
||||
{0x700, 0},
|
||||
{0x42, 0x10},
|
||||
{0x42, 0x10},
|
||||
{0x611, 0xF0},
|
||||
{0x612, 0x12A},
|
||||
{0x613, 0},
|
||||
{0x614, 0x198},
|
||||
{0x615, 0x39B},
|
||||
{0x616, 0x32F},
|
||||
{0x617, 0x204},
|
||||
{0x618, 0},
|
||||
{0x42, 0x20},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x70E, 0},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x42, 0x20},
|
||||
{0x611, 0xF0},
|
||||
{0x612, 0x12A},
|
||||
{0x613, 0},
|
||||
{0x614, 0x198},
|
||||
{0x615, 0x39B},
|
||||
{0x616, 0x32F},
|
||||
{0x617, 0x204},
|
||||
{0x618, 0},
|
||||
{0x42, 0x40},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x70E, 0},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x42, 0x40},
|
||||
{0x611, 0xF0},
|
||||
{0x612, 0x12A},
|
||||
{0x613, 0},
|
||||
{0x614, 0x198},
|
||||
{0x615, 0x39B},
|
||||
{0x616, 0x32F},
|
||||
{0x617, 0x204},
|
||||
{0x618, 0},
|
||||
{0x42, 0x10},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x700, 0},
|
||||
{0x430, 8},
|
||||
{0x42F, 0},
|
||||
{0x307, 0x1000000},
|
||||
{0x309, 0},
|
||||
{DC_CMD_STATE_ACCESS, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_REG_ACT_CONTROL, 0x54},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_DISP_DC_MCCIF_FIFOCTRL, 0},
|
||||
{DC_DISP_DISP_MEM_HIGH_PRIORITY, 0},
|
||||
{DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER, 0},
|
||||
{DC_CMD_DISPLAY_POWER_CONTROL, PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE | PW4_ENABLE | PM0_ENABLE | PM1_ENABLE},
|
||||
{DC_CMD_GENERAL_INCR_SYNCPT_CNTRL, SYNCPT_CNTRL_NO_STALL},
|
||||
{DC_CMD_CONT_SYNCPT_VSYNC, SYNCPT_VSYNC_ENABLE | 0x9}, // 9: SYNCPT
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
|
||||
{DC_CMD_STATE_ACCESS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_DV_CONTROL, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
/* Setup default YUV colorspace conversion coefficients */
|
||||
{DC_WIN_CSC_YOF, 0xF0},
|
||||
{DC_WIN_CSC_KYRGB, 0x12A},
|
||||
{DC_WIN_CSC_KUR, 0},
|
||||
{DC_WIN_CSC_KVR, 0x198},
|
||||
{DC_WIN_CSC_KUG, 0x39B},
|
||||
{DC_WIN_CSC_KVG, 0x32F},
|
||||
{DC_WIN_CSC_KUB, 0x204},
|
||||
{DC_WIN_CSC_KVB, 0},
|
||||
/* End of color coefficients */
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_DV_CONTROL, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
/* Setup default YUV colorspace conversion coefficients */
|
||||
{DC_WIN_CSC_YOF, 0xF0},
|
||||
{DC_WIN_CSC_KYRGB, 0x12A},
|
||||
{DC_WIN_CSC_KUR, 0},
|
||||
{DC_WIN_CSC_KVR, 0x198},
|
||||
{DC_WIN_CSC_KUG, 0x39B},
|
||||
{DC_WIN_CSC_KVG, 0x32F},
|
||||
{DC_WIN_CSC_KUB, 0x204},
|
||||
{DC_WIN_CSC_KVB, 0},
|
||||
/* End of color coefficients */
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_DV_CONTROL, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
/* Setup default YUV colorspace conversion coefficients */
|
||||
{DC_WIN_CSC_YOF, 0xF0},
|
||||
{DC_WIN_CSC_KYRGB, 0x12A},
|
||||
{DC_WIN_CSC_KUR, 0},
|
||||
{DC_WIN_CSC_KVR, 0x198},
|
||||
{DC_WIN_CSC_KUG, 0x39B},
|
||||
{DC_WIN_CSC_KVG, 0x32F},
|
||||
{DC_WIN_CSC_KUB, 0x204},
|
||||
{DC_WIN_CSC_KVB, 0},
|
||||
/* End of color coefficients */
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_COLOR_CONTROL, BASE_COLOR_SIZE_888},
|
||||
{DC_DISP_DISP_INTERFACE_CONTROL, DISP_DATA_FORMAT_DF1P1C},
|
||||
{DC_COM_PIN_OUTPUT_POLARITY(1), 0x1000000},
|
||||
{DC_COM_PIN_OUTPUT_POLARITY(3), 0},
|
||||
{0x4E4, 0},
|
||||
{0x300, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0xF00},
|
||||
{DC_CMD_STATE_CONTROL, 0xF},
|
||||
{0x42, 0x10},
|
||||
{DC_COM_CRC_CONTROL, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{0x716, 0x10000FF},
|
||||
{0x42, 0x20},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{0x716, 0x10000FF},
|
||||
{0x42, 0x40},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{0x716, 0x10000FF},
|
||||
{0x31, 0},
|
||||
{0x42, 0x10},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x700, 0},
|
||||
{0x402, 0},
|
||||
{0x32, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0xF00},
|
||||
{DC_CMD_STATE_CONTROL, 0xF}
|
||||
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_COMMAND, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ}
|
||||
};
|
||||
|
||||
//DSI config.
|
||||
//DSI Init config.
|
||||
static const cfg_op_t _display_config_3[60] = {
|
||||
{0xA, 0},
|
||||
{0xC, 0},
|
||||
{0xD, 0},
|
||||
{0xE, 0},
|
||||
{0x1B, 0},
|
||||
{0x1C, 0},
|
||||
{0x1D, 0},
|
||||
{0x1E, 0},
|
||||
{0x33, 0},
|
||||
{0x23, 0},
|
||||
{0x25, 0},
|
||||
{0x27, 0},
|
||||
{0x29, 0},
|
||||
{0x2B, 0},
|
||||
{0x2D, 0},
|
||||
{0x24, 0},
|
||||
{0x26, 0},
|
||||
{0x28, 0},
|
||||
{0x2A, 0},
|
||||
{0x2C, 0},
|
||||
{0x2E, 0},
|
||||
{0x10, 0},
|
||||
{0x4C, 0},
|
||||
{0x11, 0x18},
|
||||
{0x12, 0x1E0},
|
||||
{0x13, 0},
|
||||
{0x1A, 0},
|
||||
{0x34, 0},
|
||||
{0x35, 0},
|
||||
{0x36, 0},
|
||||
{0x37, 0},
|
||||
{0x4F, 0},
|
||||
{0x3C, 0x6070601},
|
||||
{0x3D, 0x40A0E05},
|
||||
{0x3E, 0x30109},
|
||||
{0x3F, 0x190A14},
|
||||
{0x44, 0x2000FFFF},
|
||||
{0x45, 0x7652000},
|
||||
{0x46, 0},
|
||||
{0x4B, 0},
|
||||
{DSI_DSI_POWER_CONTROL, 1},
|
||||
{DSI_DSI_POWER_CONTROL, 1},
|
||||
{DSI_DSI_POWER_CONTROL, 0},
|
||||
{DSI_DSI_POWER_CONTROL, 0},
|
||||
{0x4F, 0},
|
||||
{0x3C, 0x6070601},
|
||||
{0x3D, 0x40A0E05},
|
||||
{0x3E, 0x30118},
|
||||
{0x3F, 0x190A14},
|
||||
{0x44, 0x2000FFFF},
|
||||
{0x45, 0x13432000},
|
||||
{0x46, 0},
|
||||
{0xF, 0x102003},
|
||||
{0x10, 0x31},
|
||||
{DSI_DSI_POWER_CONTROL, 1},
|
||||
{DSI_DSI_POWER_CONTROL, 1},
|
||||
{0x12, 0x40},
|
||||
{0x13, 0},
|
||||
{0x14, 0},
|
||||
{0x1A, 0}
|
||||
{DSI_WR_DATA, 0},
|
||||
{DSI_INT_ENABLE, 0},
|
||||
{DSI_INT_STATUS, 0},
|
||||
{DSI_INT_MASK, 0},
|
||||
{DSI_INIT_SEQ_DATA_0, 0},
|
||||
{DSI_INIT_SEQ_DATA_1, 0},
|
||||
{DSI_INIT_SEQ_DATA_2, 0},
|
||||
{DSI_INIT_SEQ_DATA_3, 0},
|
||||
{DSI_DCS_CMDS, 0},
|
||||
{DSI_PKT_SEQ_0_LO, 0},
|
||||
{DSI_PKT_SEQ_1_LO, 0},
|
||||
{DSI_PKT_SEQ_2_LO, 0},
|
||||
{DSI_PKT_SEQ_3_LO, 0},
|
||||
{DSI_PKT_SEQ_4_LO, 0},
|
||||
{DSI_PKT_SEQ_5_LO, 0},
|
||||
{DSI_PKT_SEQ_0_HI, 0},
|
||||
{DSI_PKT_SEQ_1_HI, 0},
|
||||
{DSI_PKT_SEQ_2_HI, 0},
|
||||
{DSI_PKT_SEQ_3_HI, 0},
|
||||
{DSI_PKT_SEQ_4_HI, 0},
|
||||
{DSI_PKT_SEQ_5_HI, 0},
|
||||
{DSI_CONTROL, 0},
|
||||
{DSI_PAD_CONTROL_CD, 0},
|
||||
{DSI_SOL_DELAY, 0x18},
|
||||
{DSI_MAX_THRESHOLD, 0x1E0},
|
||||
{DSI_TRIGGER, 0},
|
||||
{DSI_INIT_SEQ_CONTROL, 0},
|
||||
{DSI_PKT_LEN_0_1, 0},
|
||||
{DSI_PKT_LEN_2_3, 0},
|
||||
{DSI_PKT_LEN_4_5, 0},
|
||||
{DSI_PKT_LEN_6_7, 0},
|
||||
{DSI_PAD_CONTROL_1, 0},
|
||||
{DSI_PHY_TIMING_0, 0x6070601},
|
||||
{DSI_PHY_TIMING_1, 0x40A0E05},
|
||||
{DSI_PHY_TIMING_2, 0x30109},
|
||||
{DSI_BTA_TIMING, 0x190A14},
|
||||
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xFFFF)},
|
||||
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x765) | DSI_TIMEOUT_TA(0x2000)},
|
||||
{DSI_TO_TALLY, 0},
|
||||
{DSI_PAD_CONTROL_0, DSI_PAD_CONTROL_VS1_PULLDN(0) | DSI_PAD_CONTROL_VS1_PDIO(0)}, // Enable
|
||||
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
|
||||
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
|
||||
{DSI_POWER_CONTROL, 0},
|
||||
{DSI_POWER_CONTROL, 0},
|
||||
{DSI_PAD_CONTROL_1, 0},
|
||||
{DSI_PHY_TIMING_0, 0x6070601},
|
||||
{DSI_PHY_TIMING_1, 0x40A0E05},
|
||||
{DSI_PHY_TIMING_2, 0x30118},
|
||||
{DSI_BTA_TIMING, 0x190A14},
|
||||
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xFFFF)},
|
||||
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x1343) | DSI_TIMEOUT_TA(0x2000)},
|
||||
{DSI_TO_TALLY, 0},
|
||||
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_CRC_RESET | DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
|
||||
{DSI_CONTROL, DSI_CONTROL_LANES(3) | DSI_CONTROL_HOST_ENABLE},
|
||||
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
|
||||
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
|
||||
{DSI_MAX_THRESHOLD, 0x40},
|
||||
{DSI_TRIGGER, 0},
|
||||
{DSI_TX_CRC, 0},
|
||||
{DSI_INIT_SEQ_CONTROL, 0}
|
||||
};
|
||||
|
||||
//DSI config (if ver == 0x10).
|
||||
static const cfg_op_t _display_config_4[43] = {
|
||||
{DSI_DSI_WR_DATA, 0x439},
|
||||
{DSI_DSI_WR_DATA, 0x9483FFB9},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0xBD15},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x1939},
|
||||
{DSI_DSI_WR_DATA, 0xAAAAAAD8},
|
||||
{DSI_DSI_WR_DATA, 0xAAAAAAEB},
|
||||
{DSI_DSI_WR_DATA, 0xAAEBAAAA},
|
||||
{DSI_DSI_WR_DATA, 0xAAAAAAAA},
|
||||
{DSI_DSI_WR_DATA, 0xAAAAAAEB},
|
||||
{DSI_DSI_WR_DATA, 0xAAEBAAAA},
|
||||
{DSI_DSI_WR_DATA, 0xAA},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x1BD15},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x2739},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFD8},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFF},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x2BD15},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0xF39},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFD8},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_DSI_WR_DATA, 0xFFFFFF},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0xBD15},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x6D915},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x439},
|
||||
{DSI_DSI_WR_DATA, 0xB9},
|
||||
{DSI_DSI_TRIGGER, 2}
|
||||
{DSI_WR_DATA, 0x439},
|
||||
{DSI_WR_DATA, 0x9483FFB9},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0xBD15},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x1939},
|
||||
{DSI_WR_DATA, 0xAAAAAAD8},
|
||||
{DSI_WR_DATA, 0xAAAAAAEB},
|
||||
{DSI_WR_DATA, 0xAAEBAAAA},
|
||||
{DSI_WR_DATA, 0xAAAAAAAA},
|
||||
{DSI_WR_DATA, 0xAAAAAAEB},
|
||||
{DSI_WR_DATA, 0xAAEBAAAA},
|
||||
{DSI_WR_DATA, 0xAA},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x1BD15},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x2739},
|
||||
{DSI_WR_DATA, 0xFFFFFFD8},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFF},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x2BD15},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0xF39},
|
||||
{DSI_WR_DATA, 0xFFFFFFD8},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFFFF},
|
||||
{DSI_WR_DATA, 0xFFFFFF},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0xBD15},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x6D915},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x439},
|
||||
{DSI_WR_DATA, 0xB9},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST}
|
||||
};
|
||||
|
||||
//DSI config.
|
||||
static const cfg_op_t _display_config_5[21] = {
|
||||
{0x4F, 0},
|
||||
{0x3C, 0x6070601},
|
||||
{0x3D, 0x40A0E05},
|
||||
{0x3E, 0x30172},
|
||||
{0x3F, 0x190A14},
|
||||
{0x44, 0x20000A40},
|
||||
{0x45, 0x5A2F2000},
|
||||
{0x46, 0},
|
||||
{0x23, 0x40000208},
|
||||
{0x27, 0x40000308},
|
||||
{0x2B, 0x40000308},
|
||||
{0x25, 0x40000308},
|
||||
{0x29, 0x3F3B2B08},
|
||||
{0x2A, 0x2CC},
|
||||
{0x2D, 0x3F3B2B08},
|
||||
{0x2E, 0x2CC},
|
||||
{0x34, 0xCE0000},
|
||||
{0x35, 0x87001A2},
|
||||
{0x36, 0x190},
|
||||
{0x37, 0x190},
|
||||
{0xF, 0},
|
||||
{DSI_PAD_CONTROL_1, 0},
|
||||
{DSI_PHY_TIMING_0, 0x6070601},
|
||||
{DSI_PHY_TIMING_1, 0x40A0E05},
|
||||
{DSI_PHY_TIMING_2, 0x30172},
|
||||
{DSI_BTA_TIMING, 0x190A14},
|
||||
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xA40)},
|
||||
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x5A2F) | DSI_TIMEOUT_TA(0x2000)},
|
||||
{DSI_TO_TALLY, 0},
|
||||
{DSI_PKT_SEQ_0_LO, 0x40000208},
|
||||
{DSI_PKT_SEQ_2_LO, 0x40000308},
|
||||
{DSI_PKT_SEQ_4_LO, 0x40000308},
|
||||
{DSI_PKT_SEQ_1_LO, 0x40000308},
|
||||
{DSI_PKT_SEQ_3_LO, 0x3F3B2B08},
|
||||
{DSI_PKT_SEQ_3_HI, 0x2CC},
|
||||
{DSI_PKT_SEQ_5_LO, 0x3F3B2B08},
|
||||
{DSI_PKT_SEQ_5_HI, 0x2CC},
|
||||
{DSI_PKT_LEN_0_1, 0xCE0000},
|
||||
{DSI_PKT_LEN_2_3, 0x87001A2},
|
||||
{DSI_PKT_LEN_4_5, 0x190},
|
||||
{DSI_PKT_LEN_6_7, 0x190},
|
||||
{DSI_HOST_CONTROL, 0},
|
||||
};
|
||||
|
||||
//Clock config.
|
||||
static const cfg_op_t _display_config_6[3] = {
|
||||
{0x34, 0x4810C001}, //CLK_RST_CONTROLLER_PLLD_BASE
|
||||
{0x36, 0x20}, //CLK_RST_CONTROLLER_PLLD_MISC1
|
||||
{0x37, 0x2DFC00} //CLK_RST_CONTROLLER_PLLD_MISC
|
||||
{0x36, 0x20}, //CLK_RST_CONTROLLER_PLLD_MISC1
|
||||
{0x37, 0x2DFC00} //CLK_RST_CONTROLLER_PLLD_MISC
|
||||
};
|
||||
|
||||
//DSI config.
|
||||
static const cfg_op_t _display_config_7[10] = {
|
||||
{0x13, 0},
|
||||
{0x10, 0},
|
||||
{0x11, 6},
|
||||
{0x12, 0x1E0},
|
||||
{DSI_DSI_POWER_CONTROL, 1},
|
||||
{0x10, 0x103032},
|
||||
{0xF, 0x33},
|
||||
{0x10, 0x103032},
|
||||
{0xF, 3},
|
||||
{0xF, 0x23}
|
||||
{DSI_TRIGGER, 0},
|
||||
{DSI_CONTROL, 0},
|
||||
{DSI_SOL_DELAY, 6},
|
||||
{DSI_MAX_THRESHOLD, 0x1E0},
|
||||
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
|
||||
{DSI_CONTROL, DSI_CONTROL_HS_CLK_CTRL | DSI_CONTROL_FORMAT(3) | DSI_CONTROL_LANES(3) | DSI_CONTROL_VIDEO_ENABLE},
|
||||
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_HS | DSI_HOST_CONTROL_FIFO_SEL| DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
|
||||
{DSI_CONTROL, DSI_CONTROL_HS_CLK_CTRL | DSI_CONTROL_FORMAT(3) | DSI_CONTROL_LANES(3) | DSI_CONTROL_VIDEO_ENABLE},
|
||||
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
|
||||
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_HS | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC}
|
||||
};
|
||||
|
||||
//MIPI CAL config.
|
||||
@@ -289,10 +295,10 @@ static const cfg_op_t _display_config_8[6] = {
|
||||
|
||||
//DSI config.
|
||||
static const cfg_op_t _display_config_9[4] = {
|
||||
{0x4F, 0},
|
||||
{0x50, 0},
|
||||
{0x51, 0x3333},
|
||||
{0x52, 0}
|
||||
{DSI_PAD_CONTROL_1, 0},
|
||||
{DSI_PAD_CONTROL_2, 0},
|
||||
{DSI_PAD_CONTROL_3, DSI_PAD_PREEMP_PD_CLK(0x3) | DSI_PAD_PREEMP_PU_CLK(0x3) | DSI_PAD_PREEMP_PD(0x03) | DSI_PAD_PREEMP_PU(0x3)},
|
||||
{DSI_PAD_CONTROL_4, 0}
|
||||
};
|
||||
|
||||
//MIPI CAL config.
|
||||
@@ -317,232 +323,240 @@ static const cfg_op_t _display_config_10[16] = {
|
||||
|
||||
//Display A config.
|
||||
static const cfg_op_t _display_config_11[113] = {
|
||||
{0x40, 0},
|
||||
{0x42, 0x10},
|
||||
{0x700, 0},
|
||||
{0x42, 0x10},
|
||||
{0x70E, 0},
|
||||
{0x700, 0},
|
||||
{0x42, 0x10},
|
||||
{0x42, 0x10},
|
||||
{0x611, 0xF0},
|
||||
{0x612, 0x12A},
|
||||
{0x613, 0},
|
||||
{0x614, 0x198},
|
||||
{0x615, 0x39B},
|
||||
{0x616, 0x32F},
|
||||
{0x617, 0x204},
|
||||
{0x618, 0},
|
||||
{0x42, 0x20},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x70E, 0},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x42, 0x20},
|
||||
{0x611, 0xF0},
|
||||
{0x612, 0x12A},
|
||||
{0x613, 0},
|
||||
{0x614, 0x198},
|
||||
{0x615, 0x39B},
|
||||
{0x616, 0x32F},
|
||||
{0x617, 0x204},
|
||||
{0x618, 0},
|
||||
{0x42, 0x40},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x70E, 0},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x42, 0x40},
|
||||
{0x611, 0xF0},
|
||||
{0x612, 0x12A},
|
||||
{0x613, 0},
|
||||
{0x614, 0x198},
|
||||
{0x615, 0x39B},
|
||||
{0x616, 0x32F},
|
||||
{0x617, 0x204},
|
||||
{0x618, 0},
|
||||
{0x42, 0x10},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x700, 0},
|
||||
{0x430, 8},
|
||||
{0x42F, 0},
|
||||
{0x307, 0x1000000},
|
||||
{0x309, 0},
|
||||
{DC_CMD_STATE_ACCESS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_DV_CONTROL, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
/* Setup default YUV colorspace conversion coefficients */
|
||||
{DC_WIN_CSC_YOF, 0xF0},
|
||||
{DC_WIN_CSC_KYRGB, 0x12A},
|
||||
{DC_WIN_CSC_KUR, 0},
|
||||
{DC_WIN_CSC_KVR, 0x198},
|
||||
{DC_WIN_CSC_KUG, 0x39B},
|
||||
{DC_WIN_CSC_KVG, 0x32F},
|
||||
{DC_WIN_CSC_KUB, 0x204},
|
||||
{DC_WIN_CSC_KVB, 0},
|
||||
/* End of color coefficients */
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_DV_CONTROL, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
/* Setup default YUV colorspace conversion coefficients */
|
||||
{DC_WIN_CSC_YOF, 0xF0},
|
||||
{DC_WIN_CSC_KYRGB, 0x12A},
|
||||
{DC_WIN_CSC_KUR, 0},
|
||||
{DC_WIN_CSC_KVR, 0x198},
|
||||
{DC_WIN_CSC_KUG, 0x39B},
|
||||
{DC_WIN_CSC_KVG, 0x32F},
|
||||
{DC_WIN_CSC_KUB, 0x204},
|
||||
{DC_WIN_CSC_KVB, 0},
|
||||
/* End of color coefficients */
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_DV_CONTROL, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
/* Setup default YUV colorspace conversion coefficients */
|
||||
{DC_WIN_CSC_YOF, 0xF0},
|
||||
{DC_WIN_CSC_KYRGB, 0x12A},
|
||||
{DC_WIN_CSC_KUR, 0},
|
||||
{DC_WIN_CSC_KVR, 0x198},
|
||||
{DC_WIN_CSC_KUG, 0x39B},
|
||||
{DC_WIN_CSC_KVG, 0x32F},
|
||||
{DC_WIN_CSC_KUB, 0x204},
|
||||
{DC_WIN_CSC_KVB, 0},
|
||||
/* End of color coefficients */
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_COLOR_CONTROL, BASE_COLOR_SIZE_888},
|
||||
{DC_DISP_DISP_INTERFACE_CONTROL, DISP_DATA_FORMAT_DF1P1C},
|
||||
{DC_COM_PIN_OUTPUT_POLARITY(1), 0x1000000},
|
||||
{DC_COM_PIN_OUTPUT_POLARITY(3), 0},
|
||||
{0x4E4, 0},
|
||||
{0x300, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0xF00},
|
||||
{DC_CMD_STATE_CONTROL, 0xF},
|
||||
{0x42, 0x10},
|
||||
{DC_COM_CRC_CONTROL, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{0x716, 0x10000FF},
|
||||
{0x42, 0x20},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{0x716, 0x10000FF},
|
||||
{0x42, 0x40},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{0x716, 0x10000FF},
|
||||
{0x31, 0},
|
||||
{0x42, 0x10},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x700, 0},
|
||||
{0x402, 0},
|
||||
{0x32, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0xF00},
|
||||
{DC_CMD_STATE_CONTROL, 0xF},
|
||||
{0x40, 0},
|
||||
{0x405, 0},
|
||||
{0x406, 0x10000},
|
||||
{0x407, 0x10048},
|
||||
{0x408, 0x90048},
|
||||
{0x409, 0x50002D0},
|
||||
{0x40A, 0xA0088},
|
||||
{0x431, 0x10001},
|
||||
{0x303, 0},
|
||||
{0x432, 5},
|
||||
{0x42F, 0},
|
||||
{0x42E, 0},
|
||||
{0x31, 0},
|
||||
{0x42, 0x10},
|
||||
{0x700, 0},
|
||||
{0x42, 0x20},
|
||||
{0x700, 0},
|
||||
{0x42, 0x40},
|
||||
{0x700, 0},
|
||||
{0x402, 0},
|
||||
{0x32, 0x20},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{0x40, 5},
|
||||
{0x40A, 0xA0088},
|
||||
{0x40, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{0, 0x301},
|
||||
{0, 0x301},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{0x40, 0},
|
||||
{0x42E, 4},
|
||||
{0x430, 8},
|
||||
{0x31, 0}
|
||||
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_COMMAND, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE | WIN_B_UPDATE | WIN_C_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ | WIN_B_ACT_REQ | WIN_C_ACT_REQ},
|
||||
{DC_CMD_STATE_ACCESS, 0},
|
||||
/* Set Display timings */
|
||||
{DC_DISP_DISP_TIMING_OPTIONS, 0},
|
||||
{DC_DISP_REF_TO_SYNC, (1 << 16)}, // h_ref_to_sync = 0, v_ref_to_sync = 1.
|
||||
{DC_DISP_SYNC_WIDTH, 0x10048},
|
||||
{DC_DISP_BACK_PORCH, 0x90048},
|
||||
{DC_DISP_ACTIVE, 0x50002D0},
|
||||
{DC_DISP_FRONT_PORCH, 0xA0088}, // Sources say that this should be above the DC_DISP_ACTIVE cmd.
|
||||
/* End of Display timings */
|
||||
{DC_DISP_SHIFT_CLOCK_OPTIONS, SC1_H_QUALIFIER_NONE | SC0_H_QUALIFIER_NONE},
|
||||
{DC_COM_PIN_OUTPUT_ENABLE(1), 0},
|
||||
{DC_DISP_DATA_ENABLE_OPTIONS, DE_SELECT_ACTIVE | DE_CONTROL_NORMAL},
|
||||
{DC_DISP_DISP_INTERFACE_CONTROL, DISP_DATA_FORMAT_DF1P1C},
|
||||
{DC_DISP_DISP_CLOCK_CONTROL, 0},
|
||||
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_STATE_ACCESS, READ_MUX | WRITE_MUX},
|
||||
{DC_DISP_FRONT_PORCH, 0xA0088},
|
||||
{DC_CMD_STATE_ACCESS, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
|
||||
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_STATE_ACCESS, 0},
|
||||
{DC_DISP_DISP_CLOCK_CONTROL, PIXEL_CLK_DIVIDER_PCD1 | SHIFT_CLK_DIVIDER(4)},
|
||||
{DC_DISP_DISP_COLOR_CONTROL, BASE_COLOR_SIZE_888},
|
||||
{DC_CMD_DISPLAY_COMMAND_OPTION0, 0}
|
||||
};
|
||||
|
||||
////Display A config.
|
||||
static const cfg_op_t _display_config_12[17] = {
|
||||
{0x40A, 0xA0088},
|
||||
{0x38, 0},
|
||||
{0x40, 0},
|
||||
{0x39, 0},
|
||||
{0x28, 0},
|
||||
{0x32, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{0, 0x301},
|
||||
{0, 0x301},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1},
|
||||
{0x36, 0},
|
||||
{DC_CMD_STATE_CONTROL, 0x100},
|
||||
{DC_CMD_STATE_CONTROL, 1}
|
||||
{DC_DISP_FRONT_PORCH, 0xA0088},
|
||||
{DC_CMD_INT_MASK, 0},
|
||||
{DC_CMD_STATE_ACCESS, 0},
|
||||
{DC_CMD_INT_ENABLE, 0},
|
||||
{DC_CMD_CONT_SYNCPT_VSYNC, 0},
|
||||
{DC_CMD_DISPLAY_COMMAND, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
|
||||
{DC_CMD_GENERAL_INCR_SYNCPT, 0x301},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
{DC_CMD_DISPLAY_POWER_CONTROL, 0},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE},
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ},
|
||||
};
|
||||
|
||||
//DSI config.
|
||||
static const cfg_op_t _display_config_13[16] = {
|
||||
{DSI_DSI_POWER_CONTROL, 0},
|
||||
{0x4F, 0},
|
||||
{0x3C, 0x6070601},
|
||||
{0x3D, 0x40A0E05},
|
||||
{0x3E, 0x30109},
|
||||
{0x3F, 0x190A14},
|
||||
{0x44, 0x2000FFFF},
|
||||
{0x45, 0x7652000},
|
||||
{0x46, 0},
|
||||
{0xF, 0x102003},
|
||||
{0x10, 0x31},
|
||||
{DSI_DSI_POWER_CONTROL, 1},
|
||||
{0x12, 0x40},
|
||||
{0x13, 0},
|
||||
{0x14, 0},
|
||||
{0x1A, 0}
|
||||
{DSI_POWER_CONTROL, 0},
|
||||
{DSI_PAD_CONTROL_1, 0},
|
||||
{DSI_PHY_TIMING_0, 0x6070601},
|
||||
{DSI_PHY_TIMING_1, 0x40A0E05},
|
||||
{DSI_PHY_TIMING_2, 0x30109},
|
||||
{DSI_BTA_TIMING, 0x190A14},
|
||||
{DSI_TIMEOUT_0, DSI_TIMEOUT_LRX(0x2000) | DSI_TIMEOUT_HTX(0xFFFF) },
|
||||
{DSI_TIMEOUT_1, DSI_TIMEOUT_PR(0x765) | DSI_TIMEOUT_TA(0x2000)},
|
||||
{DSI_TO_TALLY, 0},
|
||||
{DSI_HOST_CONTROL, DSI_HOST_CONTROL_CRC_RESET | DSI_HOST_CONTROL_TX_TRIG_HOST | DSI_HOST_CONTROL_CS | DSI_HOST_CONTROL_ECC},
|
||||
{DSI_CONTROL, DSI_CONTROL_LANES(3) | DSI_CONTROL_HOST_ENABLE},
|
||||
{DSI_POWER_CONTROL, DSI_POWER_CONTROL_ENABLE},
|
||||
{DSI_MAX_THRESHOLD, 0x40},
|
||||
{DSI_TRIGGER, 0},
|
||||
{DSI_TX_CRC, 0},
|
||||
{DSI_INIT_SEQ_CONTROL, 0}
|
||||
};
|
||||
|
||||
//DSI config (if ver == 0x10).
|
||||
static const cfg_op_t _display_config_14[22] = {
|
||||
{DSI_DSI_WR_DATA, 0x439},
|
||||
{DSI_DSI_WR_DATA, 0x9483FFB9},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x2139},
|
||||
{DSI_DSI_WR_DATA, 0x191919D5},
|
||||
{DSI_DSI_WR_DATA, 0x19191919},
|
||||
{DSI_DSI_WR_DATA, 0x19191919},
|
||||
{DSI_DSI_WR_DATA, 0x19191919},
|
||||
{DSI_DSI_WR_DATA, 0x19191919},
|
||||
{DSI_DSI_WR_DATA, 0x19191919},
|
||||
{DSI_DSI_WR_DATA, 0x19191919},
|
||||
{DSI_DSI_WR_DATA, 0x19191919},
|
||||
{DSI_DSI_WR_DATA, 0x19},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0xB39},
|
||||
{DSI_DSI_WR_DATA, 0x4F0F41B1},
|
||||
{DSI_DSI_WR_DATA, 0xF179A433},
|
||||
{DSI_DSI_WR_DATA, 0x2D81},
|
||||
{DSI_DSI_TRIGGER, 2},
|
||||
{DSI_DSI_WR_DATA, 0x439},
|
||||
{DSI_DSI_WR_DATA, 0xB9},
|
||||
{DSI_DSI_TRIGGER, 2}
|
||||
{DSI_WR_DATA, 0x439},
|
||||
{DSI_WR_DATA, 0x9483FFB9},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x2139},
|
||||
{DSI_WR_DATA, 0x191919D5},
|
||||
{DSI_WR_DATA, 0x19191919},
|
||||
{DSI_WR_DATA, 0x19191919},
|
||||
{DSI_WR_DATA, 0x19191919},
|
||||
{DSI_WR_DATA, 0x19191919},
|
||||
{DSI_WR_DATA, 0x19191919},
|
||||
{DSI_WR_DATA, 0x19191919},
|
||||
{DSI_WR_DATA, 0x19191919},
|
||||
{DSI_WR_DATA, 0x19},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0xB39},
|
||||
{DSI_WR_DATA, 0x4F0F41B1},
|
||||
{DSI_WR_DATA, 0xF179A433},
|
||||
{DSI_WR_DATA, 0x2D81},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST},
|
||||
{DSI_WR_DATA, 0x439},
|
||||
{DSI_WR_DATA, 0xB9},
|
||||
{DSI_TRIGGER, DSI_TRIGGER_HOST}
|
||||
};
|
||||
|
||||
//Display A config.
|
||||
static const cfg_op_t cfg_display_one_color[8] = {
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, 0x10}, //Enable window A.
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, 0x20}, //Enable window B.
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, 0x40}, //Enable window C.
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0x20000000}, //DSI_ENABLE
|
||||
{DC_CMD_DISPLAY_COMMAND, 0x20} //DISPLAY_CTRL_MODE: continuous display.
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT}, //Enable window A.
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT}, //Enable window B.
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT}, //Enable window C.
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
||||
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY} //DISPLAY_CTRL_MODE: continuous display.
|
||||
};
|
||||
|
||||
//Display A config.
|
||||
static const cfg_op_t cfg_display_framebuffer[32] = {
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, 0x40}, //Enable window C.
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, 0x20}, //Enable window B.
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, 0x10}, //Enable window A.
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0x20000000}, //DSI_ENABLE
|
||||
{DC_X_WIN_XD_COLOR_DEPTH, 0xD}, //T_A8B8G8R8
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_X_WIN_XD_POSITION, 0}, //(0,0)
|
||||
{DC_X_WIN_XD_H_INITIAL_DDA, 0},
|
||||
{DC_X_WIN_XD_V_INITIAL_DDA, 0},
|
||||
{DC_X_WIN_XD_PRESCALED_SIZE, 0x5000B40}, //Pre-scaled size: 1280x2880 bytes (= 0x500 vertical lines x 0xB40 bytes).
|
||||
{DC_X_WIN_XD_DDA_INCREMENT, 0x10001000},
|
||||
{DC_X_WIN_XD_SIZE, 0x50002D0}, //Window size: 1280x720 (= 0x500 vertical lines x 0x2D0 horizontal pixels).
|
||||
{DC_X_WIN_XD_LINE_STRIDE, 0x6000C00}, //768*2x768*4 (= 0x600 x 0xC00) bytes, see TRM for alignment requirements.
|
||||
{0x702, 0},
|
||||
{DC_X_WINBUF_XD_SURFACE_KIND, 0}, //Regular surface.
|
||||
{DC_X_WINBUF_XD_START_ADDR, 0xC0000000}, //Framebuffer address.
|
||||
{DC_X_WINBUF_XD_ADDR_H_OFFSET, 0},
|
||||
{DC_X_WINBUF_XD_ADDR_V_OFFSET, 0},
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0x20000000}, //DSI_ENABLE
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0x20000000}, //DSI_ENABLE
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, 0x20000000}, //DSI_ENABLE
|
||||
{DC_X_WIN_XD_WIN_OPTIONS, 0x40000000}, //Enable window AD.
|
||||
{DC_CMD_DISPLAY_COMMAND, 0x20}, //DISPLAY_CTRL_MODE: continuous display.
|
||||
{DC_CMD_STATE_CONTROL, 0x300}, //General update; window A update.
|
||||
{DC_CMD_STATE_CONTROL, 3} //General activation request; window A activation request.
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_C_SELECT}, //Enable window C.
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_B_SELECT}, //Enable window B.
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_CMD_DISPLAY_WINDOW_HEADER, WINDOW_A_SELECT}, //Enable window A.
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
||||
{DC_WIN_COLOR_DEPTH, WIN_COLOR_DEPTH_R8G8B8A8}, //T_A8B8G8R8
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_WIN_POSITION, 0}, //(0,0)
|
||||
{DC_WIN_H_INITIAL_DDA, 0},
|
||||
{DC_WIN_V_INITIAL_DDA, 0},
|
||||
{DC_WIN_PRESCALED_SIZE, V_PRESCALED_SIZE(1280) | H_PRESCALED_SIZE(2880)}, //Pre-scaled size: 1280x2880 bytes.
|
||||
{DC_WIN_DDA_INC, V_DDA_INC(0x1000) | H_DDA_INC(0x1000)},
|
||||
{DC_WIN_SIZE, V_SIZE(1280) | H_SIZE(720)}, //Window size: 1280 vertical lines x 720 horizontal pixels.
|
||||
{DC_WIN_LINE_STRIDE, 0x6000C00}, //768*2x768*4 (= 0x600 x 0xC00) bytes, see TRM for alignment requirements.
|
||||
{DC_WIN_BUFFER_CONTROL, 0},
|
||||
{DC_WINBUF_SURFACE_KIND, 0}, //Regular surface.
|
||||
{DC_WINBUF_START_ADDR, 0xC0000000}, //Framebuffer address.
|
||||
{DC_WINBUF_ADDR_H_OFFSET, 0},
|
||||
{DC_WINBUF_ADDR_V_OFFSET, 0},
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
||||
{DC_WIN_WIN_OPTIONS, 0},
|
||||
{DC_DISP_DISP_WIN_OPTIONS, DSI_ENABLE}, //DSI_ENABLE
|
||||
{DC_WIN_WIN_OPTIONS, WIN_ENABLE}, //Enable window AD.
|
||||
{DC_CMD_DISPLAY_COMMAND, DISP_CTRL_MODE_C_DISPLAY}, //DISPLAY_CTRL_MODE: continuous display.
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_UPDATE | WIN_A_UPDATE}, //General update; window A update.
|
||||
{DC_CMD_STATE_CONTROL, GENERAL_ACT_REQ | WIN_A_ACT_REQ} //General activation request; window A activation request.
|
||||
};
|
||||
|
||||
98
ipl/ff.c
98
ipl/ff.c
@@ -26,7 +26,7 @@
|
||||
#include "gfx.h"
|
||||
extern gfx_ctxt_t gfx_ctxt;
|
||||
extern gfx_con_t gfx_con;
|
||||
#define EFSPRINTF(text, ...) gfx_printf(&gfx_con, "\n\n%k[FatFS] "text"%k\n", 0xFF00FFFF, 0xFFFFFFFF)
|
||||
#define EFSPRINTF(text, ...) gfx_printf(&gfx_con, "\n\n\n%k[FatFS] Error: "text"%k\n", 0xFF00FFFF, 0xFFFFFFFF)
|
||||
//#define EFSPRINTF(...)
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
@@ -3259,7 +3259,7 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
stat = disk_status(fs->pdrv);
|
||||
if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */
|
||||
if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */
|
||||
EFSPRINTF("Error: Write protected!");
|
||||
EFSPRINTF("Write protected!");
|
||||
return FR_WRITE_PROTECTED;
|
||||
}
|
||||
return FR_OK; /* The filesystem object is valid */
|
||||
@@ -3273,11 +3273,11 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
fs->pdrv = LD2PD(vol); /* Bind the logical drive and a physical drive */
|
||||
stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */
|
||||
if (stat & STA_NOINIT) { /* Check if the initialization succeeded */
|
||||
EFSPRINTF("Error: Medium not ready or hard error!");
|
||||
EFSPRINTF("Medium not ready or hard error!");
|
||||
return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */
|
||||
}
|
||||
if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */
|
||||
EFSPRINTF("Error: Write protected!");
|
||||
EFSPRINTF("Write protected!");
|
||||
return FR_WRITE_PROTECTED;
|
||||
}
|
||||
#if FF_MAX_SS != FF_MIN_SS /* Get sector size (multiple sector size cfg only) */
|
||||
@@ -3301,11 +3301,11 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
} while (LD2PT(vol) == 0 && fmt >= 2 && ++i < 4);
|
||||
}
|
||||
if (fmt == 4) {
|
||||
EFSPRINTF("Error: Disk I/O error - Could not load boot record!");
|
||||
EFSPRINTF("Disk I/O error - Could not load boot record!");
|
||||
return FR_DISK_ERR; /* An error occured in the disk I/O layer */
|
||||
}
|
||||
if (fmt >= 2) {
|
||||
EFSPRINTF("Error: No FAT/FAT32/exFAT filesystem found!");
|
||||
EFSPRINTF("No FAT/FAT32/exFAT filesystem found!");
|
||||
return FR_NO_FILESYSTEM; /* No FAT volume is found */
|
||||
}
|
||||
|
||||
@@ -3316,21 +3316,24 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
QWORD maxlba;
|
||||
|
||||
for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ; /* Check zero filler */
|
||||
if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM;
|
||||
if (i < BPB_ZeroedEx + 53) {
|
||||
EFSPRINTF("exFAT - Zero filler check failed!");
|
||||
return FR_NO_FILESYSTEM;
|
||||
}
|
||||
|
||||
if (ld_word(fs->win + BPB_FSVerEx) != 0x100) {
|
||||
EFSPRINTF("Error: exFAT - Version check failed!");
|
||||
EFSPRINTF("exFAT - Version check failed!");
|
||||
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) */
|
||||
EFSPRINTF("Error: exFAT - Bytes per sector does not match physical sector size!");
|
||||
EFSPRINTF("exFAT - Bytes per sector does not match physical sector size!");
|
||||
return FR_NO_FILESYSTEM;
|
||||
}
|
||||
|
||||
maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Last LBA + 1 of the volume */
|
||||
if (maxlba >= 0x100000000) {
|
||||
EFSPRINTF("Error: exFAT - Cannot handle volume LBA with 32-bit LBA!");
|
||||
EFSPRINTF("exFAT - Cannot handle volume LBA with 32-bit LBA!");
|
||||
return FR_NO_FILESYSTEM; /* (It cannot be handled in 32-bit LBA) */
|
||||
}
|
||||
|
||||
@@ -3338,19 +3341,19 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
|
||||
fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */
|
||||
if (fs->n_fats != 1) {
|
||||
EFSPRINTF("Error: exFAT - Multiple or no file allocation tables found!");
|
||||
EFSPRINTF("exFAT - Multiple or no file allocation tables found!");
|
||||
return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */
|
||||
}
|
||||
|
||||
fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */
|
||||
if (fs->csize == 0) {
|
||||
EFSPRINTF("Error: exFAT - Cluster size is not between 1KB - 32KB!");
|
||||
EFSPRINTF("exFAT - Cluster size is not between 1KB - 32KB!");
|
||||
return FR_NO_FILESYSTEM; /* (Must be 1..32768) */
|
||||
}
|
||||
|
||||
nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */
|
||||
if (nclst > MAX_EXFAT) {
|
||||
EFSPRINTF("Error: exFAT - Total clusters exceed allowed!");
|
||||
EFSPRINTF("exFAT - Total clusters exceed allowed!");
|
||||
return FR_NO_FILESYSTEM; /* (Too many clusters) */
|
||||
}
|
||||
fs->n_fatent = nclst + 2;
|
||||
@@ -3360,20 +3363,23 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx);
|
||||
fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx);
|
||||
if (maxlba < (QWORD)fs->database + nclst * fs->csize) {
|
||||
EFSPRINTF("Error: exFAT - Volume size is lower than required!");
|
||||
EFSPRINTF("exFAT - Volume size is lower than required!");
|
||||
return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size required) */
|
||||
}
|
||||
fs->dirbase = ld_dword(fs->win + BPB_RootClusEx);
|
||||
|
||||
/* Check if bitmap location is in assumption (at the first cluster) */
|
||||
if (move_window(fs, clst2sect(fs, fs->dirbase)) != FR_OK) {
|
||||
EFSPRINTF("Error: exFAT - Bitmap location not at first cluster!");
|
||||
EFSPRINTF("exFAT - Bitmap location not at first cluster!");
|
||||
return FR_DISK_ERR;
|
||||
}
|
||||
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 (i == SS(fs)) return FR_NO_FILESYSTEM;
|
||||
if (i == SS(fs)) {
|
||||
EFSPRINTF("exFAT - Bitmap allocation is missing!");
|
||||
return FR_NO_FILESYSTEM;
|
||||
}
|
||||
#if !FF_FS_READONLY
|
||||
fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */
|
||||
#endif
|
||||
@@ -3382,7 +3388,7 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
#endif /* FF_FS_EXFAT */
|
||||
{
|
||||
if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) {
|
||||
EFSPRINTF("Error: FAT - Bytes per sector does not match physical sector size!");
|
||||
EFSPRINTF("FAT - Bytes per sector does not match physical sector size!");
|
||||
return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */
|
||||
}
|
||||
|
||||
@@ -3392,20 +3398,20 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
|
||||
fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */
|
||||
if (fs->n_fats != 1 && fs->n_fats != 2) {
|
||||
EFSPRINTF("Error: FAT - No or more than 2 file allocation tables found!");
|
||||
EFSPRINTF("FAT - No or more than 2 file allocation tables found!");
|
||||
return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */
|
||||
}
|
||||
fasize *= fs->n_fats; /* Number of sectors for FAT area */
|
||||
|
||||
fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */
|
||||
if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) {
|
||||
EFSPRINTF("Error: FAT - Cluster size is not a power of 2!");
|
||||
EFSPRINTF("FAT - Cluster size is not a power of 2!");
|
||||
return FR_NO_FILESYSTEM; /* (Must be power of 2) */
|
||||
}
|
||||
|
||||
fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */
|
||||
if (fs->n_rootdir % (SS(fs) / SZDIRE)) {
|
||||
EFSPRINTF("Error: FAT - Root directory entries are not sector aligned!");
|
||||
EFSPRINTF("FAT - Root directory entries are not sector aligned!");
|
||||
return FR_NO_FILESYSTEM; /* (Must be sector aligned) */
|
||||
}
|
||||
|
||||
@@ -3414,19 +3420,19 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
|
||||
nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */
|
||||
if (nrsv == 0) {
|
||||
EFSPRINTF("Error: FAT - Zero reserved sectors!");
|
||||
EFSPRINTF("FAT - Zero reserved sectors!");
|
||||
return FR_NO_FILESYSTEM; /* (Must not be 0) */
|
||||
}
|
||||
|
||||
/* Determine the FAT sub type */
|
||||
sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */
|
||||
if (tsect < sysect) {
|
||||
EFSPRINTF("Error: FAT - Invalid volume size!");
|
||||
EFSPRINTF("FAT - Invalid volume size!");
|
||||
return FR_NO_FILESYSTEM; /* (Invalid volume size) */
|
||||
}
|
||||
nclst = (tsect - sysect) / fs->csize; /* Number of clusters */
|
||||
if (nclst == 0) {
|
||||
EFSPRINTF("Error: FAT - Invalid volume size!");
|
||||
EFSPRINTF("FAT - Invalid volume size!");
|
||||
return FR_NO_FILESYSTEM; /* (Invalid volume size) */
|
||||
}
|
||||
fmt = 0;
|
||||
@@ -3434,7 +3440,7 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
if (nclst <= MAX_FAT16) fmt = FS_FAT16;
|
||||
if (nclst <= MAX_FAT12) fmt = FS_FAT12;
|
||||
if (fmt == 0) {
|
||||
EFSPRINTF("Error: FAT - Not compatible FAT12/16/32 filesystem!");
|
||||
EFSPRINTF("FAT - Not compatible FAT12/16/32 filesystem!");
|
||||
return FR_NO_FILESYSTEM;
|
||||
}
|
||||
|
||||
@@ -3445,18 +3451,18 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
fs->database = bsect + sysect; /* Data start sector */
|
||||
if (fmt == FS_FAT32) {
|
||||
if (ld_word(fs->win + BPB_FSVer32) != 0) {
|
||||
EFSPRINTF("Error: FAT32 - Not a 0.0 revision!");
|
||||
EFSPRINTF("FAT32 - Not a 0.0 revision!");
|
||||
return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */
|
||||
}
|
||||
if (fs->n_rootdir != 0) {
|
||||
EFSPRINTF("Error: FAT32 - Root entry sector is not 0!");
|
||||
EFSPRINTF("FAT32 - Root entry sector is not 0!");
|
||||
return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */
|
||||
}
|
||||
fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */
|
||||
szbfat = fs->n_fatent * 4; /* (Needed FAT size) */
|
||||
} else {
|
||||
if (fs->n_rootdir == 0) {
|
||||
EFSPRINTF("Error: FAT - Root entry sector is 0!");
|
||||
EFSPRINTF("FAT - Root entry sector is 0!");
|
||||
return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */
|
||||
}
|
||||
fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */
|
||||
@@ -3464,7 +3470,7 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */
|
||||
fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1);
|
||||
}
|
||||
if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) {
|
||||
EFSPRINTF("Error: FAT - FAT size is not the required size!");
|
||||
EFSPRINTF("FAT - FAT size is not the required size!");
|
||||
return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */
|
||||
}
|
||||
|
||||
@@ -3578,7 +3584,7 @@ FRESULT f_mount (
|
||||
/* Get logical drive number */
|
||||
vol = get_ldnumber(&rp);
|
||||
if (vol < 0) {
|
||||
EFSPRINTF("Error: Invalid drive!");
|
||||
EFSPRINTF("Invalid drive!");
|
||||
return FR_INVALID_DRIVE;
|
||||
}
|
||||
cfs = FatFs[vol]; /* Pointer to fs object */
|
||||
@@ -3822,11 +3828,11 @@ FRESULT f_read (
|
||||
*br = 0; /* Clear read byte counter */
|
||||
res = validate(&fp->obj, &fs); /* Check validity of the file object */
|
||||
if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) {
|
||||
EFSPRINTF("Error: File object Validation!");
|
||||
EFSPRINTF("File object Validation!");
|
||||
LEAVE_FF(fs, res); /* Check validity */
|
||||
}
|
||||
if (!(fp->flag & FA_READ)) {
|
||||
EFSPRINTF("Error: Access denied!");
|
||||
EFSPRINTF("Access denied!");
|
||||
LEAVE_FF(fs, FR_DENIED); /* Check access mode */
|
||||
}
|
||||
remain = fp->obj.objsize - fp->fptr;
|
||||
@@ -3850,18 +3856,18 @@ FRESULT f_read (
|
||||
}
|
||||
}
|
||||
if (clst < 2) {
|
||||
EFSPRINTF("Error: Cluster status check or Internal error!");
|
||||
EFSPRINTF("Cluster status check or Internal error!");
|
||||
ABORT(fs, FR_INT_ERR);
|
||||
}
|
||||
if (clst == 0xFFFFFFFF) {
|
||||
EFSPRINTF("Error: Disk error (cluster hard error)!");
|
||||
EFSPRINTF("Disk error (cluster hard error)!");
|
||||
ABORT(fs, FR_DISK_ERR);
|
||||
}
|
||||
fp->clust = clst; /* Update current cluster */
|
||||
}
|
||||
sect = clst2sect(fs, fp->clust); /* Get current sector */
|
||||
if (sect == 0) {
|
||||
EFSPRINTF("Error: Get current sector error!");
|
||||
EFSPRINTF("Get current sector error!");
|
||||
ABORT(fs, FR_INT_ERR);
|
||||
}
|
||||
sect += csect;
|
||||
@@ -3871,7 +3877,7 @@ FRESULT f_read (
|
||||
cc = fs->csize - csect;
|
||||
}
|
||||
if (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) {
|
||||
EFSPRINTF("Error: Read - Low level disk I/O!");
|
||||
EFSPRINTF("Read - Low level disk I/O!");
|
||||
ABORT(fs, FR_DISK_ERR);
|
||||
}
|
||||
#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */
|
||||
@@ -3893,14 +3899,14 @@ FRESULT f_read (
|
||||
#if !FF_FS_READONLY
|
||||
if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */
|
||||
if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) {
|
||||
EFSPRINTF("Error: Write-back dirty sector cache!");
|
||||
EFSPRINTF("Write-back dirty sector cache!");
|
||||
ABORT(fs, FR_DISK_ERR);
|
||||
}
|
||||
fp->flag &= (BYTE)~FA_DIRTY;
|
||||
}
|
||||
#endif
|
||||
if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) {
|
||||
EFSPRINTF("Error: Read - Low level disk I/O!\n(fill sector cache)");
|
||||
EFSPRINTF("Read - Low level disk I/O!\n(fill sector cache)");
|
||||
ABORT(fs, FR_DISK_ERR); /* Fill sector cache */
|
||||
}
|
||||
}
|
||||
@@ -3945,11 +3951,11 @@ FRESULT f_write (
|
||||
*bw = 0; /* Clear write byte counter */
|
||||
res = validate(&fp->obj, &fs); /* Check validity of the file object */
|
||||
if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) {
|
||||
EFSPRINTF("Error: File object Validation!");
|
||||
EFSPRINTF("File object Validation!");
|
||||
LEAVE_FF(fs, res); /* Check validity */
|
||||
}
|
||||
if (!(fp->flag & FA_WRITE)) {
|
||||
EFSPRINTF("Error: Access denied!");
|
||||
EFSPRINTF("Access denied!");
|
||||
LEAVE_FF(fs, FR_DENIED); /* Check access mode */
|
||||
}
|
||||
|
||||
@@ -3979,15 +3985,15 @@ FRESULT f_write (
|
||||
}
|
||||
}
|
||||
if (clst == 0) {
|
||||
EFSPRINTF("Error: Could not allocate a new cluster\n(disk full or low level disk I/O error)!");
|
||||
EFSPRINTF("Could not allocate a new cluster\n(disk full or low level disk I/O error)!");
|
||||
break; /* Could not allocate a new cluster (disk full) */
|
||||
}
|
||||
if (clst == 1) {
|
||||
EFSPRINTF("Error: Cluster status check or Internal error!");
|
||||
EFSPRINTF("Cluster status check or Internal error!");
|
||||
ABORT(fs, FR_INT_ERR);
|
||||
}
|
||||
if (clst == 0xFFFFFFFF) {
|
||||
EFSPRINTF("Error: Disk error (cluster hard error)!");
|
||||
EFSPRINTF("Disk error (cluster hard error)!");
|
||||
ABORT(fs, FR_DISK_ERR);
|
||||
}
|
||||
fp->clust = clst; /* Update current cluster */
|
||||
@@ -3998,7 +4004,7 @@ FRESULT f_write (
|
||||
#else
|
||||
if (fp->flag & FA_DIRTY) { /* Write-back sector cache */
|
||||
if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) {
|
||||
EFSPRINTF("Error: Write-back sector cache!");
|
||||
EFSPRINTF("Write-back sector cache!");
|
||||
ABORT(fs, FR_DISK_ERR);
|
||||
}
|
||||
fp->flag &= (BYTE)~FA_DIRTY;
|
||||
@@ -4006,7 +4012,7 @@ FRESULT f_write (
|
||||
#endif
|
||||
sect = clst2sect(fs, fp->clust); /* Get current sector */
|
||||
if (sect == 0) {
|
||||
EFSPRINTF("Error: Get current sector error!");
|
||||
EFSPRINTF("Get current sector error!");
|
||||
ABORT(fs, FR_INT_ERR);
|
||||
}
|
||||
sect += csect;
|
||||
@@ -4016,7 +4022,7 @@ FRESULT f_write (
|
||||
cc = fs->csize - csect;
|
||||
}
|
||||
if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) {
|
||||
EFSPRINTF("Error: Write - Low level disk I/O!");
|
||||
EFSPRINTF("Write - Low level disk I/O!");
|
||||
ABORT(fs, FR_DISK_ERR);
|
||||
}
|
||||
#if FF_FS_MINIMIZE <= 2
|
||||
@@ -4044,7 +4050,7 @@ FRESULT f_write (
|
||||
if (fp->sect != sect && /* Fill sector cache with file data */
|
||||
fp->fptr < fp->obj.objsize &&
|
||||
disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) {
|
||||
EFSPRINTF("Error: Read - Low level disk I/O!\n(Could not fill sector cache with file data)");
|
||||
EFSPRINTF("Read - Low level disk I/O!\n(Could not fill sector cache with file data)");
|
||||
ABORT(fs, FR_DISK_ERR);
|
||||
}
|
||||
#endif
|
||||
|
||||
99
ipl/gfx.c
99
ipl/gfx.c
@@ -82,14 +82,21 @@ void gfx_clear(gfx_ctxt_t *ctxt, u32 color)
|
||||
ctxt->fb[i] = color;
|
||||
}
|
||||
|
||||
void gfx_con_setfontsz(gfx_con_t *con, u8 font_size)
|
||||
{
|
||||
con->fntsz = font_size;
|
||||
con->fontmult = font_size / 8;
|
||||
}
|
||||
|
||||
void gfx_con_init(gfx_con_t *con, gfx_ctxt_t *ctxt)
|
||||
{
|
||||
con->gfx_ctxt = ctxt;
|
||||
con->x = 0;
|
||||
con->y = 0;
|
||||
con->fgcol = 0xFFFFFFFF;
|
||||
con->fgcol = 0xFFCCCCCC;
|
||||
con->fillbg = 0;
|
||||
con->bgcol = 0xFF000000;
|
||||
con->bgcol = 0xFF1B1B1B;
|
||||
gfx_con_setfontsz(con, 16);
|
||||
}
|
||||
|
||||
void gfx_con_setcol(gfx_con_t *con, u32 fgcol, int fillbg, u32 bgcol)
|
||||
@@ -117,27 +124,45 @@ void gfx_putc(gfx_con_t *con, char c)
|
||||
{
|
||||
u8 *cbuf = (u8 *)&_gfx_font[8 * (c - 32)];
|
||||
u32 *fb = con->gfx_ctxt->fb + con->x + con->y * con->gfx_ctxt->stride;
|
||||
for (u32 i = 0; i < 8; i++)
|
||||
for (u32 i = 0; i < con->fntsz; i+=con->fontmult)
|
||||
{
|
||||
u8 v = *cbuf++;
|
||||
for (u32 j = 0; j < 8; j++)
|
||||
for (u32 k = 0; k < con->fontmult; k++)
|
||||
{
|
||||
if (v & 1)
|
||||
*fb = con->fgcol;
|
||||
else if (con->fillbg)
|
||||
*fb = con->bgcol;
|
||||
v >>= 1;
|
||||
fb++;
|
||||
for (u32 j = 0; j < con->fntsz; j+=con->fontmult)
|
||||
{
|
||||
if (v & 1)
|
||||
{
|
||||
*fb = con->fgcol;
|
||||
for(u32 l = 0; l < con->fontmult - 1; l++)
|
||||
{
|
||||
fb++;
|
||||
*fb = con->fgcol;
|
||||
}
|
||||
}
|
||||
else if (con->fillbg)
|
||||
{
|
||||
*fb = con->bgcol;
|
||||
for(u32 l = 0; l < con->fontmult - 1; l++)
|
||||
{
|
||||
fb++;
|
||||
*fb = con->bgcol;
|
||||
}
|
||||
}
|
||||
v >>= 1;
|
||||
fb++;
|
||||
}
|
||||
fb += con->gfx_ctxt->stride - con->fntsz;
|
||||
v = *cbuf;
|
||||
}
|
||||
fb += con->gfx_ctxt->stride - 8;
|
||||
}
|
||||
con->x += 8;
|
||||
con->x += con->fntsz;
|
||||
}
|
||||
else if (c == '\n')
|
||||
{
|
||||
con->x = 0;
|
||||
con->y += 8;
|
||||
if (con->y > con->gfx_ctxt->height - 8)
|
||||
con->y += con->fntsz;
|
||||
if (con->y > con->gfx_ctxt->height - con->fntsz)
|
||||
con->y = 0;
|
||||
}
|
||||
}
|
||||
@@ -182,6 +207,13 @@ static void _gfx_putn(gfx_con_t *con, u32 v, int base, char fill, int fcnt)
|
||||
gfx_puts(con, p);
|
||||
}
|
||||
|
||||
void gfx_putsep(gfx_con_t *con)
|
||||
{
|
||||
gfx_con_setfontsz(con, 8);
|
||||
gfx_putc(con, '\n');
|
||||
gfx_con_setfontsz(con, 16);
|
||||
}
|
||||
|
||||
void gfx_printf(gfx_con_t *con, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -255,6 +287,8 @@ void gfx_printf(gfx_con_t *con, const char *fmt, ...)
|
||||
|
||||
void gfx_hexdump(gfx_con_t *con, u32 base, const u8 *buf, u32 len)
|
||||
{
|
||||
u8 prevFontSize = con->fntsz;
|
||||
gfx_con_setfontsz(con, 8);
|
||||
for(u32 i = 0; i < len; i++)
|
||||
{
|
||||
if(i % 0x10 == 0)
|
||||
@@ -265,7 +299,7 @@ void gfx_hexdump(gfx_con_t *con, u32 base, const u8 *buf, u32 len)
|
||||
for(u32 j = 0; j < 0x10; j++)
|
||||
{
|
||||
u8 c = buf[i - 0x10 + j];
|
||||
if(c >= 32 && c < 128)
|
||||
if(c >= 32 && c <= 126)
|
||||
gfx_putc(con, c);
|
||||
else
|
||||
gfx_putc(con, '.');
|
||||
@@ -275,8 +309,30 @@ void gfx_hexdump(gfx_con_t *con, u32 base, const u8 *buf, u32 len)
|
||||
gfx_printf(con, "%08x: ", base + i);
|
||||
}
|
||||
gfx_printf(con, "%02x ", buf[i]);
|
||||
if (i == len - 1)
|
||||
{
|
||||
int ln = len % 0x10 != 0;
|
||||
u32 k = 0x10 - 1;
|
||||
if (ln)
|
||||
{
|
||||
k = len & 0xF - 1;
|
||||
for (u32 j = 0; j < 0x10 - k; j++)
|
||||
gfx_puts(con, " ");
|
||||
}
|
||||
gfx_puts(con, "| ");
|
||||
for(u32 j = 0; j < (ln ? k : k + 1); j++)
|
||||
{
|
||||
u8 c = buf[i - k + j];
|
||||
if(c >= 32 && c <= 126)
|
||||
gfx_putc(con, c);
|
||||
else
|
||||
gfx_putc(con, '.');
|
||||
}
|
||||
gfx_putc(con, '\n');
|
||||
}
|
||||
}
|
||||
gfx_putc(con, '\n');
|
||||
gfx_con_setfontsz(con, prevFontSize);
|
||||
}
|
||||
|
||||
static int abs(int x)
|
||||
@@ -307,3 +363,16 @@ void gfx_line(gfx_ctxt_t *ctxt, int x0, int y0, int x1, int y1, u32 color)
|
||||
if (e2 < dy) { err += dx; y0 += sy; }
|
||||
}
|
||||
}
|
||||
|
||||
void gfx_set_logo(gfx_ctxt_t *ctxt, const u8 *buf)
|
||||
{
|
||||
u32 pos = 0;
|
||||
for (u32 y = 1180; y < 1256; y++)
|
||||
{
|
||||
for (u32 x = 538; x < 696; x++)
|
||||
{
|
||||
ctxt->fb[x + y*ctxt->stride] = (0xFF << 24) | buf[pos] | (buf[pos + 1] << 8) | (buf[pos + 2] << 16);
|
||||
pos+=3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,8 @@ typedef struct _gfx_con_t
|
||||
u32 fgcol;
|
||||
int fillbg;
|
||||
u32 bgcol;
|
||||
u32 fntsz;
|
||||
u32 fontmult;
|
||||
} gfx_con_t;
|
||||
|
||||
void gfx_init_ctxt(gfx_ctxt_t *ctxt, u32 *fb, u32 width, u32 height, u32 stride);
|
||||
@@ -43,6 +45,7 @@ void gfx_con_init(gfx_con_t *con, gfx_ctxt_t *ctxt);
|
||||
void gfx_con_setcol(gfx_con_t *con, u32 fgcol, int fillbg, u32 bgcol);
|
||||
void gfx_con_getpos(gfx_con_t *con, u32 *x, u32 *y);
|
||||
void gfx_con_setpos(gfx_con_t *con, u32 x, u32 y);
|
||||
void gfx_con_setfontsz(gfx_con_t *con, u8 font_size);
|
||||
void gfx_putc(gfx_con_t *con, char c);
|
||||
void gfx_puts(gfx_con_t *con, const char *s);
|
||||
void gfx_printf(gfx_con_t *con, const char *fmt, ...);
|
||||
@@ -50,5 +53,7 @@ void gfx_hexdump(gfx_con_t *con, u32 base, const u8 *buf, u32 len);
|
||||
|
||||
void gfx_set_pixel(gfx_ctxt_t *ctxt, u32 x, u32 y, u32 color);
|
||||
void gfx_line(gfx_ctxt_t *ctxt, int x0, int y0, int x1, int y1, u32 color);
|
||||
void gfx_putsep(gfx_con_t *con);
|
||||
void gfx_set_logo(gfx_ctxt_t *ctxt, const u8 *buf);
|
||||
|
||||
#endif
|
||||
|
||||
141
ipl/hos.c
141
ipl/hos.c
@@ -35,8 +35,8 @@
|
||||
#include "gfx.h"
|
||||
extern gfx_ctxt_t gfx_ctxt;
|
||||
extern gfx_con_t gfx_con;
|
||||
#define DPRINTF(...) gfx_printf(&gfx_con, __VA_ARGS__)
|
||||
//#define DPRINTF(...)
|
||||
//#define DPRINTF(...) gfx_printf(&gfx_con, __VA_ARGS__)
|
||||
#define DPRINTF(...)
|
||||
|
||||
enum KB_FIRMWARE_VERSION {
|
||||
KB_FIRMWARE_VERSION_100_200 = 0,
|
||||
@@ -145,6 +145,7 @@ int keygen(u8 *keyblob, u32 kb, void *tsec_fw)
|
||||
switch (kb) {
|
||||
case KB_FIRMWARE_VERSION_100_200:
|
||||
case KB_FIRMWARE_VERSION_300:
|
||||
case KB_FIRMWARE_VERSION_301:
|
||||
se_aes_unwrap_key(0x0D, 0x0F, console_keyseed);
|
||||
se_aes_unwrap_key(0x0C, 0x0C, master_keyseed_retail);
|
||||
break;
|
||||
@@ -189,6 +190,9 @@ typedef struct _launch_ctxt_t
|
||||
void *kernel;
|
||||
u32 kernel_size;
|
||||
link_t kip1_list;
|
||||
|
||||
u8 *svcperm;
|
||||
u8 *debugmode;
|
||||
} launch_ctxt_t;
|
||||
|
||||
typedef struct _merge_kip_t
|
||||
@@ -212,10 +216,10 @@ static int _read_emmc_pkg1(launch_ctxt_t *ctxt)
|
||||
ctxt->pkg1_id = pkg1_identify(ctxt->pkg1);
|
||||
if (!ctxt->pkg1_id)
|
||||
{
|
||||
DPRINTF("%kCould not identify package 1 version (= '%s').%k\n", 0xFF0000FF, (char *)ctxt->pkg1 + 0x10, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kCould not identify package1,\nVersion (= '%s').%k\n", 0xFF0000FF, (char *)ctxt->pkg1 + 0x10, 0xFFFFFFFF);
|
||||
goto out;
|
||||
}
|
||||
DPRINTF("Identified package1 ('%s'), keyblob version %d\n", (char *)(ctxt->pkg1 + 0x10), ctxt->pkg1_id->kb);
|
||||
gfx_printf(&gfx_con, "Identified package1 ('%s'),\nKeyblob version %d\n\n", (char *)(ctxt->pkg1 + 0x10), ctxt->pkg1_id->kb);
|
||||
|
||||
//Read the correct keyblob.
|
||||
ctxt->keyblob = (u8 *)malloc(NX_EMMC_BLOCKSIZE);
|
||||
@@ -240,7 +244,7 @@ static int _read_emmc_pkg2(launch_ctxt_t *ctxt)
|
||||
//Parse eMMC GPT.
|
||||
LIST_INIT(gpt);
|
||||
nx_emmc_gpt_parse(&gpt, &storage);
|
||||
DPRINTF("parsed GPT\n");
|
||||
DPRINTF("Parsed GPT\n");
|
||||
//Find package2 partition.
|
||||
emmc_part_t *pkg2_part = nx_emmc_part_find(&gpt, "BCPKG2-1-Normal-Main");
|
||||
if (!pkg2_part)
|
||||
@@ -253,10 +257,10 @@ DPRINTF("parsed GPT\n");
|
||||
u32 *hdr = (u32 *)(tmp + 0x100);
|
||||
u32 pkg2_size = hdr[0] ^ hdr[2] ^ hdr[3];
|
||||
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.
|
||||
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_size = pkg2_size;
|
||||
nx_emmc_part_read(&storage, pkg2_part, 0x4000 / NX_EMMC_BLOCKSIZE,
|
||||
@@ -314,12 +318,32 @@ static int _config_kip1(launch_ctxt_t *ctxt, const char *value)
|
||||
merge_kip_t *mkip1 = (merge_kip_t *)malloc(sizeof(merge_kip_t));
|
||||
mkip1->kip1 = malloc(f_size(&fp));
|
||||
f_read(&fp, mkip1->kip1, f_size(&fp), NULL);
|
||||
DPRINTF("loaded kip from SD (size %08X)\n", f_size(&fp));
|
||||
DPRINTF("Loaded kip1 from SD (size %08X)\n", f_size(&fp));
|
||||
f_close(&fp);
|
||||
list_append(&ctxt->kip1_list, &mkip1->link);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _config_svcperm(launch_ctxt_t *ctxt, const char *value)
|
||||
{
|
||||
if (*(u8 *)value == '1')
|
||||
{
|
||||
DPRINTF("Disabled SVC verification\n");
|
||||
ctxt->svcperm = malloc(1);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int _config_debugmode(launch_ctxt_t *ctxt, const char *value)
|
||||
{
|
||||
if (*(u8 *)value == '1')
|
||||
{
|
||||
DPRINTF("Enabled Debug mode\n");
|
||||
ctxt->debugmode = malloc(1);
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct _cfg_handler_t
|
||||
{
|
||||
const char *key;
|
||||
@@ -331,6 +355,8 @@ static const cfg_handler_t _config_handlers[] = {
|
||||
{ "secmon", _config_secmon },
|
||||
{ "kernel", _config_kernel },
|
||||
{ "kip1", _config_kip1 },
|
||||
{ "fullsvcperm", _config_svcperm },
|
||||
{ "debugmode", _config_debugmode },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
@@ -346,25 +372,28 @@ static int _config(launch_ctxt_t *ctxt, ini_sec_t *cfg)
|
||||
|
||||
int hos_launch(ini_sec_t *cfg)
|
||||
{
|
||||
int bootStatePackage2;
|
||||
int bootStateContinue;
|
||||
launch_ctxt_t ctxt;
|
||||
memset(&ctxt, 0, sizeof(launch_ctxt_t));
|
||||
list_init(&ctxt.kip1_list);
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (cfg && !_config(&ctxt, cfg))
|
||||
return 0;
|
||||
|
||||
gfx_printf(&gfx_con, "Initializing...\n\n");
|
||||
|
||||
//Read package1 and the correct keyblob.
|
||||
if (!_read_emmc_pkg1(&ctxt))
|
||||
return 0;
|
||||
|
||||
//XXX: remove this once we support 3+.
|
||||
//if (ctxt.pkg1_id->kb > 0)
|
||||
// return 0;
|
||||
|
||||
DPRINTF("loaded pkg1 and keyblob\n");
|
||||
gfx_printf(&gfx_con, "Loaded package1 and keyblob\n");
|
||||
//Generate keys.
|
||||
keygen(ctxt.keyblob, ctxt.pkg1_id->kb, (u8 *)ctxt.pkg1 + ctxt.pkg1_id->tsec_off);
|
||||
DPRINTF("generated keys\n");
|
||||
DPRINTF("Generated keys\n");
|
||||
//Decrypt and unpack package1 if we require parts of it.
|
||||
if (!ctxt.warmboot || !ctxt.secmon)
|
||||
{
|
||||
@@ -372,7 +401,7 @@ DPRINTF("generated keys\n");
|
||||
pkg1_unpack((void *)0x8000D000, (void *)ctxt.pkg1_id->secmon_base, ctxt.pkg1_id, ctxt.pkg1);
|
||||
//gfx_hexdump(&gfx_con, 0x8000D000, (void *)0x8000D000, 0x100);
|
||||
//gfx_hexdump(&gfx_con, ctxt.pkg1_id->secmon_base, (void *)ctxt.pkg1_id->secmon_base, 0x100);
|
||||
DPRINTF("decrypted and unpacked pkg1\n");
|
||||
gfx_printf(&gfx_con, "Decrypted and unpacked package1\n");
|
||||
}
|
||||
//Replace 'warmboot.bin' if requested.
|
||||
if (ctxt.warmboot)
|
||||
@@ -387,60 +416,93 @@ DPRINTF("decrypted and unpacked pkg1\n");
|
||||
{
|
||||
//Else we patch it to allow for an unsigned package2.
|
||||
patch_t *secmon_patchset = ctxt.pkg1_id->secmon_patchset;
|
||||
//In case a kernel patch option is set. Allows to disable Svc Verififcation or/and enable Debug mode
|
||||
patch_t *kernel_patchset = ctxt.pkg1_id->kernel_patchset;
|
||||
|
||||
if (secmon_patchset != NULL) {
|
||||
for (u32 i = 0; secmon_patchset[i].off != 0xFFFFFFFF; i++)
|
||||
*(vu32 *)(ctxt.pkg1_id->secmon_base + secmon_patchset[i].off) = secmon_patchset[i].val;
|
||||
if (secmon_patchset != NULL || (kernel_patchset != NULL && (ctxt.svcperm || ctxt.debugmode))) {
|
||||
if (secmon_patchset != NULL)
|
||||
{
|
||||
gfx_printf(&gfx_con, "%kPatching Security Monitor%k\n", 0xFF00BAFF, 0xFFCCCCCC);
|
||||
for (u32 i = 0; secmon_patchset[i].off != 0xFFFFFFFF; i++)
|
||||
*(vu32 *)(ctxt.pkg1_id->secmon_base + secmon_patchset[i].off) = secmon_patchset[i].val;
|
||||
}
|
||||
|
||||
DPRINTF("loaded warmboot.bin and secmon\n");
|
||||
gfx_printf(&gfx_con, "Loaded warmboot.bin and secmon\n");
|
||||
|
||||
//Read package2.
|
||||
if (!_read_emmc_pkg2(&ctxt))
|
||||
return 0;
|
||||
|
||||
DPRINTF("read pkg2\n");
|
||||
gfx_printf(&gfx_con, "Read package2\n");
|
||||
//Decrypt package2 and parse KIP1 blobs in INI1 section.
|
||||
pkg2_hdr_t *pkg2_hdr = pkg2_decrypt(ctxt.pkg2);
|
||||
|
||||
LIST_INIT(kip1_info);
|
||||
pkg2_parse_kips(&kip1_info, pkg2_hdr);
|
||||
|
||||
DPRINTF("parsed ini1\n");
|
||||
gfx_printf(&gfx_con, "Parsed ini1\n");
|
||||
|
||||
//Use the kernel included in package2 in case we didn't load one already.
|
||||
if (!ctxt.kernel)
|
||||
{
|
||||
ctxt.kernel = pkg2_hdr->data;
|
||||
ctxt.kernel_size = pkg2_hdr->sec_size[PKG2_SEC_KERNEL];
|
||||
|
||||
if (kernel_patchset != NULL && (ctxt.svcperm || ctxt.debugmode))
|
||||
{
|
||||
gfx_printf(&gfx_con, "%kPatching kernel%k\n", 0xFF00BAFF, 0xFFCCCCCC);
|
||||
if (ctxt.svcperm && kernel_patchset[0].off != 0xFFFFFFFF)
|
||||
*(vu32 *)(ctxt.kernel + kernel_patchset[0].off) = kernel_patchset[0].val;
|
||||
if (ctxt.debugmode && kernel_patchset[1].off != 0xFFFFFFFF)
|
||||
*(vu32 *)(ctxt.kernel + kernel_patchset[1].off) = kernel_patchset[1].val;
|
||||
}
|
||||
}
|
||||
|
||||
//Merge extra KIP1s into loaded ones.
|
||||
gfx_printf(&gfx_con, "%kPatching kernel initial processes%k\n", 0xFF00BAFF, 0xFFCCCCCC);
|
||||
LIST_FOREACH_ENTRY(merge_kip_t, mki, &ctxt.kip1_list, link)
|
||||
pkg2_merge_kip(&kip1_info, (pkg2_kip1_t *)mki->kip1);
|
||||
|
||||
//Rebuild and encrypt package2.
|
||||
pkg2_build_encrypt((void *)0xA9800000, ctxt.kernel, ctxt.kernel_size, &kip1_info);
|
||||
DPRINTF("rebuilt pkg2\n");
|
||||
gfx_printf(&gfx_con, "Rebuilt and loaded package2\n");
|
||||
} else {
|
||||
//Read package2.
|
||||
if (!_read_emmc_pkg2(&ctxt))
|
||||
return 0;
|
||||
|
||||
DPRINTF("read pkg2\n");
|
||||
gfx_printf(&gfx_con, "Loaded package2\n");
|
||||
memcpy((void *)0xA9800000, ctxt.pkg2, ctxt.pkg2_size);
|
||||
}
|
||||
}
|
||||
// Unmount SD Card
|
||||
f_mount(NULL, "", 1);
|
||||
|
||||
se_aes_key_clear(8);
|
||||
se_aes_key_clear(11);
|
||||
//se_aes_key_clear(13);
|
||||
//se_key_acc_ctrl(10, 0xFF);
|
||||
se_key_acc_ctrl(12, 0xFF);
|
||||
//se_key_acc_ctrl(13, 0xFF);
|
||||
//se_key_acc_ctrl(14, 0xFF);
|
||||
se_key_acc_ctrl(15, 0xFF);
|
||||
gfx_printf(&gfx_con, "\n%kBooting...%k\n", 0xFF00FF96, 0xFFCCCCCC);
|
||||
|
||||
//Clear 'BootConfig'.
|
||||
se_aes_key_clear(0x8);
|
||||
se_aes_key_clear(0xB);
|
||||
|
||||
switch (ctxt.pkg1_id->kb) {
|
||||
case KB_FIRMWARE_VERSION_100_200:
|
||||
case KB_FIRMWARE_VERSION_300:
|
||||
case KB_FIRMWARE_VERSION_301:
|
||||
se_key_acc_ctrl(0xC, 0xFF);
|
||||
se_key_acc_ctrl(0xD, 0xFF);
|
||||
bootStatePackage2 = 2;
|
||||
bootStateContinue = 3;
|
||||
break;
|
||||
default:
|
||||
case KB_FIRMWARE_VERSION_400:
|
||||
case KB_FIRMWARE_VERSION_500:
|
||||
se_key_acc_ctrl(0xC, 0xFF);
|
||||
se_key_acc_ctrl(0xF, 0xFF);
|
||||
bootStatePackage2 = 3;
|
||||
bootStateContinue = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
//Clear 'BootConfig' for retail systems.
|
||||
memset((void *)0x4003D000, 0, 0x3000);
|
||||
|
||||
//pkg2_decrypt((void *)0xA9800000);
|
||||
@@ -454,7 +516,7 @@ DPRINTF("decrypted and unpacked pkg1\n");
|
||||
vu32 *mb_in = (vu32 *)0x40002EF8;
|
||||
vu32 *mb_out = (vu32 *)0x40002EFC;
|
||||
|
||||
*mb_in = 0;
|
||||
*mb_in = bootStatePackage2;
|
||||
*mb_out = 0;
|
||||
|
||||
//Wait for secmon to get ready.
|
||||
@@ -463,14 +525,8 @@ DPRINTF("decrypted and unpacked pkg1\n");
|
||||
sleep(1);
|
||||
|
||||
//Signal 'BootConfig'.
|
||||
*mb_in = 1;
|
||||
sleep(100);
|
||||
|
||||
//Signal package2 available.
|
||||
*mb_in = 2;
|
||||
sleep(100);
|
||||
*mb_in = 3;
|
||||
sleep(100);
|
||||
//*mb_in = 1;
|
||||
//sleep(100);
|
||||
|
||||
/*PMC(0x4) = 0x7FFFF3;
|
||||
PMC(0x2C4) = 0xFFFFFFFF;
|
||||
@@ -485,8 +541,7 @@ DPRINTF("decrypted and unpacked pkg1\n");
|
||||
//display_end();
|
||||
|
||||
//Signal to continue boot.
|
||||
*mb_in = 4;
|
||||
sleep(100);
|
||||
*mb_in = bootStateContinue;
|
||||
|
||||
//Halt ourselves in waitevent state.
|
||||
while (1)
|
||||
|
||||
340
ipl/main.c
340
ipl/main.c
@@ -38,6 +38,7 @@
|
||||
#include "gpio.h"
|
||||
#include "sdmmc.h"
|
||||
#include "ff.h"
|
||||
#include "ctc_logo2.h"
|
||||
#include "tui.h"
|
||||
#include "heap.h"
|
||||
#include "list.h"
|
||||
@@ -47,20 +48,22 @@
|
||||
#include "hos.h"
|
||||
#include "pkg1.h"
|
||||
#include "mmc.h"
|
||||
#include "lz.h"
|
||||
|
||||
//TODO: ugly.
|
||||
gfx_ctxt_t gfx_ctxt;
|
||||
gfx_con_t gfx_con;
|
||||
|
||||
//TODO: Create more macros (info, header, debug, etc) with different colors and utilize them for consistency.
|
||||
#define EPRINTF(text) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, 0xFFFFFFFF)
|
||||
#define EPRINTFARGS(text, args...) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, args, 0xFFFFFFFF)
|
||||
#define EPRINTF(text) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, 0xFFCCCCCC)
|
||||
#define EPRINTFARGS(text, args...) gfx_printf(&gfx_con, "%k"text"%k\n", 0xFF0000FF, args, 0xFFCCCCCC)
|
||||
|
||||
//TODO: ugly.
|
||||
sdmmc_t sd_sdmmc;
|
||||
sdmmc_storage_t sd_storage;
|
||||
FATFS sd_fs;
|
||||
int sd_mounted;
|
||||
u8 *Kc_HEKATE_LOGO;
|
||||
|
||||
int sd_mount()
|
||||
{
|
||||
@@ -69,7 +72,7 @@ int sd_mount()
|
||||
|
||||
if (!sdmmc_storage_init_sd(&sd_storage, &sd_sdmmc, SDMMC_1, SDMMC_BUS_WIDTH_4, 11))
|
||||
{
|
||||
EPRINTF("Failed to init SD card (make sure that it is inserted).");
|
||||
EPRINTF("Failed to init SD card.\nMake sure that it is inserted.");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -82,7 +85,7 @@ int sd_mount()
|
||||
}
|
||||
else
|
||||
{
|
||||
EPRINTFARGS("Failed to mount SD card (FatFS Error %d).\n(make sure that a FAT32/exFAT partition exists)", res);
|
||||
EPRINTFARGS("Failed to mount SD card (FatFS Error %d).\n(make sure that a FAT type partition exists)", res);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,22 +339,19 @@ void config_hw()
|
||||
|
||||
void print_fuseinfo()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
gfx_printf(&gfx_con, "%k(Unlocked) fuse cache:\n\n%k", 0xFFFF9955, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%k(Unlocked) fuse cache:\n\n%k", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
gfx_hexdump(&gfx_con, 0x7000F900, (u8 *)0x7000F900, 0x2FC);
|
||||
|
||||
gfx_puts(&gfx_con, "\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
|
||||
|
||||
sleep(1000000);
|
||||
|
||||
u32 btn = btn_wait();
|
||||
if (btn & BTN_POWER)
|
||||
{
|
||||
if (sd_mount())
|
||||
{
|
||||
FIL fuseFp;
|
||||
char fuseFilename[9];
|
||||
memcpy(fuseFilename, "fuse.bin", 8);
|
||||
fuseFilename[8] = 0;
|
||||
@@ -361,17 +361,17 @@ void print_fuseinfo()
|
||||
else
|
||||
gfx_puts(&gfx_con, "\nDone!\n");
|
||||
}
|
||||
sleep(2000000);
|
||||
|
||||
btn_wait();
|
||||
}
|
||||
}
|
||||
|
||||
void print_kfuseinfo()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
gfx_printf(&gfx_con, "%kKFuse contents:\n\n%k", 0xFFFF9955, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kKFuse contents:\n\n%k", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
u32 buf[KFUSE_NUM_WORDS];
|
||||
if (!kfuse_read(buf))
|
||||
EPRINTF("CRC fail.");
|
||||
@@ -380,14 +380,11 @@ void print_kfuseinfo()
|
||||
|
||||
gfx_puts(&gfx_con, "\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n");
|
||||
|
||||
sleep(1000000);
|
||||
|
||||
u32 btn = btn_wait();
|
||||
if (btn & BTN_POWER)
|
||||
{
|
||||
if (sd_mount())
|
||||
{
|
||||
FIL kfuseFp;
|
||||
char kfuseFilename[10];
|
||||
memcpy(kfuseFilename, "kfuse.bin", 9);
|
||||
kfuseFilename[9] = 0;
|
||||
@@ -397,14 +394,14 @@ void print_kfuseinfo()
|
||||
else
|
||||
gfx_puts(&gfx_con, "\nDone!\n");
|
||||
}
|
||||
sleep(2000000);
|
||||
|
||||
btn_wait();
|
||||
}
|
||||
}
|
||||
|
||||
void print_mmc_info()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
||||
@@ -422,7 +419,7 @@ void print_mmc_info()
|
||||
u16 card_type;
|
||||
u32 speed;
|
||||
|
||||
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
switch (storage.csd.mmca_vsn)
|
||||
{
|
||||
case 0: /* MMC v1.0 - v1.2 */
|
||||
@@ -466,7 +463,7 @@ void print_mmc_info()
|
||||
else
|
||||
{
|
||||
gfx_printf(&gfx_con, "%kExtended Card-Specific Data V1.%d:%k\n",
|
||||
0xFFFFDD00, storage.ext_csd.ext_struct, 0xFFFFFFFF);
|
||||
0xFFFFDD00, storage.ext_csd.ext_struct, 0xFFCCCCCC);
|
||||
card_type = storage.ext_csd.card_type;
|
||||
u8 card_type_support[96];
|
||||
u8 pos_type = 0;
|
||||
@@ -509,22 +506,30 @@ void print_mmc_info()
|
||||
Cmd Classes: %02X\n\
|
||||
Capacity: %s\n\
|
||||
Max Speed: %d MB/s (%d MHz)\n\
|
||||
Type Support: %s\n\n",
|
||||
Type Support: ",
|
||||
storage.csd.mmca_vsn, storage.ext_csd.rev, storage.ext_csd.dev_version, storage.csd.cmdclass,
|
||||
storage.csd.capacity == (4096 * 512) ? "High" : "Low", speed & 0xFFFF, (speed >> 16) & 0xFFFF, card_type_support);
|
||||
storage.csd.capacity == (4096 * 512) ? "High" : "Low", speed & 0xFFFF, (speed >> 16) & 0xFFFF);
|
||||
gfx_con_setfontsz(&gfx_con, 8);
|
||||
gfx_printf(&gfx_con, "%s", card_type_support);
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
gfx_printf(&gfx_con, "\n\n", card_type_support);
|
||||
|
||||
u32 boot_size = storage.ext_csd.boot_mult << 17;
|
||||
u32 rpmb_size = storage.ext_csd.rpmb_mult << 17;
|
||||
gfx_printf(&gfx_con, "%keMMC Partitions:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, " 1: %kBOOT0 %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFFFFFFF,
|
||||
gfx_printf(&gfx_con, "%keMMC Partitions:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
gfx_printf(&gfx_con, " 1: %kBOOT0 %k\n Size: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFCCCCCC,
|
||||
boot_size / 1024, boot_size / 1024 / 512);
|
||||
gfx_printf(&gfx_con, " 2: %kBOOT1 %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFFFFFFF,
|
||||
gfx_putsep(&gfx_con);
|
||||
gfx_printf(&gfx_con, " 2: %kBOOT1 %k\n Size: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFCCCCCC,
|
||||
boot_size / 1024, boot_size / 1024 / 512);
|
||||
gfx_printf(&gfx_con, " 3: %kRPMB %kSize: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFFFFFFF,
|
||||
gfx_putsep(&gfx_con);
|
||||
gfx_printf(&gfx_con, " 3: %kRPMB %k\n Size: %5d KiB (LBA Sectors: 0x%07X)\n", 0xFF00FF96, 0xFFCCCCCC,
|
||||
rpmb_size / 1024, rpmb_size / 1024 / 512);
|
||||
gfx_printf(&gfx_con, " 0: %kGPP (USER) %kSize: %05d MiB (LBA Sectors: 0x%07X)\n\n", 0xFF00FF96, 0xFFFFFFFF,
|
||||
gfx_putsep(&gfx_con);
|
||||
gfx_printf(&gfx_con, " 0: %kGPP (USER) %k\n Size: %5d MiB (LBA Sectors: 0x%07X)\n\n", 0xFF00FF96, 0xFFCCCCCC,
|
||||
storage.sec_cnt >> SECTORS_TO_MIB_COEFF, storage.sec_cnt);
|
||||
gfx_printf(&gfx_con, "%kGPP (eMMC USER) partition table:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
||||
gfx_putsep(&gfx_con);
|
||||
gfx_printf(&gfx_con, "%kGPP (eMMC USER) partition table:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
|
||||
sdmmc_storage_set_mmc_partition(&storage, 0);
|
||||
LIST_INIT(gpt);
|
||||
@@ -532,22 +537,23 @@ void print_mmc_info()
|
||||
int gpp_idx = 0;
|
||||
LIST_FOREACH_ENTRY(emmc_part_t, part, &gpt, link)
|
||||
{
|
||||
gfx_printf(&gfx_con, " %02d: %k%s%k\n Size: % 5d MiB (LBA Sectors 0x%07X, LBA Range: %08X-%08X)%k\n",
|
||||
gpp_idx++, 0xFF14FDAE, part->name, 0xFFFFFFFF, (part->lba_end - part->lba_start + 1) >> SECTORS_TO_MIB_COEFF,
|
||||
part->lba_end - part->lba_start + 1, part->lba_start, part->lba_end, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, " %02d: %k%s%k\n Size: % 5d MiB (LBA Sectors 0x%07X)\n LBA Range: %08X-%08X\n",
|
||||
gpp_idx++, 0xFF14FDAE, part->name, 0xFFCCCCCC, (part->lba_end - part->lba_start + 1) >> SECTORS_TO_MIB_COEFF,
|
||||
part->lba_end - part->lba_start + 1, part->lba_start, part->lba_end);
|
||||
gfx_putsep(&gfx_con);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
sdmmc_storage_end(&storage);
|
||||
sleep(1000000);
|
||||
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
void print_sdcard_info()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
static const u32 SECTORS_TO_MIB_COEFF = 11;
|
||||
@@ -556,7 +562,7 @@ void print_sdcard_info()
|
||||
{
|
||||
u32 capacity;
|
||||
|
||||
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kCard IDentification:%k\n", 0xFFFFDD00, 0xFFCCCCCC);
|
||||
gfx_printf(&gfx_con,
|
||||
" Vendor ID: %02x\n\
|
||||
OEM ID: %c%c\n\
|
||||
@@ -571,7 +577,7 @@ void print_sdcard_info()
|
||||
sd_storage.cid.hwrev, sd_storage.cid.fwrev, sd_storage.cid.serial,
|
||||
sd_storage.cid.month, sd_storage.cid.year);
|
||||
|
||||
gfx_printf(&gfx_con, "%kCard-Specific Data V%d.0:%k\n", 0xFFFFDD00, sd_storage.csd.structure + 1, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kCard-Specific Data V%d.0:%k\n", 0xFFFFDD00, sd_storage.csd.structure + 1, 0xFFCCCCCC);
|
||||
capacity = sd_storage.csd.capacity >> (20 - sd_storage.csd.read_blkbits);
|
||||
gfx_printf(&gfx_con,
|
||||
" Cmd Classes: %02X\n\
|
||||
@@ -588,19 +594,17 @@ void print_sdcard_info()
|
||||
|
||||
gfx_puts(&gfx_con, "Acquiring FAT volume info...\n\n");
|
||||
f_getfree("", &sd_fs.free_clst, NULL);
|
||||
gfx_printf(&gfx_con, "%kFound %s volume:%k\n Free: %d MiB\n Cluster: %d B\n",
|
||||
0xFFFFDD00, sd_fs.fs_type == FS_EXFAT ? "exFAT" : "FAT32", 0xFFFFFFFF,
|
||||
sd_fs.free_clst * sd_fs.csize >> SECTORS_TO_MIB_COEFF, sd_fs.csize * 512);
|
||||
gfx_printf(&gfx_con, "%kFound %s volume:%k\n Free: %d MiB\n Cluster: %d KiB\n",
|
||||
0xFFFFDD00, sd_fs.fs_type == FS_EXFAT ? "exFAT" : "FAT32", 0xFFCCCCCC,
|
||||
sd_fs.free_clst * sd_fs.csize >> SECTORS_TO_MIB_COEFF, (sd_fs.csize > 1) ? (sd_fs.csize >> 1) : 512);
|
||||
}
|
||||
|
||||
sleep(1000000);
|
||||
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
void print_tsec_key()
|
||||
{
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
sdmmc_storage_t storage;
|
||||
@@ -615,6 +619,7 @@ void print_tsec_key()
|
||||
const pkg1_id_t *pkg1_id = pkg1_identify(pkg1);
|
||||
if (!pkg1_id)
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 8);
|
||||
EPRINTFARGS("Could not identify package1 version to read TSEC firmware (= '%s').",
|
||||
(char *)pkg1 + 0x10);
|
||||
goto out;
|
||||
@@ -625,7 +630,7 @@ void print_tsec_key()
|
||||
u8 key[0x10];
|
||||
int res = tsec_query(key, i, pkg1 + pkg1_id->tsec_off);
|
||||
|
||||
gfx_printf(&gfx_con, "%kTSEC key %d: %k", 0xFFFF9955, i, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kTSEC key %d: %k", 0xFFFFDD00, i, 0xFFCCCCCC);
|
||||
if (res >= 0)
|
||||
{
|
||||
for (u32 i = 0; i < 0x10; i++)
|
||||
@@ -639,19 +644,22 @@ void print_tsec_key()
|
||||
out:;
|
||||
free(pkg1);
|
||||
sdmmc_storage_end(&storage);
|
||||
sleep(1000000);
|
||||
|
||||
gfx_puts(&gfx_con, "\nPress any key...\n");
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
void reboot_normal()
|
||||
{
|
||||
sd_unmount();
|
||||
free(Kc_HEKATE_LOGO);
|
||||
panic(0x21); //Bypass fuse programming in package1.
|
||||
}
|
||||
|
||||
void reboot_rcm()
|
||||
{
|
||||
sd_unmount();
|
||||
free(Kc_HEKATE_LOGO);
|
||||
PMC(APBDEV_PMC_SCRATCH0) = 2; //Reboot into rcm.
|
||||
PMC(0) |= 0x10;
|
||||
while (1)
|
||||
@@ -661,10 +669,90 @@ void reboot_rcm()
|
||||
void power_off()
|
||||
{
|
||||
sd_unmount();
|
||||
free(Kc_HEKATE_LOGO);
|
||||
//TODO: we should probably make sure all regulators are powered off properly.
|
||||
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, u32 NUM_SECTORS_PER_ITER, emmc_part_t *part)
|
||||
{
|
||||
FIL fp;
|
||||
u32 prevPct = 200;
|
||||
|
||||
if (f_open(&fp, outFilename, FA_READ) == FR_OK)
|
||||
{
|
||||
u8 *bufEm = (u8 *)malloc(NX_EMMC_BLOCKSIZE * NUM_SECTORS_PER_ITER);
|
||||
u8 *bufSd = (u8 *)malloc(NX_EMMC_BLOCKSIZE * NUM_SECTORS_PER_ITER);
|
||||
|
||||
u32 totalSectorsVer = (u32)(f_size(&fp) >> 9);
|
||||
u32 lbaCurrVer = lba_curr - totalSectorsVer;
|
||||
|
||||
u32 pct = (u64)((u64)(lbaCurrVer - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start);
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, pct, 0xFF00FF96, 0xFF005515);
|
||||
|
||||
while (totalSectorsVer > 0)
|
||||
{
|
||||
u32 num = MIN(totalSectorsVer, NUM_SECTORS_PER_ITER);
|
||||
|
||||
if(!sdmmc_storage_read(storage, lbaCurrVer, num, bufEm))
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTFARGS("\nFailed to read %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
|
||||
num, lbaCurrVer);
|
||||
|
||||
free(bufEm);
|
||||
free(bufSd);
|
||||
f_close(&fp);
|
||||
return 1;
|
||||
}
|
||||
if (!(f_read(&fp, bufSd, num, NULL) == FR_OK))
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTFARGS("\nFailed to read %d blocks from sd card.\nVerification failed..\n", num);
|
||||
|
||||
free(bufEm);
|
||||
free(bufSd);
|
||||
f_close(&fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(!memcmp(bufEm, bufSd, num << 9))
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTFARGS("\nVerification failed.\nVerification failed..\n", num);
|
||||
|
||||
free(bufEm);
|
||||
free(bufSd);
|
||||
f_close(&fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pct = (u64)((u64)(lbaCurrVer - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start);
|
||||
if (pct != prevPct)
|
||||
{
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, pct, 0xFF00FF96, 0xFF005515);
|
||||
prevPct = pct;
|
||||
}
|
||||
|
||||
lbaCurrVer += num;
|
||||
totalSectorsVer -= num;
|
||||
}
|
||||
free(bufEm);
|
||||
free(bufSd);
|
||||
f_close(&fp);
|
||||
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, pct, 0xFFCCCCCC, 0xFF555555);
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTF("\nFile not found or could not be loaded.\nVerification failed..\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
{
|
||||
static const u32 FAT32_FILESIZE_LIMIT = 0xFFFFFFFF;
|
||||
@@ -686,7 +774,8 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
memcpy(partialIdxFilename, "partial.idx", 11);
|
||||
partialIdxFilename[11] = 0;
|
||||
|
||||
gfx_printf(&gfx_con, "SD Card free space: %d MiB, Total dump size %d MiB\n",
|
||||
gfx_con_setfontsz(&gfx_con, 8);
|
||||
gfx_printf(&gfx_con, "\nSD Card free space: %d MiB, Total dump size %d MiB\n\n",
|
||||
sd_fs.free_clst * sd_fs.csize >> SECTORS_TO_MIB_COEFF,
|
||||
totalSectors >> SECTORS_TO_MIB_COEFF);
|
||||
|
||||
@@ -701,10 +790,11 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
{
|
||||
isSmallSdCard = 1;
|
||||
|
||||
gfx_printf(&gfx_con, "%k\nSD card free space is smaller than dump total size.%k\n", 0xFF00BAFF, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%k\nSD card free space is smaller than dump total size.%k\n", 0xFF00BAFF, 0xFFCCCCCC);
|
||||
|
||||
if (!maxSplitParts)
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTF("Not enough free space for partial dumping.");
|
||||
|
||||
return 0;
|
||||
@@ -713,7 +803,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
// Check if we continuing a previous raw eMMC dump in progress.
|
||||
if (f_open(&partialIdxFp, partialIdxFilename, FA_READ) == FR_OK)
|
||||
{
|
||||
gfx_printf(&gfx_con, "%kFound partial dump in progress. Continuing...%k\n\n", 0xFF14FDAE, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kFound partial dump in progress. Continuing...%k\n\n", 0xFF14FDAE, 0xFFCCCCCC);
|
||||
|
||||
partialDumpInProgress = 1;
|
||||
// Force partial dumping, even if the card is larger.
|
||||
@@ -724,6 +814,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
|
||||
if (!maxSplitParts)
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTF("Not enough free space for partial dumping.");
|
||||
|
||||
return 0;
|
||||
@@ -733,7 +824,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
maxSplitParts += currPartIdx;
|
||||
}
|
||||
else if (isSmallSdCard)
|
||||
gfx_printf(&gfx_con, "%kPartial dumping enabled (with %d MiB parts)...%k\n\n", 0xFF00BAFF, multipartSplitSize >> 20, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kPartial dumping enabled (with %d MiB parts)...%k\n\n", 0xFF00BAFF, multipartSplitSize >> 20, 0xFFCCCCCC);
|
||||
|
||||
// Check if filesystem is FAT32 or the free space is smaller and dump in parts
|
||||
if (((sd_fs.fs_type != FS_EXFAT) && totalSectors > (FAT32_FILESIZE_LIMIT / NX_EMMC_BLOCKSIZE)) | isSmallSdCard)
|
||||
@@ -772,7 +863,8 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
FIL fp;
|
||||
if (f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
|
||||
{
|
||||
EPRINTFARGS("Error creating file %s.", outFilename);
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTFARGS("Error creating file %s.\n", outFilename);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -800,6 +892,15 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
memset(&fp, 0, sizeof(fp));
|
||||
currPartIdx++;
|
||||
|
||||
// Verify part
|
||||
if (dump_emmc_verify(storage, lba_curr, outFilename, NUM_SECTORS_PER_ITER, part))
|
||||
{
|
||||
EPRINTF("\nPress any key and try again.\n");
|
||||
|
||||
free(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (numSplitParts >= 10 && currPartIdx < 10)
|
||||
{
|
||||
outFilename[sdPathLen] = '0';
|
||||
@@ -819,7 +920,8 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
}
|
||||
else
|
||||
{
|
||||
EPRINTF("\nError creating partial.idx file.");
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTF("\nError creating partial.idx file.\n");
|
||||
|
||||
free(buf);
|
||||
return 0;
|
||||
@@ -833,6 +935,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
Don\'t move the partial.idx file!\n\
|
||||
3. Unplug and re-plug USB while pressing Vol+.\n\
|
||||
4. Run hekate - ipl again and press Dump RAW eMMC or eMMC USER to continue\n");
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
|
||||
free(buf);
|
||||
return 1;
|
||||
@@ -842,7 +945,8 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
// Create next part
|
||||
if (f_open(&fp, outFilename, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
|
||||
{
|
||||
EPRINTFARGS("Error creating file %s.", outFilename);
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTFARGS("Error creating file %s.\n", outFilename);
|
||||
|
||||
free(buf);
|
||||
return 0;
|
||||
@@ -854,14 +958,16 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
u32 num = MIN(totalSectors, NUM_SECTORS_PER_ITER);
|
||||
while(!sdmmc_storage_read(storage, lba_curr, num, buf))
|
||||
{
|
||||
EPRINTFARGS("Error reading %d blocks @ LBA %08X from eMMC (try %d)",
|
||||
EPRINTFARGS("Error reading %d blocks @ LBA %08X from eMMC (try %d), retrying...",
|
||||
num, lba_curr, ++retryCount);
|
||||
|
||||
sleep(500000);
|
||||
if (retryCount >= 10)
|
||||
sleep(150000);
|
||||
if (retryCount >= 3)
|
||||
{
|
||||
EPRINTFARGS("\nFailed to read %d blocks @ LBA %08X from eMMC. Aborting..",
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTFARGS("\nFailed to read %d blocks @ LBA %08X\nfrom eMMC. Aborting..\n",
|
||||
num, lba_curr);
|
||||
EPRINTF("\nPress any key and try again.\n");
|
||||
|
||||
free(buf);
|
||||
f_close(&fp);
|
||||
@@ -871,8 +977,9 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
res = f_write(&fp, buf, NX_EMMC_BLOCKSIZE * num, NULL);
|
||||
if (res)
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
EPRINTFARGS("\nFatal error (%d) when writing to SD Card", res);
|
||||
EPRINTF("\nPress any key and try again.");
|
||||
EPRINTF("\nPress any key and try again.\n");
|
||||
|
||||
free(buf);
|
||||
f_close(&fp);
|
||||
@@ -881,7 +988,7 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
u32 pct = (u64)((u64)(lba_curr - part->lba_start) * 100u) / (u64)(part->lba_end - part->lba_start);
|
||||
if (pct != prevPct)
|
||||
{
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, pct);
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, pct, 0xFFCCCCCC, 0xFF555555);
|
||||
prevPct = pct;
|
||||
}
|
||||
|
||||
@@ -896,18 +1003,31 @@ int dump_emmc_part(char *sd_path, sdmmc_storage_t *storage, emmc_part_t *part)
|
||||
bytesWritten = 0;
|
||||
}
|
||||
}
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, 100);
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, 100, 0xFFCCCCCC, 0xFF555555);
|
||||
|
||||
out:;
|
||||
// Dumping process ended successfully
|
||||
free(buf);
|
||||
f_close(&fp);
|
||||
|
||||
// Verify last part or single file dump
|
||||
if (dump_emmc_verify(storage, lba_curr, outFilename, NUM_SECTORS_PER_ITER, part))
|
||||
{
|
||||
EPRINTF("\nPress any key and try again.\n");
|
||||
|
||||
free(buf);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
tui_pbar(&gfx_con, 0, gfx_con.y, 100, 0xFF00FF96, 0xFF005515);
|
||||
|
||||
gfx_con_setfontsz(&gfx_con, 16);
|
||||
// Remove partial dump index file if no fatal errors occurred.
|
||||
if(isSmallSdCard)
|
||||
{
|
||||
f_unlink(partialIdxFilename);
|
||||
gfx_printf(&gfx_con, "\n\nYou can now join the files and get the complete raw eMMC dump.");
|
||||
gfx_printf(&gfx_con, "%k\n\nYou can now join the files\nand get the complete raw eMMC dump.", 0xFFCCCCCC);
|
||||
}
|
||||
gfx_putc(&gfx_con, '\n');
|
||||
gfx_puts(&gfx_con, "\n\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -924,7 +1044,7 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
||||
{
|
||||
int res = 0;
|
||||
u32 timer = 0;
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (!sd_mount())
|
||||
@@ -958,8 +1078,8 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
||||
bootPart.name[4] = (u8)('0' + i);
|
||||
bootPart.name[5] = 0;
|
||||
|
||||
gfx_printf(&gfx_con, "%k%02d: %s (%08X-%08X)%k\n", 0xFFFFDD00, i,
|
||||
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFFFFDD00, i,
|
||||
bootPart.name, bootPart.lba_start, bootPart.lba_end, 0xFFCCCCCC);
|
||||
|
||||
sdmmc_storage_set_mmc_partition(&storage, i+1);
|
||||
res = dump_emmc_part(bootPart.name, &storage, &bootPart);
|
||||
@@ -981,8 +1101,8 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
||||
if ((dumpType & DUMP_SYSTEM) == 0 && strcmp(part->name, "USER"))
|
||||
continue;
|
||||
|
||||
gfx_printf(&gfx_con, "%k%02d: %s (%08X-%08X)%k\n", 0xFFFFDD00, i++,
|
||||
part->name, part->lba_start, part->lba_end, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFFFFDD00, i++,
|
||||
part->name, part->lba_start, part->lba_end, 0xFFCCCCCC);
|
||||
|
||||
res = dump_emmc_part(part->name, &storage, part);
|
||||
}
|
||||
@@ -998,8 +1118,8 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
||||
rawPart.lba_end = RAW_AREA_NUM_SECTORS-1;
|
||||
strcpy(rawPart.name, "rawnand.bin");
|
||||
{
|
||||
gfx_printf(&gfx_con, "%k%02d: %s (%08X-%08X)%k\n", 0xFFFFDD00, i++,
|
||||
rawPart.name, rawPart.lba_start, rawPart.lba_end, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%k%02d: %s (%07X-%07X)%k\n", 0xFFFFDD00, i++,
|
||||
rawPart.name, rawPart.lba_start, rawPart.lba_end, 0xFFCCCCCC);
|
||||
|
||||
res = dump_emmc_part(rawPart.name, &storage, &rawPart);
|
||||
}
|
||||
@@ -1007,13 +1127,12 @@ static void dump_emmc_selected(dumpType_t dumpType)
|
||||
}
|
||||
|
||||
gfx_putc(&gfx_con, '\n');
|
||||
gfx_printf(&gfx_con, "%kTime taken: %d seconds.%k\n", 0xFF00FF96, (get_tmr() - timer) / 1000000, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "Time taken: %d seconds.\n", (get_tmr() - timer) / 1000000);
|
||||
sdmmc_storage_end(&storage);
|
||||
if (res)
|
||||
gfx_puts(&gfx_con, "\nDone. Press any key.\n");
|
||||
gfx_printf(&gfx_con, "\n%kFinished and verified!%k\nPress any key.\n",0xFF00FF96, 0xFFCCCCCC);
|
||||
|
||||
out:;
|
||||
sleep(1000000);
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
@@ -1028,7 +1147,7 @@ void dump_package1()
|
||||
u8 * warmboot = (u8 *)malloc(0x40000);
|
||||
u8 * secmon = (u8 *)malloc(0x40000);
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (!sd_mount())
|
||||
@@ -1049,6 +1168,7 @@ void dump_package1()
|
||||
const pk11_hdr_t *hdr = (pk11_hdr_t *)(pkg1 + pkg1_id->pkg11_off + 0x20);
|
||||
if (!pkg1_id)
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 8);
|
||||
EPRINTFARGS("Could not identify package1 version to read TSEC firmware (= '%s').", (char *)pkg1 + 0x10);
|
||||
goto out;
|
||||
}
|
||||
@@ -1065,40 +1185,40 @@ void dump_package1()
|
||||
pkg1_unpack(warmboot, secmon, pkg1_id, pkg1);
|
||||
|
||||
// display info
|
||||
gfx_printf(&gfx_con, "%kSecure monitor addr: %08X\n", 0xFF00FFA8, pkg1_id->secmon_base);
|
||||
gfx_printf(&gfx_con, "%kSecure monitor size: %08X\n", 0xFF00FFA8, hdr->sm_size);
|
||||
gfx_printf(&gfx_con, "%kSecure monitor off: %08X\n", 0xFF00FFA8, hdr->sm_off);
|
||||
gfx_printf(&gfx_con, "%kSecure monitor addr: %k%08X\n", 0xFF46EAC7, 0xFFCCCCCC, pkg1_id->secmon_base);
|
||||
gfx_printf(&gfx_con, "%kSecure monitor size: %k%08X\n", 0xFF46EAC7, 0xFFCCCCCC, hdr->sm_size);
|
||||
gfx_printf(&gfx_con, "%kSecure monitor ofst: %k%08X\n", 0xFF46EAC7, 0xFFCCCCCC, hdr->sm_off);
|
||||
|
||||
// dump package1
|
||||
if (sd_save_to_file(pkg1, 0x40000, "pkg_decr.bin")) {
|
||||
gfx_printf(&gfx_con, "Failed to create pkg_decr.bin\n");
|
||||
EPRINTF("\nFailed to create pkg_decr.bin");
|
||||
goto out;
|
||||
}
|
||||
gfx_puts(&gfx_con, "%kpackage1 dumped to pkg_decr.bin\n");
|
||||
gfx_puts(&gfx_con, "\npackage1 dumped to pkg_decr.bin\n");
|
||||
|
||||
// dump sm
|
||||
if (sd_save_to_file(secmon, 0x40000, "sm.bin")) {
|
||||
gfx_puts(&gfx_con, "Failed to create sm.bin\n");
|
||||
EPRINTF("\nFailed to create sm.bin");
|
||||
goto out;
|
||||
}
|
||||
gfx_puts(&gfx_con, "Secure Monitor dumped to sm.bin\n");
|
||||
|
||||
// dump warmboot
|
||||
if (sd_save_to_file(warmboot, 0x40000, "warmboot.bin")) {
|
||||
gfx_puts(&gfx_con, "Failed to create warmboot.bin\n");
|
||||
EPRINTF("\nFailed to create warmboot.bin");
|
||||
goto out;
|
||||
}
|
||||
gfx_puts(&gfx_con, "Warmboot dumped to warmboot.bin\n");
|
||||
|
||||
|
||||
sdmmc_storage_end(&storage);
|
||||
gfx_puts(&gfx_con, "Done. Press any key.\n");
|
||||
gfx_puts(&gfx_con, "\nDone. Press any key.\n");
|
||||
|
||||
out:;
|
||||
free(pkg1);
|
||||
free(secmon);
|
||||
free(warmboot);
|
||||
sleep(1000000);
|
||||
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
@@ -1107,7 +1227,7 @@ void launch_firmware()
|
||||
ini_sec_t *cfg_sec = NULL;
|
||||
LIST_INIT(ini_sections);
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
if (sd_mount())
|
||||
@@ -1143,19 +1263,26 @@ void launch_firmware()
|
||||
free(ments);
|
||||
}
|
||||
else
|
||||
EPRINTF("Failed to load 'hekate_ipl.ini'.");
|
||||
EPRINTF("Could not find or open 'hekate_ipl.ini'.\nMake sure it exists in SD Card!.");
|
||||
}
|
||||
|
||||
if (!cfg_sec)
|
||||
gfx_printf(&gfx_con, "Using default launch configuration.\n");
|
||||
{
|
||||
sleep(3000000);
|
||||
gfx_printf(&gfx_con, "Using default launch configuration...\n");
|
||||
}
|
||||
|
||||
free(Kc_HEKATE_LOGO);
|
||||
if (!hos_launch(cfg_sec))
|
||||
{
|
||||
Kc_HEKATE_LOGO = (u8 *)malloc(36864);
|
||||
LZ_Uncompress(Kc_HEKATE_LOGOlz, Kc_HEKATE_LOGO, SZ_HEKATE_LOGOLZ);
|
||||
EPRINTF("Failed to launch firmware.");
|
||||
}
|
||||
|
||||
//TODO: free ini.
|
||||
|
||||
out:;
|
||||
sleep(200000);
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
@@ -1164,7 +1291,7 @@ void toggle_autorcm(){
|
||||
sdmmc_t sdmmc;
|
||||
if(!sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4))
|
||||
{
|
||||
gfx_printf(&gfx_con, "%kFailed to init eMMC.%k\n", 0xFF0000FF, 0xFFFFFFFF);
|
||||
EPRINTF("Failed to init eMMC.");
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -1183,22 +1310,22 @@ void toggle_autorcm(){
|
||||
free(tempbuf);
|
||||
sdmmc_storage_end(&storage);
|
||||
|
||||
gfx_printf(&gfx_con, "%kAutoRCM mode toggled!%k\n", 0xFF00EE2C, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, "%kAutoRCM mode toggled!%k\n", 0xFF00EE2C, 0xFFCCCCCC);
|
||||
|
||||
out:;
|
||||
sleep(1000000);
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
void about()
|
||||
{
|
||||
gfx_con_setfontsz(&gfx_con, 8);
|
||||
static const char octopus[] =
|
||||
"hekate (c) 2018 naehrwert, st4rk\n\n"
|
||||
"hekate (C) 2018 naehrwert, st4rk\n\n"
|
||||
"Thanks to: %kderrek, nedwill, plutoo, shuffle2, smea, thexyz, yellows8%k\n\n"
|
||||
"Greetings to: fincs, hexkyz, SciresM, Shiny Quagsire, WinterMute\n\n"
|
||||
"Open source and free packages used:\n"
|
||||
" - FatFs R0.13a (Copyright (C) 2017, ChaN)\n"
|
||||
" - bcl-1.2.0 (Copyright (c) 2003-2006 Marcus Geelnard)\n\n"
|
||||
" - FatFs R0.13a, (Copyright (C) 2017, ChaN)\n"
|
||||
" - bcl-1.2.0, (Copyright (C) 2003-2006, Marcus Geelnard)\n\n"
|
||||
" %k___\n"
|
||||
" .-' `'.\n"
|
||||
" / \\\n"
|
||||
@@ -1218,21 +1345,24 @@ void about()
|
||||
" (/` ( (` ) ) '-; %k[switchbrew]%k\n"
|
||||
" ` '-; (-'%k";
|
||||
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_con_setpos(&gfx_con, 0, 0);
|
||||
|
||||
gfx_printf(&gfx_con, octopus, 0xFFFFCC00, 0xFFFFFFFF,
|
||||
0xFFFFCC00, 0xFFCCFF00, 0xFFFFCC00, 0xFFFFFFFF);
|
||||
gfx_printf(&gfx_con, octopus, 0xFFFFCC00, 0xFFCCCCCC,
|
||||
0xFFFFCC00, 0xFFCCFF00, 0xFFFFCC00, 0xFFCCCCCC);
|
||||
|
||||
sleep(1000000);
|
||||
btn_wait();
|
||||
}
|
||||
|
||||
ment_t ment_cinfo[] = {
|
||||
MDEF_BACK(),
|
||||
MDEF_CHGLINE(),
|
||||
MDEF_CAPTION("---- SoC Info ----", 0xFFE6B90A),
|
||||
MDEF_HANDLER("Print fuse info", print_fuseinfo),
|
||||
MDEF_HANDLER("Print kfuse info", print_kfuseinfo),
|
||||
MDEF_HANDLER("Print TSEC keys", print_tsec_key),
|
||||
MDEF_CHGLINE(),
|
||||
MDEF_CAPTION("-- Storage Info --", 0xFFE6B90A),
|
||||
MDEF_HANDLER("Print eMMC info", print_mmc_info),
|
||||
MDEF_HANDLER("Print SD Card info", print_sdcard_info),
|
||||
MDEF_END()
|
||||
@@ -1243,6 +1373,7 @@ menu_t menu_cinfo = {
|
||||
};
|
||||
|
||||
ment_t ment_autorcm[] = {
|
||||
MDEF_CAPTION("WARNING: This corrupts your BOOT0 partition!", 0xFF00FFE6),
|
||||
MDEF_BACK(),
|
||||
MDEF_BACK(),
|
||||
MDEF_BACK(),
|
||||
@@ -1262,11 +1393,19 @@ menu_t menu_autorcm = {
|
||||
|
||||
ment_t ment_tools[] = {
|
||||
MDEF_BACK(),
|
||||
MDEF_CHGLINE(),
|
||||
MDEF_CAPTION("------ Full --------", 0xFFE6B90A),
|
||||
MDEF_HANDLER("Dump RAW eMMC", dump_emmc_rawnand),
|
||||
MDEF_HANDLER("Dump eMMC BOOT", dump_emmc_boot),
|
||||
MDEF_CHGLINE(),
|
||||
MDEF_CAPTION("-- GP Partitions --", 0xFFE6B90A),
|
||||
MDEF_HANDLER("Dump eMMC SYS", dump_emmc_system),
|
||||
MDEF_HANDLER("Dump eMMC USER", dump_emmc_user),
|
||||
MDEF_HANDLER("Dump eMMC BOOT", dump_emmc_boot),
|
||||
MDEF_CHGLINE(),
|
||||
MDEF_CAPTION("------ Misc -------", 0xFFE6B90A),
|
||||
MDEF_HANDLER("Dump package1", dump_package1),
|
||||
MDEF_CHGLINE(),
|
||||
MDEF_CAPTION("---- Dangerous ----", 0xFF0000FF),
|
||||
MDEF_MENU("AutoRCM", &menu_autorcm),
|
||||
MDEF_END()
|
||||
};
|
||||
@@ -1278,17 +1417,20 @@ menu_t menu_tools = {
|
||||
|
||||
ment_t ment_top[] = {
|
||||
MDEF_HANDLER("Launch firmware", launch_firmware),
|
||||
MDEF_CAPTION("---------------", 0xFF444444),
|
||||
MDEF_MENU("Tools", &menu_tools),
|
||||
MDEF_MENU("Console info", &menu_cinfo),
|
||||
MDEF_HANDLER("Reboot (normal)", reboot_normal),
|
||||
MDEF_HANDLER("Reboot (rcm)", reboot_rcm),
|
||||
MDEF_CAPTION("---------------", 0xFF444444),
|
||||
MDEF_HANDLER("Reboot (Normal)", reboot_normal),
|
||||
MDEF_HANDLER("Reboot (RCM)", reboot_rcm),
|
||||
MDEF_HANDLER("Power off", power_off),
|
||||
MDEF_CAPTION("---------------", 0xFF444444),
|
||||
MDEF_HANDLER("About", about),
|
||||
MDEF_END()
|
||||
};
|
||||
menu_t menu_top = {
|
||||
ment_top,
|
||||
"hekate - ipl", 0, 0
|
||||
"hekate - ipl (CTCaer mod v2.2)", 0, 0
|
||||
};
|
||||
|
||||
extern void pivot_stack(u32 stack_top);
|
||||
@@ -1310,7 +1452,9 @@ void ipl_main()
|
||||
//display_color_screen(0xAABBCCDD);
|
||||
u32 *fb = display_init_framebuffer();
|
||||
gfx_init_ctxt(&gfx_ctxt, fb, 720, 1280, 768);
|
||||
gfx_clear(&gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(&gfx_ctxt, 0xFF1B1B1B);
|
||||
Kc_HEKATE_LOGO = (u8 *)malloc(36864);
|
||||
LZ_Uncompress(Kc_HEKATE_LOGOlz, Kc_HEKATE_LOGO, SZ_HEKATE_LOGOLZ);
|
||||
gfx_con_init(&gfx_con, &gfx_ctxt);
|
||||
|
||||
while (1)
|
||||
|
||||
52
ipl/pkg1.c
52
ipl/pkg1.c
@@ -24,9 +24,12 @@
|
||||
#define _BL(a, o) 0x94000000 | (((o) - (a)) >> 2) & 0x3FFFFFF
|
||||
#define _NOP() 0xD503201F
|
||||
|
||||
//#define SM_100_ADR 0x40014020
|
||||
#define SM_100_ADR 0x4002B020
|
||||
|
||||
PATCHSET_DEF(_secmon_1_patchset,
|
||||
//Patch the relocator to be able to run from 0x4002D000.
|
||||
//{ 0x1E0, _ADRP(0, 0x7C013000 - 0x4002D000) }
|
||||
//Patch the relocator to be able to run from SM_100_ADR.
|
||||
{ 0x1E0, _ADRP(0, 0x7C013000 - (SM_100_ADR - 0x40)) },
|
||||
//Patch package2 decryption and signature/hash checks.
|
||||
{ 0x9F0 + 0xADC, _NOP() }, //Header signature.
|
||||
{ 0x9F0 + 0xB8C, _NOP() }, //Version.
|
||||
@@ -42,20 +45,21 @@ PATCHSET_DEF(_secmon_2_patchset,
|
||||
|
||||
PATCHSET_DEF(_secmon_3_patchset,
|
||||
//Patch package2 decryption and signature/hash checks.
|
||||
{ 0xAC8 + 0xAB4, _NOP() },
|
||||
{ 0xAC8 + 0xA30, _NOP() }, //Header signature.
|
||||
{ 0xAC8 + 0xAC0, _NOP() }, //Version.
|
||||
{ 0xAC8 + 0xADC, _NOP() } //Sections SHA2.
|
||||
);
|
||||
|
||||
PATCHSET_DEF(_secmon_5_patchset,
|
||||
PATCHSET_DEF(_secmon_4_patchset,
|
||||
//Patch package2 decryption and signature/hash checks.
|
||||
{ 0x1218 + 0x6E68, _NOP() }, //Header signature.
|
||||
{ 0x1218 + 0x6E74, _NOP() }, //Version.
|
||||
{ 0x1218 + 0x6FE4, _NOP() }, //Sections SHA2.
|
||||
{ 0x1218 + 0x2DC, _NOP() } //Unknown.
|
||||
{ 0x1218 + 0x2DC, _NOP() } //Unknown.
|
||||
);
|
||||
|
||||
PATCHSET_DEF(_secmon_6_patchset,
|
||||
PATCHSET_DEF(_secmon_5_patchset,
|
||||
//Patch package2 decryption and signature/hash checks.
|
||||
{ 0x12b0 + 0x4d0, _NOP() },
|
||||
{ 0x12b0 + 0x4dc, _NOP() },
|
||||
@@ -64,6 +68,32 @@ PATCHSET_DEF(_secmon_6_patchset,
|
||||
//{ 0x12b0 + 0xa18 , _NOP() } // BootConfig Retail Check
|
||||
);
|
||||
|
||||
// Include kernel patches here, so we can utilize pkg1 id
|
||||
PATCHSET_DEF(_kernel_1_patchset,
|
||||
{ 0x3764C, _NOP() }, // Disable SVC verifications
|
||||
{ 0x44074, _MOVZX(8, 1, 0) } // Enable Debug Patch
|
||||
);
|
||||
|
||||
PATCHSET_DEF(_kernel_2_patchset,
|
||||
{ 0x54834, _NOP() }, // Disable SVC verifications
|
||||
{ 0x6086C, _MOVZX(8, 1, 0) } // Enable Debug Patch
|
||||
);
|
||||
|
||||
PATCHSET_DEF(_kernel_3_patchset,
|
||||
{ 0x3BD24, _NOP() }, // Disable SVC verifications
|
||||
{ 0x483FC, _MOVZX(8, 1, 0) } // Enable Debug Patch
|
||||
);
|
||||
|
||||
PATCHSET_DEF(_kernel_4_patchset,
|
||||
{ 0x41EB4, _NOP() }, // Disable SVC verifications
|
||||
{ 0x4EBFC, _MOVZX(8, 1, 0) } // Enable Debug Patch
|
||||
);
|
||||
|
||||
PATCHSET_DEF(_kernel_5_patchset,
|
||||
{ 0x45E6C, _NOP() }, // Disable SVC verifications
|
||||
{ 0x5513C, _MOVZX(8, 1, 0) } // Enable Debug Patch
|
||||
);
|
||||
|
||||
/*
|
||||
* package1.1 header: <wb, ldr, sm>
|
||||
* package1.1 layout:
|
||||
@@ -76,12 +106,12 @@ PATCHSET_DEF(_secmon_6_patchset,
|
||||
*/
|
||||
|
||||
static const pkg1_id_t _pkg1_ids[] = {
|
||||
{ "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, 0x40014020, _secmon_1_patchset }, //1.0.0
|
||||
{ "20170210155124", 0, 0x1900, 0x3FE0, { 0, 1, 2 }, 0x4002D000, _secmon_2_patchset }, //2.0.0
|
||||
{ "20170519101410", 1, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, NULL }, //3.0.0
|
||||
{ "20170710161758", 2, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, NULL }, //3.0.1
|
||||
{ "20170921172629", 3, 0x1800, 0x3FE0, { 1, 2, 0 }, 0x4002B000, _secmon_5_patchset }, //4.0.0
|
||||
{ "20180220163747", 4, 0x1900, 0x3FE0, { 1, 2, 0 }, 0x4002B000, _secmon_6_patchset }, //5.0.0
|
||||
{ "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, SM_100_ADR, _secmon_1_patchset, _kernel_1_patchset }, //1.0.0 (Patched relocator)
|
||||
{ "20170210155124", 0, 0x1900, 0x3FE0, { 0, 1, 2 }, 0x4002D000, _secmon_2_patchset, _kernel_2_patchset }, //2.0.0 - 2.3.0
|
||||
{ "20170519101410", 1, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, _secmon_3_patchset, _kernel_3_patchset }, //3.0.0
|
||||
{ "20170710161758", 2, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, _secmon_3_patchset, _kernel_3_patchset }, //3.0.1 - 3.0.2
|
||||
{ "20170921172629", 3, 0x1800, 0x3FE0, { 1, 2, 0 }, 0x4002B000, _secmon_4_patchset, _kernel_4_patchset }, //4.0.0 - 4.1.0
|
||||
{ "20180220163747", 4, 0x1900, 0x3FE0, { 1, 2, 0 }, 0x4002B000, _secmon_5_patchset, _kernel_5_patchset }, //5.0.0 - 5.0.2
|
||||
{ NULL, 0, 0, 0, 0 } //End.
|
||||
};
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ typedef struct _pkg1_id_t
|
||||
u32 sec_map[3];
|
||||
u32 secmon_base;
|
||||
patch_t *secmon_patchset;
|
||||
patch_t *kernel_patchset;
|
||||
} pkg1_id_t;
|
||||
|
||||
typedef struct _pk11_hdr_t
|
||||
|
||||
3
ipl/sd.h
3
ipl/sd.h
@@ -86,6 +86,7 @@
|
||||
#define UHS_SDR50_BUS_SPEED 2
|
||||
#define UHS_SDR104_BUS_SPEED 3
|
||||
#define UHS_DDR50_BUS_SPEED 4
|
||||
#define HS400_BUS_SPEED 5
|
||||
|
||||
/*
|
||||
* SD_SWITCH mode
|
||||
@@ -102,6 +103,6 @@
|
||||
* SD_SWITCH access modes
|
||||
*/
|
||||
#define SD_SWITCH_ACCESS_DEF 0
|
||||
#define SD_SWITCH_ACCESS_HS 1
|
||||
#define SD_SWITCH_ACCESS_HS 1
|
||||
|
||||
#endif /* LINUX_MMC_SD_H */
|
||||
|
||||
20
ipl/sdmmc.c
20
ipl/sdmmc.c
@@ -165,15 +165,27 @@ static int _sdmmc_storage_readwrite(sdmmc_storage_t *storage, u32 sector, u32 nu
|
||||
while (num_sectors)
|
||||
{
|
||||
u32 blkcnt = 0;
|
||||
//Retry once on error.
|
||||
if (!_sdmmc_storage_readwrite_ex(storage, &blkcnt, sector, MIN(num_sectors, 0xFFFF), bbuf, is_write))
|
||||
if (!_sdmmc_storage_readwrite_ex(storage, &blkcnt, sector, MIN(num_sectors, 0xFFFF), bbuf, is_write))
|
||||
return 0;
|
||||
//Retry 9 times on error.
|
||||
u32 retries = 10;
|
||||
do
|
||||
{
|
||||
if (_sdmmc_storage_readwrite_ex(storage, &blkcnt, sector, MIN(num_sectors, 0xFFFF), bbuf, is_write))
|
||||
goto out;
|
||||
else
|
||||
retries--;
|
||||
|
||||
sleep(500000);
|
||||
|
||||
} while (retries);
|
||||
return 0;
|
||||
|
||||
out:;
|
||||
DPRINTF("readwrite: %08X\n", blkcnt);
|
||||
sector += blkcnt;
|
||||
num_sectors -= blkcnt;
|
||||
bbuf += 512 * blkcnt;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
||||
|
||||
@@ -204,32 +204,34 @@ int sdmmc_setup_clock(sdmmc_t *sdmmc, u32 type)
|
||||
case 1:
|
||||
case 5:
|
||||
case 6:
|
||||
sdmmc->regs->hostctl &= 0xFB;
|
||||
sdmmc->regs->hostctl2 &= 0xFFF7;
|
||||
sdmmc->regs->hostctl &= 0xFB; //Should this be 0xFFFB (~4) ?
|
||||
sdmmc->regs->hostctl2 &= SDHCI_CTRL_VDD_330;
|
||||
break;
|
||||
case 2:
|
||||
case 7:
|
||||
sdmmc->regs->hostctl |= 4;
|
||||
sdmmc->regs->hostctl2 &= 0xFFF7;
|
||||
sdmmc->regs->hostctl |= 4;
|
||||
sdmmc->regs->hostctl2 &= SDHCI_CTRL_VDD_330;
|
||||
break;
|
||||
case 3:
|
||||
case 11:
|
||||
case 13:
|
||||
case 14:
|
||||
sdmmc->regs->hostctl2 = (sdmmc->regs->hostctl2 & 0xFFF8) | 3;
|
||||
sdmmc->regs->hostctl2 |= 8;
|
||||
sdmmc->regs->hostctl2 = (sdmmc->regs->hostctl2 & SDHCI_CTRL_UHS_MASK) | UHS_SDR104_BUS_SPEED;
|
||||
sdmmc->regs->hostctl2 |= SDHCI_CTRL_VDD_180;
|
||||
break;
|
||||
case 4:
|
||||
sdmmc->regs->hostctl2 = (sdmmc->regs->hostctl2 & 0xFFF8) | 5;
|
||||
sdmmc->regs->hostctl2 |= 8;
|
||||
//Non standard
|
||||
sdmmc->regs->hostctl2 = (sdmmc->regs->hostctl2 & SDHCI_CTRL_UHS_MASK) | HS400_BUS_SPEED;
|
||||
sdmmc->regs->hostctl2 |= SDHCI_CTRL_VDD_180;
|
||||
break;
|
||||
case 8:
|
||||
sdmmc->regs->hostctl2 = sdmmc->regs->hostctl2 & 0xFFF8;
|
||||
sdmmc->regs->hostctl2 |= 8;
|
||||
sdmmc->regs->hostctl2 = (sdmmc->regs->hostctl2 & SDHCI_CTRL_UHS_MASK) | UHS_SDR12_BUS_SPEED;
|
||||
sdmmc->regs->hostctl2 |= SDHCI_CTRL_VDD_180;
|
||||
break;
|
||||
case 10:
|
||||
sdmmc->regs->hostctl2 = (sdmmc->regs->hostctl2 & 0xFFF8) | 2;
|
||||
sdmmc->regs->hostctl2 |= 8;
|
||||
//T210 Errata for SDR50, the host must be set to SDR104.
|
||||
sdmmc->regs->hostctl2 = (sdmmc->regs->hostctl2 & SDHCI_CTRL_UHS_MASK) | UHS_SDR104_BUS_SPEED;
|
||||
sdmmc->regs->hostctl2 |= SDHCI_CTRL_VDD_180;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -551,16 +553,16 @@ int sdmmc_config_tuning(sdmmc_t *sdmmc, u32 type, u32 cmd)
|
||||
sdmmc->regs->field_1C0 = (sdmmc->regs->field_1C0 & 0xFFFF1FFF) | flag;
|
||||
sdmmc->regs->field_1C0 = (sdmmc->regs->field_1C0 & 0xFFFFE03F) | 0x40;
|
||||
sdmmc->regs->field_1C0 |= 0x20000;
|
||||
sdmmc->regs->hostctl2 |= 0x40;
|
||||
sdmmc->regs->hostctl2 |= SDHCI_CTRL_EXEC_TUNING;
|
||||
|
||||
for (u32 i = 0; i < max; i++)
|
||||
{
|
||||
_sdmmc_config_tuning_once(sdmmc, cmd);
|
||||
if (!(sdmmc->regs->hostctl2 & 0x40))
|
||||
if (!(sdmmc->regs->hostctl2 & SDHCI_CTRL_EXEC_TUNING))
|
||||
break;
|
||||
}
|
||||
|
||||
if (sdmmc->regs->hostctl2 & 0x80)
|
||||
if (sdmmc->regs->hostctl2 & SDHCI_CTRL_TUNED_CLK)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -577,14 +579,14 @@ static int _sdmmc_enable_internal_clock(sdmmc_t *sdmmc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
sdmmc->regs->hostctl2 &= 0x7FFF;
|
||||
sdmmc->regs->clkcon &= ~TEGRA_MMC_CLKCON_CLKGEN_SELECT;
|
||||
sdmmc->regs->hostctl2 |= 0x1000;
|
||||
sdmmc->regs->hostctl2 &= ~SDHCI_CTRL_PRESET_VAL_EN;
|
||||
sdmmc->regs->clkcon &= ~TEGRA_MMC_CLKCON_CLKGEN_SELECT;
|
||||
sdmmc->regs->hostctl2 |= SDHCI_HOST_VERSION_4_EN;
|
||||
|
||||
if (!(sdmmc->regs->capareg & 0x10000000))
|
||||
return 0;
|
||||
|
||||
sdmmc->regs->hostctl2 |= 0x2000;
|
||||
sdmmc->regs->hostctl2 |= SDHCI_ADDRESSING_64BIT_EN;
|
||||
sdmmc->regs->hostctl &= 0xE7;
|
||||
sdmmc->regs->timeoutcon = (sdmmc->regs->timeoutcon & 0xF0) | 0xE;
|
||||
|
||||
@@ -1076,7 +1078,7 @@ int sdmmc_enable_low_voltage(sdmmc_t *sdmmc)
|
||||
_sdmmc_get_clkcon(sdmmc);
|
||||
sleep(5000);
|
||||
|
||||
if (sdmmc->regs->hostctl2 & 8)
|
||||
if (sdmmc->regs->hostctl2 & SDHCI_CTRL_VDD_180)
|
||||
{
|
||||
sdmmc->regs->clkcon |= TEGRA_MMC_CLKCON_SD_CLOCK_ENABLE;
|
||||
_sdmmc_get_clkcon(sdmmc);
|
||||
|
||||
@@ -45,9 +45,28 @@
|
||||
#define SDMMC_RSP_TYPE_5 5
|
||||
|
||||
/*! SDMMC mask interrupt status. */
|
||||
#define SDMMC_MASKINT_MASKED 0
|
||||
#define SDMMC_MASKINT_MASKED 0
|
||||
#define SDMMC_MASKINT_NOERROR -1
|
||||
#define SDMMC_MASKINT_ERROR -2
|
||||
#define SDMMC_MASKINT_ERROR -2
|
||||
|
||||
/*! SDMMC host control 2 */
|
||||
#define SDHCI_CTRL_UHS_MASK 0xFFF8
|
||||
#define SDHCI_CTRL_VDD_330 0xFFF7
|
||||
#define SDHCI_CTRL_VDD_180 8
|
||||
#define SDHCI_CTRL_EXEC_TUNING 0x40
|
||||
#define SDHCI_CTRL_TUNED_CLK 0x80
|
||||
#define SDHCI_HOST_VERSION_4_EN 0x1000
|
||||
#define SDHCI_ADDRESSING_64BIT_EN 0x2000
|
||||
#define SDHCI_CTRL_PRESET_VAL_EN 0x8000
|
||||
|
||||
/*! SD bus speeds. */
|
||||
#define UHS_SDR12_BUS_SPEED 0
|
||||
#define HIGH_SPEED_BUS_SPEED 1
|
||||
#define UHS_SDR25_BUS_SPEED 1
|
||||
#define UHS_SDR50_BUS_SPEED 2
|
||||
#define UHS_SDR104_BUS_SPEED 3
|
||||
#define UHS_DDR50_BUS_SPEED 4
|
||||
#define HS400_BUS_SPEED 5
|
||||
|
||||
/*! Helper for SWITCH command argument. */
|
||||
#define SDMMC_SWITCH(mode, index, value) (((mode) << 24) | ((index) << 16) | ((value) << 8))
|
||||
|
||||
@@ -262,7 +262,7 @@ struct sdram_params {
|
||||
/* Specifies the value for EMC_PUTERM_WIDTH */
|
||||
u32 EmcPutermWidth;
|
||||
/* Specifies the value for EMC_PUTERM_ADJ */
|
||||
u32 EmcPutermAdj;
|
||||
////u32 EmcPutermAdj;
|
||||
|
||||
/* Specifies the value for EMC_QRST */
|
||||
u32 EmcQRst;
|
||||
@@ -647,7 +647,7 @@ struct sdram_params {
|
||||
u32 EmcAcpdControl;
|
||||
|
||||
/* Specifies the value for EMC_SWIZZLE_RANK0_BYTE_CFG */
|
||||
u32 EmcSwizzleRank0ByteCfg;
|
||||
////u32 EmcSwizzleRank0ByteCfg;
|
||||
/* Specifies the value for EMC_SWIZZLE_RANK0_BYTE0 */
|
||||
u32 EmcSwizzleRank0Byte0;
|
||||
/* Specifies the value for EMC_SWIZZLE_RANK0_BYTE1 */
|
||||
@@ -657,7 +657,7 @@ struct sdram_params {
|
||||
/* Specifies the value for EMC_SWIZZLE_RANK0_BYTE3 */
|
||||
u32 EmcSwizzleRank0Byte3;
|
||||
/* Specifies the value for EMC_SWIZZLE_RANK1_BYTE_CFG */
|
||||
u32 EmcSwizzleRank1ByteCfg;
|
||||
////u32 EmcSwizzleRank1ByteCfg;
|
||||
/* Specifies the value for EMC_SWIZZLE_RANK1_BYTE0 */
|
||||
u32 EmcSwizzleRank1Byte0;
|
||||
/* Specifies the value for EMC_SWIZZLE_RANK1_BYTE1 */
|
||||
|
||||
67
ipl/tui.c
67
ipl/tui.c
@@ -17,7 +17,9 @@
|
||||
#include "tui.h"
|
||||
#include "btn.h"
|
||||
|
||||
void tui_pbar(gfx_con_t *con, int x, int y, u32 val)
|
||||
extern u8 *Kc_HEKATE_LOGO;
|
||||
|
||||
void tui_pbar(gfx_con_t *con, int x, int y, u32 val, u32 fgcol, u32 bgcol)
|
||||
{
|
||||
u32 cx, cy;
|
||||
|
||||
@@ -25,14 +27,14 @@ void tui_pbar(gfx_con_t *con, int x, int y, u32 val)
|
||||
|
||||
gfx_con_setpos(con, x, y);
|
||||
|
||||
gfx_printf(con, "[%3d%%]", val);
|
||||
gfx_printf(con, "%k[%3d%%]%k", fgcol, val, 0xFFCCCCCC);
|
||||
|
||||
x += 7 * 8;
|
||||
x += 7 * con->fntsz;
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
for (int i = 0; i < con->fontmult * 6; i++)
|
||||
{
|
||||
gfx_line(con->gfx_ctxt, x, y + i + 1, x + 3 * val, y + i + 1, 0xFFFFFFFF);
|
||||
gfx_line(con->gfx_ctxt, x + 3 * val, y + i + 1, x + 3 * 100, y + i + 1, 0xFF888888);
|
||||
gfx_line(con->gfx_ctxt, x, y + i + 1, x + 3 * val, y + i + 1, fgcol);
|
||||
gfx_line(con->gfx_ctxt, x + 3 * val, y + i + 1, x + 3 * 100, y + i + 1, bgcol);
|
||||
}
|
||||
|
||||
gfx_con_setpos(con, cx, cy);
|
||||
@@ -41,29 +43,58 @@ void tui_pbar(gfx_con_t *con, int x, int y, u32 val)
|
||||
void *tui_do_menu(gfx_con_t *con, menu_t *menu)
|
||||
{
|
||||
int idx = 0, cnt;
|
||||
int prev_idx = 0;
|
||||
|
||||
gfx_clear(con->gfx_ctxt, 0xFF000000);
|
||||
gfx_clear(con->gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_set_logo(con->gfx_ctxt, Kc_HEKATE_LOGO);
|
||||
|
||||
while (1)
|
||||
{
|
||||
gfx_con_setcol(con, 0xFFFFFFFF, 1, 0xFF000000);
|
||||
gfx_con_setcol(con, 0xFFCCCCCC, 1, 0xFF1B1B1B);
|
||||
gfx_con_setpos(con, menu->x, menu->y);
|
||||
gfx_printf(con, "[%s]\n\n", menu->caption);
|
||||
|
||||
// Skip caption or seperator lines selection
|
||||
while (menu->ents[idx].type == MENT_CAPTION ||
|
||||
menu->ents[idx].type == MENT_CHGLINE)
|
||||
{
|
||||
if (prev_idx <= idx || (!idx && prev_idx == cnt - 1))
|
||||
{
|
||||
idx++;
|
||||
if (idx > (cnt - 1))
|
||||
{
|
||||
idx = 0;
|
||||
prev_idx = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
idx--;
|
||||
if (idx < 0)
|
||||
{
|
||||
idx = cnt - 1;
|
||||
prev_idx = cnt;
|
||||
}
|
||||
}
|
||||
}
|
||||
prev_idx = idx;
|
||||
|
||||
// Draw the menu
|
||||
for (cnt = 0; menu->ents[cnt].type != MENT_END; cnt++)
|
||||
{
|
||||
if (cnt == idx)
|
||||
gfx_con_setcol(con, 0xFF000000, 1, 0xFFCCCCCC);
|
||||
gfx_con_setcol(con, 0xFF1B1B1B, 1, 0xFFCCCCCC);
|
||||
else
|
||||
gfx_con_setcol(con, 0xFFFFFFFF, 1, 0xFF000000);
|
||||
con->x += 8;
|
||||
gfx_printf(con, "%s", menu->ents[cnt].caption);
|
||||
gfx_con_setcol(con, 0xFFCCCCCC, 1, 0xFF1B1B1B);
|
||||
if (cnt != idx && menu->ents[cnt].type == MENT_CAPTION)
|
||||
gfx_printf(con, "%k %s", menu->ents[cnt].color, menu->ents[cnt].caption);
|
||||
else
|
||||
gfx_printf(con, " %s", menu->ents[cnt].caption);
|
||||
if(menu->ents[cnt].type == MENT_MENU)
|
||||
gfx_printf(con, "%k...", 0xFFEE9900);
|
||||
gfx_putc(con, '\n');
|
||||
gfx_printf(con, " \n");
|
||||
}
|
||||
|
||||
gfx_con_setcol(con, 0xFFFFFFFF, 1, 0xFF000000);
|
||||
gfx_con_setcol(con, 0xFFCCCCCC, 1, 0xFF1B1B1B);
|
||||
gfx_putc(con, '\n');
|
||||
|
||||
u32 btn = btn_wait();
|
||||
@@ -93,8 +124,12 @@ void *tui_do_menu(gfx_con_t *con, menu_t *menu)
|
||||
case MENT_BACK:
|
||||
return NULL;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gfx_clear(con->gfx_ctxt, 0xFF000000);
|
||||
gfx_con_setfontsz(con, 16);
|
||||
gfx_clear(con->gfx_ctxt, 0xFF1B1B1B);
|
||||
gfx_set_logo(con->gfx_ctxt, Kc_HEKATE_LOGO);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
21
ipl/tui.h
21
ipl/tui.h
@@ -20,16 +20,19 @@
|
||||
#include "types.h"
|
||||
#include "gfx.h"
|
||||
|
||||
#define MENT_END 0
|
||||
#define MENT_END 0
|
||||
#define MENT_HANDLER 1
|
||||
#define MENT_MENU 2
|
||||
#define MENT_CHOICE 3
|
||||
#define MENT_BACK 4
|
||||
#define MENT_MENU 2
|
||||
#define MENT_CHOICE 3
|
||||
#define MENT_BACK 4
|
||||
#define MENT_CAPTION 5
|
||||
#define MENT_CHGLINE 6
|
||||
|
||||
typedef struct _ment_t
|
||||
{
|
||||
u32 type;
|
||||
const char *caption;
|
||||
u32 color;
|
||||
void *data;
|
||||
union
|
||||
{
|
||||
@@ -47,12 +50,14 @@ typedef struct _menu_t
|
||||
} menu_t;
|
||||
|
||||
#define MDEF_END() {MENT_END}
|
||||
#define MDEF_HANDLER(caption, _handler) { MENT_HANDLER, caption, NULL, { .handler = _handler } }
|
||||
#define MDEF_HANDLER_EX(caption, data, _handler) { MENT_HANDLER, caption, data, { .handler = _handler } }
|
||||
#define MDEF_MENU(caption, _menu) { MENT_MENU, caption, NULL, { .menu = _menu } }
|
||||
#define MDEF_HANDLER(caption, _handler) { MENT_HANDLER, caption, 0, NULL, { .handler = _handler } }
|
||||
#define MDEF_HANDLER_EX(caption, data, _handler) { MENT_HANDLER, caption, 0, data, { .handler = _handler } }
|
||||
#define MDEF_MENU(caption, _menu) { MENT_MENU, caption, 0, NULL, { .menu = _menu } }
|
||||
#define MDEF_BACK() { MENT_BACK, "Back" }
|
||||
#define MDEF_CAPTION(caption, color) { MENT_CAPTION, caption, color }
|
||||
#define MDEF_CHGLINE() {MENT_CHGLINE}
|
||||
|
||||
void tui_pbar(gfx_con_t *con, int x, int y, u32 val);
|
||||
void tui_pbar(gfx_con_t *con, int x, int y, u32 val, u32 fgcol, u32 bgcol);
|
||||
void *tui_do_menu(gfx_con_t *con, menu_t *menu);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user