目录

0. 环境介绍

1. 成果/目标

2. 移植过程

2.1 下载U-Boot官方原版源码包

2.2 解压源码包,并进入源码目录

2.3 修改代码

2.3.0 懒人必备:所有patch一键打补丁

2.3.1 arch/arm/dts/Makefile

2.3.2 arch/arm/dts/exynos4412-tiny4412.dts

2.3.3 arch/arm/mach-exynos/Kconfig

2.3.4 arch/arm/mach-exynos/clock_init_exynos4.c

2.3.5 arch/arm/mach-exynos/dmc_init_exynos4.c

2.3.6 arch/arm/mach-exynos/exynos4412_setup.h

2.3.7 arch/arm/mach-exynos/lowlevel_init.c

2.3.8 arch/arm/mach-exynos/tzpc.c

2.3.9 board/samsung/tiny4412/Kconfig

2.3.10 board/samsung/tiny4412/MAINTAINERS

2.3.11 board/samsung/tiny4412/Makefile

2.3.12 board/samsung/tiny4412/tiny4412.c

2.3.13 board/samsung/tiny4412/tools/mktiny4412spl.c

2.3.14 configs/tiny4412_defconfig

2.3.15 include/configs/tiny4412.h

3 配置、编译、下载、测试

3.1 配置

3.2 编译

3.3 下载

3.4 SD卡启动测试

3.5 查看板子信息

3.6 查看SD卡信息

3.7 查看eMMC信息

3.8 eMMC启动

3.8.1 eMMC 配置

3.8.2 从SD卡读取U-Boot镜像,并烧录到eMMC BOOT1分区

3.8.3 eMMC启动测试

4 附录

4.1 交叉编译工具链

4.1 源码

4.2 已编译好的二进制镜像

4.3 SD卡烧录工具

4.3.1 使用方法

4.4 开发板原理图


0. 环境介绍

开发环境:Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-37-generic x86_64)

交叉编译工具链:xkwy-gcc-20200517.tar.xz

U-Boot版本:u-boot-2020.07

开发板底板:Tiny4412/Super4412SDK 1506

开发板核心板:Tiny4412 (1412)

CPU:Exynos 4412 (4 * Cortex-A9,1.4GHz)

DDR:2 * K4B4G1646D-BCK0 (2 * 4Gbit,1GB)

EMMC:SAMSUNG KLM8G2FEJA-A001 (8GB)

1. 成果/目标

  • UART0作为调试串口(波特率921600bps);
  • 支持DDR3(1GB,地址空间:0x40000000~0x7FFFFFFF)
  • 支持外置SD卡读写,并支持由外置SD卡启动;
  • 支持内置eMMC读写,并支持由内置eMMC启动。

2. 移植过程

2.1 下载U-Boot官方原版源码包

官方下载地址:ftp://ftp.denx.de/pub/u-boot/u-boot-2020.07.tar.bz2

xkwy2018.cn镜像地址:https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07.tar.bz2

$ wget https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07.tar.bz2
--2020-07-25 10:16:44--  https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07.tar.bz2
Resolving xkwy2018.cn (xkwy2018.cn)... 64.64.240.120
Connecting to xkwy2018.cn (xkwy2018.cn)|64.64.240.120|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 15338841 (15M) [application/x-bzip2]
Saving to: ‘u-boot-2020.07.tar.bz2’u-boot-2020.07.tar.bz2           100%[=========================================================>]  14.63M  7.10MB/s    in 2.1s    2020-07-25 10:16:47 (7.10 MB/s) - ‘u-boot-2020.07.tar.bz2’ saved [15338841/15338841]

2.2 解压源码包,并进入源码目录

$ tar xf u-boot-2020.07.tar.bz2
$ cd u-boot-2020.07/

2.3 修改代码

完整的patch文件:https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07-tiny4412.patch

2.3.0 懒人必备:所有patch一键打补丁

使用curl下载patch文件,然后用patch命令给官方原始u-boot-2020.07打补丁。

$ curl -s https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07-tiny4412.patch | patch -p1
patching file arch/arm/dts/Makefile
patching file arch/arm/dts/exynos4412-tiny4412.dts
patching file arch/arm/mach-exynos/Kconfig
patching file arch/arm/mach-exynos/clock_init_exynos4.c
patching file arch/arm/mach-exynos/dmc_init_exynos4.c
patching file arch/arm/mach-exynos/exynos4412_setup.h
patching file arch/arm/mach-exynos/lowlevel_init.c
patching file arch/arm/mach-exynos/tzpc.c
patching file board/samsung/tiny4412/Kconfig
patching file board/samsung/tiny4412/MAINTAINERS
patching file board/samsung/tiny4412/Makefile
patching file board/samsung/tiny4412/tiny4412.c
patching file board/samsung/tiny4412/tools/mktiny4412spl.c
patching file configs/tiny4412_defconfig
patching file include/configs/tiny4412.h

注:如果做了此步骤,2.3后面的章节可全部略过,直接跳到3 配置、编译、下载、测试。

2.3.1 arch/arm/dts/Makefile

在CONFIG_EXYNOS4下面添加tiny4412用的设备树dtb文件

diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 89fa448818..107f933f05 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -11,6 +11,7 @@ dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \exynos4210-smdkv310.dtb \exynos4210-universal_c210.dtb \exynos4210-trats.dtb \
+  exynos4412-tiny4412.dtb \exynos4412-trats2.dtb \exynos4412-odroid.dtb

2.3.2 arch/arm/dts/exynos4412-tiny4412.dts

新增设备树文件:exynos4412-tiny4412.dts

主要是配置调试串口位于UART0,mmc0映射为内置eMMC,mmc2映射为外部SD卡

diff --git a/arch/arm/dts/exynos4412-tiny4412.dts b/arch/arm/dts/exynos4412-tiny4412.dts
new file mode 100755
index 0000000000..8e36148f5c
--- /dev/null
+++ b/arch/arm/dts/exynos4412-tiny4412.dts
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * xkwy's Exynos4412 based Tiny4412 board device tree source
+ *
+ * Copyright (c) xkwy2018.cn
+ *        http://xkwy2018.cn/tiny4412
+ */
+
+/dts-v1/;
+#include "exynos4412.dtsi"
+
+/ {
+  model = "xkwy Tiny4412 based on Exynos4412";
+  compatible = "xkwy,tiny4412", "samsung,exynos4412";
+
+  aliases {
+      console = &serial_0;
+
+      serial0 = &serial_0;
+      serial1 = &serail_1;
+      serial2 = &serial_2;
+      serial3 = &serial_3;
+      serial4 = &serial_4;
+
+      mmc0 = &mshc_0;
+      mmc2 = &sdhci2;
+  };
+};
+
+&serial_0 {
+  status = "okay";
+};
+
+&mshc_0 {
+  samsung,bus-width = <8>;
+  samsung,timing = <2 1 0>;
+  samsung,removable = <0>;
+  fifoth_val = <0x203f0040>;
+  bus_hz = <400000000>;
+  div = <0x3>;
+  index = <4>;
+  status = "okay";
+};
+
+&sdhci2 {
+  samsung,bus-width = <4>;
+  samsung,timing = <1 2 3>;
+  cd-gpios = <&gpk2 2 0>;
+  cd-inverted;
+  status = "okay";
+};

2.3.3 arch/arm/mach-exynos/Kconfig

配置Kconfig,增加TINY4412开发板

diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index 14347e7c7d..8cf46654c9 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -67,6 +67,10 @@ config TARGET_ORIGENbool "Exynos4412 Origen board"select SUPPORT_SPL+config TARGET_TINY4412
+  bool "Exynos4412 Tiny4412 board"
+  select SUPPORT_SPL
+config TARGET_TRATS2bool "Exynos4412 Trat2 board"@@ -161,6 +165,7 @@ source "board/samsung/smdkv310/Kconfig"source "board/samsung/trats/Kconfig"source "board/samsung/universal_c210/Kconfig"source "board/samsung/origen/Kconfig"
+source "board/samsung/tiny4412/Kconfig"source "board/samsung/trats2/Kconfig"source "board/samsung/odroid/Kconfig"source "board/samsung/arndale/Kconfig"

2.3.4 arch/arm/mach-exynos/clock_init_exynos4.c

修改时钟配置,原来的时钟结构体struct exynos4_clock是Exynos 4210的,Exynos 4412的这一部分寄存器有变化,因此需要改成struct exynos4x12_clock;

再增加一个emmc启动的时钟配置函数emmc_boot_clk_div_set,SPL里面emmc启动时会调用这个函数,由于所有的时钟都已经预先配置好了,因此这个函数里面什么都不做。

diff --git a/arch/arm/mach-exynos/clock_init_exynos4.c b/arch/arm/mach-exynos/clock_init_exynos4.c
index 584e4bac09..7e12d742b0 100644
--- a/arch/arm/mach-exynos/clock_init_exynos4.c
+++ b/arch/arm/mach-exynos/clock_init_exynos4.c
@@ -30,7 +30,11 @@#include <asm/arch/clk.h>#include <asm/arch/clock.h>#include "common_setup.h"
+#if IS_ENABLED(CONFIG_TINY4412)
+#include "exynos4412_setup.h"
+#else#include "exynos4_setup.h"
+#endif/** system_clock_init: Initialize core clock and bus clock.
@@ -38,8 +42,13 @@*/void system_clock_init(void){
+#if IS_ENABLED(CONFIG_TINY4412)
+  struct exynos4x12_clock *clk =
+          (struct exynos4x12_clock *)samsung_get_base_clock();
+#elsestruct exynos4_clock *clk =(struct exynos4_clock *)samsung_get_base_clock();
+#endifwritel(CLK_SRC_CPU_VAL, &clk->src_cpu);@@ -55,7 +64,11 @@ void system_clock_init(void)writel(CLK_SRC_CAM_VAL, &clk->src_cam);writel(CLK_SRC_MFC_VAL, &clk->src_mfc);writel(CLK_SRC_G3D_VAL, &clk->src_g3d);
+  #if IS_ENABLED(CONFIG_TINY4412)
+  writel(CLK_SRC_LCD_VAL, &clk->src_lcd);
+  #elsewritel(CLK_SRC_LCD0_VAL, &clk->src_lcd0);
+  #endifsdelay(0x10000);@@ -73,7 +86,11 @@ void system_clock_init(void)writel(CLK_DIV_CAM_VAL, &clk->div_cam);writel(CLK_DIV_MFC_VAL, &clk->div_mfc);writel(CLK_DIV_G3D_VAL, &clk->div_g3d);
+  #if IS_ENABLED(CONFIG_TINY4412)
+  writel(CLK_DIV_LCD_VAL, &clk->div_lcd);
+  #elsewritel(CLK_DIV_LCD0_VAL, &clk->div_lcd0);
+  #endif/* Set PLL locktime */writel(PLL_LOCKTIME, &clk->apll_lock);
@@ -92,3 +109,8 @@ void system_clock_init(void)sdelay(0x30000);}
+
+__weak void emmc_boot_clk_div_set(void)
+{
+    ;
+}

2.3.5 arch/arm/mach-exynos/dmc_init_exynos4.c

内存初始化适配,启用交错,交错大小设置为2GB(相当于不交错)

Exynos4412支持两个DDR控制器,并且支持组成双通道,1412版本的核心板只有两颗16bit DDR3(构成一颗32bit DDR3连接到片选Xm1CSn0上),因此在Exynos4412看来实际上只接了一颗DDR3。

diff --git a/arch/arm/mach-exynos/dmc_init_exynos4.c b/arch/arm/mach-exynos/dmc_init_exynos4.c
index ecddc72684..7436eeb098 100644
--- a/arch/arm/mach-exynos/dmc_init_exynos4.c
+++ b/arch/arm/mach-exynos/dmc_init_exynos4.c
@@ -26,7 +26,11 @@#include <config.h>#include <asm/arch/dmc.h>#include "common_setup.h"
+#if IS_ENABLED(CONFIG_TINY4412)
+#include "exynos4412_setup.h"
+#else#include "exynos4_setup.h"
+#endifstruct mem_timings mem = {.direct_cmd_msr = {
@@ -123,6 +127,9 @@ static void dmc_init(struct exynos4_dmc *dmc)writel(mem.memconfig0, &dmc->memconfig0);writel(mem.memconfig1, &dmc->memconfig1);
+#if IS_ENABLED(CONFIG_TINY4412)
+  writel((1<<31)|0x1F, &dmc->ivcontrol);
+#endif/* Config Precharge Policy */writel(mem.prechconfig, &dmc->prechconfig);

2.3.6 arch/arm/mach-exynos/exynos4412_setup.h

新增头文件:arch/arm/mach-exynos/exynos4412_setup.h

主要是定义时钟配置,DDR3时序配置。

