From ad0c2142bcc78a8949224038cb013c57d8e54bbd Mon Sep 17 00:00:00 2001 From: YuzukiTsuru Date: Sun, 4 Feb 2024 21:32:25 +0800 Subject: [PATCH] [board] update longanpi 4b --- board/longanpi-4b/README.md | 31 +- board/longanpi-4b/board.c | 74 ++++- board/longanpi-4b/init_dram/main.c | 35 ++- board/longanpi-4b/payloads/init_dram_bin.c | 294 +++++++++--------- board/longanpi-4b/start.S | 92 +++--- board/longanpi-4b/syter_boot/bl31/bl31.bin | Bin 0 -> 78769 bytes .../syter_boot/bl33/syter_bl33.bin | Bin 0 -> 9500 bytes board/longanpi-4b/syter_boot/main.c | 292 +++++++++-------- 8 files changed, 473 insertions(+), 345 deletions(-) create mode 100644 board/longanpi-4b/syter_boot/bl31/bl31.bin create mode 100755 board/longanpi-4b/syter_boot/bl33/syter_bl33.bin diff --git a/board/longanpi-4b/README.md b/board/longanpi-4b/README.md index fc121158..53c8e531 100644 --- a/board/longanpi-4b/README.md +++ b/board/longanpi-4b/README.md @@ -1,29 +1,22 @@ -# SyterKit Common +# MYC-LT527核心板及开发板 -## start.S +![image](https://github.com/YuzukiHD/SyterKit/assets/12003087/823c85ba-3f7a-4e8d-82ec-4c875b6e28a4) -This code snippet is an ARM assembly language program that includes initialization settings and exception handlers. Here's a breakdown of its functionalities: +Myir debuts the whole T527, octa-core A55 enabled edge computing +Full digital T527 processor, octa-core A55, efficient edge computing; -1. Initialization Settings: It sets registers and writes specific values to configure the processor's working mode, interrupt enable, etc. +Powerful multimedia functions: G57 GPU, 4K codec VPU, HiFi4 DSP, support 4~6 cameras; -2. Set Vector Table: It writes the address of the vector table to the Vector Base Address Register, which is used for handling exceptions and interrupts. +Support a variety of display interfaces: HDMI, DP, LVDS, MIPI-DSI and RGB parallel port, support 4K+1080P dual display; -3. Enable NEON/VFP Unit: It configures the processor to enable the NEON (Advanced SIMD) and VFP (Floating-Point) units. +Rich communication interface: 2*GE, 2*CAN, PCIE/USB3.0, 2*USB2.0, 10*UART, 30*PWM, 4*SPI, 9*I2C, etc. -4. Clear BSS Section: It zeroes out variables in the BSS section. +T527 is the real industrial grade -40℃~+85℃; -5. Disable Interrupts: It disables FIQ and IRQ interrupts and switches the processor to SVC32 mode. +Ultra-compact LGA 381pin package. -6. Set Timer Frequency: It sets the timer frequency to 24M. +Applications: high-performance industrial robots, display and control machines, vehicle terminals, edge smart boxes -7. Call the main Function: It jumps to the main function to execute the main logic. +## T527 Brief -## eabi_compat.c - -This code snippet appears to be providing implementations for the functions `abort`, `raise`, and `__aeabi_unwind_cpp_pr0`. Here's a breakdown of their functionalities: - -1. `void abort(void)`: This function creates an infinite loop, causing the program to hang indefinitely. It is typically used to indicate a critical error or unrecoverable condition in a program. - -2. `int raise(int signum)`: This function is a placeholder and always returns 0. In standard C, this function is used to raise a signal and initiate the corresponding signal handler. However, in this implementation, it does nothing and simply returns 0. - -3. `void __aeabi_unwind_cpp_pr0(void)`: This is a dummy function that serves as a placeholder to avoid linker complaints. Its purpose is to satisfy the linker when using C++ exceptions and unwinding, but it does not contain any actual functionality. +![image](https://github.com/YuzukiHD/SyterKit/assets/12003087/131a2982-c605-46f6-91cf-57d117b9a614) diff --git a/board/longanpi-4b/board.c b/board/longanpi-4b/board.c index fc83640d..dc470258 100644 --- a/board/longanpi-4b/board.c +++ b/board/longanpi-4b/board.c @@ -44,7 +44,7 @@ sdhci_t sdhci0 = { .reg = (sdhci_reg_t *) SUNXI_SMHC0_BASE, .voltage = MMC_VDD_27_36, .width = MMC_BUS_WIDTH_4, - .clock = MMC_CLK_50M, + .clock = MMC_CLK_100M, .removable = 0, .isspi = FALSE, .gpio_clk = {GPIO_PIN(GPIO_PORTF, 2), GPIO_PERIPH_MUX2}, @@ -122,4 +122,76 @@ void set_rpio_power_mode(void) { } else { printk(LOG_LEVEL_DEBUG, "PL gpio voltage : 3.3V \n"); } +} + +int sunxi_nsi_init(void) { + /* IOMMU prio 3 */ + writel(0x1, 0x02021418); + writel(0xf, 0x02021414); + /* DE prio 2 */ + writel(0x1, 0x02021a18); + writel(0xa, 0x02021a14); + /* VE R prio 2 */ + writel(0x1, 0x02021618); + writel(0xa, 0x02021614); + /* VE RW prio 2 */ + writel(0x1, 0x02021818); + writel(0xa, 0x02021814); + /* ISP prio 2 */ + writel(0x1, 0x02020c18); + writel(0xa, 0x02020c14); + /* CSI prio 2 */ + writel(0x1, 0x02021c18); + writel(0xa, 0x02021c14); + /* NPU prio 2 */ + writel(0x1, 0x02020a18); + writel(0xa, 0x02020a14); + + /* close ra0 autogating */ + writel(0x0, 0x02023c00); + /* close ta autogating */ + writel(0x0, 0x02023e00); + /* close pcie autogating */ + writel(0x0, 0x02020600); + return 0; +} + +void enable_sram_a3() { + uint32_t reg_val; + + /* De-assert PUBSRAM Clock and Gating */ + reg_val = readl(RISCV_PUBSRAM_CFG_REG); + reg_val |= RISCV_PUBSRAM_RST; + reg_val |= RISCV_PUBSRAM_GATING; + writel(reg_val, RISCV_PUBSRAM_CFG_REG); + + /* assert */ + writel(0, RISCV_CFG_BGR_REG); +} + +void show_chip() { + uint32_t chip_sid[4]; + chip_sid[0] = read32(SUNXI_SID_SRAM_BASE + 0x0); + chip_sid[1] = read32(SUNXI_SID_SRAM_BASE + 0x4); + chip_sid[2] = read32(SUNXI_SID_SRAM_BASE + 0x8); + chip_sid[3] = read32(SUNXI_SID_SRAM_BASE + 0xc); + + printk(LOG_LEVEL_INFO, "Chip SID = %08x%08x%08x%08x\n", chip_sid[0], chip_sid[1], chip_sid[2], chip_sid[3]); + + uint32_t chip_markid_sid = chip_sid[0] & 0xffff; + + switch (chip_markid_sid) { + case 0x5f30: + printk(LOG_LEVEL_INFO, "Chip type = T527M00X0DCH"); + break; + case 0x5500: + printk(LOG_LEVEL_INFO, "Chip type = MR527M02X0D00"); + break; + default: + printk(LOG_LEVEL_INFO, "Chip type = UNKNOW"); + break; + } + + uint32_t version = read32(SUNXI_SYSCTRL_BASE + 0x24) & 0x7; + printk(LOG_LEVEL_MUTE, "\tChip Version = %x \n", version); } \ No newline at end of file diff --git a/board/longanpi-4b/init_dram/main.c b/board/longanpi-4b/init_dram/main.c index c1c39a7a..f7c56e6f 100644 --- a/board/longanpi-4b/init_dram/main.c +++ b/board/longanpi-4b/init_dram/main.c @@ -2,8 +2,8 @@ #include #include -#include #include +#include #include @@ -20,11 +20,44 @@ extern sunxi_i2c_t i2c_pmu; extern void set_rpio_power_mode(void); extern void rtc_set_vccio_det_spare(void); +static void set_axp323_pmu_fin_voltage(char* power_name, uint32_t voltage){ + int set_vol = voltage; + int temp_vol, src_vol = pmu_axp1530_get_vol(&i2c_pmu, power_name); + if (src_vol > voltage) { + for (temp_vol = src_vol; temp_vol >= voltage; temp_vol -= 50) { + pmu_axp1530_set_vol(&i2c_pmu, power_name, temp_vol, 1); + } + } else if (src_vol < voltage) { + for (temp_vol = src_vol; temp_vol <= voltage; temp_vol += 50) { + pmu_axp1530_set_vol(&i2c_pmu, power_name, temp_vol, 1); + } + } + mdelay(30); /* Delay 300ms for pmu bootup */ +} + +static void set_axp717_pmu_fin_voltage(char* power_name, uint32_t voltage){ + int set_vol = voltage; + int temp_vol, src_vol = pmu_axp2202_get_vol(&i2c_pmu, power_name); + if (src_vol > voltage) { + for (temp_vol = src_vol; temp_vol >= voltage; temp_vol -= 50) { + pmu_axp2202_set_vol(&i2c_pmu, power_name, temp_vol, 1); + } + } else if (src_vol < voltage) { + for (temp_vol = src_vol; temp_vol <= voltage; temp_vol += 50) { + pmu_axp2202_set_vol(&i2c_pmu, power_name, temp_vol, 1); + } + } + mdelay(30); /* Delay 300ms for pmu bootup */ +} + int main(void) { sunxi_serial_init(&uart_dbg); show_banner(); + printk(LOG_LEVEL_INFO, "Board: Myir Tech LT527X-E, Chip: Allwinner T527\n"); + printk(LOG_LEVEL_INFO, "SoC: Arm Octa-Core Cortex-A55 v65 r2p0\n"); + sunxi_clk_init(); sunxi_clk_dump(); diff --git a/board/longanpi-4b/payloads/init_dram_bin.c b/board/longanpi-4b/payloads/init_dram_bin.c index b84c0360..fd994a43 100644 --- a/board/longanpi-4b/payloads/init_dram_bin.c +++ b/board/longanpi-4b/payloads/init_dram_bin.c @@ -1,9 +1,9 @@ -const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[31322] = { +const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[31354] = { 0xFF, 0xFF, 0xFF, 0xEA, 0x00, 0x40, 0x2D, 0xE9, 0x05, 0x00, 0x00, 0xEB, 0x10, 0x0F, 0x11, 0xEE, 0x01, 0x0A, 0x80, 0xE3, 0x10, 0x0F, 0x01, 0xEE, 0x18, 0x01, 0x00, 0xEB, 0x00, 0x40, 0xBD, 0xE8, 0x0E, 0xF0, 0xA0, 0xE1, 0x18, 0x00, 0x9F, 0xE5, 0x18, 0x10, 0x9F, 0xE5, 0x00, 0x20, 0xA0, 0xE3, 0x00, 0x20, 0x80, 0xE5, 0x04, 0x00, 0x80, 0xE2, 0x01, 0x00, 0x50, 0xE1, 0xFB, 0xFF, 0xFF, 0x1A, - 0x0E, 0xF0, 0xA0, 0xE1, 0x5C, 0x3A, 0x05, 0x00, 0x64, 0x3A, 0x05, 0x00, 0x01, 0x00, 0x50, 0xE1, + 0x0E, 0xF0, 0xA0, 0xE1, 0x7C, 0x7A, 0x28, 0x07, 0x84, 0x7A, 0x28, 0x07, 0x01, 0x00, 0x50, 0xE1, 0x0E, 0xF0, 0xA0, 0x01, 0x11, 0x40, 0x2D, 0xE9, 0x04, 0x20, 0x52, 0xE2, 0x29, 0x00, 0x00, 0xBA, 0x03, 0xC0, 0x10, 0xE2, 0x30, 0x00, 0x00, 0x1A, 0x03, 0xC0, 0x11, 0xE2, 0x3A, 0x00, 0x00, 0x1A, 0x1C, 0x20, 0x52, 0xE2, 0xE0, 0x01, 0x2D, 0xE9, 0x0A, 0x00, 0x00, 0xBA, 0x1F, 0xC0, 0x10, 0xE2, @@ -71,40 +71,42 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x01, 0x10, 0xCC, 0xE4, 0x03, 0x20, 0x82, 0xE0, 0xCB, 0xFF, 0xFF, 0xEA, 0x18, 0x30, 0x9F, 0xE5, 0x08, 0x01, 0x83, 0xE5, 0x4F, 0xF0, 0x7F, 0xF5, 0x6F, 0xF0, 0x7F, 0xF5, 0x08, 0x21, 0x93, 0xE5, 0x02, 0x00, 0x50, 0xE1, 0xF9, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0x09, 0x07, - 0x10, 0x40, 0x2D, 0xE9, 0x80, 0x20, 0xA0, 0xE3, 0x3C, 0x10, 0x9F, 0xE5, 0x80, 0xD0, 0x4D, 0xE2, - 0x0D, 0x00, 0xA0, 0xE1, 0x5D, 0x00, 0x00, 0xEB, 0x0D, 0x10, 0xA0, 0xE1, 0x00, 0x00, 0xA0, 0xE3, - 0x9D, 0x16, 0x00, 0xFA, 0x00, 0x10, 0xA0, 0xE1, 0x00, 0x40, 0xA0, 0xE1, 0x1C, 0x00, 0x9F, 0xE5, - 0x39, 0x00, 0x00, 0xEB, 0x0A, 0x00, 0xA0, 0xE3, 0x6B, 0x00, 0x00, 0xEB, 0x04, 0x00, 0xA0, 0xE1, - 0xE5, 0xFF, 0xFF, 0xEB, 0x80, 0xD0, 0x8D, 0xE2, 0x10, 0x80, 0xBD, 0xE8, 0x78, 0x32, 0x05, 0x00, - 0xB4, 0x33, 0x05, 0x00, 0x00, 0x10, 0xA0, 0xE1, 0x10, 0x40, 0x2D, 0xE9, 0x08, 0x00, 0x9F, 0xE5, - 0x2D, 0x00, 0x00, 0xEB, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0x80, 0xBD, 0xE8, 0xD5, 0x33, 0x05, 0x00, - 0x00, 0x10, 0xA0, 0xE1, 0x10, 0x40, 0x2D, 0xE9, 0x08, 0x00, 0x9F, 0xE5, 0x26, 0x00, 0x00, 0xEB, - 0x00, 0x00, 0xA0, 0xE3, 0x10, 0x80, 0xBD, 0xE8, 0xEF, 0x33, 0x05, 0x00, 0x0C, 0x30, 0x9F, 0xE5, - 0x08, 0x21, 0x93, 0xE5, 0x08, 0x30, 0x9F, 0xE5, 0x00, 0x20, 0x83, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, - 0x00, 0x00, 0x09, 0x07, 0x5C, 0x3A, 0x05, 0x00, 0x25, 0x36, 0xA0, 0xE3, 0x14, 0x20, 0x93, 0xE5, - 0x40, 0x00, 0x12, 0xE3, 0xFC, 0xFF, 0xFF, 0x0A, 0x00, 0x00, 0x83, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, - 0x0A, 0x00, 0x51, 0xE3, 0x01, 0x00, 0xA0, 0x11, 0x04, 0x00, 0x00, 0x1A, 0x10, 0x40, 0x2D, 0xE9, - 0x0D, 0x00, 0xA0, 0xE3, 0xF3, 0xFF, 0xFF, 0xEB, 0x10, 0x40, 0xBD, 0xE8, 0x01, 0x00, 0xA0, 0xE1, - 0xF0, 0xFF, 0xFF, 0xEA, 0x0F, 0x00, 0x2D, 0xE9, 0x07, 0x40, 0x2D, 0xE9, 0x00, 0x10, 0xA0, 0xE3, - 0x10, 0x20, 0x9D, 0xE5, 0x14, 0x30, 0x8D, 0xE2, 0x18, 0x00, 0x9F, 0xE5, 0x00, 0x30, 0x8D, 0xE5, - 0x04, 0x30, 0x8D, 0xE5, 0x6D, 0x00, 0x00, 0xEB, 0x0C, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, - 0x10, 0xD0, 0x8D, 0xE2, 0x1E, 0xFF, 0x2F, 0xE1, 0x40, 0xC5, 0x04, 0x00, 0x0F, 0x00, 0x2D, 0xE9, - 0x07, 0x40, 0x2D, 0xE9, 0x2A, 0x00, 0x00, 0xEB, 0x44, 0x30, 0x9F, 0xE5, 0x00, 0x20, 0x93, 0xE5, - 0x02, 0x00, 0x40, 0xE0, 0xFA, 0x2F, 0xA0, 0xE3, 0x10, 0xF2, 0x31, 0xE7, 0x92, 0x01, 0x62, 0xE0, - 0x30, 0x00, 0x9F, 0xE5, 0xE6, 0xFF, 0xFF, 0xEB, 0x14, 0x30, 0x8D, 0xE2, 0x10, 0x20, 0x9D, 0xE5, - 0x00, 0x10, 0xA0, 0xE3, 0x20, 0x00, 0x9F, 0xE5, 0x00, 0x30, 0x8D, 0xE5, 0x04, 0x30, 0x8D, 0xE5, - 0x56, 0x00, 0x00, 0xEB, 0x0C, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x10, 0xD0, 0x8D, 0xE2, - 0x1E, 0xFF, 0x2F, 0xE1, 0x5C, 0x3A, 0x05, 0x00, 0x11, 0x34, 0x05, 0x00, 0x40, 0xC5, 0x04, 0x00, - 0x04, 0x30, 0x9F, 0xE5, 0x13, 0xFF, 0x2F, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0x80, 0xC3, 0x04, 0x00, - 0x04, 0x30, 0x9F, 0xE5, 0x13, 0xFF, 0x2F, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0x4C, 0xC0, 0x04, 0x00, - 0x00, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1, 0x0E, 0x3F, 0x52, 0xEC, 0x18, 0x10, 0xA0, 0xE3, - 0x91, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x93, 0xE0, 0x00, 0x30, 0xA2, 0xE2, 0x0E, 0x1F, 0x52, 0xEC, - 0x01, 0x00, 0x50, 0xE1, 0x02, 0x20, 0xD3, 0xE0, 0xFB, 0xFF, 0xFF, 0x2A, 0x1E, 0xFF, 0x2F, 0xE1, - 0xF4, 0xFF, 0xFF, 0xEA, 0x10, 0x40, 0x2D, 0xE9, 0x0E, 0x0F, 0x51, 0xEC, 0xC0, 0x2D, 0x05, 0xE3, - 0x00, 0x30, 0xA0, 0xE3, 0x89, 0x1A, 0x00, 0xEB, 0x10, 0x80, 0xBD, 0xE8, 0x70, 0x40, 0x2D, 0xE9, - 0x00, 0x40, 0xA0, 0xE1, 0xFA, 0x0F, 0xA0, 0xE3, 0x90, 0x04, 0x00, 0xE0, 0xE9, 0xFF, 0xFF, 0xEB, - 0xF3, 0xFF, 0xFF, 0xEB, 0x00, 0x50, 0xA0, 0xE1, 0xF1, 0xFF, 0xFF, 0xEB, 0x05, 0x30, 0x40, 0xE0, - 0x04, 0x00, 0x53, 0xE1, 0xFB, 0xFF, 0xFF, 0x3A, 0x70, 0x80, 0xBD, 0xE8, 0x98, 0xC0, 0x9F, 0xE5, + 0x10, 0x40, 0x2D, 0xE9, 0x80, 0xD0, 0x4D, 0xE2, 0x20, 0x00, 0x00, 0xEB, 0x80, 0x20, 0xA0, 0xE3, + 0x38, 0x10, 0x9F, 0xE5, 0x0D, 0x00, 0xA0, 0xE1, 0x5E, 0x00, 0x00, 0xEB, 0x0D, 0x10, 0xA0, 0xE1, + 0x00, 0x00, 0xA0, 0xE3, 0xA4, 0x16, 0x00, 0xFA, 0x00, 0x10, 0xA0, 0xE1, 0x00, 0x40, 0xA0, 0xE1, + 0x1C, 0x00, 0x9F, 0xE5, 0x39, 0x00, 0x00, 0xEB, 0x0A, 0x00, 0xA0, 0xE3, 0x6C, 0x00, 0x00, 0xEB, + 0x04, 0x00, 0xA0, 0xE1, 0xE4, 0xFF, 0xFF, 0xEB, 0x80, 0xD0, 0x8D, 0xE2, 0x10, 0x80, 0xBD, 0xE8, + 0x98, 0x72, 0x28, 0x07, 0xD4, 0x73, 0x28, 0x07, 0x00, 0x10, 0xA0, 0xE1, 0x10, 0x40, 0x2D, 0xE9, + 0x08, 0x00, 0x9F, 0xE5, 0x2D, 0x00, 0x00, 0xEB, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0x80, 0xBD, 0xE8, + 0xF5, 0x73, 0x28, 0x07, 0x00, 0x10, 0xA0, 0xE1, 0x10, 0x40, 0x2D, 0xE9, 0x08, 0x00, 0x9F, 0xE5, + 0x26, 0x00, 0x00, 0xEB, 0x00, 0x00, 0xA0, 0xE3, 0x10, 0x80, 0xBD, 0xE8, 0x0F, 0x74, 0x28, 0x07, + 0x0C, 0x30, 0x9F, 0xE5, 0x08, 0x21, 0x93, 0xE5, 0x08, 0x30, 0x9F, 0xE5, 0x00, 0x20, 0x83, 0xE5, + 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x00, 0x09, 0x07, 0x7C, 0x7A, 0x28, 0x07, 0x25, 0x36, 0xA0, 0xE3, + 0x14, 0x20, 0x93, 0xE5, 0x40, 0x00, 0x12, 0xE3, 0xFC, 0xFF, 0xFF, 0x0A, 0x00, 0x00, 0x83, 0xE5, + 0x1E, 0xFF, 0x2F, 0xE1, 0x0A, 0x00, 0x51, 0xE3, 0x01, 0x00, 0xA0, 0x11, 0x04, 0x00, 0x00, 0x1A, + 0x10, 0x40, 0x2D, 0xE9, 0x0D, 0x00, 0xA0, 0xE3, 0xF3, 0xFF, 0xFF, 0xEB, 0x10, 0x40, 0xBD, 0xE8, + 0x01, 0x00, 0xA0, 0xE1, 0xF0, 0xFF, 0xFF, 0xEA, 0x0F, 0x00, 0x2D, 0xE9, 0x07, 0x40, 0x2D, 0xE9, + 0x00, 0x10, 0xA0, 0xE3, 0x10, 0x20, 0x9D, 0xE5, 0x14, 0x30, 0x8D, 0xE2, 0x18, 0x00, 0x9F, 0xE5, + 0x00, 0x30, 0x8D, 0xE5, 0x04, 0x30, 0x8D, 0xE5, 0x74, 0x00, 0x00, 0xEB, 0x0C, 0xD0, 0x8D, 0xE2, + 0x04, 0xE0, 0x9D, 0xE4, 0x10, 0xD0, 0x8D, 0xE2, 0x1E, 0xFF, 0x2F, 0xE1, 0x44, 0x05, 0x28, 0x07, + 0x0F, 0x00, 0x2D, 0xE9, 0x07, 0x40, 0x2D, 0xE9, 0x3D, 0x00, 0x00, 0xEB, 0x44, 0x30, 0x9F, 0xE5, + 0x00, 0x20, 0x93, 0xE5, 0x02, 0x00, 0x40, 0xE0, 0x3C, 0x20, 0x9F, 0xE5, 0x10, 0xF2, 0x31, 0xE7, + 0x92, 0x01, 0x62, 0xE0, 0x34, 0x00, 0x9F, 0xE5, 0xE6, 0xFF, 0xFF, 0xEB, 0x14, 0x30, 0x8D, 0xE2, + 0x10, 0x20, 0x9D, 0xE5, 0x00, 0x10, 0xA0, 0xE3, 0x24, 0x00, 0x9F, 0xE5, 0x00, 0x30, 0x8D, 0xE5, + 0x04, 0x30, 0x8D, 0xE5, 0x5D, 0x00, 0x00, 0xEB, 0x0C, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, + 0x10, 0xD0, 0x8D, 0xE2, 0x1E, 0xFF, 0x2F, 0xE1, 0x7C, 0x7A, 0x28, 0x07, 0x40, 0x42, 0x0F, 0x00, + 0x31, 0x74, 0x28, 0x07, 0x44, 0x05, 0x28, 0x07, 0x04, 0x30, 0x9F, 0xE5, 0x13, 0xFF, 0x2F, 0xE1, + 0x1E, 0xFF, 0x2F, 0xE1, 0x80, 0x03, 0x28, 0x07, 0x04, 0x30, 0x9F, 0xE5, 0x13, 0xFF, 0x2F, 0xE1, + 0x1E, 0xFF, 0x2F, 0xE1, 0x4C, 0x00, 0x28, 0x07, 0x00, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1, + 0x0E, 0x3F, 0x52, 0xEC, 0x18, 0x10, 0xA0, 0xE3, 0x91, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x93, 0xE0, + 0x00, 0x30, 0xA2, 0xE2, 0x0E, 0x1F, 0x52, 0xEC, 0x01, 0x00, 0x50, 0xE1, 0x02, 0x20, 0xD3, 0xE0, + 0xFB, 0xFF, 0xFF, 0x2A, 0x1E, 0xFF, 0x2F, 0xE1, 0xF4, 0xFF, 0xFF, 0xEA, 0x10, 0x40, 0x2D, 0xE9, + 0x0E, 0x0F, 0x51, 0xEC, 0xC0, 0x2D, 0x05, 0xE3, 0x00, 0x30, 0xA0, 0xE3, 0x8F, 0x1A, 0x00, 0xEB, + 0x10, 0x80, 0xBD, 0xE8, 0x70, 0x40, 0x2D, 0xE9, 0x00, 0x40, 0xA0, 0xE1, 0xFA, 0x0F, 0xA0, 0xE3, + 0x90, 0x04, 0x00, 0xE0, 0xE9, 0xFF, 0xFF, 0xEB, 0xF3, 0xFF, 0xFF, 0xEB, 0x00, 0x50, 0xA0, 0xE1, + 0xF1, 0xFF, 0xFF, 0xEB, 0x05, 0x30, 0x40, 0xE0, 0x04, 0x00, 0x53, 0xE1, 0xFB, 0xFF, 0xFF, 0x3A, + 0x70, 0x80, 0xBD, 0xE8, 0x10, 0x40, 0x2D, 0xE9, 0x0E, 0x0F, 0x51, 0xEC, 0x18, 0x20, 0xA0, 0xE3, + 0x00, 0x30, 0xA0, 0xE3, 0x7D, 0x1A, 0x00, 0xEB, 0x10, 0x80, 0xBD, 0xE8, 0x98, 0xC0, 0x9F, 0xE5, 0x0A, 0x10, 0xA0, 0xE3, 0x04, 0xE0, 0x2D, 0xE5, 0x20, 0x20, 0x90, 0xE5, 0x01, 0x30, 0x42, 0xE2, 0x00, 0x00, 0x52, 0xE3, 0x20, 0x30, 0x80, 0xE5, 0x00, 0x30, 0x90, 0xE5, 0x01, 0x00, 0x00, 0xCA, 0x00, 0x00, 0x53, 0xE3, 0x04, 0xF0, 0x9D, 0x04, 0x57, 0x20, 0xD0, 0xE5, 0x08, 0x00, 0x52, 0xE3, @@ -114,7 +116,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x07, 0x20, 0x03, 0xE2, 0xA3, 0x31, 0xA0, 0xE1, 0x00, 0x30, 0x80, 0xE5, 0x08, 0x30, 0x90, 0xE5, 0x02, 0x20, 0xDC, 0xE7, 0x01, 0xE0, 0x43, 0xE2, 0x08, 0xE0, 0x80, 0xE5, 0x00, 0x20, 0xC3, 0xE5, 0x1C, 0x30, 0x90, 0xE5, 0x01, 0x30, 0x83, 0xE2, 0x1C, 0x30, 0x80, 0xE5, 0xDD, 0xFF, 0xFF, 0xEA, - 0x0F, 0x20, 0x03, 0xE2, 0x23, 0x32, 0xA0, 0xE1, 0xF2, 0xFF, 0xFF, 0xEA, 0xF8, 0x32, 0x05, 0x00, + 0x0F, 0x20, 0x03, 0xE2, 0x23, 0x32, 0xA0, 0xE1, 0xF2, 0xFF, 0xFF, 0xEA, 0x18, 0x73, 0x28, 0x07, 0xF0, 0x4F, 0x2D, 0xE9, 0x00, 0x50, 0xA0, 0xE1, 0x01, 0x60, 0xA0, 0xE1, 0x6C, 0xD0, 0x4D, 0xE2, 0x01, 0xB0, 0x42, 0xE2, 0x03, 0x40, 0xA0, 0xE1, 0x00, 0x30, 0xA0, 0xE3, 0x30, 0x30, 0x8D, 0xE5, 0x61, 0x30, 0xCD, 0xE5, 0x01, 0x10, 0xFB, 0xE5, 0x00, 0x00, 0x51, 0xE3, 0x02, 0x00, 0x00, 0x1A, @@ -123,8 +125,8 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x00, 0x20, 0xA0, 0x83, 0x04, 0x20, 0x52, 0x95, 0x0F, 0x20, 0x02, 0x92, 0x82, 0x31, 0x83, 0xE0, 0x00, 0x30, 0x83, 0xE0, 0x1C, 0x30, 0xD3, 0xE5, 0x23, 0x32, 0xA0, 0xE1, 0x61, 0x30, 0xCD, 0xE5, 0x01, 0x30, 0x43, 0xE2, 0x06, 0x00, 0x53, 0xE3, 0x03, 0xF1, 0x9F, 0x97, 0x06, 0x00, 0x00, 0xEA, - 0xF4, 0xC7, 0x04, 0x00, 0xA0, 0xC8, 0x04, 0x00, 0x18, 0xC8, 0x04, 0x00, 0x64, 0xC7, 0x04, 0x00, - 0x3C, 0xC8, 0x04, 0x00, 0x6C, 0xC8, 0x04, 0x00, 0x00, 0xC9, 0x04, 0x00, 0x06, 0x00, 0xA0, 0xE1, + 0x14, 0x08, 0x28, 0x07, 0xC0, 0x08, 0x28, 0x07, 0x38, 0x08, 0x28, 0x07, 0x84, 0x07, 0x28, 0x07, + 0x5C, 0x08, 0x28, 0x07, 0x8C, 0x08, 0x28, 0x07, 0x20, 0x09, 0x28, 0x07, 0x06, 0x00, 0xA0, 0xE1, 0x35, 0xFF, 0x2F, 0xE1, 0x30, 0x30, 0x9D, 0xE5, 0x01, 0x30, 0x83, 0xE2, 0x30, 0x30, 0x8D, 0xE5, 0xDB, 0xFF, 0xFF, 0xEA, 0x00, 0x30, 0xA0, 0xE3, 0x28, 0x30, 0x8D, 0xE5, 0x2C, 0x30, 0x8D, 0xE5, 0x38, 0x30, 0x8D, 0xE5, 0x24, 0x30, 0x8D, 0xE5, 0x34, 0x30, 0x8D, 0xE5, 0x20, 0x30, 0xA0, 0xE3, @@ -148,15 +150,15 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x42, 0x00, 0x51, 0xE3, 0x28, 0x01, 0x00, 0x0A, 0x43, 0x00, 0x51, 0xE3, 0x80, 0xA0, 0x8A, 0x03, 0x34, 0xA0, 0x8D, 0x05, 0xB2, 0x00, 0x00, 0x0A, 0x00, 0x30, 0xA0, 0xE3, 0x24, 0x30, 0x8D, 0xE5, 0x45, 0x00, 0x00, 0xEA, 0x58, 0x10, 0x41, 0xE2, 0x20, 0x00, 0x51, 0xE3, 0x01, 0xF1, 0x9F, 0x97, - 0xF8, 0xFF, 0xFF, 0xEA, 0xB4, 0xCB, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, - 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, - 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x64, 0xCB, 0x04, 0x00, - 0x04, 0xCC, 0x04, 0x00, 0xE8, 0xCB, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x1C, 0xCC, 0x04, 0x00, - 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0xE8, 0xCB, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, - 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, - 0x88, 0xCB, 0x04, 0x00, 0x28, 0xCA, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, - 0xE8, 0xC9, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, 0xFC, 0xCB, 0x04, 0x00, 0x38, 0xC9, 0x04, 0x00, - 0x38, 0xC9, 0x04, 0x00, 0xBC, 0xCB, 0x04, 0x00, 0x53, 0x00, 0x51, 0xE3, 0x80, 0xA0, 0x8A, 0x03, + 0xF8, 0xFF, 0xFF, 0xEA, 0xD4, 0x0B, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, + 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, + 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x84, 0x0B, 0x28, 0x07, + 0x24, 0x0C, 0x28, 0x07, 0x08, 0x0C, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x3C, 0x0C, 0x28, 0x07, + 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x08, 0x0C, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, + 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, + 0xA8, 0x0B, 0x28, 0x07, 0x48, 0x0A, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, + 0x08, 0x0A, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, 0x1C, 0x0C, 0x28, 0x07, 0x58, 0x09, 0x28, 0x07, + 0x58, 0x09, 0x28, 0x07, 0xDC, 0x0B, 0x28, 0x07, 0x53, 0x00, 0x51, 0xE3, 0x80, 0xA0, 0x8A, 0x03, 0x34, 0xA0, 0x8D, 0x05, 0xD3, 0xFF, 0xFF, 0x1A, 0x04, 0x30, 0x94, 0xE4, 0x00, 0x00, 0x53, 0xE3, 0x74, 0x35, 0x9F, 0x05, 0x10, 0x30, 0x8D, 0xE5, 0x10, 0x10, 0x9D, 0xE5, 0x01, 0x30, 0xA0, 0xE1, 0x03, 0x20, 0xA0, 0xE1, 0x01, 0x30, 0x83, 0xE2, 0x00, 0x00, 0xD2, 0xE5, 0x00, 0x00, 0x50, 0xE3, @@ -245,8 +247,8 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x03, 0x00, 0x00, 0x0A, 0x61, 0x30, 0x41, 0xE2, 0x19, 0x00, 0x53, 0xE3, 0x20, 0x10, 0x41, 0x92, 0x71, 0x10, 0xEF, 0x96, 0x06, 0x00, 0xA0, 0xE1, 0x01, 0x70, 0x87, 0xE2, 0x35, 0xFF, 0x2F, 0xE1, 0xCC, 0xFF, 0xFF, 0xEA, 0x09, 0x10, 0xA0, 0xE1, 0x06, 0x00, 0xA0, 0xE1, 0x01, 0x80, 0x48, 0xE2, - 0x35, 0xFF, 0x2F, 0xE1, 0xD3, 0xFF, 0xFF, 0xEA, 0xF8, 0x32, 0x05, 0x00, 0x6F, 0x33, 0x05, 0x00, - 0x52, 0xB8, 0x1E, 0x85, 0xEB, 0x51, 0xE0, 0x3F, 0x00, 0x00, 0x24, 0x40, 0x09, 0x33, 0x05, 0x00, + 0x35, 0xFF, 0x2F, 0xE1, 0xD3, 0xFF, 0xFF, 0xEA, 0x18, 0x73, 0x28, 0x07, 0x8F, 0x73, 0x28, 0x07, + 0x52, 0xB8, 0x1E, 0x85, 0xEB, 0x51, 0xE0, 0x3F, 0x00, 0x00, 0x24, 0x40, 0x29, 0x73, 0x28, 0x07, 0x0C, 0x00, 0x2D, 0xE9, 0x07, 0x40, 0x2D, 0xE9, 0x10, 0x20, 0x9D, 0xE5, 0x14, 0x30, 0x8D, 0xE2, 0x04, 0x30, 0x8D, 0xE5, 0xE9, 0xFD, 0xFF, 0xEB, 0x0C, 0xD0, 0x8D, 0xE2, 0x04, 0xE0, 0x9D, 0xE4, 0x08, 0xD0, 0x8D, 0xE2, 0x1E, 0xFF, 0x2F, 0xE1, 0x80, 0xEA, 0x01, 0x20, 0x08, 0x23, 0x48, 0xF2, @@ -256,9 +258,9 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x01, 0x93, 0x06, 0x46, 0x13, 0x4B, 0x1B, 0x68, 0x9B, 0xB2, 0x01, 0x93, 0x01, 0x9B, 0xB3, 0xF5, 0x00, 0x7F, 0x0A, 0xD0, 0x03, 0xDC, 0xB3, 0xB1, 0x00, 0x24, 0x05, 0x25, 0x07, 0xE0, 0xB3, 0xF5, 0xC4, 0x6F, 0x02, 0xD0, 0xB3, 0xF5, 0x80, 0x5F, 0xF6, 0xD1, 0x01, 0x24, 0x02, 0x25, 0x01, 0x99, - 0x09, 0x48, 0xFF, 0xF7, 0xC4, 0xEA, 0x4C, 0xB1, 0x29, 0x46, 0x30, 0x46, 0x02, 0xB0, 0xBD, 0xE8, + 0x09, 0x48, 0xFF, 0xF7, 0xB6, 0xEA, 0x4C, 0xB1, 0x29, 0x46, 0x30, 0x46, 0x02, 0xB0, 0xBD, 0xE8, 0x70, 0x40, 0xFF, 0xF7, 0xD2, 0xBF, 0x01, 0x24, 0x25, 0x46, 0xF0, 0xE7, 0x00, 0x20, 0x02, 0xB0, - 0x70, 0xBD, 0x00, 0xBF, 0x00, 0x62, 0x00, 0x03, 0x22, 0x34, 0x05, 0x00, 0x70, 0x00, 0x60, 0xE1, + 0x70, 0xBD, 0x00, 0xBF, 0x00, 0x62, 0x00, 0x03, 0x42, 0x74, 0x28, 0x07, 0x70, 0x00, 0x60, 0xE1, 0x0E, 0xF0, 0xA0, 0xE1, 0x70, 0x00, 0x60, 0xE1, 0x0E, 0xF0, 0xA0, 0xE1, 0xF8, 0x5F, 0x2D, 0xE9, 0xA8, 0xC2, 0x9F, 0xE5, 0x9C, 0x02, 0x02, 0xE0, 0x01, 0x20, 0x82, 0xE2, 0x02, 0x30, 0xA0, 0xE1, 0x98, 0xC2, 0x9F, 0xE5, 0x9C, 0x02, 0x02, 0xE0, 0x01, 0x20, 0x82, 0xE2, 0x02, 0x40, 0xA0, 0xE1, @@ -303,13 +305,13 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x20, 0x0B, 0xA1, 0xEC, 0x20, 0x0B, 0xB0, 0xEC, 0x20, 0x0B, 0xA1, 0xEC, 0x20, 0x0B, 0xB0, 0xEC, 0x20, 0x0B, 0xA1, 0xEC, 0x20, 0x0B, 0xB0, 0xEC, 0x20, 0x0B, 0xA1, 0xEC, 0x20, 0x0B, 0xB0, 0xEC, 0x20, 0x0B, 0xA1, 0xEC, 0x02, 0x00, 0x50, 0xE1, 0xED, 0xFF, 0xFF, 0x1A, 0xF8, 0x9F, 0xBD, 0xE8, - 0x35, 0x4E, 0x5A, 0x01, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0x3C, 0xD0, 0x04, 0x00, - 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0x44, 0xD0, 0x04, 0x00, 0x01, 0x4B, 0x18, 0x47, - 0x70, 0x47, 0x00, 0xBF, 0x4C, 0xD0, 0x04, 0x00, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, - 0xE0, 0xD0, 0x04, 0x00, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0xF4, 0xD0, 0x04, 0x00, - 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0x4C, 0xD1, 0x04, 0x00, 0x01, 0x4B, 0x18, 0x47, - 0x70, 0x47, 0x00, 0xBF, 0xB0, 0xD1, 0x04, 0x00, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, - 0x30, 0xD2, 0x04, 0x00, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0xAC, 0xD2, 0x04, 0x00, + 0x35, 0x4E, 0x5A, 0x01, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0x5C, 0x10, 0x28, 0x07, + 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0x64, 0x10, 0x28, 0x07, 0x01, 0x4B, 0x18, 0x47, + 0x70, 0x47, 0x00, 0xBF, 0x6C, 0x10, 0x28, 0x07, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, + 0x00, 0x11, 0x28, 0x07, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0x14, 0x11, 0x28, 0x07, + 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0x6C, 0x11, 0x28, 0x07, 0x01, 0x4B, 0x18, 0x47, + 0x70, 0x47, 0x00, 0xBF, 0xD0, 0x11, 0x28, 0x07, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, + 0x50, 0x12, 0x28, 0x07, 0x01, 0x4B, 0x18, 0x47, 0x70, 0x47, 0x00, 0xBF, 0xCC, 0x12, 0x28, 0x07, 0x10, 0xB5, 0x14, 0x46, 0x1A, 0x46, 0x02, 0x9B, 0x1B, 0xB1, 0xBD, 0xE8, 0x10, 0x40, 0xFF, 0xF7, 0xD9, 0xBF, 0xE4, 0x00, 0xFF, 0x23, 0xA3, 0x40, 0xDB, 0x43, 0xFF, 0xF7, 0xD9, 0xFF, 0xE0, 0x40, 0xC0, 0xB2, 0x10, 0xBD, 0x2D, 0xE9, 0xF0, 0x4F, 0x84, 0x46, 0x69, 0x4C, 0x0F, 0x46, 0x16, 0x46, @@ -339,7 +341,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x19, 0x68, 0xBF, 0xF3, 0x5F, 0x8F, 0x41, 0xB9, 0x04, 0x33, 0x9A, 0x42, 0xF8, 0xD1, 0x01, 0x23, 0x03, 0x93, 0x03, 0x98, 0x0F, 0xB0, 0xBD, 0xE8, 0xF0, 0x8F, 0x23, 0x68, 0xBF, 0xF3, 0x5F, 0x8F, 0x01, 0x33, 0xF6, 0xD1, 0x04, 0x34, 0xA2, 0x42, 0xF7, 0xD1, 0xF0, 0xE7, 0x03, 0x90, 0xF0, 0xE7, - 0x78, 0x33, 0x05, 0x00, 0x08, 0x00, 0x00, 0x42, 0x0C, 0x00, 0x00, 0x41, 0x2D, 0xE9, 0xF0, 0x4F, + 0x98, 0x73, 0x28, 0x07, 0x08, 0x00, 0x00, 0x42, 0x0C, 0x00, 0x00, 0x41, 0x2D, 0xE9, 0xF0, 0x4F, 0x84, 0x46, 0x57, 0x4C, 0x0E, 0x46, 0x17, 0x46, 0x8B, 0xB0, 0x04, 0xAD, 0x0F, 0xCC, 0x0F, 0xC5, 0x94, 0xE8, 0x03, 0x00, 0x85, 0xE8, 0x03, 0x00, 0xBC, 0xF1, 0x00, 0x0F, 0x3F, 0xD0, 0x4F, 0xEA, 0x5C, 0x05, 0x0C, 0xF1, 0x80, 0x44, 0x08, 0x34, 0x05, 0xF1, 0x80, 0x45, 0x0C, 0x35, 0xAB, 0x19, @@ -362,15 +364,15 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x4F, 0xF0, 0x01, 0x0A, 0xB0, 0xE7, 0x4F, 0xF0, 0xFF, 0x37, 0xD8, 0xE7, 0x04, 0xF1, 0x44, 0x03, 0x22, 0x68, 0xBF, 0xF3, 0x5F, 0x8F, 0x22, 0xB9, 0x04, 0x34, 0xA3, 0x42, 0xF8, 0xD1, 0x4F, 0xF0, 0x01, 0x08, 0x40, 0x46, 0x0B, 0xB0, 0xBD, 0xE8, 0xF0, 0x8F, 0x80, 0x46, 0xF9, 0xE7, 0x00, 0xBF, - 0x78, 0x33, 0x05, 0x00, 0x08, 0x00, 0x00, 0x42, 0x0C, 0x00, 0x00, 0x41, 0x2D, 0xE9, 0xF0, 0x41, + 0x98, 0x73, 0x28, 0x07, 0x08, 0x00, 0x00, 0x42, 0x0C, 0x00, 0x00, 0x41, 0x2D, 0xE9, 0xF0, 0x41, 0x4F, 0xF0, 0x01, 0x34, 0xDF, 0xF8, 0x3C, 0xC0, 0x62, 0x43, 0x00, 0x24, 0x09, 0x1A, 0xDF, 0xF8, 0x38, 0xE0, 0x25, 0x46, 0x94, 0x42, 0x05, 0xD1, 0xD8, 0x00, 0x25, 0xFA, 0x00, 0xF0, 0xC0, 0xB2, 0xBD, 0xE8, 0xF0, 0x81, 0x0F, 0x58, 0x04, 0xEB, 0x0C, 0x06, 0x50, 0xF8, 0x04, 0x8B, 0x7E, 0x40, 0x04, 0xEB, 0x0E, 0x07, 0x87, 0xEA, 0x08, 0x07, 0x04, 0xF1, 0x01, 0x34, 0x3E, 0x43, 0x35, 0x43, 0xE8, 0xE7, 0x00, 0xBF, 0x98, 0xBA, 0xDC, 0xFE, 0x67, 0x45, 0x23, 0x01, 0x4A, 0x43, 0x10, 0x0A, 0x70, 0x47, 0x00, 0x00, 0x2D, 0xE9, 0xF0, 0x4F, 0x50, 0x22, 0xBD, 0xB0, 0x04, 0x46, 0x00, 0x21, - 0x0D, 0xEB, 0x02, 0x00, 0xFE, 0xF7, 0x6C, 0xEF, 0x50, 0x22, 0x00, 0x21, 0x28, 0xA8, 0x10, 0xAD, - 0xFE, 0xF7, 0x66, 0xEF, 0x99, 0x4B, 0x26, 0x68, 0x0F, 0xCB, 0x85, 0xE8, 0x0F, 0x00, 0xE3, 0x6E, + 0x0D, 0xEB, 0x02, 0x00, 0xFE, 0xF7, 0x60, 0xEF, 0x50, 0x22, 0x00, 0x21, 0x28, 0xA8, 0x10, 0xAD, + 0xFE, 0xF7, 0x5A, 0xEF, 0x99, 0x4B, 0x26, 0x68, 0x0F, 0xCB, 0x85, 0xE8, 0x0F, 0x00, 0xE3, 0x6E, 0xA5, 0x6F, 0x23, 0xF0, 0x00, 0x63, 0xE3, 0x66, 0xFF, 0xF7, 0xEE, 0xFD, 0xA3, 0x6E, 0x27, 0x68, 0x02, 0x93, 0xE3, 0x6E, 0x06, 0x93, 0x23, 0x6F, 0x07, 0x93, 0x63, 0x6F, 0x08, 0x93, 0x63, 0x69, 0x04, 0x93, 0xE3, 0x6F, 0x05, 0x93, 0x4F, 0xF4, 0xB4, 0x73, 0x23, 0x60, 0x63, 0x68, 0x03, 0x2B, @@ -408,7 +410,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x6E, 0x60, 0x16, 0xD1, 0x2B, 0x69, 0x29, 0x68, 0x00, 0x2B, 0x3F, 0xF4, 0x69, 0xAF, 0x00, 0x29, 0x3F, 0xF4, 0x66, 0xAF, 0xE2, 0x6F, 0xDB, 0x1B, 0x2B, 0x61, 0x03, 0xFA, 0x0B, 0xF3, 0x0D, 0x9E, 0xC9, 0x1B, 0x08, 0xEA, 0x02, 0x02, 0x29, 0x60, 0x13, 0x43, 0xE3, 0x67, 0xC7, 0xF1, 0x7F, 0x03, - 0x6B, 0x60, 0x50, 0x46, 0x8E, 0xE2, 0x30, 0x46, 0x8C, 0xE2, 0x00, 0xBF, 0x90, 0x33, 0x05, 0x00, + 0x6B, 0x60, 0x50, 0x46, 0x8E, 0xE2, 0x30, 0x46, 0x8C, 0xE2, 0x00, 0xBF, 0xB0, 0x73, 0x28, 0x07, 0x92, 0x90, 0x92, 0x92, 0x1A, 0x14, 0x1C, 0x20, 0x9A, 0x98, 0x9A, 0x9A, 0x0C, 0x0A, 0x0D, 0x0E, 0x82, 0x7F, 0x82, 0x7E, 0x0D, 0x0A, 0x0B, 0x0C, 0x0A, 0x07, 0x0F, 0x0E, 0xFB, 0xFC, 0xFC, 0xFC, 0xBA, 0xF1, 0x00, 0x0F, 0x47, 0xD1, 0x2B, 0x68, 0x08, 0xF1, 0xFF, 0x32, 0x6A, 0x60, 0xC3, 0xF1, @@ -493,13 +495,13 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x13, 0x43, 0xE3, 0x67, 0x3E, 0x44, 0x82, 0x46, 0x7F, 0x2E, 0xCB, 0xD9, 0xC0, 0xE4, 0x00, 0xBF, 0x31, 0x75, 0xB9, 0xFD, 0x67, 0x45, 0x23, 0x01, 0x67, 0x46, 0x24, 0x02, 0x83, 0xDE, 0x1B, 0x43, 0x2D, 0xE9, 0xF7, 0x43, 0x05, 0x25, 0xDF, 0xF8, 0x74, 0x90, 0x4F, 0xF0, 0x01, 0x08, 0x06, 0x46, - 0x16, 0x49, 0x17, 0x48, 0xFE, 0xF7, 0x5A, 0xEB, 0x01, 0x3D, 0x04, 0xD1, 0x15, 0x48, 0x01, 0x24, - 0xFE, 0xF7, 0x54, 0xEB, 0x1E, 0xE0, 0x30, 0x46, 0xFF, 0xF7, 0x0C, 0xFC, 0x07, 0x46, 0x00, 0x28, + 0x16, 0x49, 0x17, 0x48, 0xFE, 0xF7, 0x4C, 0xEB, 0x01, 0x3D, 0x04, 0xD1, 0x15, 0x48, 0x01, 0x24, + 0xFE, 0xF7, 0x46, 0xEB, 0x1E, 0xE0, 0x30, 0x46, 0xFF, 0xF7, 0x0C, 0xFC, 0x07, 0x46, 0x00, 0x28, 0xF2, 0xD1, 0x30, 0x46, 0x03, 0xF0, 0x16, 0xFC, 0xB0, 0xFA, 0x80, 0xF4, 0xCD, 0xF8, 0x00, 0x80, 0x64, 0x09, 0x01, 0x23, 0x08, 0x22, 0x4F, 0xF4, 0x00, 0x41, 0x38, 0x46, 0xFF, 0xF7, 0x3A, 0xFA, - 0x04, 0x43, 0x03, 0xD0, 0x48, 0x46, 0xFE, 0xF7, 0x3A, 0xEB, 0xDD, 0xE7, 0x31, 0x68, 0x06, 0x48, - 0xFE, 0xF7, 0x34, 0xEB, 0x20, 0x46, 0x03, 0xB0, 0xBD, 0xE8, 0xF0, 0x83, 0x37, 0x34, 0x05, 0x00, - 0x3C, 0x34, 0x05, 0x00, 0xAF, 0x34, 0x05, 0x00, 0x82, 0x34, 0x05, 0x00, 0x57, 0x34, 0x05, 0x00, + 0x04, 0x43, 0x03, 0xD0, 0x48, 0x46, 0xFE, 0xF7, 0x2C, 0xEB, 0xDD, 0xE7, 0x31, 0x68, 0x06, 0x48, + 0xFE, 0xF7, 0x26, 0xEB, 0x20, 0x46, 0x03, 0xB0, 0xBD, 0xE8, 0xF0, 0x83, 0x57, 0x74, 0x28, 0x07, + 0x5C, 0x74, 0x28, 0x07, 0xCF, 0x74, 0x28, 0x07, 0xA2, 0x74, 0x28, 0x07, 0x77, 0x74, 0x28, 0x07, 0x0A, 0x4B, 0x0B, 0x4A, 0x1A, 0x60, 0x0B, 0x4A, 0x5A, 0x60, 0x0B, 0x4A, 0x9A, 0x60, 0x02, 0xF1, 0x9E, 0x62, 0x02, 0xF6, 0xFF, 0x72, 0xDA, 0x60, 0x08, 0x4A, 0x1A, 0x61, 0x08, 0x4A, 0x5A, 0x61, 0x08, 0x4A, 0x9A, 0x61, 0x08, 0x4A, 0xDA, 0x61, 0x70, 0x47, 0x00, 0xBF, 0x54, 0x00, 0x14, 0x03, @@ -509,12 +511,12 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x03, 0x4A, 0xA4, 0xFB, 0x02, 0x23, 0x98, 0x09, 0x00, 0x29, 0x18, 0xBF, 0x01, 0x30, 0x10, 0xBD, 0xD3, 0x4D, 0x62, 0x10, 0x40, 0x08, 0xF8, 0xB5, 0x18, 0x4A, 0x4F, 0xF0, 0x80, 0x43, 0x00, 0x05, 0x00, 0x24, 0x17, 0x4D, 0x8C, 0x42, 0x0C, 0xD1, 0x15, 0x4F, 0x4F, 0xF0, 0x80, 0x43, 0xDF, 0xF8, - 0x4C, 0xC0, 0x00, 0x25, 0xAC, 0x42, 0x0B, 0xD1, 0x12, 0x48, 0xFE, 0xF7, 0xD8, 0xEA, 0x00, 0x20, + 0x4C, 0xC0, 0x00, 0x25, 0xAC, 0x42, 0x0B, 0xD1, 0x12, 0x48, 0xFE, 0xF7, 0xCA, 0xEA, 0x00, 0x20, 0x10, 0xE0, 0xA6, 0x18, 0x1E, 0x60, 0x66, 0x19, 0xC6, 0x50, 0x01, 0x34, 0x04, 0x33, 0xE9, 0xE7, 0xC1, 0x58, 0xEA, 0x19, 0xC6, 0x18, 0x8A, 0x42, 0x05, 0xD0, 0x33, 0x46, 0x0A, 0x48, 0xFE, 0xF7, - 0xC6, 0xEA, 0x01, 0x20, 0xF8, 0xBD, 0x1E, 0x46, 0x05, 0xEB, 0x0C, 0x02, 0x56, 0xF8, 0x04, 0x1B, + 0xB8, 0xEA, 0x01, 0x20, 0xF8, 0xBD, 0x1E, 0x46, 0x05, 0xEB, 0x0C, 0x02, 0x56, 0xF8, 0x04, 0x1B, 0x8A, 0x42, 0xF3, 0xD1, 0x01, 0x35, 0x33, 0x46, 0xDC, 0xE7, 0x00, 0xBF, 0x67, 0x45, 0x23, 0x01, - 0x98, 0xBA, 0xDC, 0xFE, 0x10, 0x35, 0x05, 0x00, 0xDE, 0x34, 0x05, 0x00, 0x83, 0x69, 0x10, 0xB5, + 0x98, 0xBA, 0xDC, 0xFE, 0x30, 0x75, 0x28, 0x07, 0xFE, 0x74, 0x28, 0x07, 0x83, 0x69, 0x10, 0xB5, 0xC3, 0xF3, 0x07, 0x12, 0xC3, 0xF3, 0x01, 0x34, 0x03, 0xF0, 0x0F, 0x01, 0x22, 0x44, 0x0A, 0x44, 0xC1, 0x69, 0xC3, 0xF3, 0x81, 0x33, 0x13, 0x44, 0x0A, 0x0B, 0x02, 0xF0, 0x07, 0x04, 0x07, 0x2C, 0x16, 0xBF, 0x02, 0xF0, 0x0F, 0x02, 0x02, 0x33, 0x9B, 0x18, 0x11, 0xF0, 0x0F, 0x0F, 0x4F, 0xF0, @@ -523,11 +525,11 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x18, 0x46, 0x10, 0xBD, 0x43, 0x68, 0x10, 0xB5, 0x03, 0x3B, 0x05, 0x2B, 0x1B, 0xD8, 0xDF, 0xE8, 0x03, 0xF0, 0x03, 0x0C, 0x1A, 0x1A, 0x1C, 0x1F, 0x90, 0xF8, 0x64, 0x30, 0x0A, 0x24, 0x5C, 0x43, 0x40, 0xF2, 0xDC, 0x53, 0x08, 0xBF, 0x1C, 0x46, 0x06, 0xE0, 0x90, 0xF8, 0x65, 0x30, 0x0A, 0x24, - 0x5C, 0x43, 0x08, 0xBF, 0x4F, 0xF4, 0x96, 0x64, 0x20, 0x46, 0xFE, 0xF7, 0x04, 0xEA, 0x70, 0xB1, - 0x0A, 0x48, 0xFE, 0xF7, 0x64, 0xEA, 0x00, 0x24, 0x0D, 0xE0, 0x90, 0xF8, 0x66, 0x30, 0xEE, 0xE7, + 0x5C, 0x43, 0x08, 0xBF, 0x4F, 0xF4, 0x96, 0x64, 0x20, 0x46, 0xFE, 0xF7, 0xF6, 0xE9, 0x70, 0xB1, + 0x0A, 0x48, 0xFE, 0xF7, 0x56, 0xEA, 0x00, 0x24, 0x0D, 0xE0, 0x90, 0xF8, 0x66, 0x30, 0xEE, 0xE7, 0x90, 0xF8, 0x67, 0x30, 0x0A, 0x24, 0x5C, 0x43, 0x40, 0xF2, 0x4C, 0x43, 0xE2, 0xE7, 0x21, 0x46, - 0x03, 0x48, 0xFE, 0xF7, 0x54, 0xEA, 0x20, 0x46, 0x10, 0xBD, 0x00, 0xBF, 0x26, 0x35, 0x05, 0x00, - 0x3C, 0x35, 0x05, 0x00, 0x83, 0x6F, 0xC3, 0xF3, 0x02, 0x53, 0x05, 0x2B, 0x16, 0xD8, 0xDF, 0xE8, + 0x03, 0x48, 0xFE, 0xF7, 0x46, 0xEA, 0x20, 0x46, 0x10, 0xBD, 0x00, 0xBF, 0x46, 0x75, 0x28, 0x07, + 0x5C, 0x75, 0x28, 0x07, 0x83, 0x6F, 0xC3, 0xF3, 0x02, 0x53, 0x05, 0x2B, 0x16, 0xD8, 0xDF, 0xE8, 0x03, 0xF0, 0x06, 0x03, 0x0C, 0x0F, 0x15, 0x12, 0x0A, 0x4B, 0x0B, 0x4A, 0x1A, 0x60, 0x0B, 0x4A, 0x13, 0x68, 0x43, 0xF0, 0x80, 0x73, 0x13, 0x60, 0x70, 0x47, 0x06, 0x4B, 0x08, 0x4A, 0xF5, 0xE7, 0x04, 0x4B, 0x08, 0x4A, 0xF2, 0xE7, 0x03, 0x4B, 0x07, 0x4A, 0xEF, 0xE7, 0x01, 0x4B, 0x07, 0x4A, @@ -541,12 +543,12 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x43, 0xF4, 0x80, 0x73, 0x13, 0x60, 0x00, 0x23, 0x2B, 0x60, 0x32, 0x68, 0x92, 0x4B, 0x42, 0xF0, 0x01, 0x02, 0x32, 0x60, 0x1F, 0x46, 0x32, 0x68, 0x42, 0xF0, 0x20, 0x02, 0x32, 0x60, 0x01, 0x22, 0x2A, 0x60, 0x1A, 0x68, 0xD0, 0x07, 0xFC, 0xD5, 0x8C, 0x4A, 0x13, 0x68, 0xD9, 0x07, 0xFC, 0xD5, - 0x4F, 0xF4, 0xFA, 0x70, 0xFE, 0xF7, 0x20, 0xEA, 0x89, 0x4A, 0x01, 0x20, 0x13, 0x68, 0x43, 0xF0, - 0x01, 0x03, 0x13, 0x60, 0xFE, 0xF7, 0x18, 0xEA, 0x00, 0x23, 0x2B, 0x60, 0x33, 0x68, 0x23, 0xF0, + 0x4F, 0xF4, 0xFA, 0x70, 0xFE, 0xF7, 0x14, 0xEA, 0x89, 0x4A, 0x01, 0x20, 0x13, 0x68, 0x43, 0xF0, + 0x01, 0x03, 0x13, 0x60, 0xFE, 0xF7, 0x0C, 0xEA, 0x00, 0x23, 0x2B, 0x60, 0x33, 0x68, 0x23, 0xF0, 0x20, 0x03, 0x33, 0x60, 0x01, 0x23, 0x2B, 0x60, 0x3B, 0x68, 0xDB, 0x07, 0xFC, 0xD5, 0x81, 0x4A, 0x00, 0x23, 0x2B, 0x60, 0x13, 0x68, 0x23, 0xF0, 0x20, 0x03, 0x13, 0x60, 0x01, 0x23, 0x2B, 0x60, 0x3B, 0x68, 0xD8, 0x07, 0xFC, 0xD5, 0x7C, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x03, 0x03, 0x01, 0x2B, - 0xFA, 0xD1, 0xA3, 0x6F, 0xD9, 0x06, 0x03, 0xD4, 0x4F, 0xF4, 0xFA, 0x70, 0xFE, 0xF7, 0xF4, 0xE9, + 0xFA, 0xD1, 0xA3, 0x6F, 0xD9, 0x06, 0x03, 0xD4, 0x4F, 0xF4, 0xFA, 0x70, 0xFE, 0xF7, 0xE8, 0xE9, 0x00, 0x23, 0x2B, 0x60, 0x33, 0x68, 0x23, 0xF0, 0x01, 0x03, 0x33, 0x60, 0x01, 0x23, 0x2B, 0x60, 0x3B, 0x68, 0xDA, 0x07, 0xFC, 0xD5, 0x63, 0x68, 0x08, 0x2B, 0x59, 0xD1, 0x23, 0x6A, 0x6F, 0x4A, 0x6F, 0x49, 0x13, 0x60, 0x6F, 0x4B, 0x19, 0x60, 0x19, 0x68, 0x00, 0x29, 0xFC, 0xDB, 0x61, 0x6A, @@ -606,8 +608,8 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0xC1, 0xF8, 0x80, 0x21, 0x0A, 0x68, 0xC2, 0xF3, 0x16, 0x02, 0x1A, 0x43, 0x22, 0xF0, 0x60, 0x02, 0x42, 0xF0, 0x40, 0x02, 0x0A, 0x60, 0xD1, 0xF8, 0x00, 0x23, 0xC2, 0xF3, 0x16, 0x02, 0x13, 0x43, 0x23, 0xF0, 0x60, 0x03, 0x43, 0xF0, 0x40, 0x03, 0xC1, 0xF8, 0x00, 0x33, 0x23, 0x68, 0x43, 0xF0, - 0x00, 0x63, 0x23, 0x60, 0x2B, 0x68, 0x43, 0xF0, 0x80, 0x03, 0x2B, 0x60, 0xFE, 0xF7, 0x14, 0xE8, - 0x2B, 0x68, 0x0A, 0x20, 0x23, 0xF0, 0x80, 0x03, 0x2B, 0x60, 0xFE, 0xF7, 0x0E, 0xE8, 0x23, 0x68, + 0x00, 0x63, 0x23, 0x60, 0x2B, 0x68, 0x43, 0xF0, 0x80, 0x03, 0x2B, 0x60, 0xFE, 0xF7, 0x08, 0xE8, + 0x2B, 0x68, 0x0A, 0x20, 0x23, 0xF0, 0x80, 0x03, 0x2B, 0x60, 0xFE, 0xF7, 0x02, 0xE8, 0x23, 0x68, 0x23, 0xF0, 0x00, 0x63, 0x23, 0x60, 0x38, 0xBD, 0x83, 0x6E, 0x1B, 0x0A, 0xB1, 0xE7, 0xB0, 0xF8, 0x6A, 0x30, 0xAE, 0xE7, 0x90, 0xF8, 0x6B, 0x30, 0x2B, 0xB1, 0x5B, 0x00, 0xAF, 0xE7, 0x00, 0x23, 0xAD, 0xE7, 0x80, 0x23, 0xAB, 0xE7, 0x33, 0x23, 0xA9, 0xE7, 0x00, 0xBF, 0x00, 0x03, 0x14, 0x03, @@ -664,7 +666,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x03, 0x63, 0x80, 0xB2, 0x03, 0x43, 0xC7, 0xE7, 0x84, 0x00, 0x14, 0x03, 0x20, 0x01, 0x14, 0x03, 0x04, 0x01, 0x14, 0x03, 0x38, 0x00, 0x14, 0x03, 0xAC, 0x00, 0x14, 0x03, 0x10, 0x01, 0x14, 0x03, 0xF0, 0xB5, 0xC1, 0xB0, 0x04, 0x46, 0x80, 0x22, 0x00, 0x21, 0x68, 0x46, 0x20, 0xAD, 0xFD, 0xF7, - 0x38, 0xEE, 0x00, 0x21, 0x80, 0x22, 0x28, 0x46, 0xFD, 0xF7, 0x32, 0xEE, 0xE1, 0x6E, 0x11, 0xF0, + 0x2C, 0xEE, 0x00, 0x21, 0x80, 0x22, 0x28, 0x46, 0xFD, 0xF7, 0x26, 0xEE, 0xE1, 0x6E, 0x11, 0xF0, 0x00, 0x63, 0x00, 0xF0, 0xF9, 0x84, 0x04, 0xF1, 0x80, 0x02, 0x00, 0x23, 0x92, 0xF8, 0x20, 0x60, 0x01, 0x32, 0x12, 0xF8, 0x01, 0x0C, 0x4D, 0xF8, 0x23, 0x60, 0x45, 0xF8, 0x23, 0x00, 0x01, 0x33, 0x20, 0x2B, 0xF3, 0xD1, 0x4A, 0x03, 0x40, 0xF1, 0x63, 0x82, 0xBA, 0x49, 0xBA, 0x4A, 0x0B, 0x68, @@ -841,10 +843,10 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x00, 0x1E, 0x1D, 0x15, 0x0F, 0x1A, 0x0A, 0x01, 0x07, 0x1B, 0x08, 0x10, 0x09, 0x14, 0x13, 0x00, 0x16, 0x0E, 0x03, 0x15, 0x17, 0x0D, 0x0C, 0x0B, 0x04, 0x02, 0x19, 0x18, 0x00, 0x1E, 0x1D, 0x05, 0x03, 0x02, 0x01, 0x00, 0x00, 0x1E, 0x1D, 0x1C, 0x10, 0xB5, 0x01, 0x20, 0x06, 0x4C, 0x23, 0x68, - 0x23, 0xF0, 0x80, 0x73, 0x43, 0xF4, 0x00, 0x73, 0x23, 0x60, 0xFD, 0xF7, 0xBE, 0xE8, 0x23, 0x68, + 0x23, 0xF0, 0x80, 0x73, 0x43, 0xF4, 0x00, 0x73, 0x23, 0x60, 0xFD, 0xF7, 0xB2, 0xE8, 0x23, 0x68, 0x43, 0xF0, 0x80, 0x73, 0x23, 0x60, 0x10, 0xBD, 0x08, 0x00, 0x12, 0x03, 0x8B, 0x4A, 0x70, 0xB5, 0x04, 0x46, 0xD0, 0xE9, 0x00, 0x65, 0x01, 0x20, 0x13, 0x68, 0x23, 0xF0, 0x01, 0x03, 0x13, 0x60, - 0xFD, 0xF7, 0xAA, 0xE8, 0xE3, 0x69, 0xC3, 0xF3, 0x02, 0x33, 0x07, 0x2B, 0x01, 0xBF, 0x4F, 0xF0, + 0xFD, 0xF7, 0x9E, 0xE8, 0xE3, 0x69, 0xC3, 0xF3, 0x02, 0x33, 0x07, 0x2B, 0x01, 0xBF, 0x4F, 0xF0, 0x45, 0x72, 0x13, 0x68, 0x43, 0xF4, 0x80, 0x13, 0x13, 0x60, 0x81, 0x4A, 0x13, 0x68, 0x23, 0xF4, 0x80, 0x23, 0x13, 0x60, 0x4F, 0xF0, 0x45, 0x72, 0x13, 0x68, 0xE1, 0x69, 0x23, 0xF4, 0x70, 0x63, 0xC9, 0x07, 0x4C, 0xBF, 0x43, 0xF4, 0x40, 0x73, 0x43, 0xF4, 0x70, 0x63, 0x13, 0x60, 0xA3, 0x6F, @@ -862,7 +864,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x45, 0x72, 0x13, 0x60, 0x21, 0x68, 0xA1, 0xF1, 0xFB, 0x03, 0xF9, 0x2B, 0x49, 0x4B, 0x67, 0xD8, 0x1A, 0x68, 0x22, 0xF0, 0xF0, 0x42, 0x42, 0xF0, 0xC0, 0x52, 0x1A, 0x60, 0x4A, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x87, 0x33, 0x43, 0xF0, 0x18, 0x33, 0x13, 0x60, 0x0A, 0x20, 0x47, 0x4A, 0x13, 0x68, - 0x23, 0xF4, 0x00, 0x73, 0x13, 0x60, 0xFD, 0xF7, 0x18, 0xE8, 0x20, 0x46, 0x44, 0x4C, 0xFE, 0xF7, + 0x23, 0xF4, 0x00, 0x73, 0x13, 0x60, 0xFD, 0xF7, 0x0C, 0xE8, 0x20, 0x46, 0x44, 0x4C, 0xFE, 0xF7, 0xB5, 0xFF, 0x44, 0x48, 0x08, 0x2D, 0x23, 0x68, 0x43, 0x49, 0x44, 0x4A, 0x23, 0xF4, 0x00, 0x73, 0x23, 0x60, 0x03, 0x68, 0x23, 0xF4, 0x00, 0x73, 0x03, 0x60, 0x0B, 0x68, 0x23, 0xF4, 0x00, 0x73, 0x0B, 0x60, 0x13, 0x68, 0x23, 0xF4, 0x00, 0x73, 0x13, 0x60, 0x3D, 0x4B, 0x1E, 0x68, 0x26, 0xF4, @@ -944,10 +946,10 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x0C, 0x02, 0x14, 0x03, 0x04, 0x00, 0x14, 0x03, 0x2D, 0xE9, 0xF8, 0x4F, 0xCA, 0x00, 0x07, 0x6E, 0x05, 0x46, 0x0E, 0x46, 0xBA, 0x4B, 0xD0, 0xE9, 0x1C, 0x98, 0x18, 0x20, 0xD7, 0x40, 0x1B, 0x68, 0x07, 0xF0, 0x1F, 0x07, 0x79, 0x1C, 0xC3, 0xF3, 0x07, 0x23, 0x03, 0xFB, 0x00, 0x00, 0x02, 0xF0, - 0x36, 0xEC, 0x44, 0x00, 0x31, 0x46, 0xB3, 0x48, 0x22, 0x46, 0xFC, 0xF7, 0x40, 0xED, 0xB2, 0x4B, + 0x36, 0xEC, 0x44, 0x00, 0x31, 0x46, 0xB3, 0x48, 0x22, 0x46, 0xFC, 0xF7, 0x32, 0xED, 0xB2, 0x4B, 0x1A, 0x68, 0x9A, 0x46, 0x42, 0xF0, 0x20, 0x02, 0x1A, 0x60, 0xB0, 0x4A, 0x93, 0x46, 0x13, 0x68, - 0x03, 0xF0, 0x07, 0x03, 0x03, 0x2B, 0xFA, 0xD1, 0x01, 0x20, 0xFC, 0xF7, 0x76, 0xED, 0xAC, 0x49, - 0x01, 0x20, 0x0B, 0x68, 0x23, 0xF0, 0x01, 0x03, 0x0B, 0x60, 0xFC, 0xF7, 0x6E, 0xED, 0xA9, 0x48, + 0x03, 0xF0, 0x07, 0x03, 0x03, 0x2B, 0xFA, 0xD1, 0x01, 0x20, 0xFC, 0xF7, 0x6A, 0xED, 0xAC, 0x49, + 0x01, 0x20, 0x0B, 0x68, 0x23, 0xF0, 0x01, 0x03, 0x0B, 0x60, 0xFC, 0xF7, 0x62, 0xED, 0xA9, 0x48, 0x00, 0x23, 0xA7, 0x49, 0x03, 0x60, 0xA8, 0x4B, 0x1A, 0x68, 0x22, 0xF4, 0xF8, 0x52, 0x42, 0xEA, 0x06, 0x22, 0x22, 0xF0, 0x01, 0x02, 0x1A, 0x60, 0x1A, 0x68, 0x42, 0xF0, 0x20, 0x02, 0x1A, 0x60, 0x01, 0x22, 0x02, 0x60, 0xA1, 0x4A, 0x94, 0x46, 0xD2, 0xF8, 0x00, 0xE0, 0x1E, 0xF0, 0x01, 0x0F, @@ -961,7 +963,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x14, 0xBF, 0x22, 0xF0, 0x02, 0x02, 0x42, 0xF0, 0x02, 0x02, 0x3A, 0x60, 0x1A, 0x68, 0x22, 0xF0, 0x20, 0x02, 0x1A, 0x60, 0x01, 0x23, 0x82, 0x4A, 0x03, 0x60, 0x13, 0x68, 0x01, 0x2B, 0xFC, 0xD1, 0xDC, 0xF8, 0x00, 0x30, 0xDA, 0x07, 0xFB, 0xD5, 0x0B, 0x68, 0x01, 0x20, 0x43, 0xF0, 0x01, 0x03, - 0x0B, 0x60, 0xFC, 0xF7, 0x02, 0xED, 0xDA, 0xF8, 0x00, 0x30, 0x23, 0xF0, 0x20, 0x03, 0xCA, 0xF8, + 0x0B, 0x60, 0xFC, 0xF7, 0xF6, 0xEC, 0xDA, 0xF8, 0x00, 0x30, 0x23, 0xF0, 0x20, 0x03, 0xCA, 0xF8, 0x00, 0x30, 0xDB, 0xF8, 0x00, 0x30, 0x03, 0xF0, 0x03, 0x03, 0x03, 0x2B, 0xF9, 0xD0, 0x75, 0x4A, 0xB4, 0xF5, 0x34, 0x7F, 0x28, 0x46, 0x13, 0x68, 0xA2, 0xF1, 0x98, 0x02, 0x43, 0xF4, 0x80, 0x53, 0x43, 0xF0, 0x10, 0x03, 0xC2, 0xF8, 0x98, 0x30, 0x13, 0x68, 0x23, 0xF0, 0xF8, 0x53, 0x2C, 0xBF, @@ -976,7 +978,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0xC0, 0xF8, 0x80, 0x31, 0xC0, 0xF8, 0x00, 0x23, 0x50, 0x4A, 0x13, 0x60, 0xA2, 0xF2, 0x8C, 0x72, 0x13, 0x68, 0x43, 0xF0, 0x02, 0x03, 0x13, 0x60, 0x4D, 0x4B, 0x1A, 0x68, 0x42, 0xF0, 0x00, 0x62, 0x1A, 0x60, 0x1A, 0x68, 0x22, 0xF0, 0x00, 0x62, 0x1A, 0x60, 0x0B, 0x68, 0x23, 0xF4, 0x80, 0x23, - 0x0B, 0x60, 0x27, 0xB9, 0x22, 0x46, 0x31, 0x46, 0x46, 0x48, 0xFC, 0xF7, 0x40, 0xEC, 0xEB, 0x6C, + 0x0B, 0x60, 0x27, 0xB9, 0x22, 0x46, 0x31, 0x46, 0x46, 0x48, 0xFC, 0xF7, 0x32, 0xEC, 0xEB, 0x6C, 0xDB, 0x03, 0x02, 0xD5, 0xB4, 0xF5, 0xB4, 0x7F, 0x02, 0xD9, 0xB4, 0xF5, 0xFA, 0x7F, 0x4F, 0xD2, 0x41, 0x4B, 0x2B, 0x67, 0x41, 0x4B, 0x6B, 0x67, 0x28, 0x46, 0xFE, 0xF7, 0x21, 0xFE, 0xC5, 0xE9, 0x1C, 0x98, 0x38, 0x46, 0xBD, 0xE8, 0xF8, 0x8F, 0xA4, 0xF1, 0x7E, 0x07, 0xD2, 0xF8, 0x00, 0xE0, @@ -989,12 +991,12 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0xF2, 0xE7, 0x29, 0x4B, 0x29, 0x4A, 0x8C, 0xE7, 0x29, 0x4B, 0x2A, 0x4A, 0x89, 0xE7, 0x2A, 0x4B, 0x2A, 0x4A, 0x86, 0xE7, 0x2A, 0x4B, 0x2B, 0x4A, 0x83, 0xE7, 0x2B, 0x4B, 0x2B, 0x4A, 0x80, 0xE7, 0x40, 0xF2, 0x61, 0x23, 0x9C, 0x42, 0x57, 0xD8, 0x29, 0x4B, 0x2B, 0x67, 0x29, 0x4B, 0xAA, 0xE7, - 0x10, 0x10, 0x00, 0x02, 0x53, 0x35, 0x05, 0x00, 0x30, 0x00, 0x13, 0x03, 0x04, 0x00, 0x13, 0x03, + 0x10, 0x10, 0x00, 0x02, 0x73, 0x75, 0x28, 0x07, 0x30, 0x00, 0x13, 0x03, 0x04, 0x00, 0x13, 0x03, 0x50, 0x02, 0x01, 0x07, 0x20, 0x03, 0x13, 0x03, 0xB0, 0x01, 0x13, 0x03, 0xBC, 0x01, 0x13, 0x03, 0x00, 0x18, 0x00, 0x02, 0xC0, 0x00, 0x14, 0x03, 0xD0, 0x00, 0x14, 0x03, 0x00, 0x00, 0x13, 0x03, 0x24, 0x03, 0x13, 0x03, 0xAC, 0x00, 0x14, 0x03, 0xFE, 0x02, 0xFE, 0x02, 0xE8, 0x02, 0xE8, 0x02, 0xF2, 0x02, 0xF2, 0x02, 0x84, 0x00, 0x14, 0x03, 0x10, 0x03, 0x14, 0x03, 0x90, 0x07, 0x14, 0x03, - 0x44, 0x00, 0x14, 0x03, 0x68, 0x35, 0x05, 0x00, 0xA0, 0x9C, 0xA0, 0xA0, 0x09, 0x07, 0x0E, 0x0E, + 0x44, 0x00, 0x14, 0x03, 0x88, 0x75, 0x28, 0x07, 0xA0, 0x9C, 0xA0, 0xA0, 0x09, 0x07, 0x0E, 0x0E, 0xE0, 0x01, 0xE0, 0x01, 0xFD, 0x01, 0xFD, 0x01, 0x2B, 0x02, 0x2B, 0x02, 0x4E, 0x02, 0x4E, 0x02, 0x4B, 0x02, 0x4B, 0x02, 0x6A, 0x02, 0x6A, 0x02, 0x83, 0x02, 0x83, 0x02, 0x80, 0x02, 0x80, 0x02, 0x9D, 0x02, 0x9D, 0x02, 0x97, 0x02, 0x97, 0x02, 0xC0, 0x02, 0xC0, 0x02, 0xB5, 0x02, 0xB5, 0x02, @@ -1025,23 +1027,23 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x21, 0xF0, 0x3F, 0x01, 0x0B, 0x43, 0x99, 0xB2, 0x1B, 0x0C, 0x11, 0x80, 0x51, 0x88, 0x53, 0x80, 0x65, 0x4B, 0x1A, 0x68, 0x42, 0xF0, 0x06, 0x02, 0x1A, 0x60, 0x1A, 0x68, 0x42, 0xF0, 0x01, 0x02, 0x1A, 0x60, 0x62, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x0C, 0x03, 0x0C, 0x2B, 0xFA, 0xD1, 0x14, 0x68, - 0x14, 0xF0, 0x03, 0x04, 0x03, 0xD0, 0x01, 0x24, 0x5D, 0x48, 0xFC, 0xF7, 0xB8, 0xEA, 0xEB, 0x69, + 0x14, 0xF0, 0x03, 0x04, 0x03, 0xD0, 0x01, 0x24, 0x5D, 0x48, 0xFC, 0xF7, 0xAA, 0xEA, 0xEB, 0x69, 0xDB, 0x07, 0x0C, 0xD4, 0x5B, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x0C, 0x03, 0x0C, 0x2B, 0xFA, 0xD1, - 0x13, 0x68, 0x9F, 0x07, 0x03, 0xD0, 0x01, 0x24, 0x57, 0x48, 0xFC, 0xF7, 0xA8, 0xEA, 0x57, 0x4B, + 0x13, 0x68, 0x9F, 0x07, 0x03, 0xD0, 0x01, 0x24, 0x57, 0x48, 0xFC, 0xF7, 0x9A, 0xEA, 0x57, 0x4B, 0x57, 0x4E, 0xDF, 0xF8, 0xD8, 0x81, 0x1B, 0x68, 0x56, 0x4B, 0x57, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x55, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x55, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x53, 0x4B, 0x1B, 0x68, 0x53, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x52, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x51, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x50, 0x4B, 0x1B, 0x68, 0x33, 0x68, 0x56, 0xF8, 0x12, 0x3C, 0x32, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA6, 0xF1, 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF2, 0x27, 0x21, 0xFC, 0xF7, - 0x76, 0xEA, 0xEB, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x36, 0xBE, 0x42, + 0x68, 0xEA, 0xEB, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x36, 0xBE, 0x42, 0xE9, 0xD1, 0x45, 0x4B, 0xDF, 0xF8, 0x68, 0x81, 0x44, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x43, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x42, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x41, 0x4B, 0x1B, 0x68, 0x41, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x3F, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x3F, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x3D, 0x4B, 0x1B, 0x68, 0x3D, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x33, 0x68, 0x56, 0xF8, 0x12, 0x3C, 0x32, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA6, 0xF1, 0x45, 0x71, - 0x40, 0x46, 0xA1, 0xF5, 0x0C, 0x71, 0xFC, 0xF7, 0x3A, 0xEA, 0xEB, 0x6E, 0x13, 0xF0, 0x80, 0x5F, + 0x40, 0x46, 0xA1, 0xF5, 0x0C, 0x71, 0xFC, 0xF7, 0x2C, 0xEA, 0xEB, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x36, 0xBE, 0x42, 0xE9, 0xD1, 0xEB, 0x69, 0xDE, 0x07, 0x00, 0xF1, 0xCD, 0x80, 0x2F, 0x4B, 0x2F, 0x4E, 0xDF, 0xF8, 0xEC, 0x80, 0x1B, 0x68, 0x2E, 0x4B, 0x2F, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x2D, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x2D, 0x4B, @@ -1049,7 +1051,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x2A, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x29, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x28, 0x4B, 0x1B, 0x68, 0x55, 0xE0, 0x00, 0x02, 0x14, 0x03, 0x66, 0x00, 0x14, 0x03, 0x82, 0x02, 0x14, 0x03, 0x64, 0x00, 0x14, 0x03, 0x10, 0x02, 0x14, 0x03, - 0x95, 0x35, 0x05, 0x00, 0x90, 0x02, 0x14, 0x03, 0xB9, 0x35, 0x05, 0x00, 0x14, 0x02, 0x14, 0x03, + 0xB5, 0x75, 0x28, 0x07, 0x90, 0x02, 0x14, 0x03, 0xD9, 0x75, 0x28, 0x07, 0x14, 0x02, 0x14, 0x03, 0x26, 0x02, 0x14, 0x03, 0x15, 0x02, 0x14, 0x03, 0x2F, 0x02, 0x14, 0x03, 0x16, 0x02, 0x14, 0x03, 0x17, 0x02, 0x14, 0x03, 0x18, 0x02, 0x14, 0x03, 0x19, 0x02, 0x14, 0x03, 0x1A, 0x02, 0x14, 0x03, 0x1B, 0x02, 0x14, 0x03, 0x1C, 0x02, 0x14, 0x03, 0x1D, 0x02, 0x14, 0x03, 0x38, 0x02, 0x14, 0x03, @@ -1057,33 +1059,33 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x22, 0x02, 0x14, 0x03, 0x23, 0x02, 0x14, 0x03, 0x24, 0x02, 0x14, 0x03, 0x25, 0x02, 0x14, 0x03, 0x94, 0x02, 0x14, 0x03, 0xA6, 0x02, 0x14, 0x03, 0x95, 0x02, 0x14, 0x03, 0xAF, 0x02, 0x14, 0x03, 0x96, 0x02, 0x14, 0x03, 0x97, 0x02, 0x14, 0x03, 0x98, 0x02, 0x14, 0x03, 0x99, 0x02, 0x14, 0x03, - 0x9A, 0x02, 0x14, 0x03, 0x9B, 0x02, 0x14, 0x03, 0x9C, 0x02, 0x14, 0x03, 0xDE, 0x35, 0x05, 0x00, - 0x06, 0x36, 0x05, 0x00, 0x2E, 0x36, 0x05, 0x00, 0x33, 0x68, 0x56, 0xF8, 0x12, 0x3C, 0x32, 0x68, + 0x9A, 0x02, 0x14, 0x03, 0x9B, 0x02, 0x14, 0x03, 0x9C, 0x02, 0x14, 0x03, 0xFE, 0x75, 0x28, 0x07, + 0x26, 0x76, 0x28, 0x07, 0x4E, 0x76, 0x28, 0x07, 0x33, 0x68, 0x56, 0xF8, 0x12, 0x3C, 0x32, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA6, 0xF1, 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF2, 0xA7, 0x21, - 0xFC, 0xF7, 0xA4, 0xE9, 0xEB, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x36, + 0xFC, 0xF7, 0x96, 0xE9, 0xEB, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x36, 0xBE, 0x42, 0xE9, 0xD1, 0x47, 0x4B, 0xDF, 0xF8, 0x58, 0x81, 0x47, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x45, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x45, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x43, 0x4B, 0x1B, 0x68, 0x43, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x42, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x41, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x40, 0x4B, 0x1B, 0x68, 0x40, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x33, 0x68, 0x56, 0xF8, 0x12, 0x3C, 0x32, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA6, 0xF1, - 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF5, 0x2C, 0x71, 0xFC, 0xF7, 0x68, 0xE9, 0xEB, 0x6E, 0x13, 0xF0, + 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF5, 0x2C, 0x71, 0xFC, 0xF7, 0x5A, 0xE9, 0xEB, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x36, 0xBE, 0x42, 0xE9, 0xD1, 0x33, 0x4A, 0x13, 0x68, 0x23, 0xF0, 0x03, 0x03, 0x13, 0x60, 0xEB, 0x69, 0xD8, 0x04, 0x39, 0xD5, 0x30, 0x49, 0x0B, 0x88, 0x48, 0x88, 0x0E, 0x88, 0x43, 0xEA, 0x00, 0x43, 0x23, 0xF0, 0x03, 0x03, 0x43, 0xF0, 0x02, 0x03, 0x98, 0xB2, 0x1B, 0x0C, 0x08, 0x80, 0x48, 0x88, 0x4B, 0x80, 0x13, 0x68, 0x43, 0xF0, 0x06, 0x03, 0x13, 0x60, 0x13, 0x68, 0x43, 0xF0, 0x01, 0x03, 0x13, 0x60, 0x02, 0xF5, 0xD6, 0x72, 0x13, 0x68, 0x03, 0xF0, 0x0C, 0x03, 0x0C, 0x2B, 0xFA, 0xD1, 0x13, 0x68, 0x99, 0x07, 0x03, 0xD0, 0x01, 0x24, - 0x20, 0x48, 0xFC, 0xF7, 0x34, 0xE9, 0xEB, 0x69, 0xDA, 0x07, 0x0C, 0xD4, 0x1E, 0x4A, 0x13, 0x68, + 0x20, 0x48, 0xFC, 0xF7, 0x26, 0xE9, 0xEB, 0x69, 0xDA, 0x07, 0x0C, 0xD4, 0x1E, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x0C, 0x03, 0x0C, 0x2B, 0xFA, 0xD1, 0x13, 0x68, 0x9B, 0x07, 0x03, 0xD0, 0x01, 0x24, - 0x1A, 0x48, 0xFC, 0xF7, 0x24, 0xE9, 0x15, 0x4A, 0x13, 0x68, 0x23, 0xF0, 0x03, 0x03, 0x13, 0x60, + 0x1A, 0x48, 0xFC, 0xF7, 0x16, 0xE9, 0x15, 0x4A, 0x13, 0x68, 0x23, 0xF0, 0x03, 0x03, 0x13, 0x60, 0x13, 0x4A, 0x13, 0x88, 0x51, 0x88, 0x10, 0x88, 0x84, 0xF0, 0x01, 0x00, 0x43, 0xEA, 0x01, 0x43, 0x23, 0xF0, 0x03, 0x03, 0x99, 0xB2, 0x1B, 0x0C, 0x11, 0x80, 0x51, 0x88, 0x53, 0x80, 0xBD, 0xE8, 0xF0, 0x81, 0x00, 0xBF, 0x9D, 0x02, 0x14, 0x03, 0xB8, 0x02, 0x14, 0x03, 0x9E, 0x02, 0x14, 0x03, 0x9F, 0x02, 0x14, 0x03, 0xA0, 0x02, 0x14, 0x03, 0xA1, 0x02, 0x14, 0x03, 0xA2, 0x02, 0x14, 0x03, 0xA3, 0x02, 0x14, 0x03, 0xA4, 0x02, 0x14, 0x03, 0xA5, 0x02, 0x14, 0x03, 0x64, 0x00, 0x14, 0x03, - 0x66, 0x00, 0x14, 0x03, 0x95, 0x35, 0x05, 0x00, 0x90, 0x02, 0x14, 0x03, 0xB9, 0x35, 0x05, 0x00, - 0x56, 0x36, 0x05, 0x00, 0x9C, 0x4A, 0x2D, 0xE9, 0xF0, 0x41, 0x06, 0x46, 0x19, 0x32, 0x12, 0xF8, + 0x66, 0x00, 0x14, 0x03, 0xB5, 0x75, 0x28, 0x07, 0x90, 0x02, 0x14, 0x03, 0xD9, 0x75, 0x28, 0x07, + 0x76, 0x76, 0x28, 0x07, 0x9C, 0x4A, 0x2D, 0xE9, 0xF0, 0x41, 0x06, 0x46, 0x19, 0x32, 0x12, 0xF8, 0x19, 0x3C, 0x00, 0x23, 0x02, 0xF8, 0x19, 0x3C, 0x12, 0xF8, 0x18, 0x1C, 0x02, 0xF8, 0x18, 0x3C, 0x12, 0xF8, 0x17, 0x1C, 0x02, 0xF8, 0x17, 0x3C, 0x12, 0xF8, 0x16, 0x1C, 0x02, 0xF8, 0x16, 0x3C, 0x32, 0xF8, 0x18, 0x1C, 0x22, 0xF8, 0x18, 0x3C, 0x32, 0xF8, 0x16, 0x1C, 0x22, 0xF8, 0x16, 0x3C, @@ -1092,23 +1094,23 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x0C, 0x03, 0x43, 0xF0, 0x08, 0x03, 0x99, 0xB2, 0x1B, 0x0C, 0x11, 0x80, 0x51, 0x88, 0x53, 0x80, 0x82, 0x4B, 0x1A, 0x68, 0x42, 0xF0, 0x10, 0x02, 0x1A, 0x60, 0x1A, 0x68, 0x42, 0xF0, 0x20, 0x02, 0x1A, 0x60, 0x7F, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x03, 0x03, 0x03, 0x2B, 0xFA, 0xD1, 0x14, 0x68, - 0x14, 0xF0, 0x0C, 0x04, 0x03, 0xD0, 0x01, 0x24, 0x7A, 0x48, 0xFC, 0xF7, 0xA0, 0xE8, 0xF3, 0x69, + 0x14, 0xF0, 0x0C, 0x04, 0x03, 0xD0, 0x01, 0x24, 0x7A, 0x48, 0xFC, 0xF7, 0x92, 0xE8, 0xF3, 0x69, 0xDD, 0x07, 0x0D, 0xD4, 0x78, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x03, 0x03, 0x03, 0x2B, 0xFA, 0xD1, - 0x13, 0x68, 0x13, 0xF0, 0x0C, 0x0F, 0x03, 0xD0, 0x01, 0x24, 0x74, 0x48, 0xFC, 0xF7, 0x8E, 0xE8, + 0x13, 0x68, 0x13, 0xF0, 0x0C, 0x0F, 0x03, 0xD0, 0x01, 0x24, 0x74, 0x48, 0xFC, 0xF7, 0x80, 0xE8, 0x73, 0x4B, 0x74, 0x4D, 0xDF, 0xF8, 0x70, 0x82, 0x1B, 0x68, 0x73, 0x4B, 0x73, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x72, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x71, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x70, 0x4B, 0x1B, 0x68, 0x70, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x6E, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x6E, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x6C, 0x4B, 0x1B, 0x68, 0x2B, 0x68, 0x55, 0xF8, 0x12, 0x3C, 0x2A, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA5, 0xF1, 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF2, 0x4F, 0x21, - 0xFC, 0xF7, 0x5C, 0xE8, 0xF3, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x35, + 0xFC, 0xF7, 0x4E, 0xE8, 0xF3, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x35, 0xBD, 0x42, 0xE9, 0xD1, 0x61, 0x4B, 0xDF, 0xF8, 0x04, 0x82, 0x61, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x5F, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x5F, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x5D, 0x4B, 0x1B, 0x68, 0x5D, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x5C, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x5B, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x5A, 0x4B, 0x1B, 0x68, 0x5A, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x2B, 0x68, 0x55, 0xF8, 0x12, 0x3C, 0x2A, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA5, 0xF1, - 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF5, 0x16, 0x71, 0xFC, 0xF7, 0x20, 0xE8, 0xF3, 0x6E, 0x13, 0xF0, + 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF5, 0x16, 0x71, 0xFC, 0xF7, 0x12, 0xE8, 0xF3, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x35, 0xBD, 0x42, 0xE9, 0xD1, 0xF3, 0x69, 0xD8, 0x07, 0x00, 0xF1, 0xE0, 0x80, 0x4B, 0x4B, 0x4C, 0x4D, 0xDF, 0xF8, 0x84, 0x81, 0x1B, 0x68, 0x4B, 0x4B, 0x4B, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x4A, 0x4B, 0x1A, 0x88, 0x5B, 0x88, @@ -1116,14 +1118,14 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x46, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x46, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x44, 0x4B, 0x1B, 0x68, 0x2B, 0x68, 0x55, 0xF8, 0x12, 0x3C, 0x2A, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA5, 0xF1, 0x45, 0x71, 0x40, 0x46, - 0xA1, 0xF2, 0xCF, 0x21, 0xFB, 0xF7, 0xE2, 0xEF, 0xF3, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, + 0xA1, 0xF2, 0xCF, 0x21, 0xFB, 0xF7, 0xD4, 0xEF, 0xF3, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x35, 0xBD, 0x42, 0xE9, 0xD1, 0x39, 0x4B, 0xDF, 0xF8, 0x18, 0x81, 0x39, 0x4F, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x37, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x37, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x35, 0x4B, 0x1B, 0x68, 0x35, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x34, 0x4B, 0x1A, 0x88, 0x5B, 0x88, 0x33, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x32, 0x4B, 0x1B, 0x68, 0x32, 0x4B, 0x1A, 0x78, 0x5A, 0x78, 0x9A, 0x78, 0xDB, 0x78, 0x68, 0xE0, 0x00, 0xBF, 0x4D, 0x00, 0x14, 0x03, 0x64, 0x00, 0x14, 0x03, - 0x38, 0x02, 0x14, 0x03, 0x7E, 0x36, 0x05, 0x00, 0xB8, 0x02, 0x14, 0x03, 0xA3, 0x36, 0x05, 0x00, + 0x38, 0x02, 0x14, 0x03, 0x9E, 0x76, 0x28, 0x07, 0xB8, 0x02, 0x14, 0x03, 0xC3, 0x76, 0x28, 0x07, 0x3C, 0x02, 0x14, 0x03, 0x4E, 0x02, 0x14, 0x03, 0x3D, 0x02, 0x14, 0x03, 0x57, 0x02, 0x14, 0x03, 0x3E, 0x02, 0x14, 0x03, 0x3F, 0x02, 0x14, 0x03, 0x40, 0x02, 0x14, 0x03, 0x41, 0x02, 0x14, 0x03, 0x42, 0x02, 0x14, 0x03, 0x43, 0x02, 0x14, 0x03, 0x44, 0x02, 0x14, 0x03, 0x45, 0x02, 0x14, 0x03, @@ -1134,23 +1136,23 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0xC1, 0x02, 0x14, 0x03, 0xC2, 0x02, 0x14, 0x03, 0xC3, 0x02, 0x14, 0x03, 0xC4, 0x02, 0x14, 0x03, 0xC5, 0x02, 0x14, 0x03, 0xE0, 0x02, 0x14, 0x03, 0xC6, 0x02, 0x14, 0x03, 0xC7, 0x02, 0x14, 0x03, 0xC8, 0x02, 0x14, 0x03, 0xC9, 0x02, 0x14, 0x03, 0xCA, 0x02, 0x14, 0x03, 0xCB, 0x02, 0x14, 0x03, - 0xCC, 0x02, 0x14, 0x03, 0xCD, 0x02, 0x14, 0x03, 0xC9, 0x36, 0x05, 0x00, 0xF2, 0x36, 0x05, 0x00, - 0x1B, 0x37, 0x05, 0x00, 0x44, 0x37, 0x05, 0x00, 0x2B, 0x68, 0x55, 0xF8, 0x12, 0x3C, 0x2A, 0x68, + 0xCC, 0x02, 0x14, 0x03, 0xCD, 0x02, 0x14, 0x03, 0xE9, 0x76, 0x28, 0x07, 0x12, 0x77, 0x28, 0x07, + 0x3B, 0x77, 0x28, 0x07, 0x64, 0x77, 0x28, 0x07, 0x2B, 0x68, 0x55, 0xF8, 0x12, 0x3C, 0x2A, 0x68, 0xD2, 0x1A, 0x06, 0x2A, 0x0B, 0xD8, 0xA5, 0xF1, 0x45, 0x71, 0x40, 0x46, 0xA1, 0xF5, 0x36, 0x71, - 0xFB, 0xF7, 0x3C, 0xEF, 0xF3, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x35, + 0xFB, 0xF7, 0x2E, 0xEF, 0xF3, 0x6E, 0x13, 0xF0, 0x80, 0x5F, 0x08, 0xBF, 0x01, 0x24, 0x01, 0x35, 0xBD, 0x42, 0xE9, 0xD1, 0x2A, 0x4A, 0x13, 0x68, 0x23, 0xF0, 0x60, 0x03, 0x13, 0x60, 0xF3, 0x69, 0xD9, 0x04, 0x3B, 0xD5, 0x27, 0x49, 0x0B, 0x88, 0x48, 0x88, 0x0D, 0x88, 0x43, 0xEA, 0x00, 0x43, 0x23, 0xF0, 0x0C, 0x03, 0x43, 0xF0, 0x04, 0x03, 0x98, 0xB2, 0x1B, 0x0C, 0x08, 0x80, 0x48, 0x88, 0x4B, 0x80, 0x13, 0x68, 0x43, 0xF0, 0x10, 0x03, 0x13, 0x60, 0x13, 0x68, 0x43, 0xF0, 0x20, 0x03, 0x13, 0x60, 0x02, 0xF5, 0xEA, 0x72, 0x13, 0x68, 0x03, 0xF0, 0x03, 0x03, 0x03, 0x2B, 0xFA, 0xD1, - 0x13, 0x68, 0x13, 0xF0, 0x0C, 0x0F, 0x03, 0xD0, 0x01, 0x24, 0x17, 0x48, 0xFB, 0xF7, 0x06, 0xEF, + 0x13, 0x68, 0x13, 0xF0, 0x0C, 0x0F, 0x03, 0xD0, 0x01, 0x24, 0x17, 0x48, 0xFB, 0xF7, 0xF8, 0xEE, 0xF3, 0x69, 0xDB, 0x07, 0x0D, 0xD4, 0x15, 0x4A, 0x13, 0x68, 0x03, 0xF0, 0x03, 0x03, 0x03, 0x2B, 0xFA, 0xD1, 0x13, 0x68, 0x13, 0xF0, 0x0C, 0x0F, 0x03, 0xD0, 0x01, 0x24, 0x10, 0x48, 0xFB, 0xF7, - 0xF6, 0xEE, 0x0B, 0x4A, 0x13, 0x68, 0x23, 0xF0, 0x60, 0x03, 0x13, 0x60, 0x09, 0x4A, 0x13, 0x88, + 0xE8, 0xEE, 0x0B, 0x4A, 0x13, 0x68, 0x23, 0xF0, 0x60, 0x03, 0x13, 0x60, 0x09, 0x4A, 0x13, 0x88, 0x51, 0x88, 0x10, 0x88, 0x84, 0xF0, 0x01, 0x00, 0x43, 0xEA, 0x01, 0x43, 0x23, 0xF0, 0x0C, 0x03, 0x99, 0xB2, 0x1B, 0x0C, 0x11, 0x80, 0x51, 0x88, 0x53, 0x80, 0xBD, 0xE8, 0xF0, 0x81, 0x00, 0xBF, - 0x64, 0x00, 0x14, 0x03, 0x66, 0x00, 0x14, 0x03, 0x7E, 0x36, 0x05, 0x00, 0xB8, 0x02, 0x14, 0x03, - 0xA3, 0x36, 0x05, 0x00, 0x1B, 0x4A, 0x13, 0x68, 0x43, 0xF0, 0x20, 0x03, 0x13, 0x60, 0x1A, 0x4B, + 0x64, 0x00, 0x14, 0x03, 0x66, 0x00, 0x14, 0x03, 0x9E, 0x76, 0x28, 0x07, 0xB8, 0x02, 0x14, 0x03, + 0xC3, 0x76, 0x28, 0x07, 0x1B, 0x4A, 0x13, 0x68, 0x43, 0xF0, 0x20, 0x03, 0x13, 0x60, 0x1A, 0x4B, 0x1A, 0x78, 0x59, 0x78, 0x99, 0x78, 0xD2, 0x07, 0xD9, 0x78, 0xF9, 0xD5, 0x15, 0x4A, 0x4F, 0xF0, 0xFF, 0x31, 0x13, 0x68, 0xD1, 0x32, 0x23, 0xF0, 0x20, 0x03, 0x42, 0xF8, 0xD1, 0x3C, 0x13, 0x78, 0x11, 0x70, 0x53, 0x78, 0x00, 0x23, 0x53, 0x70, 0x90, 0x78, 0x93, 0x70, 0xD0, 0x78, 0xD3, 0x70, @@ -1366,7 +1368,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x00, 0x00, 0x13, 0x03, 0x43, 0x68, 0x03, 0xF0, 0x0F, 0x03, 0x04, 0x3B, 0x04, 0x2B, 0x96, 0xBF, 0x09, 0x4A, 0x0A, 0x49, 0x52, 0xF8, 0x23, 0x10, 0xC3, 0x69, 0xDA, 0x0A, 0x1B, 0x03, 0x02, 0xF0, 0x0E, 0x02, 0x03, 0xF4, 0x80, 0x53, 0x01, 0x32, 0x43, 0xF0, 0x40, 0x43, 0x43, 0xEA, 0x02, 0x63, - 0x03, 0x4A, 0x0B, 0x43, 0x13, 0x60, 0x70, 0x47, 0xA0, 0x33, 0x05, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x03, 0x4A, 0x0B, 0x43, 0x13, 0x60, 0x70, 0x47, 0xC0, 0x73, 0x28, 0x07, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0x03, 0x10, 0xB5, 0x04, 0x46, 0xFF, 0xF7, 0xDC, 0xFF, 0x43, 0x68, 0x04, 0x2B, 0x01, 0xD1, 0xFF, 0xF7, 0xCB, 0xFF, 0x63, 0x68, 0x03, 0x3B, 0x01, 0x2B, 0x02, 0xD8, 0x20, 0x46, 0xFF, 0xF7, 0xB4, 0xFF, 0x20, 0x46, 0xFF, 0xF7, 0x5D, 0xFF, 0xFF, 0xF7, 0x55, 0xFE, 0xFF, 0xF7, @@ -1377,16 +1379,16 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x9A, 0x22, 0x02, 0xF5, 0xB0, 0x72, 0x13, 0x68, 0x43, 0xF0, 0x01, 0x03, 0x13, 0x60, 0x18, 0x4A, 0x13, 0x68, 0x23, 0xF4, 0x7F, 0x43, 0x23, 0xF0, 0x08, 0x03, 0x43, 0xF4, 0x40, 0x53, 0x13, 0x60, 0x83, 0x6F, 0xDB, 0x00, 0x09, 0xD5, 0x13, 0x68, 0x12, 0x48, 0x23, 0xF0, 0x0F, 0x03, 0x43, 0xF0, - 0x01, 0x03, 0x13, 0x60, 0x11, 0x68, 0xFA, 0xF7, 0xBA, 0xEF, 0x0F, 0x4A, 0x13, 0x68, 0x23, 0xF0, + 0x01, 0x03, 0x13, 0x60, 0x11, 0x68, 0xFA, 0xF7, 0xAC, 0xEF, 0x0F, 0x4A, 0x13, 0x68, 0x23, 0xF0, 0xEE, 0x43, 0x43, 0xF0, 0x4C, 0x53, 0x13, 0x60, 0xD3, 0x69, 0x1B, 0x0C, 0x1B, 0x04, 0x43, 0xF4, 0x00, 0x63, 0x43, 0xF0, 0x08, 0x03, 0xD3, 0x61, 0x13, 0x69, 0x03, 0xF4, 0x7F, 0x03, 0x43, 0xF0, 0xF8, 0x53, 0x43, 0xF0, 0x30, 0x03, 0x13, 0x61, 0x08, 0xBD, 0x00, 0xBF, 0xA8, 0x3E, 0x02, 0x02, - 0x50, 0x02, 0x13, 0x03, 0x6D, 0x37, 0x05, 0x00, 0x54, 0x02, 0x13, 0x03, 0x2D, 0xE9, 0xF0, 0x41, + 0x50, 0x02, 0x13, 0x03, 0x8D, 0x77, 0x28, 0x07, 0x54, 0x02, 0x13, 0x03, 0x2D, 0xE9, 0xF0, 0x41, 0x80, 0x46, 0x2C, 0x4D, 0x05, 0x20, 0x2C, 0x4E, 0x2B, 0x68, 0x2C, 0x4F, 0x2C, 0x4C, 0x23, 0xF0, 0x00, 0x43, 0x43, 0xF0, 0x00, 0x63, 0x2B, 0x60, 0x2B, 0x68, 0x23, 0xF0, 0x80, 0x43, 0x43, 0xF0, 0x00, 0x63, 0x2B, 0x60, 0x33, 0x68, 0x23, 0xF0, 0x01, 0x03, 0x33, 0x60, 0x33, 0x68, 0x23, 0xF4, 0x80, 0x33, 0x33, 0x60, 0x3B, 0x68, 0x23, 0xF0, 0x00, 0x43, 0x3B, 0x60, 0x23, 0x68, 0x23, 0xF0, - 0x00, 0x43, 0x23, 0x60, 0xFA, 0xF7, 0xB8, 0xEF, 0xD8, 0xF8, 0x00, 0x00, 0x42, 0x46, 0x39, 0x46, + 0x00, 0x43, 0x23, 0x60, 0xFA, 0xF7, 0xAC, 0xEF, 0xD8, 0xF8, 0x00, 0x00, 0x42, 0x46, 0x39, 0x46, 0x40, 0x00, 0xFC, 0xF7, 0x4D, 0xFD, 0x23, 0x68, 0x05, 0x20, 0x43, 0xF0, 0x30, 0x63, 0x23, 0x60, 0x23, 0x68, 0x23, 0xF0, 0x1F, 0x03, 0x43, 0xF0, 0x03, 0x02, 0x43, 0xF0, 0x00, 0x63, 0x43, 0xF0, 0x03, 0x03, 0x22, 0x60, 0x23, 0x60, 0x33, 0x68, 0x43, 0xF4, 0x80, 0x33, 0x33, 0x60, 0x33, 0x68, @@ -1428,7 +1430,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x47, 0xF0, 0x80, 0x53, 0xD0, 0xE9, 0x06, 0x96, 0xC3, 0x66, 0x48, 0xF0, 0x01, 0x03, 0x83, 0x67, 0x43, 0x68, 0x04, 0x2B, 0x0C, 0xBF, 0x46, 0xF2, 0xB7, 0x03, 0x42, 0xF2, 0xB7, 0x03, 0x83, 0x61, 0x4F, 0xF4, 0xE0, 0x43, 0xC3, 0x61, 0xFF, 0xF7, 0xF5, 0xFE, 0x05, 0x46, 0x88, 0xB1, 0x4C, 0x48, - 0x36, 0x0C, 0x4F, 0xF0, 0x01, 0x0A, 0xFA, 0xF7, 0x22, 0xEE, 0xE3, 0x69, 0x36, 0x04, 0xC4, 0xF8, + 0x36, 0x0C, 0x4F, 0xF0, 0x01, 0x0A, 0xFA, 0xF7, 0x14, 0xEE, 0xE3, 0x69, 0x36, 0x04, 0xC4, 0xF8, 0x78, 0x80, 0xC4, 0xF8, 0x18, 0x90, 0x1E, 0x43, 0xE7, 0x66, 0xE6, 0x61, 0x50, 0x46, 0xBD, 0xE8, 0xF0, 0x87, 0xA3, 0x6F, 0x9A, 0x07, 0x0A, 0xD5, 0x20, 0x46, 0xFD, 0xF7, 0xBF, 0xFF, 0x01, 0x28, 0x08, 0xBF, 0x0A, 0x25, 0x01, 0x35, 0x09, 0x2D, 0xF6, 0xD9, 0x00, 0x28, 0xDF, 0xD1, 0x4F, 0xF4, @@ -1447,8 +1449,8 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0xE3, 0x61, 0xFF, 0xF7, 0x6F, 0xFE, 0x82, 0x46, 0x08, 0xB1, 0x0E, 0x48, 0x78, 0xE7, 0xA3, 0x6F, 0x9B, 0x07, 0x83, 0xD5, 0x05, 0x46, 0x20, 0x46, 0xFD, 0xF7, 0x48, 0xFF, 0x01, 0x28, 0x08, 0xBF, 0x0A, 0x25, 0x01, 0x35, 0x09, 0x2D, 0xF6, 0xD9, 0x00, 0x28, 0x3F, 0xF4, 0x77, 0xAF, 0xEC, 0xE7, - 0x89, 0x37, 0x05, 0x00, 0xB6, 0x37, 0x05, 0x00, 0xE3, 0x37, 0x05, 0x00, 0x10, 0x38, 0x05, 0x00, - 0x3E, 0x38, 0x05, 0x00, 0x6C, 0x38, 0x05, 0x00, 0x2D, 0xE9, 0xF8, 0x4F, 0x04, 0x46, 0x83, 0x6F, + 0xA9, 0x77, 0x28, 0x07, 0xD6, 0x77, 0x28, 0x07, 0x03, 0x78, 0x28, 0x07, 0x30, 0x78, 0x28, 0x07, + 0x5E, 0x78, 0x28, 0x07, 0x8C, 0x78, 0x28, 0x07, 0x2D, 0xE9, 0xF8, 0x4F, 0x04, 0x46, 0x83, 0x6F, 0xD0, 0xF8, 0x00, 0xA0, 0x13, 0xF0, 0x04, 0x06, 0x1E, 0xBF, 0x23, 0xF0, 0x04, 0x03, 0x01, 0x26, 0x83, 0x67, 0x83, 0x6F, 0xD8, 0x04, 0x05, 0xD5, 0xBA, 0xF5, 0xB4, 0x7F, 0x84, 0xBF, 0x4F, 0xF4, 0xB4, 0x72, 0x22, 0x60, 0x13, 0xF4, 0x00, 0x65, 0x55, 0xD0, 0x4F, 0xF4, 0xB4, 0x72, 0xD4, 0xF8, @@ -1468,9 +1470,9 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x20, 0x46, 0xFF, 0xF7, 0xC7, 0xFD, 0x00, 0x28, 0xBD, 0xD0, 0x20, 0x46, 0xFC, 0xF7, 0x46, 0xFA, 0xA3, 0x6F, 0xB0, 0xF5, 0x80, 0x5F, 0x23, 0xF4, 0x00, 0x23, 0xA3, 0x67, 0x3B, 0xD1, 0x4F, 0xF0, 0x20, 0x43, 0x4F, 0xF0, 0xA0, 0x32, 0x1A, 0x60, 0xBF, 0xF3, 0x4F, 0x8F, 0x1B, 0x68, 0x93, 0x42, - 0x07, 0xD0, 0xA1, 0x6F, 0x3C, 0x48, 0x41, 0xF4, 0x80, 0x31, 0xA1, 0x67, 0xFA, 0xF7, 0xDE, 0xEC, + 0x07, 0xD0, 0xA1, 0x6F, 0x3C, 0x48, 0x41, 0xF4, 0x80, 0x31, 0xA1, 0x67, 0xFA, 0xF7, 0xD0, 0xEC, 0x0D, 0xE0, 0x4F, 0xF0, 0x70, 0x33, 0x4F, 0xF0, 0xE0, 0x4B, 0xCB, 0xF8, 0x00, 0x30, 0x01, 0x20, - 0xFA, 0xF7, 0x1A, 0xED, 0xDB, 0xF8, 0x00, 0x30, 0xB3, 0xF1, 0x70, 0x3F, 0xE9, 0xD1, 0xA3, 0x6F, + 0xFA, 0xF7, 0x0E, 0xED, 0xDB, 0xF8, 0x00, 0x30, 0xB3, 0xF1, 0x70, 0x3F, 0xE9, 0xD1, 0xA3, 0x6F, 0x99, 0x01, 0x09, 0xD5, 0xE2, 0x69, 0xC2, 0xF3, 0x02, 0x32, 0x01, 0x2A, 0x3D, 0xD1, 0x65, 0x61, 0xC4, 0xE9, 0x1C, 0x87, 0xC4, 0xF8, 0x7C, 0x90, 0x1A, 0x05, 0xC4, 0xF8, 0x00, 0xA0, 0x42, 0xBF, 0x65, 0x61, 0xC4, 0xF8, 0x7C, 0x90, 0xC4, 0xE9, 0x1C, 0x87, 0x00, 0x2E, 0x38, 0xD0, 0x43, 0xF0, @@ -1478,31 +1480,31 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x4F, 0xF0, 0x70, 0x32, 0x1A, 0x60, 0xBF, 0xF3, 0x4F, 0x8F, 0x1B, 0x68, 0x93, 0x42, 0x05, 0xD0, 0xA1, 0x6F, 0x41, 0xF4, 0x00, 0x31, 0xA1, 0x67, 0x1C, 0x48, 0xBF, 0xE7, 0x4F, 0xF0, 0x20, 0x4B, 0x4F, 0xF0, 0xA0, 0x33, 0xCB, 0xF8, 0x00, 0x30, 0x4F, 0xF0, 0x80, 0x32, 0x4F, 0xF0, 0x00, 0x43, - 0x01, 0x20, 0x1A, 0x60, 0xFA, 0xF7, 0xD8, 0xEC, 0xDB, 0xF8, 0x00, 0x30, 0xB3, 0xF1, 0xA0, 0x3F, + 0x01, 0x20, 0x1A, 0x60, 0xFA, 0xF7, 0xCC, 0xEC, 0xDB, 0xF8, 0x00, 0x30, 0xB3, 0xF1, 0xA0, 0x3F, 0xBD, 0xD0, 0xA1, 0x6F, 0x41, 0xF4, 0xA0, 0x21, 0xE5, 0xE7, 0x00, 0x2A, 0xC4, 0xD1, 0x22, 0x6D, 0x62, 0x61, 0xE2, 0x6D, 0x22, 0x67, 0x22, 0x6E, 0x62, 0x67, 0x62, 0x6D, 0xE2, 0x67, 0xBB, 0xE7, 0x01, 0x26, 0x41, 0xE7, 0x92, 0x90, 0x92, 0x92, 0x1A, 0x14, 0x1C, 0x20, 0x1C, 0x1A, 0x15, 0x14, 0x17, 0x18, 0x17, 0x18, 0x2B, 0x28, 0x28, 0x2A, 0x9A, 0x98, 0x9A, 0x9A, 0x0C, 0x0A, 0x0D, 0x0E, - 0x0D, 0x0A, 0x0B, 0x0C, 0x0A, 0x07, 0x0F, 0x0E, 0x9A, 0x38, 0x05, 0x00, 0xCB, 0x38, 0x05, 0x00, + 0x0D, 0x0A, 0x0B, 0x0C, 0x0A, 0x07, 0x0F, 0x0E, 0xBA, 0x78, 0x28, 0x07, 0xEB, 0x78, 0x28, 0x07, 0x19, 0x16, 0x13, 0x0E, 0x2D, 0xE9, 0xF8, 0x43, 0x05, 0x46, 0xFD, 0xF7, 0xEF, 0xFB, 0x00, 0x27, 0x28, 0x46, 0x6D, 0x4A, 0x01, 0x24, 0x29, 0x68, 0x6C, 0x4E, 0x13, 0x68, 0xB1, 0xF5, 0x34, 0x7F, 0x23, 0xF0, 0xF8, 0x53, 0x2C, 0xBF, 0x43, 0xF0, 0x40, 0x63, 0x43, 0xF0, 0xD8, 0x53, 0x13, 0x60, 0xFC, 0xF7, 0x50, 0xFA, 0x37, 0x60, 0x29, 0x46, 0x38, 0x46, 0xFE, 0xF7, 0xAF, 0xFD, 0x34, 0x60, 0xEB, 0x6E, 0x13, 0xF4, 0x80, 0x16, 0x11, 0xD0, 0x18, 0x03, 0x72, 0xD5, 0x28, 0x46, 0xFD, 0xF7, 0x07, 0xFD, 0x01, 0x28, 0x04, 0x46, 0x08, 0xBF, 0x05, 0x27, 0x01, 0x37, 0x04, 0x2F, 0xF5, 0xD9, - 0x00, 0x2C, 0x6B, 0xD1, 0x01, 0x26, 0x5A, 0x48, 0xFA, 0xF7, 0x30, 0xEC, 0xEB, 0x6E, 0x13, 0xF4, + 0x00, 0x2C, 0x6B, 0xD1, 0x01, 0x26, 0x5A, 0x48, 0xFA, 0xF7, 0x22, 0xEC, 0xEB, 0x6E, 0x13, 0xF4, 0x00, 0x17, 0x0F, 0xD0, 0x19, 0x03, 0x63, 0xD5, 0x00, 0x27, 0x28, 0x46, 0xFD, 0xF7, 0xD6, 0xFD, 0x01, 0x28, 0x04, 0x46, 0x08, 0xBF, 0x05, 0x27, 0x01, 0x37, 0x04, 0x2F, 0xF5, 0xD9, 0xB4, 0xFA, 0x84, 0xF7, 0x7F, 0x09, 0xEB, 0x6E, 0x13, 0xF4, 0x80, 0x09, 0x18, 0xD0, 0x01, 0x2F, 0x59, 0xD0, 0x1A, 0x03, 0x52, 0xD5, 0xB8, 0x46, 0x28, 0x46, 0xFE, 0xF7, 0xBA, 0xF8, 0x01, 0x28, 0x04, 0x46, 0x08, 0xBF, 0x4F, 0xF0, 0x05, 0x08, 0x08, 0xF1, 0x01, 0x08, 0xB8, 0xF1, 0x04, 0x0F, 0xF2, 0xD9, - 0x00, 0x2C, 0x4A, 0xD1, 0x4F, 0xF0, 0x01, 0x09, 0x42, 0x48, 0xFA, 0xF7, 0x00, 0xEC, 0xEB, 0x6E, + 0x00, 0x2C, 0x4A, 0xD1, 0x4F, 0xF0, 0x01, 0x09, 0x42, 0x48, 0xFA, 0xF7, 0xF2, 0xEB, 0xEB, 0x6E, 0x13, 0xF4, 0x00, 0x02, 0x16, 0xD0, 0x01, 0x2F, 0x46, 0xD0, 0x1B, 0x03, 0x3F, 0xD5, 0xB8, 0x46, 0x28, 0x46, 0xFE, 0xF7, 0x07, 0xFB, 0x01, 0x28, 0x04, 0x46, 0x08, 0xBF, 0x4F, 0xF0, 0x05, 0x08, 0x08, 0xF1, 0x01, 0x08, 0xB8, 0xF1, 0x04, 0x0F, 0xF2, 0xD9, 0xBC, 0xBB, 0x36, 0x48, 0xFA, 0xF7, - 0xE6, 0xEB, 0x01, 0x22, 0xEB, 0x6E, 0x3E, 0x43, 0x46, 0xEA, 0x09, 0x06, 0x16, 0x43, 0x13, 0xF4, + 0xD8, 0xEB, 0x01, 0x22, 0xEB, 0x6E, 0x3E, 0x43, 0x46, 0xEA, 0x09, 0x06, 0x16, 0x43, 0x13, 0xF4, 0x00, 0x23, 0x54, 0xD0, 0x8E, 0xB3, 0x31, 0x4E, 0x00, 0x27, 0x33, 0x68, 0x01, 0x33, 0x0A, 0x2B, - 0x33, 0x60, 0x25, 0xD1, 0x3C, 0x46, 0x2E, 0x48, 0xFA, 0xF7, 0xD0, 0xEB, 0x20, 0x46, 0xBD, 0xE8, + 0x33, 0x60, 0x25, 0xD1, 0x3C, 0x46, 0x2E, 0x48, 0xFA, 0xF7, 0xC2, 0xEB, 0x20, 0x46, 0xBD, 0xE8, 0xF8, 0x83, 0x28, 0x46, 0xFD, 0xF7, 0x94, 0xFC, 0x04, 0x46, 0x91, 0xE7, 0x00, 0x26, 0x95, 0xE7, 0x28, 0x46, 0xFD, 0xF7, 0x73, 0xFD, 0x04, 0x46, 0xA1, 0xE7, 0x28, 0x46, 0xFE, 0xF7, 0x68, 0xF8, 0x04, 0x46, 0xB5, 0xE7, 0x4F, 0xF0, 0x00, 0x09, 0xB9, 0xE7, 0xB9, 0x46, 0xB7, 0xE7, 0x28, 0x46, @@ -1513,8 +1515,8 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0xFD, 0xF7, 0x3A, 0xFE, 0x30, 0x40, 0x03, 0x21, 0x04, 0x40, 0x28, 0x46, 0xFD, 0xF7, 0x34, 0xFE, 0x00, 0x21, 0x04, 0x40, 0x28, 0x46, 0xFD, 0xF7, 0x2F, 0xFE, 0x04, 0x40, 0xB6, 0xE7, 0x00, 0x2E, 0xDB, 0xD0, 0x1C, 0x46, 0xB2, 0xE7, 0x00, 0xBF, 0x14, 0x00, 0x14, 0x03, 0x20, 0x03, 0x13, 0x03, - 0xFE, 0x38, 0x05, 0x00, 0x15, 0x39, 0x05, 0x00, 0x2B, 0x39, 0x05, 0x00, 0x60, 0x3A, 0x05, 0x00, - 0x42, 0x39, 0x05, 0x00, 0x10, 0xB5, 0x04, 0x46, 0xFD, 0xF7, 0xEE, 0xFA, 0x20, 0x46, 0xBD, 0xE8, + 0x1E, 0x79, 0x28, 0x07, 0x35, 0x79, 0x28, 0x07, 0x4B, 0x79, 0x28, 0x07, 0x80, 0x7A, 0x28, 0x07, + 0x62, 0x79, 0x28, 0x07, 0x10, 0xB5, 0x04, 0x46, 0xFD, 0xF7, 0xEE, 0xFA, 0x20, 0x46, 0xBD, 0xE8, 0x10, 0x40, 0xFF, 0xF7, 0x07, 0xBF, 0x00, 0x00, 0x11, 0x4A, 0x38, 0xB5, 0x04, 0x46, 0x11, 0x49, 0x13, 0x68, 0x43, 0xF4, 0x00, 0x73, 0x13, 0x60, 0x0B, 0x68, 0x23, 0xF0, 0x80, 0x73, 0x43, 0xF0, 0x02, 0x23, 0x0B, 0x60, 0x13, 0x68, 0x43, 0xF4, 0x00, 0x43, 0x13, 0x60, 0xFF, 0xF7, 0x76, 0xFB, @@ -1522,26 +1524,26 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0xD9, 0xFF, 0x05, 0x46, 0x20, 0x46, 0xFE, 0xF7, 0xBB, 0xFC, 0x28, 0x46, 0x38, 0xBD, 0x00, 0xBF, 0x20, 0x00, 0x12, 0x03, 0x08, 0x00, 0x12, 0x03, 0x38, 0x00, 0x13, 0x03, 0x2D, 0xE9, 0xF3, 0x41, 0x0C, 0x46, 0x8F, 0x6F, 0x48, 0x48, 0x17, 0xF4, 0x00, 0x07, 0x14, 0xBF, 0xD1, 0xE9, 0x1C, 0x78, - 0xB8, 0x46, 0x46, 0x49, 0xFA, 0xF7, 0x32, 0xEB, 0x45, 0x4A, 0x20, 0x46, 0x13, 0x68, 0x43, 0xF4, + 0xB8, 0x46, 0x46, 0x49, 0xFA, 0xF7, 0x24, 0xEB, 0x45, 0x4A, 0x20, 0x46, 0x13, 0x68, 0x43, 0xF4, 0x80, 0x73, 0x13, 0x60, 0x93, 0x68, 0x23, 0xF0, 0x3F, 0x03, 0x93, 0x60, 0xFC, 0xF7, 0xA2, 0xF8, 0x18, 0xB9, 0x00, 0x20, 0x02, 0xB0, 0xBD, 0xE8, 0xF0, 0x81, 0xA3, 0x6F, 0xDD, 0x07, 0x12, 0xD5, - 0xE3, 0x6D, 0x00, 0x2B, 0x15, 0xDA, 0x21, 0x68, 0x3A, 0x48, 0xFA, 0xF7, 0x18, 0xEB, 0x61, 0x68, - 0x39, 0x48, 0xFA, 0xF7, 0x14, 0xEB, 0x20, 0x46, 0xFF, 0xF7, 0xDC, 0xFB, 0xB0, 0xB9, 0x37, 0x48, - 0xFA, 0xF7, 0x0C, 0xEB, 0xE5, 0xE7, 0x20, 0x46, 0xFF, 0xF7, 0x86, 0xFD, 0x00, 0x28, 0xE7, 0xD1, + 0xE3, 0x6D, 0x00, 0x2B, 0x15, 0xDA, 0x21, 0x68, 0x3A, 0x48, 0xFA, 0xF7, 0x0A, 0xEB, 0x61, 0x68, + 0x39, 0x48, 0xFA, 0xF7, 0x06, 0xEB, 0x20, 0x46, 0xFF, 0xF7, 0xDC, 0xFB, 0xB0, 0xB9, 0x37, 0x48, + 0xFA, 0xF7, 0xFE, 0xEA, 0xE5, 0xE7, 0x20, 0x46, 0xFF, 0xF7, 0x86, 0xFD, 0x00, 0x28, 0xE7, 0xD1, 0xDF, 0xE7, 0xA3, 0x6F, 0x18, 0x05, 0xE6, 0xD5, 0x20, 0x46, 0xFB, 0xF7, 0x99, 0xFF, 0xA3, 0x6F, 0x23, 0xF4, 0x00, 0x63, 0xA3, 0x67, 0x00, 0x28, 0xDD, 0xD0, 0xD2, 0xE7, 0xE6, 0x69, 0xB3, 0x0F, 0x03, 0x2B, 0x0C, 0xD1, 0x20, 0x46, 0xFC, 0xF7, 0x41, 0xF8, 0xC6, 0xF3, 0x0D, 0x42, 0x05, 0x46, - 0x82, 0x42, 0x08, 0xD0, 0x01, 0x46, 0x26, 0x48, 0xFA, 0xF7, 0xE8, 0xEA, 0xC1, 0xE7, 0x02, 0x2B, + 0x82, 0x42, 0x08, 0xD0, 0x01, 0x46, 0x26, 0x48, 0xFA, 0xF7, 0xDA, 0xEA, 0xC1, 0xE7, 0x02, 0x2B, 0x20, 0xD1, 0xC6, 0xF3, 0x0D, 0x45, 0x23, 0x4B, 0x29, 0x46, 0x23, 0x48, 0x1B, 0x68, 0xA3, 0x6F, - 0x00, 0x93, 0xD4, 0xE9, 0x06, 0x23, 0xFA, 0xF7, 0xDA, 0xEA, 0xA3, 0x6F, 0x28, 0x46, 0xD9, 0x01, + 0x00, 0x93, 0xD4, 0xE9, 0x06, 0x23, 0xFA, 0xF7, 0xCC, 0xEA, 0xA3, 0x6F, 0x28, 0x46, 0xD9, 0x01, 0x4F, 0xF4, 0x80, 0x51, 0x41, 0xBF, 0x1D, 0x4A, 0x13, 0x68, 0x43, 0xF0, 0x09, 0x03, 0x13, 0x60, 0xA3, 0x6F, 0x1A, 0x02, 0x48, 0xBF, 0xC4, 0xE9, 0x1C, 0x78, 0xFB, 0xF7, 0xDB, 0xFF, 0x50, 0xB9, 0x28, 0x46, 0x9F, 0xE7, 0xB6, 0xB2, 0x20, 0x46, 0xFC, 0xF7, 0x10, 0xF8, 0x46, 0xEA, 0x00, 0x46, 0x05, 0x46, 0xE6, 0x61, 0xD7, 0xE7, 0xA3, 0x6F, 0x5B, 0x06, 0x92, 0xD4, 0x20, 0x46, 0xFF, 0xF7, 0x81, 0xFB, 0x00, 0x28, 0xA3, 0xD0, 0x4F, 0xF4, 0x80, 0x51, 0x28, 0x46, 0xFB, 0xF7, 0xC2, 0xFF, - 0x00, 0x28, 0xE5, 0xD0, 0x85, 0xE7, 0x00, 0xBF, 0x60, 0x39, 0x05, 0x00, 0x58, 0x39, 0x05, 0x00, - 0x60, 0x01, 0x00, 0x03, 0x7A, 0x39, 0x05, 0x00, 0x8C, 0x39, 0x05, 0x00, 0xC6, 0x39, 0x05, 0x00, - 0xE0, 0x39, 0x05, 0x00, 0x00, 0x62, 0x00, 0x03, 0x20, 0x3A, 0x05, 0x00, 0x30, 0x00, 0x13, 0x03, + 0x00, 0x28, 0xE5, 0xD0, 0x85, 0xE7, 0x00, 0xBF, 0x80, 0x79, 0x28, 0x07, 0x78, 0x79, 0x28, 0x07, + 0x60, 0x01, 0x00, 0x03, 0x9A, 0x79, 0x28, 0x07, 0xAC, 0x79, 0x28, 0x07, 0xE6, 0x79, 0x28, 0x07, + 0x00, 0x7A, 0x28, 0x07, 0x00, 0x62, 0x00, 0x03, 0x40, 0x7A, 0x28, 0x07, 0x30, 0x00, 0x13, 0x03, 0x80, 0xEA, 0x01, 0x20, 0x08, 0x23, 0x48, 0xF2, 0x05, 0x01, 0x42, 0x00, 0x01, 0x3B, 0x9B, 0xB2, 0x00, 0x04, 0x92, 0xB2, 0x4C, 0xBF, 0x82, 0xEA, 0x01, 0x00, 0x10, 0x46, 0x00, 0x2B, 0xF4, 0xD1, 0x70, 0x47, 0x38, 0xB5, 0x0D, 0x46, 0x04, 0x46, 0x2C, 0x44, 0xFF, 0xF7, 0xE9, 0xFF, 0x44, 0xEA, @@ -1829,7 +1831,7 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x20, 0x04, 0xA0, 0x21, 0x08, 0x10, 0x41, 0x22, 0x10, 0x00, 0x50, 0xE3, 0x20, 0x02, 0xA0, 0x21, 0x04, 0x10, 0x41, 0x22, 0x08, 0x20, 0x8F, 0xE2, 0x00, 0x00, 0xD2, 0xE7, 0x01, 0x00, 0x80, 0xE0, 0x1E, 0xFF, 0x2F, 0xE1, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x47, 0xFD, 0xE7, 0xED, 0xE4, 0xFF, 0xEA, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x47, 0xFD, 0xE7, 0xE7, 0xE4, 0xFF, 0xEA, 0x5C, 0xFE, 0xFF, 0x7F, 0x01, 0x00, 0x00, 0x00, 0xB0, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E, 0x0E, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x0A, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, @@ -1959,5 +1961,5 @@ const unsigned char __attribute__((section(".init_dram_bin"))) init_dram_bin[313 0x72, 0x31, 0x33, 0x20, 0x3D, 0x20, 0x25, 0x78, 0x0A, 0x00 }; -unsigned long long init_dram_bin_length = 31322; +unsigned long long init_dram_bin_length = 31354; \ No newline at end of file diff --git a/board/longanpi-4b/start.S b/board/longanpi-4b/start.S index 7a96ee48..fd5bfc1e 100644 --- a/board/longanpi-4b/start.S +++ b/board/longanpi-4b/start.S @@ -2,53 +2,55 @@ #include +// Macro to save register values onto the stack .macro save_regs - str lr, [sp, #-4] - mrs lr, spsr_all - str lr, [sp, #-8] - str r1, [sp, #-12] - str r0, [sp, #-16] - mov r0, sp - cps #0x13 - ldr r1, [r0, #-4] - str r1, [sp, #-4]! - ldr r1, [r0, #-8] - str r1, [sp, #-(4 * 16)] - ldr r1, [r0, #-12] - ldr r0, [r0, #-16] - stmdb sp, {r0 - r14}^ - sub sp, sp, #(4 * 16) - ldr r4, [sp] - and r0, r4, #0x1f - cmp r0, #0x10 - beq 10f - cmp r0, #0x13 - beq 11f - b . -11: add r1, sp, #(4 * 17) - str r1, [sp, #(4 * 14)] - str lr, [sp, #(4 * 15)] -10: add r1, sp, #(4 * 17) - str r1, [sp, #-4]! - mov r0, sp + str lr, [sp, #-4] // Save value of lr register onto the stack + mrs lr, spsr_all // Save value of spsr_all register onto lr register + str lr, [sp, #-8] // Save value of lr register onto the stack + str r1, [sp, #-12] // Save value of r1 register onto the stack + str r0, [sp, #-16] // Save value of r0 register onto the stack + mov r0, sp // Copy value of sp register to r0 register + cps #0x13 // Switch to SVC mode + ldr r1, [r0, #-4] // Load value of r1 register from stack to r1 register + str r1, [sp, #-4]! // Save value of r1 register onto the stack and update stack pointer + ldr r1, [r0, #-8] // Load value of r1 register from stack to r1 register + str r1, [sp, #-(4 * 16)] // Save value of r1 register onto the stack + ldr r1, [r0, #-12] // Load value of r1 register from stack to r1 register + ldr r0, [r0, #-16] // Load value of r0 register from stack to r0 register + stmdb sp, {r0 - r14}^ // Save values of registers r0-r14 onto the stack + sub sp, sp, #(4 * 16) // Update stack pointer + ldr r4, [sp] // Load value of r4 register from stack to r4 register + and r0, r4, #0x1f // Copy the lower 5 bits of r4 register to r0 register + cmp r0, #0x10 // Compare value of r0 register with 0x10 + beq 10f // If equal, jump to label 10 + cmp r0, #0x13 // Compare value of r0 register with 0x13 + beq 11f // If equal, jump to label 11 + b . // Jump to current location +11: add r1, sp, #(4 * 17) // Add (4 * 17) to sp register and copy result to r1 register + str r1, [sp, #(4 * 14)] // Save value of r1 register onto the stack + str lr, [sp, #(4 * 15)] // Save value of lr register onto the stack +10: add r1, sp, #(4 * 17) // Add (4 * 17) to sp register and copy result to r1 register + str r1, [sp, #-4]! // Save value of r1 register onto the stack and update stack pointer + mov r0, sp // Copy value of sp register to r0 register .endm +// Macro to restore register values from the stack .macro restore_regs - mov r12, sp - ldr sp, [r12], #4 - ldr r1, [r12], #4 - msr spsr_cxsf, r1 - and r0, r1, #0x1f - cmp r0, #0x10 - beq 20f - cmp r0, #0x13 - beq 21f - b . -20: ldr lr, [r12, #(4 * 15)] - ldmia r12, {r0 - r14}^ - movs pc, lr -21: ldm r12, {r0 - r15}^ - mov r0, r0 + mov r12, sp // Copy value of sp register to r12 register + ldr sp, [r12], #4 // Load value from memory pointed by r12 register to sp register and update r12 register + ldr r1, [r12], #4 // Load value from memory pointed by r12 register to r1 register and update r12 register + msr spsr_cxsf, r1 // Write value of r1 register to spsr_cxsf register + and r0, r1, #0x1f // Copy the lower 5 bits of r1 register to r0 register + cmp r0, #0x10 // Compare value of r0 register with 0x10 + beq 20f // If equal, jump to label 20 + cmp r0, #0x13 // Compare value of r0 register with 0x13 + beq 21f // If equal, jump to label 21 + b . // Jump to current location +20: ldr lr, [r12, #(4 * 15)] // Load value from memory pointed by r12 register to lr register + ldmia r12, {r0 - r14}^ // Load values of registers r0-r14 from memory pointed by r12 register and update r12 register + movs pc, lr // Set value of PC register to value of lr register +21: ldm r12, {r0 - r15}^ // Load values of registers r0-r15 from memory pointed by r12 register + mov r0, r0 // Copy value of r0 register to r0 register .endm #define ARMV7_USR_MODE 0x10 @@ -75,8 +77,8 @@ _start: .long __spl_size /* spl size */ .long 0x30 /* boot header size */ .long 0x30303033 /* boot header version */ - .long 0x00020000 /* return value */ - .long 0x00028000 /* run address */ + .long 0x00044000 /* return value */ + .long 0x00044000 /* run address */ .long 0x0 /* eGON version */ .byte 0x00, 0x00, 0x00, 0x00 /* platform information - 8byte */ .byte 0x34, 0x2e, 0x30, 0x00 diff --git a/board/longanpi-4b/syter_boot/bl31/bl31.bin b/board/longanpi-4b/syter_boot/bl31/bl31.bin new file mode 100644 index 0000000000000000000000000000000000000000..9d868856de834212ae78739727337bca9dd17fd1 GIT binary patch literal 78769 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 literal 0 HcmV?d00001 diff --git a/board/longanpi-4b/syter_boot/main.c b/board/longanpi-4b/syter_boot/main.c index 3d711e8d..c1ed8ffc 100644 --- a/board/longanpi-4b/syter_boot/main.c +++ b/board/longanpi-4b/syter_boot/main.c @@ -20,69 +20,81 @@ #include #include -#include +#include +#include +#include +#include +#include +#include +#include -#include "sys-dram.h" -#include "sys-i2c.h" -#include "sys-rtc.h" -#include "sys-sdcard.h" -#include "sys-sid.h" -#include "sys-spi.h" +#include -#include "fdt_wrapper.h" -#include "ff.h" -#include "libfdt.h" -#include "uart.h" +#include +#include +#include +#include + +#define CONFIG_BL31_FILENAME "bl31.bin" +#define CONFIG_BL31_LOAD_ADDR (0x48000000) -#define CONFIG_KERNEL_FILENAME "zImage" #define CONFIG_DTB_FILENAME "sunxi.dtb" -#define CONFIG_CONFIG_FILENAME "config.txt" +#define CONFIG_DTB_LOAD_ADDR (0x4a200000) + +#define CONFIG_KERNEL_FILENAME "Image" +#define CONFIG_KERNEL_LOAD_ADDR (0x40080000) + +#define CONFIG_BL33_FILENAME "syter_bl33.bin" +#define CONFIG_BL33_LOAD_ADDR (0x4a000000) #define CONFIG_SDMMC_SPEED_TEST_SIZE 1024// (unit: 512B sectors) -#define CONFIG_DTB_LOAD_ADDR (0x41008000) -#define CONFIG_KERNEL_LOAD_ADDR (0x41800000) -#define CONFIG_CONFIG_LOAD_ADDR (0x40008000) +#define CONFIG_DEFAULT_BOOTDELAY 0 + #define CONFIG_HEAP_BASE (0x40800000) #define CONFIG_HEAP_SIZE (16 * 1024 * 1024) -#define CONFIG_DEFAULT_BOOTDELAY 5 +extern sunxi_serial_t uart_dbg; -#define FILENAME_MAX_LEN 64 -typedef struct { - uint8_t *dest; +extern sunxi_i2c_t i2c_pmu; - uint8_t *of_dest; +extern sdhci_t sdhci0; - uint8_t *config_dest; - uint8_t is_config; +extern void enable_sram_a3(); +extern void show_chip(); +extern void rtc_set_vccio_det_spare(); +extern void set_rpio_power_mode(void); +extern void sunxi_nsi_init(); + +typedef struct atf_head { + uint32_t jump_instruction; /* jumping to real code */ + uint8_t magic[8]; /* magic */ + uint32_t scp_base; /* scp openrisc core bin */ + uint32_t next_boot_base; /* next boot base for uboot */ + uint32_t nos_base; /* ARM SVC RUNOS base */ + uint32_t secureos_base; /* optee base */ + uint8_t version[8]; /* atf version */ + uint8_t platform[8]; /* platform information */ + uint32_t reserved[1]; /* stamp space, 16bytes align */ + uint32_t dram_para[32]; /* the dram param */ + uint64_t dtb_base; /* the address of dtb */ +} atf_head_t; + +#define FILENAME_MAX_LEN 16 +typedef struct { + uint8_t *bl31_dest; + char bl31_filename[FILENAME_MAX_LEN]; - char filename[FILENAME_MAX_LEN]; + uint8_t *kernel_dest; + char kernel_filename[FILENAME_MAX_LEN]; + uint8_t *of_dest; char of_filename[FILENAME_MAX_LEN]; - char config_filename[FILENAME_MAX_LEN]; + uint8_t *bl33_dest; + char bl33_filename[FILENAME_MAX_LEN]; } image_info_t; -#define MAX_SECTION_LEN 16 -#define MAX_KEY_LEN 16 -#define MAX_VALUE_LEN 512 -#define CONFIG_MAX_ENTRY 3 - -typedef struct { - char section[MAX_SECTION_LEN]; - char key[MAX_KEY_LEN]; - char value[MAX_VALUE_LEN]; -} IniEntry; - -IniEntry entries[CONFIG_MAX_ENTRY]; - -extern sunxi_serial_t uart_dbg; - -extern sunxi_i2c_t i2c_pmu; - -extern sdhci_t sdhci0; - image_info_t image; #define CHUNK_SIZE 0x20000 @@ -155,27 +167,25 @@ static int load_sdcard(image_info_t *image) { printk(LOG_LEVEL_DEBUG, "FATFS: mount OK\n"); } - /* load DTB */ + printk(LOG_LEVEL_INFO, "FATFS: read %s addr=%x\n", image->bl31_filename, (uint32_t) image->bl31_dest); + ret = fatfs_loadimage(image->bl31_filename, image->bl31_dest); + if (ret) + return ret; + printk(LOG_LEVEL_INFO, "FATFS: read %s addr=%x\n", image->of_filename, (uint32_t) image->of_dest); ret = fatfs_loadimage(image->of_filename, image->of_dest); if (ret) return ret; - /* load Kernel */ - printk(LOG_LEVEL_INFO, "FATFS: read %s addr=%x\n", image->filename, (uint32_t) image->dest); - ret = fatfs_loadimage(image->filename, image->dest); + printk(LOG_LEVEL_INFO, "FATFS: read %s addr=%x\n", image->kernel_filename, (uint32_t) image->kernel_dest); + ret = fatfs_loadimage(image->kernel_filename, image->kernel_dest); if (ret) return ret; - /* load config */ - printk(LOG_LEVEL_INFO, "FATFS: read %s addr=%x\n", image->config_filename, (uint32_t) image->config_dest); - ret = fatfs_loadimage(image->config_filename, image->config_dest); - if (ret) { - printk(LOG_LEVEL_INFO, "CONFIG: Cannot find config file, Using default config.\n"); - image->is_config = 0; - } else { - image->is_config = 1; - } + printk(LOG_LEVEL_INFO, "FATFS: read %s addr=%x\n", image->bl33_filename, (uint32_t) image->bl33_dest); + ret = fatfs_loadimage(image->bl33_filename, image->bl33_dest); + if (ret) + return ret; /* umount fs */ fret = f_mount(0, "", 0); @@ -185,11 +195,30 @@ static int load_sdcard(image_info_t *image) { } else { printk(LOG_LEVEL_DEBUG, "FATFS: unmount OK\n"); } - printk(LOG_LEVEL_INFO, "FATFS: done in %ums\n", time_ms() - start); + printk(LOG_LEVEL_DEBUG, "FATFS: done in %ums\n", time_ms() - start); return 0; } +void jmp_to_arm64(uint32_t addr) { + /* Set RTC data to current time_ms(), Save in RTC_FEL_INDEX */ + rtc_set_start_time_ms(); + + /* set the cpu boot entry addr: */ + write32(RVBARADDR0_L, addr); + write32(RVBARADDR0_H, 0); + + /* set cpu to AA64 execution state when the cpu boots into after a warm reset */ + asm volatile("mrc p15,0,r2,c12,c0,2"); + asm volatile("orr r2,r2,#(0x3<<0)"); + asm volatile("dsb"); + asm volatile("mcr p15,0,r2,c12,c0,2"); + asm volatile("isb"); +_loop: + asm volatile("wfi"); + goto _loop; +} + static int abortboot_single_key(int bootdelay) { int abort = 0; unsigned long ts; @@ -220,23 +249,40 @@ static int abortboot_single_key(int bootdelay) { return abort; } -static void set_pmu_fin_voltage(char *power_name, uint32_t voltage) { - int set_vol = voltage; - int temp_vol, src_vol = pmu_axp1530_get_vol(&i2c_pmu, power_name); - if (src_vol > voltage) { - for (temp_vol = src_vol; temp_vol >= voltage; temp_vol -= 50) { - pmu_axp1530_set_vol(&i2c_pmu, power_name, temp_vol, 1); - } - } else if (src_vol < voltage) { - for (temp_vol = src_vol; temp_vol <= voltage; temp_vol += 50) { - pmu_axp1530_set_vol(&i2c_pmu, power_name, temp_vol, 1); - } - } - mdelay(30); /* Delay 300ms for pmu bootup */ +msh_declare_command(boot); +msh_define_help(boot, "boot to linux", "Usage: boot\n"); +int cmd_boot(int argc, const char **argv) { + atf_head_t *atf_head = (atf_head_t *) image.bl31_dest; + + atf_head->next_boot_base = CONFIG_BL33_LOAD_ADDR; + atf_head->dtb_base = CONFIG_DTB_LOAD_ADDR; + + atf_head->platform[0] = 0x00; + atf_head->platform[1] = 0x52; + atf_head->platform[2] = 0x41; + atf_head->platform[3] = 0x57; + atf_head->platform[4] = 0xbe; + atf_head->platform[5] = 0xe9; + atf_head->platform[6] = 0x00; + atf_head->platform[7] = 0x00; + + printk(LOG_LEVEL_INFO, "ATF: Kernel addr: 0x%08x\n", atf_head->next_boot_base); + printk(LOG_LEVEL_INFO, "ATF: Kernel DTB addr: 0x%08x\n", atf_head->dtb_base); + + clean_syterkit_data(); + + jmp_to_arm64(CONFIG_BL31_LOAD_ADDR); + + printk(LOG_LEVEL_INFO, "Back to SyterKit\n"); + + // if kernel boot not success, jump to fel. + jmp_to_fel(); + return 0; } msh_declare_command(reload); -msh_define_help(reload, "rescan TF Card and reload DTB, Kernel zImage", "Usage: reload\n"); +msh_define_help(reload, "rescan TF Card and reload DTB", + "Usage: reload\n"); int cmd_reload(int argc, const char **argv) { if (sdmmc_init(&card0, &sdhci0) != 0) { printk(LOG_LEVEL_ERROR, "SMHC: init failed\n"); @@ -250,103 +296,88 @@ int cmd_reload(int argc, const char **argv) { return 0; } -msh_declare_command(boot); -msh_define_help(boot, "boot to linux", "Usage: boot\n"); -int cmd_boot(int argc, const char **argv) { - /* Initialize variables for kernel entry point and SD card access. */ - uint32_t entry_point = 0; - void (*kernel_entry)(int zero, int arch, uint32_t params); - - /* Set up boot parameters for the kernel. */ - if (zImage_loader((uint8_t *) image.dest, &entry_point)) { - printk(LOG_LEVEL_ERROR, "boot setup failed\n"); - abort(); - } - - /* Disable MMU, data cache, instruction cache, interrupts */ - clean_syterkit_data(); - /* Debug message to indicate the kernel address that the system is jumping to. */ - printk(LOG_LEVEL_INFO, "jump to kernel address: 0x%x\n\n", image.dest); - - /* Jump to the kernel entry point. */ - kernel_entry = (void (*)(int, int, uint32_t)) entry_point; - kernel_entry(0, ~0, (uint32_t) image.of_dest); - return 0; -} - const msh_command_entry commands[] = { - msh_define_command(reload), msh_define_command(boot), + msh_define_command(reload), msh_command_end, }; -/* - * main function for the bootloader. Initializes and sets up the system, loads the kernel and device tree binary from - * an SD card, sets boot arguments, and boots the kernel. If the kernel fails to boot, the function jumps to FEL mode. - */ int main(void) { - /* Initialize the debug serial interface. */ sunxi_serial_init(&uart_dbg); - /* Display the bootloader banner. */ show_banner(); + show_chip(); - /* enbale rtc vccio detected */ rtc_set_vccio_det_spare(); - /* Initialize the system clock. */ sunxi_clk_init(); - /* Check rtc fel flag. if set flag, goto fel */ - if (rtc_probe_fel_flag()) { - printk(LOG_LEVEL_INFO, "RTC: get fel flag, jump to fel mode.\n"); - clean_syterkit_data(); - rtc_clear_fel_flag(); - sunxi_clk_reset(); - mdelay(100); - goto _fel; - } - set_rpio_power_mode(); - + + sunxi_clk_dump(); + sunxi_i2c_init(&i2c_pmu); + pmu_axp2202_init(&i2c_pmu); + pmu_axp1530_init(&i2c_pmu); + pmu_axp2202_set_vol(&i2c_pmu, "dcdc1", 1100, 1); + + pmu_axp1530_set_dual_phase(&i2c_pmu); + pmu_axp1530_set_vol(&i2c_pmu, "dcdc1", 1100, 1); + pmu_axp1530_set_vol(&i2c_pmu, "dcdc2", 1100, 1); + + pmu_axp2202_set_vol(&i2c_pmu, "dcdc2", 920, 1); + pmu_axp2202_set_vol(&i2c_pmu, "dcdc3", 1160, 1); + pmu_axp2202_set_vol(&i2c_pmu, "dcdc4", 3300, 1); + + pmu_axp2202_dump(&i2c_pmu); + pmu_axp1530_dump(&i2c_pmu); + + enable_sram_a3(); + /* Initialize the DRAM and enable memory management unit (MMU). */ uint64_t dram_size = sunxi_dram_init(NULL); + sunxi_clk_dump(); + arm32_mmu_enable(SDRAM_BASE, dram_size); /* Initialize the small memory allocator. */ smalloc_init(CONFIG_HEAP_BASE, CONFIG_HEAP_SIZE); + sunxi_nsi_init(); + /* Clear the image_info_t struct. */ memset(&image, 0, sizeof(image_info_t)); - /* Set the destination address for the device tree binary (DTB), kernel image, and configuration data. */ + image.bl31_dest = (uint8_t *) CONFIG_BL31_LOAD_ADDR; image.of_dest = (uint8_t *) CONFIG_DTB_LOAD_ADDR; - image.dest = (uint8_t *) CONFIG_KERNEL_LOAD_ADDR; - image.config_dest = (uint8_t *) CONFIG_CONFIG_LOAD_ADDR; - image.is_config = 0; + image.kernel_dest = (uint8_t *) CONFIG_KERNEL_LOAD_ADDR; + image.bl33_dest = (uint8_t *) CONFIG_BL33_LOAD_ADDR; - /* Copy the filenames for the DTB, kernel image, and configuration data. */ - strcpy(image.filename, CONFIG_KERNEL_FILENAME); + strcpy(image.bl31_filename, CONFIG_BL31_FILENAME); strcpy(image.of_filename, CONFIG_DTB_FILENAME); - strcpy(image.config_filename, CONFIG_CONFIG_FILENAME); + strcpy(image.kernel_filename, CONFIG_KERNEL_FILENAME); + strcpy(image.bl33_filename, CONFIG_BL33_FILENAME); /* Initialize the SD host controller. */ if (sunxi_sdhci_init(&sdhci0) != 0) { printk(LOG_LEVEL_ERROR, "SMHC: %s controller init failed\n", sdhci0.name); goto _shell; } else { - printk(LOG_LEVEL_INFO, "SMHC: %s controller v%x initialized\n", sdhci0.name, sdhci0.reg->vers); + printk(LOG_LEVEL_INFO, "SMHC: %s controller initialized\n", sdhci0.name); } /* Initialize the SD card and check if initialization is successful. */ if (sdmmc_init(&card0, &sdhci0) != 0) { - printk(LOG_LEVEL_WARNING, "SMHC: init failed\n"); - goto _shell; + printk(LOG_LEVEL_WARNING, "SMHC: init failed, Retrying...\n"); + mdelay(30); + if (sdmmc_init(&card0, &sdhci0) != 0) { + printk(LOG_LEVEL_WARNING, "SMHC: init failed\n"); + goto _shell; + } } /* Load the DTB, kernel image, and configuration data from the SD card. */ @@ -354,7 +385,7 @@ int main(void) { printk(LOG_LEVEL_WARNING, "SMHC: loading failed\n"); goto _shell; } - + int bootdelay = CONFIG_DEFAULT_BOOTDELAY; /* Showing boot delays */ @@ -367,10 +398,5 @@ int main(void) { _shell: syterkit_shell_attach(commands); -_fel: - /* If the kernel boot fails, jump to FEL mode. */ - jmp_to_fel(); - - /* Return 0 to indicate successful execution. */ return 0; -} +} \ No newline at end of file