diff --git a/arch/arm/mach-exynos/exynos4412_setup.h b/arch/arm/mach-exynos/exynos4412_setup.h
new file mode 100644
index 0000000000..dd9218c2dc
--- /dev/null
+++ b/arch/arm/mach-exynos/exynos4412_setup.h
@@ -0,0 +1,652 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Machine Specific Values for EXYNOS4412 based board
+ *
+ * Copyright (C) 2020 FriendlyARM Electronics Co., Ltd.
+ */
+
+#ifndef _TINY4412_SETUP_H
+#define _TINY4412_SETUP_H
+
+#include <config.h>
+#include <asm/arch/cpu.h>
+
+#ifdef CONFIG_CLK_800_330_165
+#define DRAM_CLK_330
+#endif
+#ifdef CONFIG_CLK_1000_200_200
+#define DRAM_CLK_200
+#endif
+#ifdef CONFIG_CLK_1000_330_165
+#define DRAM_CLK_330
+#endif
+#ifdef CONFIG_CLK_1000_400_200
+#define DRAM_CLK_400
+#endif
+
+/* Bus Configuration Register Address */
+#define ASYNC_CONFIG      0x10010350
+
+/* CLK_SRC_CPU */
+#define MUX_MPLL_USER_SEL_C_FINPLL        0x0
+#define MUX_MPLL_USER_SEL_C_FOUTMPLL  0x1
+#define MUX_HPM_SEL_MOUTAPLL      0x0
+#define MUX_HPM_SEL_SCLKMPLL      0x1
+#define MUX_CORE_SEL_MOUTAPLL     0x0
+#define MUX_CORE_SEL_SCLKMPLL     0x1
+#define MUX_APLL_SEL_FILPLL       0x0
+#define MUX_APLL_SEL_MOUTMPLLFOUT 0x1
+#define CLK_SRC_CPU_VAL           ((MUX_MPLL_USER_SEL_C_FOUTMPLL << 24) \
+                  | (MUX_HPM_SEL_MOUTAPLL << 20) \
+                  | (MUX_CORE_SEL_MOUTAPLL << 16)\
+                  | (MUX_APLL_SEL_MOUTMPLLFOUT << 0))
+
+/* CLK_DIV_CPU0 */
+#define CORE2_RATIO       0x0
+#define APLL_RATIO        0x1
+#define PCLK_DBG_RATIO        0x1
+#define ATB_RATIO     0x6
+#define PERIPH_RATIO      0x0
+#define COREM1_RATIO      0x7
+#define COREM0_RATIO      0x3
+#define CORE_RATIO        0x0
+#define CLK_DIV_CPU0_VAL  ((CORE2_RATIO << 28) \
+              | (APLL_RATIO << 24) \
+              | (PCLK_DBG_RATIO << 20) \
+              | (ATB_RATIO << 16) \
+              | (PERIPH_RATIO << 12) \
+              | (COREM1_RATIO << 8) \
+              | (COREM0_RATIO << 4) \
+              | (CORE_RATIO << 0))
+
+/* CLK_DIV_CPU1 */
+#define CORES_RATIO       0x5
+#define HPM_RATIO     0x0
+#define COPY_RATIO        0x6
+#define CLK_DIV_CPU1_VAL  ((CORES_RATIO<<8) | (HPM_RATIO << 4) | (COPY_RATIO))
+
+/* CLK_SRC_DMC */
+#define MUX_G2D_ACP_SEL_MOUTG2D_ACP_0 0x0
+#define MUX_G2D_ACP_SEL_MOUTG2D_ACP_1 0x1
+#define MUX_G2D_ACP_1_SEL_SCLKEPLL    0x0
+#define MUX_G2D_ACP_1_SEL_SCLKVPLL    0x1
+#define MUX_G2D_ACP_0_SEL_SCLKMPLL    0x0
+#define MUX_G2D_ACP_0_SEL_SCLKAPLL    0x1
+#define MUX_PWI_SEL_XXTI      0x0
+#define MUX_PWI_SEL_XUSBXTI       0x1
+#define MUX_PWI_SEL_SCLK_HDMI24M  0x2
+#define MUX_PWI_SEL_SCLK_USBPHY0  0x3
+#define MUX_PWI_SEL_SCLK_USBPHY1  0x4
+#define MUX_PWI_SEL_SCLK_HDMIPHY  0x5
+#define MUX_PWI_SEL_SCLKMPLL      0x6
+#define MUX_PWI_SEL_SCLKEPLL      0x7
+#define MUX_PWI_SEL_SCLKVPLL      0x8
+#define MUX_MPLL_SEL_FINPLL           0x0
+#define MUX_MPLL_SEL_MOUTMPLLFOUT 0x1
+#define MUX_DPHY_SEL_SCLKMPLL     0x0
+#define MUX_DPHY_SEL_SCLKAPLL     0x1
+#define MUX_DMC_BUS_SEL_SCLKMPLL  0x0
+#define MUX_DMC_BUS_SEL_SCLKAPLL  0x1
+#define MUX_C2C_SEL_SCLKMPLL      0x0
+#define MUX_C2C_SEL_SCLKAPLL      0x1
+#define CLK_SRC_DMC_VAL           ((MUX_G2D_ACP_SEL_MOUTG2D_ACP_0 << 28) \
+                  | (MUX_G2D_ACP_1_SEL_SCLKEPLL << 24) \
+                  | (MUX_G2D_ACP_0_SEL_SCLKMPLL << 20) \
+                  | (MUX_PWI_SEL_XUSBXTI << 16) \
+                  | (MUX_MPLL_SEL_MOUTMPLLFOUT << 12) \
+                  | (MUX_DPHY_SEL_SCLKMPLL << 8) \
+                  | (MUX_DMC_BUS_SEL_SCLKMPLL << 4) \
+                  | (MUX_C2C_SEL_SCLKMPLL << 0))
+
+/* CLK_DIV_DMC0 */
+#define DMCP_RATIO        0x1
+#define DMCD_RATIO        0x1
+#define DMC_RATIO     0x1
+#define DPHY_RATIO        0x1
+#define ACP_PCLK_RATIO        0x1
+#define ACP_RATIO     0x3
+#define CLK_DIV_DMC0_VAL  ((DMCP_RATIO << 20) \
+              | (DMCD_RATIO << 16) \
+              | (DMC_RATIO << 12) \
+              | (DPHY_RATIO << 8) \
+              | (ACP_PCLK_RATIO << 4)   \
+              | (ACP_RATIO << 0))
+
+/* CLK_DIV_DMC1 */
+#define DPM_RATIO     0x1
+#define DVSEM_RATIO       0x1
+#define C2C_ACLK_RATIO    0x1
+#define PWI_RATIO     0x7
+#define C2C_RATIO     0x1
+#define G2D_ACP_RATIO 0x3
+#define CLK_DIV_DMC1_VAL  ((DPM_RATIO << 24) \
+              | (DVSEM_RATIO << 16) \
+              | (C2C_ACLK_RATIO << 12) \
+              | (PWI_RATIO << 8) \
+              | (C2C_RATIO << 4) \
+              | (G2D_ACP_RATIO << 0))
+
+/* CLK_SRC_TOP0 */
+#define MUX_ONENAND_SEL_ACLK_133  0x0
+#define MUX_ONENAND_SEL_ACLK_160  0x1
+#define MUX_ACLK_133_SEL_SCLKMPLL 0x0
+#define MUX_ACLK_133_SEL_SCLKAPLL 0x1
+#define MUX_ACLK_160_SEL_SCLKMPLL 0x0
+#define MUX_ACLK_160_SEL_SCLKAPLL 0x1
+#define MUX_ACLK_100_SEL_SCLKMPLL 0x0
+#define MUX_ACLK_100_SEL_SCLKAPLL 0x1
+#define MUX_ACLK_200_SEL_SCLKMPLL 0x0
+#define MUX_ACLK_200_SEL_SCLKAPLL 0x1
+#define MUX_VPLL_SEL_FINPLL       0x0
+#define MUX_VPLL_SEL_FOUTVPLL     0x1
+#define MUX_EPLL_SEL_FINPLL       0x0
+#define MUX_EPLL_SEL_FOUTEPLL     0x1
+#define MUX_ONENAND_1_SEL_MOUTONENAND 0x0
+#define MUX_ONENAND_1_SEL_SCLKVPLL    0x1
+#define CLK_SRC_TOP0_VAL      ((MUX_ONENAND_SEL_ACLK_133 << 28) \
+                  | (MUX_ACLK_133_SEL_SCLKMPLL << 24) \
+                  | (MUX_ACLK_160_SEL_SCLKMPLL << 20) \
+                  | (MUX_ACLK_100_SEL_SCLKMPLL << 16) \
+                  | (MUX_ACLK_200_SEL_SCLKMPLL << 12) \
+                  | (MUX_VPLL_SEL_FOUTVPLL << 8) \
+                  | (MUX_EPLL_SEL_FOUTEPLL << 4)\
+                  | (MUX_ONENAND_1_SEL_MOUTONENAND << 0))
+
+/* CLK_SRC_TOP1 */
+#define MUX_ACLK_400_MCUISP_SUB_SEL_FINPLL    0x0
+#define MUX_ACLK_400_MCUISP_SUB_SEL_DIVOUT_ACLK_400_MCUISP    0x1
+#define MUX_ACLK_200_SUB_SEL_FINPLL   0x0
+#define MUX_ACLK_200_SUB_SEL_DIVOUT_ACLK_200  0x1
+#define MUX_ACLK_266_GPS_SUB_SEL_FINPLL   0x0
+#define MUX_ACLK_266_GPS_SUB_SEL_DIVOUT_ACLK_266_GPS  0x1
+#define MUX_MPLL_USER_SEL_T_FINPLL    0x0
+#define MUX_MPLL_USER_SEL_T_SCLKMPLL  0x1
+#define MUX_ACLK_400_MCUISP_SEL_SCLKMPLL_USER_T   0x0
+#define MUX_ACLK_400_MCUISP_SEL_SCLKAPLL  0x1
+#define MUX_ACLK_266_GPS_SEL_SCLKMPLL_USER_T  0x0
+#define MUX_ACLK_266_GPS_SEL_SCLKAPLL 0x0
+#define CLK_SRC_TOP1_VAL  ((MUX_ACLK_400_MCUISP_SUB_SEL_DIVOUT_ACLK_400_MCUISP << 24) \
+                  | (MUX_ACLK_200_SUB_SEL_DIVOUT_ACLK_200 << 20) \
+                  | (MUX_ACLK_266_GPS_SUB_SEL_DIVOUT_ACLK_266_GPS << 16) \
+                  | (MUX_MPLL_USER_SEL_T_SCLKMPLL << 12) \
+                  | (MUX_ACLK_400_MCUISP_SEL_SCLKMPLL_USER_T << 8) \
+                  | (MUX_ACLK_266_GPS_SEL_SCLKMPLL_USER_T << 4))
+
+/* CLK_DIV_TOP */
+#define ACLK_400_MCUISP_RATIO 0x0
+#define ACLK_266_GPS_RATIO    0x0
+#define ONENAND_RATIO     0x1
+#define ACLK_133_RATIO        0x5
+#define ACLK_160_RATIO        0x4
+#define ACLK_100_RATIO        0x7
+#define ACLK_200_RATIO        0x0
+#define CLK_DIV_TOP_VAL       ((ACLK_400_MCUISP_RATIO << 24)    \
+              | (ACLK_266_GPS_RATIO << 20)  \
+              | (ONENAND_RATIO << 16)   \
+              | (ACLK_133_RATIO << 12)\
+              | (ACLK_160_RATIO << 8)   \
+              | (ACLK_100_RATIO << 4)   \
+              | (ACLK_200_RATIO << 0))
+
+/* CLK_SRC_LEFTBUS */
+#define MUX_MPLL_USER_SEL_L_FINPLL    0x0
+#define MUX_MPLL_USER_SEL_L_FOUTMPLL  0x1
+#define MUX_GDL_SEL_SCLKMPLL  0x0
+#define MUX_GDL_SEL_SCLKAPLL  0x1
+#define CLK_SRC_LEFTBUS_VAL   ((MUX_MPLL_USER_SEL_L_FOUTMPLL << 4) \
+              | (MUX_GDL_SEL_SCLKMPLL << 0))
+
+/* CLK_DIV_LEFTBUS */
+#define GPL_RATIO     0x1
+#define GDL_RATIO     0x3
+#define CLK_DIV_LEFTBUS_VAL   ((GPL_RATIO << 4) | (GDL_RATIO))
+
+/* CLK_SRC_RIGHTBUS */
+#define MUX_MPLL_USER_SEL_R_FINPLL    0x0
+#define MUX_MPLL_USER_SEL_R_FOUTMPLL  0x1
+#define MUX_GDR_SEL_SCLKMPLL  0x0
+#define MUX_GDR_SEL_SCLKAPLL  0x1
+#define CLK_SRC_RIGHTBUS_VAL  ((MUX_MPLL_USER_SEL_R_FOUTMPLL << 4) \
+              | (MUX_GDR_SEL_SCLKMPLL << 0))
+
+/* CLK_DIV_RIGHTBUS */
+#define GPR_RATIO     0x1
+#define GDR_RATIO     0x3
+#define CLK_DIV_RIGHTBUS_VAL  ((GPR_RATIO << 4) | (GDR_RATIO))
+
+/* CLK_SRS_FSYS: 6 = SCLKMPLL */
+#define SATA_SEL_SCLKMPLL 0
+#define SATA_SEL_SCLKAPLL 1
+
+#define MMC_SEL_XXTI      0
+#define MMC_SEL_XUSBXTI       1
+#define MMC_SEL_SCLK_HDMI24M  2
+#define MMC_SEL_SCLK_USBPHY0  3
+#define MMC_SEL_SCLK_USBPHY1  4
+#define MMC_SEL_SCLK_HDMIPHY  5
+#define MMC_SEL_SCLKMPLL  6
+#define MMC_SEL_SCLKEPLL  7
+#define MMC_SEL_SCLKVPLL  8
+
+#define MMCC0_SEL     MMC_SEL_SCLKMPLL
+#define MMCC1_SEL     MMC_SEL_SCLKMPLL
+#define MMCC2_SEL     MMC_SEL_SCLKMPLL
+#define MMCC3_SEL     MMC_SEL_SCLKMPLL
+#define MMCC4_SEL     MMC_SEL_SCLKMPLL
+#define CLK_SRC_FSYS_VAL  ((SATA_SEL_SCLKMPLL << 24) \
+              | (MMCC4_SEL << 16) \
+              | (MMCC3_SEL << 12) \
+              | (MMCC2_SEL << 8) \
+              | (MMCC1_SEL << 4) \
+              | (MMCC0_SEL << 0))
+
+/* SCLK_MMC[0-4] = MOUTMMC[0-4]/(MMC[0-4]_RATIO + 1)/(MMC[0-4]_PRE_RATIO +1) */
+/* CLK_DIV_FSYS1 */
+#define MMC0_RATIO        0xF
+#define MMC0_PRE_RATIO        0x0
+#define MMC1_RATIO        0xF
+#define MMC1_PRE_RATIO        0x0
+#define CLK_DIV_FSYS1_VAL ((MMC1_PRE_RATIO << 24) \
+              | (MMC1_RATIO << 16) \
+              | (MMC0_PRE_RATIO << 8) \
+              | (MMC0_RATIO << 0))
+
+/* CLK_DIV_FSYS2 */
+#define MMC2_RATIO        0x7
+#define MMC2_PRE_RATIO        0x0
+#define MMC3_RATIO        0x7
+#define MMC3_PRE_RATIO        0x4
+#define CLK_DIV_FSYS2_VAL ((MMC3_PRE_RATIO << 24) \
+              | (MMC3_RATIO << 16) \
+              | (MMC2_PRE_RATIO << 8) \
+              | (MMC2_RATIO << 0))
+
+/* CLK_DIV_FSYS3 */
+#define MMC4_RATIO        0xF
+#define MMC4_PRE_RATIO        0x0
+#define CLK_DIV_FSYS3_VAL ((MMC4_PRE_RATIO << 8) \
+              | (MMC4_RATIO << 0))
+
+/* CLK_SRC_PERIL0 */
+#define UART_SEL_XXTI     0
+#define UART_SEL_XUSBXTI  1
+#define UART_SEL_SCLK_HDMI24M 2
+#define UART_SEL_SCLK_USBPHY0 3
+#define UART_SEL_SCLK_USBPHY1 4
+#define UART_SEL_SCLK_HDMIPHY 5
+#define UART_SEL_SCLKMPLL 6
+#define UART_SEL_SCLKEPLL 7
+#define UART_SEL_SCLKVPLL 8
+
+#define UART0_SEL     UART_SEL_SCLKMPLL
+#define UART1_SEL     UART_SEL_SCLKMPLL
+#define UART2_SEL     UART_SEL_SCLKMPLL
+#define UART3_SEL     UART_SEL_SCLKMPLL
+#define UART4_SEL     UART_SEL_SCLKMPLL
+#define CLK_SRC_PERIL0_VAL    ((UART4_SEL << 16) \
+              | (UART3_SEL << 12) \
+              | (UART2_SEL << 8) \
+              | (UART1_SEL << 4) \
+              | (UART0_SEL << 0))
+
+/* SCLK_UART[0-4] = MOUTUART[0-4]/(UART[0-4]_RATIO + 1) */
+/* CLK_DIV_PERIL0 */
+#define UART0_RATIO       7
+#define UART1_RATIO       7
+#define UART2_RATIO       7
+#define UART3_RATIO       7
+#define UART4_RATIO       7
+#define CLK_DIV_PERIL0_VAL    ((UART4_RATIO << 16) \
+              | (UART3_RATIO << 12) \
+              | (UART2_RATIO << 8) \
+              | (UART1_RATIO << 4) \
+              | (UART0_RATIO << 0))
+
+/* Clock Source CAM/FIMC */
+/* CLK_SRC_CAM */
+#define CAM0_SEL_XUSBXTI  1
+#define CAM1_SEL_XUSBXTI  1
+#define CSIS0_SEL_XUSBXTI 1
+#define CSIS1_SEL_XUSBXTI 1
+
+#define FIMC_SEL_SCLKMPLL 6
+#define FIMC0_LCLK_SEL        FIMC_SEL_SCLKMPLL
+#define FIMC1_LCLK_SEL        FIMC_SEL_SCLKMPLL
+#define FIMC2_LCLK_SEL        FIMC_SEL_SCLKMPLL
+#define FIMC3_LCLK_SEL        FIMC_SEL_SCLKMPLL
+
+#define CLK_SRC_CAM_VAL       ((CSIS1_SEL_XUSBXTI << 28) \
+              | (CSIS0_SEL_XUSBXTI << 24) \
+              | (CAM1_SEL_XUSBXTI << 20) \
+              | (CAM0_SEL_XUSBXTI << 16) \
+              | (FIMC3_LCLK_SEL << 12) \
+              | (FIMC2_LCLK_SEL << 8) \
+              | (FIMC1_LCLK_SEL << 4) \
+              | (FIMC0_LCLK_SEL << 0))
+
+/* SCLK CAM */
+/* CLK_DIV_CAM */
+#define FIMC0_LCLK_RATIO  4
+#define FIMC1_LCLK_RATIO  4
+#define FIMC2_LCLK_RATIO  4
+#define FIMC3_LCLK_RATIO  4
+#define CLK_DIV_CAM_VAL       ((FIMC3_LCLK_RATIO << 12) \
+              | (FIMC2_LCLK_RATIO << 8) \
+              | (FIMC1_LCLK_RATIO << 4) \
+              | (FIMC0_LCLK_RATIO << 0))
+
+/* SCLK MFC */
+/* CLK_SRC_MFC */
+#define MFC_SEL_MPLL      0
+#define MOUTMFC_0     0
+#define MFC_SEL           MOUTMFC_0
+#define MFC_0_SEL     MFC_SEL_MPLL
+#define CLK_SRC_MFC_VAL       ((MFC_SEL << 8) | (MFC_0_SEL))
+
+
+/* CLK_DIV_MFC */
+#define MFC_RATIO     3
+#define CLK_DIV_MFC_VAL       (MFC_RATIO)
+
+/* SCLK G3D */
+/* CLK_SRC_G3D */
+#define G3D_SEL_MPLL      0
+#define MOUTG3D_0     0
+#define G3D_SEL           MOUTG3D_0
+#define G3D_0_SEL     G3D_SEL_MPLL
+#define CLK_SRC_G3D_VAL       ((G3D_SEL << 8) | (G3D_0_SEL))
+
+/* CLK_DIV_G3D */
+#define G3D_RATIO     1
+#define CLK_DIV_G3D_VAL       (G3D_RATIO)
+
+/* SCLK LCD */
+/* CLK_SRC_LCD */
+#define FIMD_SEL_SCLKMPLL 6
+#define MDNIE0_SEL_XUSBXTI    1
+#define MDNIE_PWM0_SEL_XUSBXTI    1
+#define MIPI0_SEL_XUSBXTI 1
+#define CLK_SRC_LCD_VAL   ((MIPI0_SEL_XUSBXTI << 12) \
+              | (MDNIE_PWM0_SEL_XUSBXTI << 8) \
+              | (MDNIE0_SEL_XUSBXTI << 4) \
+              | (FIMD_SEL_SCLKMPLL << 0))
+
+/* CLK_DIV_LCD */
+#define MIPI0_PRE_RATIO   0xF
+#define MIPI0_RATIO   0xF
+#define MDNIE_PWM0_PRE_RATIO  0xF
+#define MDNIE_PWM0_RATIO  0xF
+#define MDNIE0_RATIO  0xF
+#define FIMD0_RATIO       0xF
+#define CLK_DIV_LCD_VAL   ((MIPI0_PRE_RATIO << 20) \
+              | (MIPI0_RATIO << 16) \
+              | (MDNIE_PWM0_PRE_RATIO << 12) \
+              | (MDNIE_PWM0_RATIO << 8) \
+              | (MDNIE0_RATIO << 4) \
+              | (FIMD0_RATIO << 0))
+
+/* Required period to generate a stable clock output */
+/* PLL_LOCK_TIME */
+#define PLL_LOCKTIME      0x1C20
+
+/* PLL Values */
+#define DISABLE           0
+#define ENABLE            1
+#define SET_PLL(mdiv, pdiv, sdiv) ((ENABLE << 31)\
+                  | (mdiv << 16) \
+                  | (pdiv << 8) \
+                  | (sdiv << 0))
+
+/* APLL_CON0 */
+#define APLL_MDIV     175
+#define APLL_PDIV     3
+#define APLL_SDIV     0
+#define APLL_CON0_VAL     SET_PLL(APLL_MDIV, APLL_PDIV, APLL_SDIV)
+
+/* APLL_CON1 */
+#define APLL_RESV1        0x0
+#define APLL_RESV0        0x1
+#define APLL_BYPASS       0x0
+#define APLL_DCC_ENB  0x0
+#define APLL_AFC_ENB  0x0
+#define APLL_FEED_EN  0x0
+#define APLL_LOCK_CON_OUT 0x0
+#define APLL_LOCK_CON_IN  0x3
+#define APLL_LOCK_CON_DLY 0x8
+#define APLL_AFC      0x0
+#define APLL_CON1_VAL     ((APLL_RESV1 << 24) \
+                  | (APLL_RESV0 << 23) \
+                  | (APLL_BYPASS << 22) \
+                  | (APLL_DCC_ENB << 21) \
+                  | (APLL_AFC_ENB << 20) \
+                  | (APLL_FEED_EN << 16) \
+                  | (APLL_LOCK_CON_OUT << 14) \
+                  | (APLL_LOCK_CON_IN << 12) \
+                  | (APLL_LOCK_CON_DLY << 8) \
+                  | (APLL_AFC << 0))
+
+/* MPLL_CON0 */
+#define MPLL_MDIV     100
+#define MPLL_PDIV     3
+#define MPLL_SDIV     0
+#define MPLL_CON0_VAL     SET_PLL(MPLL_MDIV, MPLL_PDIV, MPLL_SDIV)
+
+/* MPLL_CON1 */
+#define MPLL_RESV1            0x0
+#define MPLL_RESV0            0x1
+#define MPLL_BYPASS           0x0
+#define MPLL_DCC_ENB      0x0
+#define MPLL_AFC_ENB      0x0
+#define MPLL_FEED_EN      0x0
+#define MPLL_LOCK_CON_OUT 0x0
+#define MPLL_LOCK_CON_IN  0x3
+#define MPLL_LOCK_CON_DLY 0x8
+#define MPLL_AFC      0x0
+#define MPLL_CON1_VAL     ((MPLL_RESV1 << 24) \
+                  | (MPLL_RESV0 << 23) \
+                  | (MPLL_BYPASS << 22) \
+                  | (MPLL_DCC_ENB << 21) \
+                  | (MPLL_AFC_ENB << 20) \
+                  | (MPLL_FEED_EN << 16) \
+                  | (MPLL_LOCK_CON_OUT << 14) \
+                  | (MPLL_LOCK_CON_IN << 12) \
+                  | (MPLL_LOCK_CON_DLY << 8) \
+                  | (MPLL_AFC << 0))
+
+/* EPLL_CON0 */
+#define EPLL_MDIV     0x30
+#define EPLL_PDIV     0x3
+#define EPLL_SDIV     0x2
+#define EPLL_CON0_VAL     SET_PLL(EPLL_MDIV, EPLL_PDIV, EPLL_SDIV)
+
+/* EPLL_CON1 */
+#define EPLL_K            0x0
+#define EPLL_CON1_VAL     (EPLL_K >> 0)
+
+/* VPLL_CON0 */
+#define VPLL_MDIV     0x35
+#define VPLL_PDIV     0x3
+#define VPLL_SDIV     0x2
+#define VPLL_CON0_VAL     SET_PLL(VPLL_MDIV, VPLL_PDIV, VPLL_SDIV)
+
+/* VPLL_CON1 */
+#define VPLL_SSCG_EN      DISABLE
+#define VPLL_SEL_PF_DN_SPREAD 0x0
+#define VPLL_MRR      0x11
+#define VPLL_MFR      0x0
+#define VPLL_K            0x400
+#define VPLL_CON1_VAL     ((VPLL_SSCG_EN << 31)\
+              | (VPLL_SEL_PF_DN_SPREAD << 29) \
+              | (VPLL_MRR << 24) \
+              | (VPLL_MFR << 16) \
+              | (VPLL_K << 0))
+
+/* DMC */
+#define DIRECT_CMD_NOP    0x07000000
+#define DIRECT_CMD_ZQ 0x0a000000
+#define DIRECT_CMD_CHIP1_SHIFT    (1 << 20)
+#define MEM_TIMINGS_MSR_COUNT 4
+#define CTRL_START    (1 << 0)
+#define CTRL_DLL_ON   (1 << 1)
+#define AREF_EN       (1 << 5)
+#define DRV_TYPE  (1 << 6)
+
+struct mem_timings {
+  unsigned direct_cmd_msr[MEM_TIMINGS_MSR_COUNT];
+  unsigned timingref;
+  unsigned timingrow;
+  unsigned timingdata;
+  unsigned timingpower;
+  unsigned zqcontrol;
+  unsigned control0;
+  unsigned control1;
+  unsigned control2;
+  unsigned concontrol;
+  unsigned prechconfig;
+  unsigned memcontrol;
+  unsigned memconfig0;
+  unsigned memconfig1;
+  unsigned dll_resync;
+  unsigned dll_on;
+};
+
+/* MIU */
+/* MIU Config Register Offsets*/
+#define APB_SFR_INTERLEAVE_CONF_OFFSET    0x400
+#define APB_SFR_ARBRITATION_CONF_OFFSET   0xC00
+#define ABP_SFR_SLV_ADDRMAP_CONF_OFFSET   0x800
+#define ABP_SFR_INTERLEAVE_ADDRMAP_START_OFFSET   0x808
+#define ABP_SFR_INTERLEAVE_ADDRMAP_END_OFFSET 0x810
+#define ABP_SFR_SLV0_SINGLE_ADDRMAP_START_OFFSET  0x818
+#define ABP_SFR_SLV0_SINGLE_ADDRMAP_END_OFFSET    0x820
+#define ABP_SFR_SLV1_SINGLE_ADDRMAP_START_OFFSET  0x828
+#define ABP_SFR_SLV1_SINGLE_ADDRMAP_END_OFFSET    0x830
+
+#ifdef CONFIG_TINY4412
+/* Interleave: 2Bit, Interleave_bit1: 0x15, Interleave_bit0: 0x7 */
+#define APB_SFR_INTERLEAVE_CONF_VAL   0x20001507
+#define APB_SFR_ARBRITATION_CONF_VAL  0x00000001
+#endif
+
+#define INTERLEAVE_ADDR_MAP_START_ADDR    0x40000000
+#define INTERLEAVE_ADDR_MAP_END_ADDR  0xbfffffff
+#define INTERLEAVE_ADDR_MAP_EN        0x00000001
+
+#ifdef CONFIG_MIU_1BIT_INTERLEAVED
+/* Interleave_bit0: 0xC*/
+#define APB_SFR_INTERLEAVE_CONF_VAL   0x0000000c
+#endif
+#ifdef CONFIG_MIU_2BIT_INTERLEAVED
+/* Interleave: 2Bit, Interleave_bit1: 0x15, Interleave_bit0: 0xc */
+#define APB_SFR_INTERLEAVE_CONF_VAL   0x2000150c
+#endif
+#define SLAVE0_SINGLE_ADDR_MAP_START_ADDR 0x40000000
+#define SLAVE0_SINGLE_ADDR_MAP_END_ADDR       0x7fffffff
+#define SLAVE1_SINGLE_ADDR_MAP_START_ADDR 0x80000000
+#define SLAVE1_SINGLE_ADDR_MAP_END_ADDR       0xbfffffff
+/* Enable SME0 and SME1*/
+#define APB_SFR_SLV_ADDR_MAP_CONF_VAL     0x00000006
+
+#define FORCE_DLL_RESYNC  3
+#define DLL_CONTROL_ON        1
+
+#define DIRECT_CMD1   0x00020000
+#define DIRECT_CMD2   0x00030000
+#define DIRECT_CMD3   0x00010002
+#define DIRECT_CMD4   0x00000328
+
+#define CTRL_ZQ_MODE_NOTERM   (0x1 << 0)
+#define CTRL_ZQ_START     (0x1 << 1)
+#define CTRL_ZQ_FORCE     (0x0 << 2)
+#define CTRL_ZQ_DIV       (0 << 4)
+#define CTRL_ZQ_MODE_DDS  (0x4 << 8)
+#define CTRL_ZQ_MODE_TERM (0x1 << 11)
+#define CTRL_ZQ_FORCE_IMPN    (0x5 << 14)
+#define CTRL_ZQ_FORCE_IMPP    (0x2 << 17)
+#define CTRL_DCC      (0xE38 << 20)
+#define ZQ_CONTROL_VAL        (CTRL_ZQ_MODE_NOTERM | CTRL_ZQ_START | CTRL_ZQ_FORCE\
+              | CTRL_ZQ_DIV | CTRL_ZQ_MODE_DDS\
+              | CTRL_ZQ_MODE_TERM | CTRL_ZQ_FORCE_IMPN\
+              | CTRL_ZQ_FORCE_IMPP | CTRL_DCC)
+
+#define ASYNC         (0 << 0)
+#define CLK_RATIO     (1 << 1)
+#define DIV_PIPE      (1 << 3)
+#define AWR_ON            (1 << 4)
+#define AREF_DISABLE      (0 << 5)
+#define DRV_TYPE_DISABLE  (0 << 6)
+#define CHIP0_NOT_EMPTY       (0 << 8)
+#define CHIP1_NOT_EMPTY       (0 << 9)
+#define DQ_SWAP_DISABLE       (0 << 10)
+#define QOS_FAST_DISABLE  (0 << 11)
+#define RD_FETCH      (0x3 << 12)
+#define TIMEOUT_LEVEL0        (0xFFF << 16)
+#define CONCONTROL_VAL        (ASYNC | CLK_RATIO | DIV_PIPE | AWR_ON\
+              | AREF_DISABLE | DRV_TYPE_DISABLE\
+              | CHIP0_NOT_EMPTY | CHIP1_NOT_EMPTY\
+              | DQ_SWAP_DISABLE | QOS_FAST_DISABLE\
+              | RD_FETCH | TIMEOUT_LEVEL0)
+
+#define CLK_STOP_DISABLE  (0 << 1)
+#define DPWRDN_DISABLE        (0 << 2)
+#define DPWRDN_TYPE       (0 << 3)
+#define TP_DISABLE        (0 << 4)
+#define DSREF_DIABLE      (0 << 5)
+#define ADD_LAT_PALL      (1 << 6)
+#define MEM_TYPE_DDR3     (0x6 << 8)
+#define MEM_WIDTH_32      (0x2 << 12)
+#define NUM_CHIP_2        (0 << 16)
+#define BL_8          (0x3 << 20)
+#define MEMCONTROL_VAL        (CLK_STOP_DISABLE | DPWRDN_DISABLE\
+              | DPWRDN_TYPE | TP_DISABLE | DSREF_DIABLE\
+              | ADD_LAT_PALL | MEM_TYPE_DDR3 | MEM_WIDTH_32\
+              | NUM_CHIP_2 | BL_8)
+
+
+#define CHIP_BANK_8       (0x3 << 0)
+#define CHIP_ROW_14       (0x3 << 4)
+#define CHIP_COL_10       (0x3 << 8)
+#define CHIP_MAP_INTERLEAVED  (1 << 12)
+#define CHIP_MASK     (0xC0 << 16)
+#ifdef CONFIG_MIU_LINEAR
+#define CHIP0_BASE        (0x40 << 24)
+#define CHIP1_BASE        (0x60 << 24)
+#else
+#define CHIP0_BASE        (0x40 << 24)
+#define CHIP1_BASE        (0x80 << 24)
+#endif
+#define MEMCONFIG0_VAL        (CHIP_BANK_8 | CHIP_ROW_14 | CHIP_COL_10\
+              | CHIP_MAP_INTERLEAVED | CHIP_MASK | CHIP0_BASE)
+#define MEMCONFIG1_VAL        (CHIP_BANK_8 | CHIP_ROW_14 | CHIP_COL_10\
+              | CHIP_MAP_INTERLEAVED | CHIP_MASK | CHIP1_BASE)
+
+#define TP_CNT            (0xff << 24)
+#define PRECHCONFIG       TP_CNT
+
+#define CTRL_OFF      (0 << 0)
+#define CTRL_DLL_OFF      (0 << 1)
+#define CTRL_HALF     (0 << 2)
+#define CTRL_DFDQS        (1 << 3)
+#define DQS_DELAY     (0 << 4)
+#define CTRL_START_POINT  (0x10 << 8)
+#define CTRL_INC      (0x10 << 16)
+#define CTRL_FORCE        (0x71 << 24)
+#define CONTROL0_VAL      (CTRL_OFF | CTRL_DLL_OFF | CTRL_HALF\
+              | CTRL_DFDQS | DQS_DELAY | CTRL_START_POINT\
+              | CTRL_INC | CTRL_FORCE)
+
+#define CTRL_SHIFTC       (0x6 << 0)
+#define CTRL_REF      (8 << 4)
+#define CTRL_SHGATE       (1 << 29)
+#define TERM_READ_EN      (1 << 30)
+#define TERM_WRITE_EN     (1 << 31)
+#define CONTROL1_VAL      (CTRL_SHIFTC | CTRL_REF | CTRL_SHGATE\
+              | TERM_READ_EN | TERM_WRITE_EN)
+
+#define CONTROL2_VAL      0x00000000
+
+#define TIMINGREF_VAL     0x000000BB
+#define TIMINGROW_VAL     0x7a46654f
+#define   TIMINGDATA_VAL      0x46400506
+#define   TIMINGPOWER_VAL     0x52000A3C
+#endif

2.3.7 arch/arm/mach-exynos/lowlevel_init.c

修改DEBUG_UART引脚复用配置,由UART3改为UART0。

此处的串口仅仅是早期调试串口,启动时会打印“<debug_uart>”,真正的U-Boot命令行终端使用的串口由设备树定义,位于/aliases/节点的console属性。

diff --git a/arch/arm/mach-exynos/lowlevel_init.c b/arch/arm/mach-exynos/lowlevel_init.c
index 97d6ca8fc2..29682d5135 100644
--- a/arch/arm/mach-exynos/lowlevel_init.c
+++ b/arch/arm/mach-exynos/lowlevel_init.c
@@ -220,7 +220,11 @@ int do_lowlevel_init(void)#ifdef CONFIG_DEBUG_UART#if (defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_SERIAL_SUPPORT)) || \!defined(CONFIG_SPL_BUILD)
+      #if IS_ENABLED(CONFIG_TINY4412)
+      exynos_pinmux_config(PERIPH_ID_UART0, PINMUX_FLAG_NONE);
+      #elseexynos_pinmux_config(PERIPH_ID_UART3, PINMUX_FLAG_NONE);
+      #endifdebug_uart_init();#endif#endif

2.3.8 arch/arm/mach-exynos/tzpc.c

修改TrustZone配置。

diff --git a/arch/arm/mach-exynos/tzpc.c b/arch/arm/mach-exynos/tzpc.c
index abe8e7f458..3134a27f98 100644
--- a/arch/arm/mach-exynos/tzpc.c
+++ b/arch/arm/mach-exynos/tzpc.c
@@ -34,7 +34,11 @@ void tzpc_init(void)if (cpu_is_exynos5() && (addr == end))break;+        #if IS_ENABLED(CONFIG_TINY4412)
+      writel(0xBF, &tzpc->decprot2set);
+      #elsewritel(DECPROTXSET, &tzpc->decprot2set);
+      #endifwritel(DECPROTXSET, &tzpc->decprot3set);}}

2.3.9 board/samsung/tiny4412/Kconfig

在board/samsung目录下新建tiny4412板子的文件夹。

添加板子相关配置项定义。

diff --git a/board/samsung/tiny4412/Kconfig b/board/samsung/tiny4412/Kconfig
new file mode 100644
index 0000000000..044c4f84ec
--- /dev/null
+++ b/board/samsung/tiny4412/Kconfig
@@ -0,0 +1,16 @@
+if TARGET_TINY4412
+
+config TINY4412
+  bool
+  default y
+
+config SYS_BOARD
+  default "tiny4412"
+
+config SYS_VENDOR
+  default "samsung"
+
+config SYS_CONFIG_NAME
+  default "tiny4412"
+
+endif

2.3.10 board/samsung/tiny4412/MAINTAINERS

在board/samsung目录下新建tiny4412板子的文件夹。

添加维护者相关信息。

diff --git a/board/samsung/tiny4412/MAINTAINERS b/board/samsung/tiny4412/MAINTAINERS
new file mode 100644
index 0000000000..e68fdff08a
--- /dev/null
+++ b/board/samsung/tiny4412/MAINTAINERS
@@ -0,0 +1,6 @@
+TINY4412 BOARD
+M:    xkwy.xkwy <xkwy001@gmail.com>
+S:    Maintained
+F:    board/samsung/tiny4412/
+F:    include/configs/tiny4412.h
+F:    configs/tiny4412_defconfig

2.3.11 board/samsung/tiny4412/Makefile

在board/samsung目录下新建tiny4412板子的文件夹。

添加编译脚本,主要加入编译板级实现的接口tiny4412.c,以及编译制作tiny4412-spl.bin的工具。

diff --git a/board/samsung/tiny4412/Makefile b/board/samsung/tiny4412/Makefile
new file mode 100644
index 0000000000..07170d7803
--- /dev/null
+++ b/board/samsung/tiny4412/Makefile
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2020 xkwy2018.cn
+
+ifdef CONFIG_SPL_BUILD
+# necessary to create built-in.o
+obj- := __dummy__.o
+
+hostprogs-y := tools/mktiny4412spl
+always := $(hostprogs-y)
+else
+obj-y += tiny4412.o
+endif

2.3.12 board/samsung/tiny4412/tiny4412.c

在board/samsung目录下新建tiny4412板子的文件夹。

添加板级接口,如获取、设置板子类型,exynos_init等。

diff --git a/board/samsung/tiny4412/tiny4412.c b/board/samsung/tiny4412/tiny4412.c
new file mode 100644
index 0000000000..2e2bec9ce8
--- /dev/null
+++ b/board/samsung/tiny4412/tiny4412.c
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2020 xkwy2018.cn
+ */
+
+#include <common.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_BOARD_TYPES
+void set_board_type(void)
+{
+  gd->board_type = 0x1506;
+}
+
+void set_board_revision(void)
+{
+  /*
+   * Revision already set by set_board_type() because it can be
+   * executed early.
+   */
+}
+
+const char *get_board_type(void)
+{
+  return "1506";
+}
+#endif
+
+u32 get_board_rev(void)
+{
+  return 0;
+}
+
+int exynos_init(void)
+{
+  return 0;
+}

2.3.13 board/samsung/tiny4412/tools/mktiny4412spl.c

在board/samsung/tiny4412目录下新建tools文件夹。

添加制作tiny4412-spl.bin的工具。

原始编译出来的spl/u-boot-spl.bin直接烧录到SD卡或eMMC中无法运行,需要使用这个工具加个文件头和校验才行。

本工具将u-boot-spl.bin截断或补齐14KB并计算校验和作为bl2,然后在它前面放8KB的bl1程序(E4412_N.bl1.bin)。

diff --git a/board/samsung/tiny4412/tools/mktiny4412spl.c b/board/samsung/tiny4412/tools/mktiny4412spl.c
new file mode 100644
index 0000000000..d7e4913f63
--- /dev/null
+++ b/board/samsung/tiny4412/tools/mktiny4412spl.c
@@ -0,0 +1,446 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+
+#define BL2_OFFSET            (8*1024)
+#define BL2_SIZE          (14*1024)
+
+/*
+ * Requirement:
+ * IROM code reads first 14K bytes from boot device.
+ * It then calculates the checksum of 14K-4 bytes and compare with data at
+ * 14K-4 offset.
+ *
+ * This function takes two filenames:
+ * IN  "u-boot-spl.bin" and
+ * OUT "$(BOARD)-spl.bin as filenames.
+ * It reads the "u-boot-spl.bin" in 14K buffer.
+ * It calculates checksum of 14K-4 Bytes and stores at 14K-4 offset in buffer.
+ * It writes the buffer to "$(BOARD)-spl.bin" file.
+ */
+
+static unsigned char buf[BL2_OFFSET+BL2_SIZE] = { /* E4412_N.bl1.bin */
+  0xA3,0x69,0xD3,0x18,0xE9,0x7D,0xB9,0x66,0xD1,0x6B,0xD5,0x6E,0xD4,0x79,0xA6,0x79,
+  0x07,0x00,0x00,0xEA,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,
+  0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,
+  0xFE,0xFF,0xFF,0xEA,0xDC,0x00,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x02,0x11,0xA0,0xE3,
+  0x01,0x00,0x10,0xE1,0x24,0x00,0x00,0x0A,0xCC,0x00,0x9F,0xE5,0x00,0x00,0x90,0xE5,
+  0x01,0x00,0x10,0xE3,0x20,0x00,0x00,0x0A,0xC0,0x00,0x9F,0xE5,0x00,0x00,0x90,0xE5,
+  0x03,0x00,0x00,0xE2,0x03,0x00,0x30,0xE3,0x04,0x00,0x00,0x0A,0xB0,0x00,0x9F,0xE5,
+  0x00,0x00,0x90,0xE5,0x01,0x00,0x10,0xE3,0x00,0x00,0x00,0x0A,0x16,0x00,0x00,0xEA,
+  0xA0,0x00,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x03,0x00,0x00,0xE2,0x03,0x00,0x30,0xE3,
+  0x04,0x00,0x00,0x0A,0x90,0x00,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x01,0x00,0x10,0xE3,
+  0x00,0x00,0x00,0x0A,0x0C,0x00,0x00,0xEA,0x80,0x20,0x9F,0xE5,0x00,0x40,0x92,0xE5,
+  0x7C,0x20,0x9F,0xE5,0x00,0x50,0x92,0xE5,0x78,0x60,0x9F,0xE5,0x06,0x00,0x54,0xE1,
+  0x05,0xF0,0xA0,0x01,0x70,0x00,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x07,0x00,0x00,0xE2,
+  0x07,0x00,0x30,0xE3,0x00,0x00,0x00,0x1A,0xC8,0x07,0x00,0xEA,0x5C,0x00,0x9F,0xE5,
+  0x5C,0x10,0x9F,0xE5,0x5C,0x30,0x9F,0xE5,0x01,0x00,0x50,0xE1,0x03,0x00,0x00,0x0A,
+  0x03,0x00,0x51,0xE1,0x04,0x20,0x90,0x34,0x04,0x20,0x81,0x34,0xFB,0xFF,0xFF,0x3A,
+  0x44,0x10,0x9F,0xE5,0x00,0x20,0xA0,0xE3,0x01,0x00,0x53,0xE1,0x04,0x20,0x83,0x34,
+  0xFC,0xFF,0xFF,0x3A,0x2B,0x00,0x00,0xEA,0x00,0x06,0x02,0x10,0xC0,0x12,0x02,0x10,
+  0x88,0x11,0x02,0x10,0x84,0x11,0x02,0x10,0x98,0x11,0x02,0x10,0x94,0x11,0x02,0x10,
+  0x20,0x00,0x02,0x02,0x24,0x00,0x02,0x02,0x10,0x0D,0xBA,0xFC,0x98,0x13,0x02,0x10,
+  0xA4,0x2A,0x02,0x02,0xA4,0x2A,0x02,0x02,0xA4,0x2A,0x02,0x02,0xA4,0x2A,0x02,0x02,
+  0x01,0x12,0xA0,0xE3,0x0C,0x00,0x91,0xE5,0x00,0x00,0x50,0xE3,0x02,0x00,0x00,0x1A,
+  0x00,0x10,0xA0,0xE3,0x04,0x21,0x9F,0xE5,0x08,0x10,0x82,0xE5,0x1E,0xFF,0x2F,0xE1,
+  0xFC,0x00,0x9F,0xE5,0x00,0x07,0x90,0xE5,0x02,0x07,0x80,0xE3,0x02,0x0B,0x80,0xE3,
+  0xEC,0x10,0x9F,0xE5,0x00,0x07,0x81,0xE5,0x01,0x00,0xA0,0xE1,0x04,0x07,0x90,0xE5,
+  0x02,0x04,0x80,0xE3,0x40,0x00,0x80,0xE3,0x04,0x07,0x81,0xE5,0x01,0x00,0xA0,0xE1,
+  0x00,0x09,0x90,0xE5,0x02,0x04,0x80,0xE3,0x80,0x00,0x80,0xE3,0x00,0x09,0x81,0xE5,
+  0x07,0x09,0x01,0xE3,0x19,0x17,0x81,0xE2,0x08,0x00,0x81,0xE5,0x42,0x18,0x81,0xE2,
+  0x08,0x00,0x81,0xE5,0x1E,0xFF,0x2F,0xE1,0x70,0x40,0x2D,0xE9,0xDF,0xFF,0xFF,0xEB,
+  0xE6,0xFF,0xFF,0xEB,0x2B,0x00,0x00,0xEB,0x70,0x40,0xFF,0xE6,0x2E,0x00,0x00,0xEB,
+  0xFF,0x50,0x00,0xE2,0x9D,0x01,0x00,0xEB,0x00,0x60,0xA0,0xE1,0x04,0x00,0xA0,0xE1,
+  0xDA,0x00,0x00,0xEB,0x00,0x00,0x55,0xE3,0x0A,0x00,0x00,0x1A,0x30,0x00,0x00,0xEB,
+  0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x68,0x00,0x9F,0xE5,0x68,0x10,0x9F,0xE5,
+  0x80,0x09,0x81,0xE5,0x00,0xF0,0x20,0xE3,0xFE,0xFF,0xFF,0xEA,0x5C,0x00,0x9F,0xE5,
+  0x30,0xFF,0x2F,0xE1,0x0F,0x00,0x00,0xEA,0x00,0x00,0x56,0xE3,0x02,0x00,0x00,0x0A,
+  0x48,0x00,0x9F,0xE5,0x30,0xFF,0x2F,0xE1,0x0A,0x00,0x00,0xEA,0x5E,0x01,0x00,0xEB,
+  0x01,0x00,0x50,0xE3,0x02,0x00,0x00,0x1A,0x30,0x00,0x9F,0xE5,0x30,0xFF,0x2F,0xE1,
+  0x04,0x00,0x00,0xEA,0x28,0x00,0x9F,0xE5,0x1C,0x10,0x9F,0xE5,0x80,0x09,0x81,0xE5,
+  0x00,0xF0,0x20,0xE3,0xFE,0xFF,0xFF,0xEA,0x00,0x00,0xA0,0xE3,0x70,0x80,0xBD,0xE8,
+  0x00,0x00,0x9D,0x13,0x00,0x00,0x04,0x10,0x60,0x00,0xAD,0xDE,0x00,0x00,0x02,0x10,
+  0x00,0x34,0x02,0x02,0x61,0x00,0xAD,0xDE,0xAC,0x00,0x9F,0xE5,0x80,0x09,0x90,0xE5,
+  0x70,0x10,0xFF,0xE6,0x01,0x00,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0x98,0x00,0x9F,0xE5,
+  0x80,0x19,0x90,0xE5,0x01,0x08,0x11,0xE3,0x01,0x00,0x00,0x0A,0x01,0x00,0xA0,0xE3,
+  0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,0x00,0xF0,0x20,0xE3,
+  0xFE,0xFF,0xFF,0xEA,0x30,0x40,0x2D,0xE9,0x00,0x30,0xA0,0xE3,0x6C,0x00,0x9F,0xE5,
+  0xFC,0x4B,0x90,0xE5,0x00,0x20,0xA0,0xE3,0x0E,0x00,0x00,0xEA,0x60,0x00,0x9F,0xE5,
+  0x02,0x01,0x80,0xE0,0x00,0x14,0x90,0xE5,0x00,0x00,0x51,0xE3,0x00,0x00,0x00,0x1A,
+  0x07,0x00,0x00,0xEA,0x51,0x58,0xE7,0xE7,0x21,0x0C,0x85,0xE0,0x51,0x54,0xE7,0xE7,
+  0x05,0x00,0x80,0xE0,0xFF,0x50,0x01,0xE2,0x05,0x00,0x80,0xE0,0x00,0x30,0x83,0xE0,
+  0x00,0xF0,0x20,0xE3,0x01,0x20,0x82,0xE2,0xFF,0x0D,0x00,0xE3,0x00,0x00,0x52,0xE1,
+  0xED,0xFF,0xFF,0x3A,0x03,0x00,0x54,0xE1,0x01,0x00,0x00,0x0A,0x00,0x00,0xA0,0xE3,
+  0x30,0x80,0xBD,0xE8,0x01,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,0x00,0x00,0x02,0x10,
+  0x00,0x60,0x02,0x02,0x00,0x30,0x02,0x02,0x10,0x40,0x2D,0xE9,0x20,0x40,0xA0,0xE3,
+  0x60,0x04,0x9F,0xE5,0x0D,0x1B,0x80,0xE2,0x3C,0x20,0x90,0xE5,0x04,0x00,0xA0,0xE1,
+  0x32,0xFF,0x2F,0xE1,0x01,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,
+  0x10,0x80,0xBD,0xE8,0x00,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,0x10,0x40,0x2D,0xE9,
+  0x20,0x40,0xA0,0xE3,0x2C,0x04,0x9F,0xE5,0x0D,0x1B,0x80,0xE2,0x44,0x20,0x90,0xE5,
+  0x04,0x00,0xA0,0xE1,0x32,0xFF,0x2F,0xE1,0x01,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,
+  0x01,0x00,0xA0,0xE3,0x10,0x80,0xBD,0xE8,0x00,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,
+  0x10,0x40,0x2D,0xE9,0xFC,0x13,0x9F,0xE5,0x6C,0x00,0x91,0xE5,0x30,0xFF,0x2F,0xE1,
+  0x10,0x80,0xBD,0xE8,0x70,0x40,0x2D,0xE9,0x20,0x40,0xA0,0xE3,0xF7,0xFF,0xFF,0xEB,
+  0x01,0x10,0xA0,0xE3,0xA0,0x54,0x81,0xE0,0xD8,0x03,0x9F,0xE5,0x0D,0x2B,0x80,0xE2,
+  0x04,0x10,0xA0,0xE1,0x30,0x30,0x90,0xE5,0x05,0x00,0xA0,0xE1,0x33,0xFF,0x2F,0xE1,
+  0x01,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,0x70,0x80,0xBD,0xE8,
+  0x00,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,0x10,0x40,0x2D,0xE9,0xE7,0xFF,0xFF,0xEB,
+  0x00,0x40,0xA0,0xE1,0x9C,0x03,0x9F,0xE5,0x0D,0x2B,0x80,0xE2,0x01,0x19,0xA0,0xE3,
+  0x58,0x30,0x90,0xE5,0x04,0x00,0xA0,0xE1,0x33,0xFF,0x2F,0xE1,0x00,0x00,0x50,0xE3,
+  0x01,0x00,0x00,0x0A,0x01,0x00,0xA0,0xE3,0x10,0x80,0xBD,0xE8,0x00,0x00,0xA0,0xE3,
+  0xFC,0xFF,0xFF,0xEA,0x10,0x40,0x2D,0xE9,0x68,0x13,0x9F,0xE5,0x70,0x00,0x91,0xE5,
+  0x30,0xFF,0x2F,0xE1,0x10,0x80,0xBD,0xE8,0x10,0x40,0x2D,0xE9,0x54,0x03,0x9F,0xE5,
+  0x01,0x19,0xA0,0xE3,0x60,0x20,0x90,0xE5,0x0D,0x0B,0x80,0xE2,0x32,0xFF,0x2F,0xE1,
+  0x01,0x00,0xA0,0xE3,0x10,0x80,0xBD,0xE8,0x10,0x40,0x2D,0xE9,0xCB,0xFF,0xFF,0xEB,
+  0x00,0x40,0xA0,0xE1,0x2C,0x03,0x9F,0xE5,0x0D,0x2B,0x80,0xE2,0x01,0x19,0xA0,0xE3,
+  0x64,0x30,0x90,0xE5,0x04,0x00,0xA0,0xE1,0x33,0xFF,0x2F,0xE1,0x00,0x00,0x50,0xE3,
+  0x08,0x00,0x00,0x0A,0x0C,0x13,0x9F,0xE5,0x68,0x00,0x91,0xE5,0x30,0xFF,0x2F,0xE1,
+  0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A,0x01,0x00,0xA0,0xE3,0x10,0x80,0xBD,0xE8,
+  0x00,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,0x00,0x00,0xA0,0xE3,0xFA,0xFF,0xFF,0xEA,
+  0xF8,0x43,0x2D,0xE9,0x00,0x40,0xA0,0xE3,0x00,0x00,0xA0,0xE3,0x00,0x00,0x8D,0xE5,
+  0x00,0x50,0xA0,0xE3,0xB1,0xFF,0xFF,0xEB,0x00,0x80,0xA0,0xE1,0x01,0x69,0xA0,0xE3,
+  0xC0,0x02,0x9F,0xE5,0x50,0x10,0x90,0xE5,0x0D,0x00,0xA0,0xE1,0x31,0xFF,0x2F,0xE1,
+  0x06,0x00,0xA0,0xE1,0x00,0x10,0x9D,0xE5,0x5E,0x04,0x00,0xEB,0x00,0x50,0xA0,0xE1,
+  0x08,0x00,0xA0,0xE1,0x00,0x10,0x9D,0xE5,0x5A,0x04,0x00,0xEB,0x00,0x70,0xA0,0xE1,
+  0x00,0xF0,0x20,0xE3,0x09,0x00,0x00,0xEA,0x07,0x20,0x84,0xE0,0x00,0x10,0x9D,0xE5,
+  0x91,0x04,0x01,0xE0,0x02,0x04,0x81,0xE2,0x8D,0x0B,0x80,0xE2,0x74,0x12,0x9F,0xE5,
+  0x4C,0x30,0x91,0xE5,0x00,0x10,0xA0,0xE3,0x33,0xFF,0x2F,0xE1,0x01,0x40,0x84,0xE2,
+  0x05,0x00,0x54,0xE1,0xF3,0xFF,0xFF,0x3A,0x01,0x00,0xA0,0xE3,0xF8,0x83,0xBD,0xE8,
+  0x10,0x40,0x2D,0xE9,0x00,0x40,0xA0,0xE1,0x12,0x00,0x54,0xE3,0x42,0x00,0x00,0x0A,
+  0x14,0x00,0x00,0xCA,0x12,0x00,0x54,0xE3,0x04,0xF1,0x8F,0x30,0x87,0x00,0x00,0xEA,
+  0x43,0x00,0x00,0xEA,0x38,0x00,0x00,0xEA,0x2E,0x00,0x00,0xEA,0x38,0x00,0x00,0xEA,
+  0x41,0x00,0x00,0xEA,0x4C,0x00,0x00,0xEA,0x40,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,
+  0x57,0x00,0x00,0xEA,0x5D,0x00,0x00,0xEA,0x4E,0x00,0x00,0xEA,0x68,0x00,0x00,0xEA,
+  0x7A,0x00,0x00,0xEA,0x79,0x00,0x00,0xEA,0x72,0x00,0x00,0xEA,0x77,0x00,0x00,0xEA,
+  0x37,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x1A,0x00,0x54,0xE3,0x47,0x00,0x00,0x0A,
+  0x0A,0x00,0x00,0xCA,0x13,0x00,0x44,0xE2,0x07,0x00,0x50,0xE3,0x00,0xF1,0x8F,0x30,
+  0x6E,0x00,0x00,0xEA,0x25,0x00,0x00,0xEA,0x2E,0x00,0x00,0xEA,0x38,0x00,0x00,0xEA,
+  0x2D,0x00,0x00,0xEA,0x16,0x00,0x00,0xEA,0x43,0x00,0x00,0xEA,0x49,0x00,0x00,0xEA,
+  0x1E,0x00,0x54,0xE3,0x2B,0x00,0x00,0x0A,0x06,0x00,0x00,0xCA,0x1B,0x00,0x54,0xE3,
+  0x51,0x00,0x00,0x0A,0x1C,0x00,0x54,0xE3,0x24,0x00,0x00,0x0A,0x1D,0x00,0x54,0xE3,
+  0x5E,0x00,0x00,0x1A,0x22,0x00,0x00,0xEA,0x01,0x0C,0x54,0xE3,0x4F,0x00,0x00,0x0A,
+  0x01,0x0C,0xE0,0xE3,0x04,0x00,0x90,0xE0,0x06,0x00,0x00,0x0A,0x01,0x00,0x50,0xE3,
+  0x56,0x00,0x00,0x1A,0x3C,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,
+  0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x59,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,
+  0x00,0x00,0x00,0x1A,0x14,0xFF,0xFF,0xEB,0x4F,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,
+  0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,
+  0x30,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,0x0A,0xFF,0xFF,0xEB,
+  0x45,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,
+  0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,
+  0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x2F,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,
+  0x00,0x00,0x00,0x1A,0xFC,0xFE,0xFF,0xEB,0x37,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,
+  0x00,0xF0,0x20,0xE3,0x7D,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,
+  0xF5,0xFE,0xFF,0xEB,0x30,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,
+  0x44,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,0xEE,0xFE,0xFF,0xEB,
+  0x29,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0xB6,0x00,0x00,0xEB,
+  0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,0xE7,0xFE,0xFF,0xEB,0x22,0x00,0x00,0xEA,
+  0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0xBF,0x00,0x00,0xEB,0x00,0x00,0x50,0xE3,
+  0x00,0x00,0x00,0x1A,0xE0,0xFE,0xFF,0xEB,0x1B,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,
+  0x44,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,0xDA,0xFE,0xFF,0xEB,
+  0x15,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0x45,0xFF,0xFF,0xEB,
+  0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,0xD3,0xFE,0xFF,0xEB,0x0E,0x00,0x00,0xEA,
+  0x00,0xF0,0x20,0xE3,0x32,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,
+  0xCD,0xFE,0xFF,0xEB,0x08,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x0C,0xFF,0xFF,0xEB,
+  0x00,0x00,0x50,0xE3,0x00,0x00,0x00,0x1A,0xC7,0xFE,0xFF,0xEB,0x02,0x00,0x00,0xEA,
+  0x00,0xF0,0x20,0xE3,0xC4,0xFE,0xFF,0xEB,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,
+  0x01,0x00,0xA0,0xE3,0x10,0x80,0xBD,0xE8,0x00,0x00,0x02,0x02,0xF8,0x40,0x2D,0xE9,
+  0xFA,0xFE,0xFF,0xEB,0x00,0x60,0xA0,0xE1,0x02,0x54,0x86,0xE2,0x21,0x5A,0x85,0xE2,
+  0x01,0x3C,0xA0,0xE3,0x00,0x30,0x8D,0xE5,0x28,0x30,0x9F,0xE5,0x0E,0x2B,0xA0,0xE3,
+  0x02,0x10,0x43,0xE0,0x05,0x00,0xA0,0xE1,0x07,0x00,0x00,0xEB,0x00,0x40,0xA0,0xE1,
+  0x00,0x00,0x54,0xE3,0x01,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,0xF8,0x80,0xBD,0xE8,
+  0x00,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,0x00,0x6C,0x02,0x02,0xFC,0x47,0x2D,0xE9,
+  0x00,0x40,0xA0,0xE1,0x01,0x50,0xA0,0xE1,0x02,0x60,0xA0,0xE1,0x03,0x70,0xA0,0xE1,
+  0x28,0x80,0x9D,0xE5,0x33,0xAE,0x84,0xE2,0x80,0x01,0x8D,0xE8,0x06,0x30,0xA0,0xE1,
+  0x05,0x20,0xA0,0xE1,0x43,0x1F,0xA0,0xE3,0x04,0x00,0xA0,0xE1,0x30,0xC0,0x9A,0xE5,
+  0x3C,0xFF,0x2F,0xE1,0x00,0x90,0xA0,0xE1,0x00,0x00,0x59,0xE3,0x01,0x00,0x00,0x0A,
+  0x09,0x00,0xA0,0xE1,0xFC,0x87,0xBD,0xE8,0x00,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,
+  0xF0,0x40,0x2D,0xE9,0x74,0xE1,0x9F,0xE5,0x00,0xE6,0x9E,0xE5,0x02,0x11,0x0E,0xE2,
+  0x6C,0xE1,0x9F,0xE5,0xC0,0xE2,0x9E,0xE5,0x01,0x20,0x0E,0xE2,0x60,0xE1,0x9F,0xE5,
+  0x88,0xE1,0x9E,0xE5,0x03,0x30,0x0E,0xE2,0x54,0xE1,0x9F,0xE5,0x98,0xE1,0x9E,0xE5,
+  0x03,0x40,0x0E,0xE2,0x48,0xE1,0x9F,0xE5,0x84,0xE1,0x9E,0xE5,0x01,0x50,0x0E,0xE2,
+  0x3C,0xE1,0x9F,0xE5,0x94,0xE1,0x9E,0xE5,0x01,0x60,0x0E,0xE2,0x30,0xE1,0x9F,0xE5,
+  0xE0,0xE1,0x9E,0xE5,0x03,0x70,0x0E,0xE2,0x28,0xE1,0x9F,0xE5,0x08,0xEF,0x9E,0xE5,
+  0x10,0xC0,0x0E,0xE2,0x00,0x00,0x51,0xE3,0x42,0x00,0x00,0x0A,0x00,0x00,0x52,0xE3,
+  0x01,0x00,0x00,0x1A,0x04,0x00,0xA0,0xE3,0x3F,0x00,0x00,0xEA,0x03,0x00,0x53,0xE3,
+  0x13,0x00,0x00,0x1A,0x03,0x00,0x54,0xE3,0x11,0x00,0x00,0x1A,0x03,0x00,0x54,0xE3,
+  0x07,0x00,0x00,0x1A,0x00,0x00,0x57,0xE3,0x03,0x00,0x00,0x1A,0x00,0x00,0x5C,0xE3,
+  0x01,0x00,0x00,0x1A,0x02,0x00,0xA0,0xE3,0x33,0x00,0x00,0xEA,0x01,0x00,0xA0,0xE3,
+  0x31,0x00,0x00,0xEA,0x00,0x00,0x57,0xE3,0x03,0x00,0x00,0x1A,0x10,0x00,0x5C,0xE3,
+  0x01,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,0x2B,0x00,0x00,0xEA,0x02,0x00,0xA0,0xE3,
+  0x29,0x00,0x00,0xEA,0x00,0x00,0x55,0xE3,0x13,0x00,0x00,0x1A,0x00,0x00,0x56,0xE3,
+  0x11,0x00,0x00,0x1A,0x03,0x00,0x54,0xE3,0x07,0x00,0x00,0x1A,0x00,0x00,0x57,0xE3,
+  0x03,0x00,0x00,0x1A,0x00,0x00,0x5C,0xE3,0x01,0x00,0x00,0x1A,0x02,0x00,0xA0,0xE3,
+  0x1D,0x00,0x00,0xEA,0x01,0x00,0xA0,0xE3,0x1B,0x00,0x00,0xEA,0x00,0x00,0x57,0xE3,
+  0x03,0x00,0x00,0x1A,0x10,0x00,0x5C,0xE3,0x01,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,
+  0x15,0x00,0x00,0xEA,0x02,0x00,0xA0,0xE3,0x13,0x00,0x00,0xEA,0x03,0x00,0x54,0xE3,
+  0x07,0x00,0x00,0x1A,0x00,0x00,0x57,0xE3,0x03,0x00,0x00,0x1A,0x00,0x00,0x5C,0xE3,
+  0x01,0x00,0x00,0x1A,0x04,0x00,0xA0,0xE3,0x0B,0x00,0x00,0xEA,0x03,0x00,0xA0,0xE3,
+  0x09,0x00,0x00,0xEA,0x00,0x00,0x57,0xE3,0x04,0x00,0x00,0x1A,0x10,0x00,0x5C,0xE3,
+  0x02,0x00,0x00,0x1A,0x00,0xF0,0x20,0xE3,0x00,0xF0,0x20,0xE3,0xFE,0xFF,0xFF,0xEA,
+  0x04,0x00,0xA0,0xE3,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE3,0xF0,0x80,0xBD,0xE8,
+  0x00,0x00,0x02,0x10,0x00,0x10,0x02,0x10,0x00,0x20,0x02,0x10,0x70,0x40,0x2D,0xE9,
+  0x08,0x50,0xA0,0xE3,0x00,0x40,0xA0,0xE3,0x07,0x00,0x00,0xEA,0xFF,0x10,0x04,0xE2,
+  0x05,0x00,0xA0,0xE1,0xA4,0x02,0x00,0xEB,0x01,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,
+  0x01,0x00,0xA0,0xE3,0x70,0x80,0xBD,0xE8,0x01,0x40,0x84,0xE2,0x04,0x00,0x54,0xE3,
+  0xF5,0xFF,0xFF,0xBA,0x00,0x00,0xA0,0xE3,0xF9,0xFF,0xFF,0xEA,0x70,0x40,0x2D,0xE9,
+  0x10,0x50,0xA0,0xE3,0x00,0x40,0xA0,0xE3,0x07,0x00,0x00,0xEA,0xFF,0x10,0x04,0xE2,
+  0x05,0x00,0xA0,0xE1,0x94,0x02,0x00,0xEB,0x01,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,
+  0x01,0x00,0xA0,0xE3,0x70,0x80,0xBD,0xE8,0x01,0x40,0x84,0xE2,0x04,0x00,0x54,0xE3,
+  0xF5,0xFF,0xFF,0xBA,0x00,0x00,0xA0,0xE3,0xF9,0xFF,0xFF,0xEA,0xFE,0x4F,0x2D,0xE9,
+  0x00,0x20,0xA0,0xE1,0x84,0x0A,0x9F,0xE5,0xC0,0x40,0x90,0xE5,0xC4,0x50,0x90,0xE5,
+  0xC8,0x60,0x90,0xE5,0xCC,0x70,0x90,0xE5,0xD0,0xC0,0x90,0xE5,0xD4,0xE0,0x90,0xE5,
+  0xD8,0x80,0x90,0xE5,0xDC,0x90,0x90,0xE5,0xF0,0xA0,0x90,0xE5,0xF4,0x00,0x90,0xE5,
+  0x08,0x00,0x8D,0xE5,0x54,0x0A,0x9F,0xE5,0xF8,0x00,0x90,0xE5,0x04,0x00,0x8D,0xE5,
+  0x48,0x0A,0x9F,0xE5,0xFC,0x00,0x90,0xE5,0x00,0x00,0x8D,0xE5,0x00,0x30,0xA0,0xE3,
+  0x04,0x00,0x00,0xEA,0x03,0x02,0xA0,0xE1,0x34,0x00,0xA0,0xE1,0x1F,0x06,0xDF,0xE7,
+  0x04,0x00,0x82,0xE4,0x01,0x30,0x83,0xE2,0x02,0x00,0x53,0xE3,0xF8,0xFF,0xFF,0x3A,
+  0x00,0x30,0xA0,0xE3,0x04,0x00,0x00,0xEA,0x03,0x02,0xA0,0xE1,0x35,0x00,0xA0,0xE1,
+  0x1F,0x06,0xDF,0xE7,0x04,0x00,0x82,0xE4,0x01,0x30,0x83,0xE2,0x02,0x00,0x53,0xE3,
+  0xF8,0xFF,0xFF,0x3A,0x00,0x30,0xA0,0xE3,0x04,0x00,0x00,0xEA,0x03,0x02,0xA0,0xE1,
+  0x36,0x00,0xA0,0xE1,0x1F,0x06,0xDF,0xE7,0x04,0x00,0x82,0xE4,0x01,0x30,0x83,0xE2,
+  0x02,0x00,0x53,0xE3,0xF8,0xFF,0xFF,0x3A,0x00,0x30,0xA0,0xE3,0x04,0x00,0x00,0xEA,
+  0x03,0x02,0xA0,0xE1,0x37,0x00,0xA0,0xE1,0x1F,0x06,0xDF,0xE7,0x04,0x00,0x82,0xE4,
+  0x01,0x30,0x83,0xE2,0x02,0x00,0x53,0xE3,0xF8,0xFF,0xFF,0x3A,0x00,0x30,0xA0,0xE3,
+  0x04,0x00,0x00,0xEA,0x03,0x02,0xA0,0xE1,0x3C,0x00,0xA0,0xE1,0x1F,0x06,0xDF,0xE7,
+  0x04,0x00,0x82,0xE4,0x01,0x30,0x83,0xE2,0x02,0x00,0x53,0xE3,0xF8,0xFF,0xFF,0x3A,
+  0x00,0x30,0xA0,0xE3,0x04,0x00,0x00,0xEA,0x03,0x02,0xA0,0xE1,0x3E,0x00,0xA0,0xE1,
+  0x1F,0x06,0xDF,0xE7,0x04,0x00,0x82,0xE4,0x01,0x30,0x83,0xE2,0x02,0x00,0x53,0xE3,
+  0xF8,0xFF,0xFF,0x3A,0x00,0x30,0xA0,0xE3,0x04,0x00,0x00,0xEA,0x03,0x02,0xA0,0xE1,
+  0x38,0x00,0xA0,0xE1,0x1F,0x06,0xDF,0xE7,0x04,0x00,0x82,0xE4,0x01,0x30,0x83,0xE2,
+  0x02,0x00,0x53,0xE3,0xF8,0xFF,0xFF,0x3A,0x00,0x30,0xA0,0xE3,0x04,0x00,0x00,0xEA,
+  0x03,0x02,0xA0,0xE1,0x39,0x00,0xA0,0xE1,0x1F,0x06,0xDF,0xE7,0x04,0x00,0x82,0xE4,
+  0x01,0x30,0x83,0xE2,0x02,0x00,0x53,0xE3,0xF8,0xFF,0xFF,0x3A,0x00,0x30,0xA0,0xE3,
+  0x04,0x00,0x00,0xEA,0x83,0x01,0xA0,0xE1,0x3A,0x00,0xA0,0xE1,0xFF,0x00,0x00,0xE2,
+  0x04,0x00,0x81,0xE4,0x01,0x30,0x83,0xE2,0x04,0x00,0x53,0xE3,0xF8,0xFF,0xFF,0x3A,
+  0x00,0x30,0xA0,0xE3,0x05,0x00,0x00,0xEA,0x83,0x01,0xA0,0xE1,0x08,0xB0,0x9D,0xE5,
+  0x3B,0x00,0xA0,0xE1,0xFF,0x00,0x00,0xE2,0x04,0x00,0x81,0xE4,0x01,0x30,0x83,0xE2,
+  0x04,0x00,0x53,0xE3,0xF7,0xFF,0xFF,0x3A,0x00,0x30,0xA0,0xE3,0x05,0x00,0x00,0xEA,
+  0x83,0x01,0xA0,0xE1,0x04,0xB0,0x9D,0xE5,0x3B,0x00,0xA0,0xE1,0xFF,0x00,0x00,0xE2,
+  0x04,0x00,0x81,0xE4,0x01,0x30,0x83,0xE2,0x04,0x00,0x53,0xE3,0xF7,0xFF,0xFF,0x3A,
+  0x00,0x30,0xA0,0xE3,0x05,0x00,0x00,0xEA,0x83,0x01,0xA0,0xE1,0x00,0xB0,0x9D,0xE5,
+  0x3B,0x00,0xA0,0xE1,0xFF,0x00,0x00,0xE2,0x04,0x00,0x81,0xE4,0x01,0x30,0x83,0xE2,
+  0x04,0x00,0x53,0xE3,0xF7,0xFF,0xFF,0x3A,0x01,0x00,0xA0,0xE3,0xFE,0x8F,0xBD,0xE8,
+  0xF0,0x43,0x2D,0xE9,0x06,0xDD,0x4D,0xE2,0x00,0x40,0xA0,0xE1,0x01,0x50,0xA0,0xE1,
+  0x68,0x08,0x9F,0xE5,0x40,0x00,0x90,0xE5,0xFF,0x70,0x00,0xE2,0x00,0x00,0x57,0xE3,
+  0x02,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,0x06,0xDD,0x8D,0xE2,0xF0,0x83,0xBD,0xE8,
+  0x05,0x00,0x57,0xE1,0x01,0x00,0x00,0x9A,0x00,0x00,0xA0,0xE3,0xF9,0xFF,0xFF,0xEA,
+  0x08,0x00,0x55,0xE3,0x02,0x00,0x00,0x0A,0x10,0x00,0x55,0xE3,0x08,0x00,0x00,0x1A,
+  0x03,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x02,0x8C,0xA0,0xE3,0x0D,0x90,0xA0,0xE3,
+  0x06,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x02,0x8C,0xA0,0xE3,0x1A,0x90,0xA0,0xE3,
+  0x02,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x00,0x00,0xA0,0xE3,0xE9,0xFF,0xFF,0xEA,
+  0x00,0xF0,0x20,0xE3,0x0D,0x10,0xA0,0xE1,0xC0,0x00,0x8D,0xE2,0x56,0xFF,0xFF,0xEB,
+  0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,0xE1,0xFF,0xFF,0xEA,
+  0x00,0x60,0xA0,0xE3,0x10,0x00,0x00,0xEA,0xC0,0x00,0x8D,0xE2,0x06,0x01,0x90,0xE7,
+  0x09,0x10,0x88,0xE0,0x01,0x00,0x50,0xE1,0x08,0x00,0x00,0x2A,0xC0,0x00,0x8D,0xE2,
+  0x06,0x01,0x90,0xE7,0x00,0x00,0xD4,0xE7,0x06,0x11,0x9D,0xE7,0x01,0x00,0x20,0xE0,
+  0xC0,0x10,0x8D,0xE2,0x06,0x11,0x91,0xE7,0x01,0x00,0xC4,0xE7,0x01,0x00,0x00,0xEA,
+  0x00,0x00,0xA0,0xE3,0xCF,0xFF,0xFF,0xEA,0x01,0x60,0x86,0xE2,0x07,0x00,0x56,0xE1,
+  0xEC,0xFF,0xFF,0x3A,0x01,0x00,0xA0,0xE3,0xCA,0xFF,0xFF,0xEA,0x7C,0x17,0x9F,0xE5,
+  0x20,0x00,0x91,0xE5,0x01,0x05,0xC0,0xE3,0x20,0x00,0x81,0xE5,0x1E,0xFF,0x2F,0xE1,
+  0x68,0x17,0x9F,0xE5,0x20,0x00,0x91,0xE5,0x01,0x05,0x80,0xE3,0x20,0x00,0x81,0xE5,
+  0x1E,0xFF,0x2F,0xE1,0x54,0x17,0x9F,0xE5,0x20,0x00,0x91,0xE5,0x02,0x05,0x80,0xE3,
+  0x20,0x00,0x81,0xE5,0x1E,0xFF,0x2F,0xE1,0x00,0x20,0xA0,0xE1,0x9F,0x27,0xDF,0xE7,
+  0x02,0x10,0xA0,0xE1,0x34,0x27,0x9F,0xE5,0x50,0x10,0x82,0xE5,0x1E,0xFF,0x2F,0xE1,
+  0x10,0x40,0x2D,0xE9,0x70,0x00,0xA0,0xE3,0xCE,0x46,0xA0,0xE3,0x08,0x00,0x84,0xE5,
+  0x00,0x30,0xA0,0xE3,0x00,0x00,0x00,0xEA,0x01,0x30,0x83,0xE2,0x20,0x0E,0x04,0xE3,
+  0x00,0x00,0x53,0xE1,0xFB,0xFF,0xFF,0x3A,0x70,0x00,0xA0,0xE3,0xCE,0x46,0xA0,0xE3,
+  0x08,0x00,0x84,0xE5,0x00,0x10,0xA0,0xE3,0x09,0x00,0x00,0xEA,0xCE,0x06,0xA0,0xE3,
+  0x10,0x20,0xD0,0xE5,0x40,0x00,0x12,0xE3,0x04,0x00,0x00,0x0A,0x00,0x00,0xA0,0xE3,
+  0xCE,0x46,0xA0,0xE3,0x08,0x00,0x84,0xE5,0x01,0x00,0xA0,0xE3,0x10,0x80,0xBD,0xE8,
+  0x01,0x10,0x81,0xE2,0xC8,0x06,0x9F,0xE5,0x00,0x00,0x51,0xE1,0xF2,0xFF,0xFF,0x3A,
+  0x00,0x00,0xA0,0xE3,0xF8,0xFF,0xFF,0xEA,0x00,0x10,0xA0,0xE3,0x06,0x00,0x00,0xEA,
+  0xCE,0x06,0xA0,0xE3,0x28,0x00,0x90,0xE5,0x10,0x00,0x10,0xE3,0x01,0x00,0x00,0x0A,
+  0x01,0x00,0xA0,0xE3,0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x81,0xE2,0x90,0x06,0x9F,0xE5,
+  0x00,0x00,0x51,0xE1,0xF5,0xFF,0xFF,0x3A,0x00,0x00,0xA0,0xE3,0xF8,0xFF,0xFF,0xEA,
+  0xFE,0x4F,0x2D,0xE9,0x00,0x40,0xA0,0xE1,0x01,0x50,0xA0,0xE1,0x02,0x60,0xA0,0xE1,
+  0x03,0x70,0xA0,0xE1,0x00,0x00,0xA0,0xE3,0x04,0x00,0x8D,0xE5,0xA9,0x89,0x05,0xE3,
+  0x08,0x00,0x56,0xE3,0x02,0x00,0x00,0x0A,0x10,0x00,0x56,0xE3,0x0E,0x00,0x00,0x1A,
+  0x06,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,0x01,0x90,0xA0,0xE3,0x03,0xA0,0xA0,0xE3,
+  0x02,0x0C,0xA0,0xE3,0x00,0x00,0x8D,0xE5,0x0D,0xB0,0xA0,0xE3,0x09,0x00,0x00,0xEA,
+  0x00,0xF0,0x20,0xE3,0x02,0x90,0xA0,0xE3,0x03,0xA0,0xA0,0xE3,0x02,0x0C,0xA0,0xE3,
+  0x00,0x00,0x8D,0xE5,0x1A,0xB0,0xA0,0xE3,0x02,0x00,0x00,0xEA,0x00,0xF0,0x20,0xE3,
+  0x00,0x00,0xA0,0xE3,0xFE,0x8F,0xBD,0xE8,0x00,0xF0,0x20,0xE3,0x20,0x00,0xA0,0xE3,
+  0xCE,0x16,0xA0,0xE3,0x28,0x00,0x81,0xE5,0xCE,0x06,0xA0,0xE3,0x04,0x00,0x90,0xE5,
+  0x80,0x00,0x80,0xE3,0x04,0x00,0x81,0xE5,0xCE,0x06,0xA0,0xE3,0x04,0x10,0x90,0xE5,
+  0x01,0x00,0x57,0xE3,0x01,0x00,0x00,0xDA,0x14,0x00,0x87,0xE2,0x00,0x00,0x00,0xEA,
+  0x01,0x00,0x87,0xE2,0x01,0x20,0xA0,0xE3,0x12,0x00,0xC1,0xE1,0xCE,0x16,0xA0,0xE3,
+  0x04,0x00,0x81,0xE5,0x10,0x00,0xA0,0xE3,0x28,0x00,0x81,0xE5,0x01,0x04,0xA0,0xE3,
+  0xC0,0x13,0x81,0xE1,0x30,0x00,0x81,0xE5,0xCE,0x06,0xA0,0xE3,0x04,0x00,0x90,0xE5,
+  0x80,0x00,0x80,0xE3,0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,0x10,0x00,0xA0,0xE3,
+  0x28,0x00,0x81,0xE5,0x00,0x00,0xA0,0xE3,0x08,0x00,0x81,0xE5,0x08,0x00,0x8D,0xE5,
+  0x05,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE3,0xCE,0x16,0xA0,0xE3,0x0C,0x00,0x81,0xE5,
+  0x08,0x00,0x9D,0xE5,0x01,0x00,0x80,0xE2,0x08,0x00,0x8D,0xE5,0x08,0x00,0x9D,0xE5,
+  0x09,0x00,0x50,0xE1,0xF6,0xFF,0xFF,0x3A,0x00,0x00,0xA0,0xE3,0x08,0x00,0x8D,0xE5,
+  0x08,0x00,0x00,0xEA,0x08,0x00,0x9D,0xE5,0x80,0x01,0xA0,0xE1,0x35,0x00,0xA0,0xE1,
+  0xFF,0x00,0x00,0xE2,0xCE,0x16,0xA0,0xE3,0x0C,0x00,0x81,0xE5,0x08,0x00,0x9D,0xE5,
+  0x01,0x00,0x80,0xE2,0x08,0x00,0x8D,0xE5,0x08,0x00,0x9D,0xE5,0x0A,0x00,0x50,0xE1,
+  0xF3,0xFF,0xFF,0x3A,0x08,0x00,0x56,0xE3,0x02,0x00,0x00,0x0A,0x30,0x00,0xA0,0xE3,
+  0xCE,0x16,0xA0,0xE3,0x08,0x00,0x81,0xE5,0x00,0x00,0x57,0xE3,0x0F,0x00,0x00,0x1A,
+  0x90,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x1C,0x00,0x00,0x1A,0xCE,0x06,0xA0,0xE3,
+  0x04,0x10,0x90,0xE5,0x01,0x00,0x57,0xE3,0x01,0x00,0x00,0xDA,0x14,0x00,0x87,0xE2,
+  0x00,0x00,0x00,0xEA,0x01,0x00,0x87,0xE2,0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,
+  0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,0x00,0x00,0xA0,0xE3,0xAC,0xFF,0xFF,0xEA,
+  0x62,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x0C,0x00,0x00,0x1A,0xCE,0x06,0xA0,0xE3,
+  0x04,0x10,0x90,0xE5,0x01,0x00,0x57,0xE3,0x01,0x00,0x00,0xDA,0x14,0x00,0x87,0xE2,
+  0x00,0x00,0x00,0xEA,0x01,0x00,0x87,0xE2,0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,
+  0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,0x00,0x00,0xA0,0xE3,0x9C,0xFF,0xFF,0xEA,
+  0x10,0x00,0xA0,0xE3,0xCE,0x16,0xA0,0xE3,0x28,0x00,0x81,0xE5,0xCE,0x06,0xA0,0xE3,
+  0x04,0x00,0x90,0xE5,0x80,0x00,0xC0,0xE3,0x04,0x00,0x81,0xE5,0xCE,0x06,0xA0,0xE3,
+  0x04,0x00,0x90,0xE5,0x30,0x00,0x80,0xE3,0x04,0x00,0x81,0xE5,0x02,0x08,0x81,0xE2,
+  0x20,0x00,0x90,0xE5,0x04,0x00,0x80,0xE3,0x02,0x18,0x81,0xE2,0x20,0x00,0x81,0xE5,
+  0x08,0x00,0x56,0xE3,0x03,0x00,0x00,0x0A,0x08,0x00,0xA0,0xE1,0x39,0xFF,0xFF,0xEB,
+  0x33,0xFF,0xFF,0xEB,0x2D,0xFF,0xFF,0xEB,0x00,0x00,0xA0,0xE3,0x08,0x00,0x8D,0xE5,
+  0x05,0x00,0x00,0xEA,0xCE,0x06,0xA0,0xE3,0x10,0x00,0xD0,0xE5,0x01,0x00,0xC4,0xE4,
+  0x08,0x00,0x9D,0xE5,0x01,0x00,0x80,0xE2,0x08,0x00,0x8D,0xE5,0x08,0x00,0x9D,0xE5,
+  0x00,0x10,0x9D,0xE5,0x01,0x00,0x50,0xE1,0xF5,0xFF,0xFF,0x3A,0x00,0x00,0xA0,0xE3,
+  0x08,0x00,0x8D,0xE5,0x04,0x00,0x00,0xEA,0xCE,0x06,0xA0,0xE3,0x10,0x00,0xD0,0xE5,
+  0x08,0x00,0x9D,0xE5,0x01,0x00,0x80,0xE2,0x08,0x00,0x8D,0xE5,0x08,0x00,0x9D,0xE5,
+  0x0B,0x00,0x50,0xE1,0xF7,0xFF,0xFF,0x3A,0x08,0x00,0x56,0xE3,0x00,0x00,0x00,0x0A,
+  0x0D,0xFF,0xFF,0xEB,0xCE,0x06,0xA0,0xE3,0x04,0x00,0x90,0xE5,0x80,0x00,0x80,0xE3,
+  0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,0x00,0xF0,0x20,0xE3,0x9C,0x03,0x9F,0xE5,
+  0x30,0x00,0x90,0xE5,0x01,0x04,0x10,0xE3,0xFB,0xFF,0xFF,0x0A,0x01,0x04,0xA0,0xE3,
+  0x88,0x13,0x9F,0xE5,0x30,0x00,0x81,0xE5,0x00,0xF0,0x20,0xE3,0x7C,0x03,0x9F,0xE5,
+  0x30,0x00,0x90,0xE5,0x02,0x01,0x10,0xE3,0xFB,0xFF,0xFF,0x1A,0x00,0x10,0x9D,0xE5,
+  0x01,0x00,0x44,0xE0,0x06,0x10,0xA0,0xE1,0xB8,0xFE,0xFF,0xEB,0x00,0x00,0x50,0xE3,
+  0x0C,0x00,0x00,0x1A,0xCE,0x06,0xA0,0xE3,0x04,0x10,0x90,0xE5,0x01,0x00,0x57,0xE3,
+  0x01,0x00,0x00,0xDA,0x14,0x00,0x87,0xE2,0x00,0x00,0x00,0xEA,0x01,0x00,0x87,0xE2,
+  0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,
+  0x00,0x00,0xA0,0xE3,0x46,0xFF,0xFF,0xEA,0xCE,0x06,0xA0,0xE3,0x28,0x00,0x90,0xE5,
+  0x20,0x00,0x10,0xE3,0x0F,0x00,0x00,0x0A,0x20,0x00,0xA0,0xE3,0xCE,0x16,0xA0,0xE3,
+  0x28,0x00,0x81,0xE5,0xCE,0x06,0xA0,0xE3,0x04,0x10,0x90,0xE5,0x01,0x00,0x57,0xE3,
+  0x01,0x00,0x00,0xDA,0x14,0x00,0x87,0xE2,0x00,0x00,0x00,0xEA,0x01,0x00,0x87,0xE2,
+  0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,
+  0x00,0x00,0xA0,0xE3,0x32,0xFF,0xFF,0xEA,0xCE,0x06,0xA0,0xE3,0x04,0x10,0x90,0xE5,
+  0x01,0x00,0x57,0xE3,0x01,0x00,0x00,0xDA,0x14,0x00,0x87,0xE2,0x00,0x00,0x00,0xEA,
+  0x01,0x00,0x87,0xE2,0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,0xCE,0x16,0xA0,0xE3,
+  0x04,0x00,0x81,0xE5,0x01,0x00,0xA0,0xE3,0x25,0xFF,0xFF,0xEA,0xF8,0x4F,0x2D,0xE9,
+  0x00,0x40,0xA0,0xE1,0x01,0x50,0xA0,0xE1,0x02,0x60,0xA0,0xE1,0x03,0x70,0xA0,0xE1,
+  0x04,0x80,0xA0,0xE1,0x84,0x02,0x9F,0xE5,0x20,0x00,0x90,0xE5,0x01,0x08,0xC0,0xE3,
+  0x78,0x12,0x9F,0xE5,0x20,0x00,0x81,0xE5,0x08,0x00,0x57,0xE3,0x05,0x00,0x00,0x1A,
+  0x01,0x00,0xA0,0xE1,0x00,0x00,0x90,0xE5,0x0F,0x00,0xC0,0xE3,0x03,0x00,0x80,0xE3,
+  0x00,0x00,0x81,0xE5,0x02,0xAC,0xA0,0xE3,0x10,0x00,0x57,0xE3,0x06,0x00,0x00,0x1A,
+  0x48,0x02,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x0F,0x00,0xC0,0xE3,0x05,0x00,0x80,0xE3,
+  0x38,0x12,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x02,0xAC,0xA0,0xE3,0x2C,0x02,0x9F,0xE5,
+  0x00,0x00,0x90,0xE5,0x1F,0x08,0xDA,0xE7,0x01,0x10,0x4A,0xE2,0x01,0x08,0x80,0xE1,
+  0x18,0x12,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x0A,0x10,0xA0,0xE1,0x05,0x00,0xA0,0xE1,
+  0xE4,0x00,0x00,0xEB,0x00,0xB0,0xA0,0xE1,0x0A,0x10,0x86,0xE0,0x01,0x00,0x41,0xE2,
+  0x0A,0x10,0xA0,0xE1,0xDF,0x00,0x00,0xEB,0x00,0x00,0x8D,0xE5,0x0B,0x90,0xA0,0xE1,
+  0x0A,0x00,0x00,0xEA,0x07,0x20,0xA0,0xE1,0x09,0x10,0xA0,0xE1,0x08,0x00,0xA0,0xE1,
+  0x28,0x30,0x9D,0xE5,0xD5,0xFE,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,
+  0x00,0x00,0xA0,0xE3,0xF8,0x8F,0xBD,0xE8,0x0A,0x80,0x88,0xE0,0x01,0x90,0x89,0xE2,
+  0x00,0x00,0x9D,0xE5,0x0B,0x00,0x80,0xE0,0x09,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0x8A,
+  0x01,0x00,0xA0,0xE3,0xF6,0xFF,0xFF,0xEA,0x10,0x40,0x2D,0xE9,0x00,0x40,0xA0,0xE1,
+  0xCE,0x06,0xA0,0xE3,0x04,0x10,0x90,0xE5,0x01,0x00,0x54,0xE3,0x01,0x00,0x00,0xDA,
+  0x14,0x00,0x84,0xE2,0x00,0x00,0x00,0xEA,0x01,0x00,0x84,0xE2,0x01,0x20,0xA0,0xE3,
+  0x12,0x00,0xC1,0xE1,0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,0x10,0x00,0xA0,0xE3,
+  0x28,0x00,0x81,0xE5,0x00,0x00,0xA0,0xE3,0x08,0x00,0x81,0xE5,0xFF,0x00,0xA0,0xE3,
+  0x08,0x00,0x81,0xE5,0x00,0x00,0x54,0xE3,0x0F,0x00,0x00,0x1A,0xA5,0xFE,0xFF,0xEB,
+  0x00,0x00,0x50,0xE3,0x1C,0x00,0x00,0x1A,0xCE,0x06,0xA0,0xE3,0x04,0x10,0x90,0xE5,
+  0x01,0x00,0x54,0xE3,0x01,0x00,0x00,0xDA,0x14,0x00,0x84,0xE2,0x00,0x00,0x00,0xEA,
+  0x01,0x00,0x84,0xE2,0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,0xCE,0x16,0xA0,0xE3,
+  0x04,0x00,0x81,0xE5,0x00,0x00,0xA0,0xE3,0x10,0x80,0xBD,0xE8,0x77,0xFE,0xFF,0xEB,
+  0x00,0x00,0x50,0xE3,0x0C,0x00,0x00,0x1A,0xCE,0x06,0xA0,0xE3,0x04,0x10,0x90,0xE5,
+  0x01,0x00,0x54,0xE3,0x01,0x00,0x00,0xDA,0x14,0x00,0x84,0xE2,0x00,0x00,0x00,0xEA,
+  0x01,0x00,0x84,0xE2,0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,0xCE,0x16,0xA0,0xE3,
+  0x04,0x00,0x81,0xE5,0x00,0x00,0xA0,0xE3,0xEE,0xFF,0xFF,0xEA,0xCE,0x06,0xA0,0xE3,
+  0x04,0x10,0x90,0xE5,0x01,0x00,0x54,0xE3,0x01,0x00,0x00,0xDA,0x14,0x00,0x84,0xE2,
+  0x00,0x00,0x00,0xEA,0x01,0x00,0x84,0xE2,0x01,0x20,0xA0,0xE3,0x12,0x00,0x81,0xE1,
+  0xCE,0x16,0xA0,0xE3,0x04,0x00,0x81,0xE5,0x01,0x00,0xA0,0xE3,0xE1,0xFF,0xFF,0xEA,
+  0x10,0x40,0x2D,0xE9,0x00,0x40,0xA0,0xE1,0x72,0x07,0x07,0xE3,0xCE,0x16,0xA0,0xE3,
+  0x00,0x00,0x81,0xE5,0x07,0x00,0xA0,0xE3,0x04,0x00,0x81,0xE5,0x04,0x00,0xA0,0xE1,
+  0xB4,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,
+  0x10,0x80,0xBD,0xE8,0x01,0x00,0xA0,0xE3,0xFC,0xFF,0xFF,0xEA,0xF8,0x43,0x2D,0xE9,
+  0x00,0x40,0xA0,0xE1,0x01,0x50,0xA0,0xE1,0x58,0x60,0x9F,0xE5,0xBF,0xFB,0xFF,0xEB,
+  0x00,0x80,0xA0,0xE1,0x01,0x79,0xA0,0xE3,0x05,0x00,0xA0,0xE1,0xE7,0xFF,0xFF,0xEB,
+  0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,0xF8,0x83,0xBD,0xE8,
+  0x04,0x30,0xA0,0xE1,0x07,0x20,0xA0,0xE1,0x08,0x10,0xA0,0xE1,0x06,0x00,0xA0,0xE1,
+  0x00,0x50,0x8D,0xE5,0x5C,0xFF,0xFF,0xEB,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,
+  0x00,0x00,0xA0,0xE3,0xF4,0xFF,0xFF,0xEA,0x01,0x00,0xA0,0xE3,0xF2,0xFF,0xFF,0xEA,
+  0x00,0x00,0xE2,0x0C,0x00,0x5A,0x62,0x02,0x00,0x34,0x02,0x02,0x01,0x30,0x90,0xE1,
+  0x21,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0,0x1A,0x00,0x00,0x3A,
+  0x20,0x32,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x01,0x00,0x00,0x3A,
+  0x00,0xC0,0xA0,0xE3,0x20,0x00,0x00,0xEA,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,
+  0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,
+  0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,
+  0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,
+  0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,
+  0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,
+  0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,
+  0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,
+  0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,
+  0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,
+  0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,
+  0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,
+  0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,
+  0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,
+  0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,
+  0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,
+  0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,
+  0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,
+  0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,
+  0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,
+  0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,
+  0x00,0x00,0xA0,0xE1,0x02,0x80,0xBD,0xE8,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,
+  0xB4,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0,0xA6,0xFF,0xFF,0x3A,0x00,0xC0,0xA0,0xE3,
+  0xC5,0xFF,0xFF,0xEA,0x00,0x00,0x00,0x00,0x32,0x30,0x31,0x31,0x31,0x31,0x32,0x38,
+};
+
+int main(int argc, char *argv[])
+{
+  int fd_in = -1;
+  int fd_out = -1;
+
+  if (argc != 3) {
+      printf("Usage: %s <in.bin> <out.bin>\n", argv[0]);
+      return 0;
+  }
+
+  do {
+      const char *inFile = argv[1];
+      const char *outFile = argv[2];
+
+      fd_in = open(inFile, O_RDONLY);
+      if (fd_in < 0) break;
+
+      int r_sz = read(fd_in, buf+BL2_OFFSET, BL2_SIZE-4);
+      if (r_sz == -1) break;
+
+      int in_size = lseek(fd_in, 0, SEEK_END);
+      if (in_size > r_sz) {
+          printf("WARNING: Cut head %d of %dbytes(%s)\n",
+              r_sz, in_size, inFile);
+      }
+
+      close(fd_in);
+      fd_in = -1;
+
+      unsigned int checksum = 0;
+      for (int i = 0; i < r_sz; i++)
+          checksum += buf[BL2_OFFSET+i];
+      memcpy(&buf[BL2_OFFSET+BL2_SIZE-4], &checksum, 4);
+
+      remove(outFile);
+      fd_out = open(outFile, O_CREAT|O_WRONLY|O_TRUNC, 0664);
+      if (fd_out < 0) break;
+
+      int w_sz = write(fd_out, buf, sizeof(buf));
+      if (w_sz != sizeof(buf)) break;
+
+      close(fd_out);
+      fd_out = -1;
+
+      return 0;
+  } while (0);
+
+  if (fd_in >= 0)
+      close(fd_in);
+
+  if (fd_out >= 0)
+      close(fd_out);
+
+  printf("Failed!\n");
+  return -1;
+}

2.3.14 configs/tiny4412_defconfig

添加tiny4412板子的默认配置文件。

diff --git a/configs/tiny4412_defconfig b/configs/tiny4412_defconfig
new file mode 100644
index 0000000000..ccd50ee90d
--- /dev/null
+++ b/configs/tiny4412_defconfig
@@ -0,0 +1,59 @@
+CONFIG_ARM=y
+CONFIG_SYS_ARM_CACHE_WRITETHROUGH=y
+CONFIG_ARCH_CPU_INIT=y
+CONFIG_ARCH_EXYNOS=y
+CONFIG_SYS_TEXT_BASE=0x40000000
+CONFIG_ARCH_EXYNOS4=y
+CONFIG_TARGET_TINY4412=y
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_ENV_SIZE=0x10000
+CONFIG_ENV_OFFSET=0xF0000
+CONFIG_SPL_TEXT_BASE=0x02023400
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_SPL_SIZE_LIMIT=0x37fc
+CONFIG_SPL=y
+CONFIG_DEBUG_UART_BASE=0x13800000
+CONFIG_DEBUG_UART_CLOCK=100000000
+CONFIG_IDENT_STRING=" for Tiny4412"
+CONFIG_DEBUG_UART=y
+CONFIG_DEFAULT_DEVICE_TREE="exynos4412-tiny4412"
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_USE_BOOTARGS=y
+CONFIG_BOOTARGS="console=ttySAC0,921600 earlyprintk root=/dev/ram rw initrd=0x44000000,8M"
+CONFIG_BOOTCOMMAND="mw 110002a0 10000 && mw 110002a4 00 && mmc rescan && mmc dev 2 && load mmc 2 40008000 zImage && load mmc 2 42000000 exynos4412-tiny4412.dtb && load mmc 2 44000000 ramdisk && mw 110002a4 10 && bootz 40008000 - 42000000"
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_BOARD_TYPES=y
+# CONFIG_SPL_FRAMEWORK is not set
+CONFIG_SYS_PROMPT="Tiny4412 # "
+CONFIG_CMD_CONFIG=y
+CONFIG_CMD_LICENSE=y
+CONFIG_BOOTM_OPENRTOS=y
+CONFIG_BOOTM_OSE=y
+CONFIG_CMD_BOOTMENU=y
+CONFIG_CMD_ADTIMG=y
+CONFIG_CMD_SPL=y
+CONFIG_CMD_DFU=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_MMC=y
+# CONFIG_CMD_NET is not set
+CONFIG_CMD_CACHE=y
+# CONFIG_CMD_MISC is not set
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_OF_CONTROL=y
+CONFIG_DFU_MMC=y
+CONFIG_SUPPORT_EMMC_RPMB=y
+CONFIG_SUPPORT_EMMC_BOOT=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
+CONFIG_MMC_SDHCI_S5P=y
+CONFIG_DM_ETH=y
+CONFIG_DM_ETH_PHY=y
+CONFIG_BAUDRATE=921600
+CONFIG_CONS_INDEX=0
+CONFIG_SERIAL_RX_BUFFER=y
+CONFIG_SERIAL_RX_BUFFER_SIZE=4096
+CONFIG_DEBUG_UART_ANNOUNCE=y

2.3.15 include/configs/tiny4412.h

添加tiny4412板子头文件。

diff --git a/include/configs/tiny4412.h b/include/configs/tiny4412.h
new file mode 100755
index 0000000000..9731ffaf9f
--- /dev/null
+++ b/include/configs/tiny4412.h
@@ -0,0 +1,65 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2020 xkwy2018.cn
+ *
+ * Configuration settings for the xkwy Tiny4412 (EXYNOS4412) board.
+ */
+
+#ifndef __CONFIG_TINY4412_H
+#define __CONFIG_TINY4412_H
+
+#include <configs/exynos4-common.h>
+
+#define CONFIG_EXYNOS4210               1       /* for spl dmc&clock */
+
+#define CONFIG_MACH_TYPE                MACH_TYPE_TINY4412
+
+#define CONFIG_CLK_1000_400_200
+
+/* Dual Samsung's DDR3 K4B4G1646D-BCK0 (total: 8Gbit) */
+#define PHYS_SDRAM_1                    0x40000000
+#define SDRAM_BANK_SIZE                 SZ_1G
+#define CONFIG_SYS_SDRAM_BASE           PHYS_SDRAM_1
+
+#define CONFIG_SYS_LOAD_ADDR            (CONFIG_SYS_SDRAM_BASE + SZ_32M)
+#define CONFIG_LOADADDR                 0x42000000
+
+
+/* copy form \linux\kernel\4.15.12\drivers\tty\tty_baudrate.c  static const speed_t baud_table[] */
+#define CONFIG_SYS_BAUDRATE_TABLE       {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,  \
+                                        9600, 19200, 38400, 57600, 115200, 230400, 460800,              \
+                                        500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,     \
+                                        2500000, 3000000, 3500000, 4000000}
+
+#define CONFIG_SYS_MONITOR_BASE    0x00000000
+
+/* Power Down Modes */
+#define S5P_CHECK_SLEEP                 0x00000BAD
+#define S5P_CHECK_DIDLE                 0xBAD00000
+#define S5P_CHECK_LPA                   0xABAD0000
+
+
+#define CONFIG_SYS_MMC_ENV_DEV          0
+
+#define CONFIG_SPL_MAX_FOOTPRINT        (14 * 1024)
+
+#define CONFIG_SYS_INIT_SP_ADDR         0x02040000
+
+/*
+ *    SD Card layout:
+ *    +-----+-----+----------+-----+----------------+-------+
+ *    | 0K5 | 8K  | 14K(BL2) | 1K5 |     936KiB     |  64K  |
+ *    | MBR | BL1 | spl.bin  |     | u-boot-dtb.bin | u-env |
+ *    +-----+-----+----------+-----+----------------+-------+
+ *
+ *    eMMC layout: (Boot Capacity: 4 MiB ENH)
+ *    +-----+----------+-----------+----------------+-------+
+ *    | 8K  | 14K(BL2) |    2K     |     936KiB     |  64K  |
+ *    | BL1 | spl.bin  |           | u-boot-dtb.bin | u-env |
+ *    +-----+----------+-----------+----------------+-------+
+ */
+/* U-Boot copy size from boot Media to DRAM.*/
+#define BL2_START_OFFSET  (1 + 0x6000/512)
+#define BL2_SIZE_BLOC_COUNT   (936*2)
+
+#endif    /* __CONFIG_H */

3 配置、编译、下载、测试

3.1 配置

$ make CROSS_COMPILE=arm-xkwy-linux-gnueabi- tiny4412_defconfigHOSTCC  scripts/basic/fixdepHOSTCC  scripts/kconfig/conf.oYACC    scripts/kconfig/zconf.tab.cLEX     scripts/kconfig/zconf.lex.cHOSTCC  scripts/kconfig/zconf.tab.oHOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

3.2 编译

$ make CROSS_COMPILE=arm-xkwy-linux-gnueabi- -j8
scripts/kconfig/conf  --syncconfig KconfigUPD     include/config.hCFG     u-boot.cfgGEN     include/autoconf.mk.depCFG     spl/u-boot.cfgGEN     include/autoconf.mkGEN     spl/include/autoconf.mkUPD     include/generated/dt.hUPD     include/generated/timestamp_autogenerated.hUPD     include/config/uboot.releaseUPD     include/generated/version_autogenerated.hHOSTCC  scripts/bin2cHOSTCC  scripts/dtc/flattree.oHOSTCC  scripts/dtc/dtc.oHOSTCC  scripts/dtc/fstree.oHOSTCC  scripts/dtc/data.oHOSTCC  scripts/dtc/livetree.oHOSTCC  scripts/dtc/treesource.oHOSTCC  scripts/dtc/srcpos.oHOSTCC  scripts/dtc/checks.oHOSTCC  scripts/dtc/util.oLEX     scripts/dtc/dtc-lexer.lex.cYACC    scripts/dtc/dtc-parser.tab.hCC      lib/asm-offsets.sCC      arch/arm/lib/asm-offsets.sYACC    scripts/dtc/dtc-parser.tab.cHOSTCC  scripts/dtc/dtc-lexer.lex.oUPD     include/generated/generic-asm-offsets.hUPD     include/generated/asm-offsets.hLDS     u-boot.ldsHOSTCC  scripts/dtc/dtc-parser.tab.oHOSTLD  scripts/dtc/dtcHOSTCC  tools/img2srecHOSTCC  tools/mkenvimage.oHOSTCC  tools/os_support.oWRAP    tools/lib/crc32.cHOSTCC  tools/aisimage.oHOSTCC  tools/atmelimage.oWRAP    tools/common/fdt_region.cWRAP    tools/common/bootm.cHOSTCC  tools/default_image.oWRAP    tools/lib/fdtdec_common.cWRAP    tools/lib/fdtdec.cWRAP    tools/common/image.cHOSTCC  tools/imagetool.oHOSTCC  tools/imximage.oHOSTCC  tools/imx8image.oHOSTCC  tools/imx8mimage.oHOSTCC  tools/kwbimage.oWRAP    tools/lib/md5.cHOSTCC  tools/lpc32xximage.oHOSTCC  tools/mxsimage.oHOSTCC  tools/omapimage.oHOSTCC  tools/pblimage.oHOSTCC  tools/pbl_crc32.oHOSTCC  tools/vybridimage.oHOSTCC  tools/stm32image.oWRAP    tools/lib/rc4.cHOSTCC  tools/rkcommon.oHOSTCC  tools/rkimage.oHOSTCC  tools/rksd.oHOSTCC  tools/rkspi.oHOSTCC  tools/socfpgaimage.oWRAP    tools/lib/crc16.cWRAP    tools/lib/sha1.cWRAP    tools/lib/sha256.cWRAP    tools/common/hash.cHOSTCC  tools/ublimage.oHOSTCC  tools/zynqimage.oHOSTCC  tools/zynqmpimage.oHOSTCC  tools/zynqmpbif.oHOSTCC  tools/libfdt/fdt.oHOSTCC  tools/libfdt/fdt_ro.oHOSTCC  tools/libfdt/fdt_wip.oHOSTCC  tools/libfdt/fdt_sw.oHOSTCC  tools/libfdt/fdt_rw.oHOSTCC  tools/libfdt/fdt_strerror.oHOSTCC  tools/libfdt/fdt_empty_tree.oHOSTCC  tools/libfdt/fdt_addresses.oHOSTCC  tools/libfdt/fdt_overlay.oHOSTCC  tools/gpimage.oHOSTCC  tools/gpimage-common.oHOSTCC  tools/mtk_image.oHOSTCC  tools/dumpimage.oHOSTCC  tools/common/fdt_region.oHOSTCC  tools/common/bootm.oHOSTCC  tools/lib/crc32.oHOSTCC  tools/lib/fdtdec_common.oHOSTCC  tools/lib/fdtdec.oHOSTCC  tools/common/image.oHOSTCC  tools/lib/md5.oHOSTCC  tools/lib/rc4.oHOSTCC  tools/lib/crc16.oHOSTCC  tools/lib/sha1.oHOSTCC  tools/lib/sha256.oHOSTCC  tools/common/hash.oHOSTCC  tools/mkimage.oHOSTCC  tools/proftoolHOSTCC  tools/fdtgrep.oHOSTCC  tools/spl_size_limitHOSTLD  tools/mkenvimageHOSTLD  tools/fdtgrepHOSTLD  tools/dumpimageHOSTLD  tools/mkimageLD      arch/arm/cpu/built-in.oCC      arch/arm/cpu/armv7/cache_v7.oAS      arch/arm/cpu/armv7/cache_v7_asm.oCC      arch/arm/cpu/armv7/cpu.oCC      arch/arm/cpu/armv7/cp15.oAS      arch/arm/lib/vectors.oCC      arch/arm/cpu/armv7/s5p-common/cpu_info.oCC      arch/arm/mach-exynos/soc.oCC      board/samsung/common/board.oAS      arch/arm/lib/crt0.oCC      arch/arm/cpu/armv7/syslib.oAS      arch/arm/lib/setjmp.oAS      arch/arm/lib/relocate.oCC      arch/arm/lib/bootm-fdt.oCC      arch/arm/mach-exynos/clock.oCC      arch/arm/cpu/armv7/s5p-common/timer.oCC      arch/arm/mach-exynos/pinmux.oAS      arch/arm/cpu/armv7/sctlr.oCC      arch/arm/lib/bootm.oCC      arch/arm/mach-exynos/power.oCC      arch/arm/mach-exynos/system.oAS      arch/arm/cpu/armv7/start.oCC      arch/arm/cpu/armv7/s5p-common/sromc.oLD      board/samsung/common/built-in.oCC      arch/arm/cpu/armv7/s5p-common/pwm.oCC      board/samsung/tiny4412/tiny4412.oLD      cmd/arm/built-in.oCC      cmd/boot.oCC      cmd/bootm.oCC      arch/arm/lib/zimage.oAS      arch/arm/lib/memset.oLD      board/samsung/tiny4412/built-in.oAS      arch/arm/lib/memcpy.oCC      cmd/help.oCC      cmd/version.oCC      cmd/blk_common.oLD      arch/arm/cpu/armv7/s5p-common/built-in.oLD      arch/arm/cpu/armv7/built-in.oCC      arch/arm/lib/sections.oCC      arch/arm/lib/stack.oCC      cmd/source.oCC      cmd/bdinfo.oCC      cmd/blkcache.oCC      cmd/bootefi.oCC      cmd/bootmenu.oCC      arch/arm/lib/interrupts.oCC      common/init/board_init.oCC      cmd/bootz.oCC      common/main.oCC      disk/part.oLD      common/init/built-in.oLD      arch/arm/mach-exynos/built-in.oCC      common/exports.oLD      drivers/adc/built-in.oCC      common/hash.oLD      drivers/ata/built-in.oLD      drivers/dma/ti/built-in.oLD      drivers/axi/built-in.oCC      arch/arm/lib/reset.oCC      drivers/block/blk-uclass.oLD      drivers/dma/built-in.oCC      arch/arm/lib/cache.oCC      common/cli_hush.oCC      cmd/cache.oCC      disk/part_dos.oCC      common/autoboot.oCC      arch/arm/lib/cache-cp15.oCC      disk/part_iso.oGZIP    cmd/config_data.gzUPD     cmd/config_data_size.hCC      arch/arm/lib/psci-dt.oCC      cmd/console.oCC      disk/part_efi.oAS      arch/arm/lib/ashldi3.oAS      arch/arm/lib/ashrdi3.oCC      cmd/dm.oCC      arch/arm/lib/div0.oCC      drivers/block/blkcache.oCC      cmd/adtimg.oAS      arch/arm/lib/div64.oCC      common/board_f.oCC      common/board_r.oAS      arch/arm/lib/lib1funcs.oAS      arch/arm/lib/lshrdi3.oAS      arch/arm/lib/muldi3.oAS      arch/arm/lib/uldivmod.oCC      arch/arm/lib/eabi_compat.oLD      drivers/block/built-in.oLD      drivers/cache/built-in.oCC      cmd/echo.oAS      arch/arm/lib/crt0_arm_efi.oCC      drivers/core/device.oCC      arch/arm/lib/reloc_arm_efi.oLD      arch/arm/lib/built-in.oAR      arch/arm/lib/lib.aCC      cmd/elf.oCC      cmd/exit.oCC      common/board_info.oCC      drivers/gpio/gpio-uclass.oCC      drivers/i2c/i2c-uclass.oLD      drivers/net/mscc_eswitch/built-in.oLD      drivers/net/ti/built-in.oCC      drivers/gpio/s5p_gpio.oCC      drivers/net/eth-phy-uclass.oCC      cmd/ext4.oCC      common/bootm.oLD      drivers/net/built-in.oCC      cmd/ext2.oLD      disk/built-in.oCC      drivers/core/fdtaddr.oCC      cmd/fat.oCC      cmd/fdt.oCC      cmd/fs.oCC      drivers/core/lists.oLD      drivers/i2c/built-in.oCC      drivers/core/root.oLD      drivers/net/phy/built-in.oCC      drivers/core/uclass.oLD      drivers/power/built-in.oCC      common/bootm_os.oLD      drivers/power/battery/built-in.oLD      drivers/power/domain/built-in.oLD      drivers/power/fuel_gauge/built-in.oLD      drivers/gpio/built-in.oLD      drivers/power/mfd/built-in.oLD      drivers/power/pmic/built-in.oCC      common/fdt_support.oCC      cmd/itest.oGZIP    cmd/license_data.gzCC      drivers/core/util.oCC      drivers/core/device-remove.oUPD     cmd/license_data_size.hCC      cmd/load.oLD      drivers/power/regulator/built-in.oCC      drivers/core/simple-bus.oCC      drivers/serial/serial-uclass.oCC      drivers/core/dump.oCC      drivers/serial/serial_s5p.oCC      common/splash.oCC      common/menu.oCC      cmd/mem.oCC      drivers/core/of_extra.oCC      drivers/core/ofnode.oCC      drivers/core/read_extra.oLD      drivers/serial/built-in.oCC      drivers/spi/spi-uclass.oCC      cmd/mmc.oLD      drivers/usb/cdns3/built-in.oCC      cmd/legacy-mtd-utils.oLD      drivers/usb/common/built-in.oCC      common/cli_readline.oCC      drivers/spi/spi-mem.oCC      cmd/part.oCC      common/cli_simple.oCC      common/bouncebuf.oCC      common/console.oLD      drivers/spi/built-in.oCC      common/dlmalloc.oLD      drivers/usb/dwc3/built-in.oCC      common/malloc_simple.oCC      common/image.oLD      drivers/core/built-in.oCC      common/image-fdt.oCC      drivers/crypto/fsl/sec.oLD      drivers/crypto/rsa_mod_exp/built-in.oCC      common/memsize.oCC      cmd/pxe.oLD      drivers/crypto/fsl/built-in.oLD      drivers/crypto/built-in.oCC      cmd/pxe_utils.oCC      drivers/dfu/dfu.oCC      drivers/input/key_matrix.oCC      cmd/sf.oLD      drivers/mailbox/built-in.oCC      common/stdio.oLD      drivers/memory/built-in.oCC      drivers/input/input.oLD      drivers/misc/built-in.oCC      cmd/setexpr.oCC      cmd/sysboot.oCC      drivers/dfu/dfu_mmc.oCC      common/image-android-dt.oCC      common/cli.oCC      drivers/mmc/mmc.oCC      drivers/mmc/mmc-uclass.oCC      drivers/input/keyboard-uclass.oCC      common/command.oCC      drivers/mmc/mmc_write.oCC      cmd/test.oCC      cmd/ximg.oLD      drivers/input/built-in.oLD      drivers/mtd/nand/built-in.oLD      drivers/mtd/onenand/built-in.oCC      drivers/mtd/spi/sf-uclass.oCC      drivers/mtd/spi/sf_probe.oCC      cmd/spl.oLD      drivers/dfu/built-in.oCC      drivers/mtd/spi/spi-nor-ids.oCC      common/s_record.oCC      common/xyzModem.oCC      drivers/mmc/mmc_boot.oCC      cmd/dfu.oCC      drivers/mtd/spi/spi-nor-core.oCC      drivers/mmc/dw_mmc.oLD      drivers/usb/emul/built-in.oCC      drivers/mmc/exynos_dw_mmc.oLD      drivers/usb/eth/built-in.oCC      drivers/mmc/rpmb.oLD      drivers/usb/host/built-in.oCC      drivers/mmc/sdhci.oCC      cmd/gpt.oLD      common/built-in.oCC      drivers/mmc/s5p_sdhci.oCC      cmd/nvedit.oLD      drivers/usb/musb-new/built-in.oLD      drivers/usb/musb/built-in.oLD      drivers/phy/allwinner/built-in.oLD      drivers/phy/marvell/built-in.oLD      drivers/phy/rockchip/built-in.oLD      drivers/reset/built-in.oLD      drivers/pwm/built-in.oCC      drivers/rtc/rtc-lib.oLD      drivers/scsi/built-in.oLD      drivers/smem/built-in.oLD      drivers/soc/built-in.oLD      drivers/sound/built-in.oLD      drivers/spmi/built-in.oLD      drivers/usb/phy/built-in.oUPD     cmd/config_data_gz.hLD      drivers/thermal/built-in.oLD      drivers/ufs/built-in.oLD      drivers/usb/ulpi/built-in.oLD      drivers/video/bridge/built-in.oLD      drivers/video/sunxi/built-in.oCC      drivers/watchdog/s5p_wdt.oLD      drivers/mmc/built-in.oLD      drivers/video/built-in.oCC      env/common.oUPD     cmd/license_data_gz.hCC      fs/ext4/ext4fs.oLD      lib/crypto/built-in.oCC      fs/fat/fat_write.oLD      drivers/mtd/spi/spi-nor.oLD      drivers/rtc/built-in.oCC      lib/efi_driver/efi_uclass.oLD      drivers/mtd/spi/built-in.oCC      lib/efi_driver/efi_block_device.oLD      drivers/mtd/built-in.oLD      drivers/watchdog/built-in.oCC      lib/efi_loader/efi_bootmgr.oLD      drivers/built-in.oCC      cmd/config.oCC      env/env.oCC      fs/fs.oCC      lib/efi_loader/efi_boottime.oLD      lib/efi_driver/built-in.oCC      cmd/license.oCC      fs/fs_internal.oCC      lib/libfdt/fdt.oCC      fs/ext4/ext4_common.oCC      env/attr.oLD      cmd/built-in.oCC      lib/libfdt/fdt_ro.oCC      net/arp.oCC      env/flags.oCC      env/callback.oCC      net/eth-uclass.oCC      env/mmc.oCC      net/eth_common.oCC      fs/ext4/dev.oCC      fs/ext4/ext4_write.oLD      env/built-in.oCC      net/net.oCC      lib/zlib/zlib.oCC      lib/libfdt/fdt_wip.oCC      lib/charset.oCC      lib/libfdt/fdt_strerror.oCC      lib/libfdt/fdt_sw.oCC      lib/crc8.oCC      lib/crc16.oLD      net/built-in.oLD      fs/fat/built-in.oCC      lib/smbios.oCC      lib/libfdt/fdt_rw.oCC      lib/libfdt/fdt_empty_tree.oCC      lib/libfdt/fdt_addresses.oCC      fs/ext4/ext4_journal.oCC      fs/ext4/crc16.oCC      lib/efi_loader/efi_console.oCC      lib/ldiv.oCC      lib/efi_loader/efi_device_path.oCC      lib/efi_loader/efi_device_path_to_text.oCC      lib/net_utils.oCC      lib/efi_loader/efi_device_path_utilities.oCC      lib/rc4.oCC      lib/efi_loader/efi_file.oLD      lib/libfdt/built-in.oCC      lib/sha256.oCC      lib/efi_loader/efi_hii.oCC      lib/list_sort.oLD      fs/ext4/built-in.oLD      fs/built-in.oCC      lib/efi_loader/efi_hii_config.oCC      lib/gunzip.oLD      lib/zlib/built-in.oCC      lib/fdtdec_common.oCC      lib/fdtdec.oCC      lib/efi_loader/efi_image_loader.oCC      lib/efi_loader/efi_memory.oCC      lib/qsort.oCC      lib/efi_loader/efi_root_node.oCC      lib/efi_loader/efi_runtime.oCC      lib/hashtable.oCC      lib/errno.oCC      lib/display_options.oCC      lib/efi_loader/efi_setup.oCC      lib/efi_loader/efi_unicode_collation.oCC      lib/crc32.oCC      lib/efi_loader/efi_variable.oCC      lib/ctype.oCC      lib/efi_loader/efi_watchdog.oCC      lib/div64.oCC      lib/hang.oCC      lib/linux_compat.oCC      lib/linux_string.oCC      lib/lmb.oCC      lib/membuff.oCC      lib/slre.oCC      lib/efi_loader/efi_disk.oCC      lib/string.oCC      lib/efi_loader/efi_net.oCC      lib/tables_csum.oCC      lib/time.oCC      lib/efi_loader/efi_smbios.oCC      lib/efi_loader/efi_signature.oCC      lib/hexdump.oCC      lib/efi_loader/helloworld.oCC      lib/uuid.oAS      lib/efi_loader/efi_crt0.oCC      lib/rand.oCC      lib/efi_loader/efi_reloc.oCC      lib/panic.oCC      lib/efi_loader/efi_freestanding.oLD      lib/efi_loader/built-in.oCC      lib/vsprintf.oCC      lib/strto.oCC      lib/date.oCC      lib/elf.oLD      lib/efi_loader/helloworld_efi.soOBJCOPY lib/efi_loader/helloworld.efiLD      lib/built-in.oCC      examples/standalone/hello_world.oCC      examples/standalone/stubs.oLD      examples/standalone/libstubs.oLD      examples/standalone/hello_worldOBJCOPY examples/standalone/hello_world.srecOBJCOPY examples/standalone/hello_world.binLD      u-bootOBJCOPY u-boot.srecOBJCOPY u-boot-nodtb.binSYM     u-boot.symDTC     arch/arm/dts/exynos4210-origen.dtbDTC     arch/arm/dts/exynos4210-smdkv310.dtbDTC     arch/arm/dts/exynos4210-universal_c210.dtbDTC     arch/arm/dts/exynos4210-trats.dtbDTC     arch/arm/dts/exynos4412-tiny4412.dtbDTC     arch/arm/dts/exynos4412-trats2.dtbDTC     arch/arm/dts/exynos4412-odroid.dtbSHIPPED dts/dt.dtbFDTGREP dts/dt-spl.dtbCAT     u-boot-dtb.binCOPY    u-boot.dtbCOPY    u-boot.binCC      spl/./lib/asm-offsets.sCC      spl/./arch/arm/lib/asm-offsets.sLDS     spl/u-boot-spl.ldsUPD     spl/./include/generated/asm-offsets.hUPD     spl/./include/generated/generic-asm-offsets.hLD      spl/arch/arm/cpu/built-in.oCC      spl/arch/arm/mach-exynos/soc.oLD      spl/board/samsung/common/built-in.oCC      spl/common/init/board_init.oAS      spl/arch/arm/lib/vectors.oLD      spl/board/samsung/tiny4412/built-in.oHOSTCC  spl/board/samsung/tiny4412/tools/mktiny4412splCC      spl/arch/arm/cpu/armv7/s5p-common/cpu_info.oLD      spl/dts/built-in.oCC      spl/drivers/block/blk_legacy.oCC      spl/fs/fs_internal.oCC      spl/drivers/gpio/s5p_gpio.oAS      spl/arch/arm/lib/crt0.oLD      spl/common/init/built-in.oCC      spl/arch/arm/mach-exynos/clock.oAS      spl/arch/arm/lib/setjmp.oCC      spl/arch/arm/lib/bootm-fdt.oCC      spl/arch/arm/cpu/armv7/cache_v7.oLD      spl/arch/arm/cpu/armv7/s5p-common/built-in.oLD      spl/drivers/mtd/built-in.oAS      spl/arch/arm/lib/memset.oAS      spl/arch/arm/cpu/armv7/cache_v7_asm.oLD      spl/fs/built-in.oCC      spl/arch/arm/cpu/armv7/cpu.oAS      spl/arch/arm/lib/memcpy.oCC      spl/arch/arm/mach-exynos/pinmux.oLD      spl/drivers/gpio/built-in.oCC      spl/arch/arm/cpu/armv7/cp15.oCC      spl/arch/arm/lib/sections.oLD      spl/drivers/block/built-in.oCC      spl/arch/arm/mach-exynos/power.oCC      spl/arch/arm/mach-exynos/system.oCC      spl/drivers/serial/serial.oCC      spl/arch/arm/lib/stack.oCC      spl/arch/arm/cpu/armv7/syslib.oLD      spl/drivers/soc/built-in.oCC      spl/arch/arm/lib/interrupts.oAS      spl/arch/arm/cpu/armv7/start.oCC      spl/arch/arm/mach-exynos/dmc_init_exynos4.oCC      spl/arch/arm/mach-exynos/clock_init_exynos4.oLD      spl/arch/arm/cpu/armv7/built-in.oCC      spl/arch/arm/mach-exynos/spl_boot.oCC      spl/drivers/serial/serial_s5p.oCC      spl/arch/arm/mach-exynos/tzpc.oCC      spl/arch/arm/lib/reset.oCC      spl/arch/arm/lib/cache.oCC      spl/arch/arm/mach-exynos/lowlevel_init.oCC      spl/arch/arm/lib/cache-cp15.oCC      spl/arch/arm/lib/psci-dt.oAS      spl/arch/arm/lib/ashldi3.oAS      spl/arch/arm/lib/ashrdi3.oLD      spl/drivers/serial/built-in.oLD      spl/drivers/built-in.oCC      spl/arch/arm/lib/div0.oAS      spl/arch/arm/lib/div64.oAS      spl/arch/arm/lib/lib1funcs.oAS      spl/arch/arm/lib/lshrdi3.oAS      spl/arch/arm/lib/muldi3.oAS      spl/arch/arm/lib/uldivmod.oCC      spl/arch/arm/lib/eabi_compat.oAS      spl/arch/arm/lib/crt0_arm_efi.oCC      spl/arch/arm/lib/reloc_arm_efi.oLD      spl/arch/arm/mach-exynos/built-in.oLD      spl/arch/arm/lib/built-in.oAR      spl/arch/arm/lib/lib.aLD      spl/u-boot-splOBJCOPY spl/u-boot-spl-nodtb.binCOPY    spl/u-boot-spl.bin
./spl/board/samsung/tiny4412/tools/mktiny4412spl  spl/u-boot-spl.bin spl/tiny4412-spl.binCFGCHK  u-boot.cfg

3.3 下载

SD卡烧录工具:https://xkwy2018.cn/tiny4412/u-boot/tools/tiny4412Fusing.sh

注意:执行此操作会擦除SD卡,请注意备份SD卡的文件。


$ wget https://xkwy2018.cn/tiny4412/u-boot/tools/tiny4412Fusing.sh
--2020-07-25 12:33:04--  https://xkwy2018.cn/tiny4412/u-boot/tools/tiny4412Fusing.sh
Resolving xkwy2018.cn (xkwy2018.cn)... 64.64.240.120
Connecting to xkwy2018.cn (xkwy2018.cn)|64.64.240.120|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1466 (1.4K) [text/x-sh]
Saving to: ‘tiny4412Fusing.sh’tiny4412Fusing.sh               100%[====================================================>]   1.43K  --.-KB/s    in 0s      2020-07-25 12:33:09 (154 MB/s) - ‘tiny4412Fusing.sh’ saved [1466/1466]$ chmod +x tiny4412Fusing.sh
$ ./tiny4412Fusing.sh -h
Usage: ./tiny4412Fusing.sh [-q] [-e] [-D <SD Reader''s device file>] [-d <u-boot source directory>]
$ ./tiny4412Fusing.sh -e -D /dev/mmcblk0 -d $PWD
erase count: 8191
u-boot: /dev/shm/u-boot-2020.07
/dev/mmcblk0: 120GiB
3809280 bytes (3.8 MB, 3.6 MiB) copied, 7 s, 544 kB/s
8191+0 records in
8191+0 records out
4193792 bytes (4.2 MB, 4.0 MiB) copied, 7.67944 s, 546 kB/s
44+0 records in
44+0 records out
22528 bytes (23 kB, 22 KiB) copied, 0.072426 s, 311 kB/s
679+1 records in
679+1 records out
347739 bytes (348 kB, 340 KiB) copied, 0.660174 s, 527 kB/s

3.4 SD卡启动测试

将SD卡插入开发板,将开发板启动方式开关拨到SD卡模式,上电,将会打印如下信息:

<debug_uart> U-Boot 2020.07 (Jul 25 2020 - 12:39:46 +0800) for Tiny4412CPU:   Exynos4412 @ 1.4 GHz
Model: xkwy Tiny4412 based on Exynos4412
Type:  1506
DRAM:  1 GiB
MMC:   SAMSUNG SDHCI: 2, EXYNOS DWMMC: 0
Loading Environment from MMC... *** Warning - bad CRC, using default environmentIn:    serial
Out:   serial
Err:   serial
Boot device: MMC(2)
Hit any key to stop autoboot:  0
Tiny4412 # 

3.5 查看板子信息

Tiny4412 # bdinfo
arch_number = 0x00001200
boot_params = 0x40000100
DRAM bank   = 0x00000000
-> start    = 0x40000000
-> size     = 0x40000000
baudrate    = 921600 bps
TLB addr    = 0x7fff0000
relocaddr   = 0x7ff8c000
reloc off   = 0x3ff8c000
irq_sp      = 0x7af78a10
sp start    = 0x7af78a00
Board Type  = 5382
Early malloc usage: f0 / 400
fdt_blob    = 0x7af78a20
Build       = 32-bit
Tiny4412 # 

3.6 查看SD卡信息

Tiny4412 # mmc rescan
Tiny4412 # mmc dev 2
switch to partitions #0, OK
mmc2 is current device
Tiny4412 # mmc info
Device: SAMSUNG SDHCI
Manufacturer ID: 1b
OEM: 534d
Name: BD4QT
Bus Speed: 50000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 119.3 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
Tiny4412 # 

3.7 查看eMMC信息

Tiny4412 # mmc rescan
Tiny4412 # mmc dev 0
switch to partitions #0, OK
mmc0(part 0) is current device
Tiny4412 # mmc info
Device: EXYNOS DWMMC
Manufacturer ID: 15
OEM: 100
Name: M8G2F
Bus Speed: 52000000
Mode: MMC High Speed (52MHz)
Rd Block Len: 512
MMC version 4.4.1
High Capacity: Yes
Capacity: 7.4 GiB
Bus Width: 8-bit
Erase Group Size: 512 KiB
HC WP Group Size: 8 MiB
User Capacity: 7.4 GiB WRREL
Boot Capacity: 4 MiB ENH
RPMB Capacity: 4 MiB ENH
Boot area 0 is not write protected
Boot area 1 is not write protected
Tiny4412 # 

3.8 eMMC启动

3.8.1 eMMC 配置

配置boot分区为4MB,配置boot_bus_width为1。

Tiny4412 # mmc bootpart-resize 0 4 4
Tiny4412 # mmc bootbus 0 1 0 0
Tiny4412 # 

3.8.2 从SD卡读取U-Boot镜像,并烧录到eMMC BOOT1分区

Tiny4412 # mmc rescan
Tiny4412 # mmc dev 2
switch to partitions #0, OK
mmc2 is current device
Tiny4412 # mmc read 42000000 1 2000MMC read: dev # 2, block # 1, count 8192 ... 8192 blocks read: OK
Tiny4412 # mmc dev 0
switch to partitions #0, OK
mmc0(part 0) is current device
Tiny4412 # mmc partconf 0 1 1 1
Tiny4412 # mmc erase 0 2000MMC erase: dev # 0, block # 0, count 8192 ... 8192 blocks erased: OK
Tiny4412 # mmc write 42000000 0 2000MMC write: dev # 0, block # 0, count 8192 ... 8192 blocks written: OK
Tiny4412 # 

3.8.3 eMMC启动测试

将开发板启动方式拨码开关拨到NAND或eMMC模式,按下复位键或重启上电,将会打印如下信息:

(可以拔掉SD卡测试一下)

<debug_uart> U-Boot 2020.07 (Jul 25 2020 - 12:39:46 +0800) for Tiny4412CPU:   Exynos4412 @ 1.4 GHz
Model: xkwy Tiny4412 based on Exynos4412
Type:  1506
DRAM:  1 GiB
MMC:   sdhci@12530000 - probe failed: -19Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Boot device: MMC(0)
Hit any key to stop autoboot:  0
Tiny4412 # 

4 附录

4.1 交叉编译工具链

下载地址:https://xkwy2018.cn/gcc/

版本:gcc version 10.1.0 (xkwy-gcc-20200517)

$ arm-xkwy-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-xkwy-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/xkwy-gcc/20200517/libexec/gcc/arm-xkwy-linux-gnueabi/10.1.0/lto-wrapper
Target: arm-xkwy-linux-gnueabi
Configured with: ../gcc-10.1.0/configure --prefix=/opt/xkwy-gcc/20200517 --target=arm-xkwy-linux-gnueabi --with-pkgversion=xkwy-gcc-20200517 --with-bugurl='https://xkwy2018.cn/gcc/bug-report.php?pkgversion=xkwy-gcc-20200517' --with-sysroot=/opt/xkwy-gcc/20200517/arm-xkwy-linux-gnueabi --enable-languages=c,c++ --with-arch=armv7-a --with-tune=cortex-a9 --with-fpu=vfpv3 --with-float=softfp --enable-threads=posix --quiet --silent
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.1.0 (xkwy-gcc-20200517) 

4.1 源码

【U-Boot 2020.07原始源码】官方下载地址:ftp://ftp.denx.de/pub/u-boot/u-boot-2020.07.tar.bz2

【U-Boot 2020.07原始源码】xkwy2018.cn镜像地址:https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07.tar.bz2

【tin4412 patch】下载地址:https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07-tiny4412.patch

【已打好patch源码包】下载地址:https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/u-boot-2020.07-tiny4412.tar.xz

4.2 已编译好的二进制镜像

下载地址:https://xkwy2018.cn/tiny4412/u-boot/2020.07-tiny4412/build/

烧录到SD卡只需要u-boot-dtb.bin和spl/tiny4412-spl.bin,注意下载后保持文件相对位置。

4.3 SD卡烧录工具

下载地址:https://xkwy2018.cn/tiny4412/u-boot/tools/tiny4412Fusing.sh

4.3.1 使用方法

  • -h    查看帮助信息
  • -q    安静模式,执行烧录时不打印过程信息
  • -e    烧录前彻底擦除4MB空间,适用于第一次烧录
  • -D <SD Reader's device file>    指定SD卡设备文件,默认为/dev/mmcblk0,实际SD卡设备文件名可使用lsblk命令查看
  • -d <u-boot source directory>    指定U-Boot源码目录,默认为/works/u-boot,脚本会向该目录找u-boot-dtb.bin和spl/tiny4412-spl.bin

4.4 开发板原理图

下载地址:https://xkwy2018.cn/tiny4412/Schematic-PCB/

tiny4412移植U-Boot 2020.07相关推荐

  1. 2020.07 学习日记

    废话 寒假到现在,在家里玩了5个月,来学校又玩了大半个月.以为会做点东西了就什么都懂了,竟然没做准备就投了字节秋招提前批.结果被挂了之后,又被捞起来面试.可以说十分幸运了,但机会都是留给有准备的人 2 ...

  2. 第十弹:网络公开课,免费学习资源,2020.07.05更新

    第十弹:网络公开课,免费学习资源,2020.07.05更新 按照个人兴趣整理的网络公开课资源导航网址:http://www.trochilidaetechnology.com/ 以下为[网络公开课]领 ...

  3. 猎人手游最新服务器,【猎人mm服务端】2020.07月升级經典手工制作搭建网游服务器...

    [猎人mm服务端]2020.07月升级經典手工制作搭建网游服务器 修改标的物的设置,并修改标的物的销售和价格.修改精制道具的价格,并与掉落的道具统一. 无人岛的经验值增加了紫圣诞鹿(经验值是圣诞怪物的 ...

  4. 312戳气球——力扣算法系列2020.07.19 Python

    第25天 2020.07.19 周日 难度系数:困难 题目:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中. 现在要求你戳破所有的气球.如果你戳破气球i,就可以获得 ...

  5. tiny4412移植uboot-2019-01(三)

    开发环境:win7 64位 +  Ubuntu16.04 64位 开发板:tiny4412ADK + S700 + 4GB eMMC + 1G DDR3 工具链:友善之臂提供的 arm-linux-g ...

  6. tiny4412搭建linux开发环境,[Tiny4412] 移植 Linux4.4 到 Tiny4412 开发板上

    一. 前言 一直以来都是基于 Linux-2.6 内核学习嵌入式,但是工作之后发现,主流的 kernel 早已经不再使用 platform device 结构去描述设备信息了,而是换成了更为简洁的 d ...

  7. 安富莱v6开发板网口通讯_安富莱嵌入式周报第170期:2020.07.202020.07.26

    说明: 谢谢大家的关注,继续为大家盘点上周精彩内容. 1.沁恒推出带USB3.0,千兆以太网,光纤接口的RISC内核单片机CH569     CH569/565 微控制器使用 RISC-V3A 内核, ...

  8. (4)tiny4412移植uboot_2018_07

    开发板:tiny4412(1611) 编译器: arm-tiny4412-linux-gnueabi-gcc (gcc version 6.1) 说明:本次移植希望在新版uboot支持sd卡启动方式 ...

  9. [u-boot 2020.07] README

    挖坑,难填! 摘要: 状态: 在哪里获得帮助: 在哪里获取源代码: 我们来自哪里: 名称和拼写: 版本控制: 目录层次结构: 软件配置: 处理器架构和板类型的选择: 沙盒环境(Sandbox): Bo ...

  10. tiny4412移植tslib库

    1.将tslib-1.4.tar.gz拷贝到虚拟机某个路径进行解压 2.进入解压路径tslib 3.执行#./autogen.sh 如果提示:./autogen.sh: 4: ./autogen.sh ...

最新文章

  1. 扫描PDF转换成word文档如何操作
  2. Bluetooth Low Energy 嗅探
  3. Java字符串格式化
  4. Swift - static和class的使用
  5. 使用神经网络拟合曲线(MATLAB/Python)
  6. ASP.NET2.0中配置文件的加密与解密
  7. 你知道自己适合做程序员吗?
  8. 解决火狐https问题 安全连接问题
  9. linux目标文件链接命令,ld 命令:将目标文件链接为可执行程序 - dute.org
  10. python︱mysql数据库连接——pyodbc
  11. 慕课软件工程(第二十章.ISO9000标准)
  12. 电机选型计算电机转动惯量、启动转矩和额定转速
  13. 软件测试 - Linux和数据库
  14. android+关闭屏幕旋转,Android:即使设备自动旋转屏幕关闭,如何强制反向纵向?...
  15. 拯救win10系统,如何开机进入DOS等删除恶意软件
  16. java开发基础知识学习总结
  17. Flutter pageview indicator指示器实现
  18. Victor ti99不错
  19. 没有乌云,天就一定晴了么
  20. PLSQL Developer13.0.4安装破解教程

热门文章

  1. FOI冬令营 Day1
  2. python断言语句的语法_Python断言教程
  3. assert:python断言报错语句
  4. win10安装python27_《win10python27安装教程》 win10怎么安装python
  5. java gdal生成彩色tiff文件 并压缩大小
  6. 用R的igraph包来画蛋白质互作网络图 | PPI | protein protein interaction network | Cytoscape...
  7. 基因家族分析-蛋白互作网络分析
  8. XTUOJ-1277-Triangle
  9. 大陆身份证号码正则验证js脚本
  10. 电子信息业取得长足发展 效益与质量同步提升