开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位
工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi
要移植的u-boot版本:u-boot-2016-11
Tiny4412开发板硬件版本为:
底板: Tiny4412SDK 1312B
核心板:Tiny4412 - 1306
----------------------------------------------------------------------------------------------------------------------------------------------
2019.02.04 第二次修改:
原因:Uboot启动后DRAM显示错误;
diff --git a/arch/arm/mach-exynos/dmc_init_exynos4412.c b/arch/arm/mach-exynos/d
index f096f25..2b2bc3b 100644
--- a/arch/arm/mach-exynos/dmc_init_exynos4412.c
+++ b/arch/arm/mach-exynos/dmc_init_exynos4412.c
struct mem_timings mem = {
.direct_cmd_msr = {
DIRECT_CMD1, DIRECT_CMD2, DIRECT_CMD3, DIRECT_CMD4
@@ -179,7 +180,6 @@ static void dmc_init(struct exynos4_dmc *dmc)
writel(DIRECT_CMD_ZQ, &dmc->directcmd);
sdelay(0x100000);
-#ifndef TINY4412
/* Chip1: NOP Command: Assert and Hold CKE to high level */
writel((DIRECT_CMD_NOP | DIRECT_CMD_CHIP1_SHIFT), &dmc->directcmd);
sdelay(0x100000);
@@ -191,7 +191,6 @@ static void dmc_init(struct exynos4_dmc *dmc)
/* Chip1: ZQINIT */
writel((DIRECT_CMD_ZQ | DIRECT_CMD_CHIP1_SHIFT), &dmc->directcmd);
sdelay(0x100000);
-#endif
phy_control_reset(1, dmc);
sdelay(0x100000);
diff --git a/include/configs/tiny4412.h b/include/configs/tiny4412.h
index 197fd14..08fb652 100644
--- a/include/configs/tiny4412.h
+++ b/include/configs/tiny4412.h
/* High Level Configuration Options */
#define TINY4412 1
@@ -21,26 +18,30 @@
#define CONFIG_SYS_DCACHE_OFF 1
/* TINY4412 has 8 bank of DRAM */
-#define CONFIG_NR_DRAM_BANKS 8
+#define CONFIG_NR_DRAM_BANKS 4
#define CONFIG_SYS_SDRAM_BASE 0x40000000
#define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE
-#define SDRAM_BANK_SIZE (128 << 20) /* 128 MB */
+#define SDRAM_BANK_SIZE 0x10000000 /*(256 << 20)
/* memtest works on */
#define CONFIG_SYS_MEMTEST_START CONFIG_SYS_SDRAM_BASE
-#define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_SDRAM_BASE + 0x6000000)
-#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x3E00000)
+#define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_SDRAM_BASE + 0x5e00000)
+#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x3e00000)
但是启动的ext2格式还是有问题,目前还在解决当中。
——————————————————————————————————————————————————————————————————————
上述问题已解决:tiny4412 --Uboot移植(6) SD卡驱动,启动内核
1、原理图
Exynos4412中有两个独立的DRAM控制器,分别叫DMC0和DMC1。DMC0和DMC1分别支持最大1.5GB的DRAM,它们都支持DDR2/DDR3和LPDDR2等,512 Mb, 1 Gb, 2 Gb, 4 Gb and 8 Gbit的内存设备,支持16/32bit的位宽。DRAM0 对应的地址是0x4000_0000~0xAFFF_FFF共1.5GB,DRAM1 对应的地址是0xA000_000~0x0000_0000共1.5GB。
Tiny4412的1GB的DRAM是由4片大小为128MX16的DDR3芯片组合而成,下面看一下Tiny4412的原理图
从上两图可以看出,这四片DDR 芯片被分成了两两一组,组成32位数据,四片都是挂接到DMC0处。
2,DDR3初始化代码
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefil
index 5575adf..5889802 100644
--- a/arch/arm/mach-exynos/Makefile
+++ b/arch/arm/mach-exynos/Makefile
@@ -15,7 +15,7 @@ ifdef CONFIG_SPL_BUILD
obj-$(CONFIG_EXYNOS5) += clock_init_exynos5.o
obj-$(CONFIG_EXYNOS5) += dmc_common.o dmc_init_ddr3.o
obj-$(CONFIG_EXYNOS4210)+= dmc_init_exynos4.o clock_init_exynos4.o
-obj-$(CONFIG_EXYNOS4412)+= dmc_init_exynos4.o clock_init_exynos4412.o
+obj-$(CONFIG_EXYNOS4412)+= dmc_init_exynos4412.o clock_init_exynos4412.o
obj-y += spl_boot.o tzpc.o
obj-y += lowlevel_init.o
diff --git a/arch/arm/mach-exynos/dmc_init_exynos4412.c b/arch/arm/mach-e new file mode 100644 index 0000000..b2c0c0d --- /dev/null +++ b/arch/arm/mach-exynos/dmc_init_exynos4412.c @@ -0,0 +1,254 @@ +/* + * Memory setup for board based on EXYNOS4412 + * + * 2016 + * Modified by AP0904225 <ap0904225@qq.com> + * + * Copyright (C) 2013 Samsung Electronics + * Rajeshwari Shinde <rajeshwari.s@samsung.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */++#include <config.h>+#include <asm/arch/dmc.h>+#include "common_setup.h"+#include "exynos4412_setup.h"++#ifdef TINY4412 +struct mem_timings mem = { + .direct_cmd_msr = { + DIRECT_CMD1, DIRECT_CMD2, DIRECT_CMD3, DIRECT_CMD4
+ .timingref = 0x000000BB,
+ .timingrow = 0x4046654f,
+ .timingdata = 0x46400506,
+ .timingpower = 0x52000A3C,
+ .zqcontrol = 0xE3854C03,
+ .control0 = 0x71101008,
+ .control1 = 0xe0000086,
+ .control2 = 0x00000000,
+ .concontrol = 0x0FFF301A,
+ .prechconfig = 0xff000000,
+ .memcontrol = 0x00312640, /* Tiny4412-1306 core board use chip0/1 */
+ .memconfig0 = 0x40e01323, /* ROW is 15bit */
+ .memconfig1 = 0x60e01323, /* DMC0 address up to 0xfFFFFFFF */
+ .dll_resync = FORCE_DLL_RESYNC,
+ .dll_on = DLL_CONTROL_ON,
+
+};
+#else
+struct mem_timings mem = {+ .direct_cmd_msr = {+ DIRECT_CMD1, DIRECT_CMD2, DIRECT_CMD3, DIRECT_CMD4+ },+ .timingref = TIMINGREF_VAL,+ .timingrow = TIMINGROW_VAL,+ .timingdata = TIMINGDATA_VAL,+ .timingpower = TIMINGPOWER_VAL,+ .zqcontrol = ZQ_CONTROL_VAL,+ .control0 = CONTROL0_VAL,+ .control1 = CONTROL1_VAL,+ .control2 = CONTROL2_VAL,+ .concontrol = CONCONTROL_VAL,+ .prechconfig = PRECHCONFIG,+ .memcontrol = MEMCONTROL_VAL,+ .memconfig0 = MEMCONFIG0_VAL,+ .memconfig1 = MEMCONFIG1_VAL,+ .dll_resync = FORCE_DLL_RESYNC,+ .dll_on = DLL_CONTROL_ON,+};+#endif
++static void phy_control_reset(int ctrl_no, struct exynos4_dmc *dmc)+{+ if (ctrl_no) {+ writel((mem.control1 | (1 << mem.dll_resync)),+ &dmc->phycontrol1);+ writel((mem.control1 | (0 << mem.dll_resync)),+ &dmc->phycontrol1);+ } else {+ writel((mem.control0 | (0 << mem.dll_on)),+ &dmc->phycontrol0);+ writel((mem.control0 | (1 << mem.dll_on)),+ &dmc->phycontrol0);+ }+}++static void dmc_config_mrs(struct exynos4_dmc *dmc, int chip)+{+ int i;+ unsigned long mask = 0;++ if (chip)+ mask = DIRECT_CMD_CHIP1_SHIFT;++ for (i = 0; i < MEM_TIMINGS_MSR_COUNT; i++) {+ writel(mem.direct_cmd_msr[i] | mask,+ &dmc->directcmd);+ }+}++static void dmc_init(struct exynos4_dmc *dmc)+{+ /*
+ * DLL Parameter Setting:
+ * Termination: Enable R/W
+ * Phase Delay for DQS Cleaning: 180' Shift
+ */+ writel(mem.control1, &dmc->phycontrol1);++ /*
+ * ZQ Calibration
+ * Termination: Disable
+ * Auto Calibration Start: Enable
+ */+ writel(mem.zqcontrol, &dmc->phyzqcontrol);+ sdelay(0x100000);++ /*
+ * Update DLL Information:
+ * Force DLL Resyncronization
+ */+ phy_control_reset(1, dmc);+ phy_control_reset(0, dmc);++ /* Set DLL Parameters */+ writel(mem.control1, &dmc->phycontrol1);++ /* DLL Start */+ writel((mem.control0 | CTRL_START | CTRL_DLL_ON), &dmc->phycontrol0);
++ writel(mem.control2, &dmc->phycontrol2);++ /* Set Clock Ratio of Bus clock to Memory Clock */+ writel(mem.concontrol, &dmc->concontrol);++ /*
+ * Memor Burst length: 8
+ * Number of chips: 2
+ * Memory Bus width: 32 bit
+ * Memory Type: DDR3
+ * Additional Latancy for PLL: 1 Cycle
+ */+ writel(mem.memcontrol, &dmc->memcontrol);++ writel(mem.memconfig0, &dmc->memconfig0);+ writel(mem.memconfig1, &dmc->memconfig1);+
+#ifdef TINY4412
+ writel(0x8000001F, &dmc->ivcontrol);
+#endif
++ /* Config Precharge Policy */+ writel(mem.prechconfig, &dmc->prechconfig);+ /*
+ * TimingAref, TimingRow, TimingData, TimingPower Setting:
+ * Values as per Memory AC Parameters
+ */+ writel(mem.timingref, &dmc->timingref);+ writel(mem.timingrow, &dmc->timingrow);+ writel(mem.timingdata, &dmc->timingdata);+ writel(mem.timingpower, &dmc->timingpower);++ /* Chip0: NOP Command: Assert and Hold CKE to high level */+ writel(DIRECT_CMD_NOP, &dmc->directcmd);+ sdelay(0x100000);++ /* Chip0: EMRS2, EMRS3, EMRS, MRS Commands Using Direct Command */+ dmc_config_mrs(dmc, 0);+ sdelay(0x100000);++ /* Chip0: ZQINIT */+ writel(DIRECT_CMD_ZQ, &dmc->directcmd);+ sdelay(0x100000);++//#ifndef TINY4412
+ /* Chip1: NOP Command: Assert and Hold CKE to high level */+ writel((DIRECT_CMD_NOP | DIRECT_CMD_CHIP1_SHIFT), &dmc->directcmd);+ sdelay(0x100000);++ /* Chip1: EMRS2, EMRS3, EMRS, MRS Commands Using Direct Command */+ dmc_config_mrs(dmc, 1);+ sdelay(0x100000);++ /* Chip1: ZQINIT */+ writel((DIRECT_CMD_ZQ | DIRECT_CMD_CHIP1_SHIFT), &dmc->directcmd);+ sdelay(0x100000);+//#endif
++ phy_control_reset(1, dmc);+ sdelay(0x100000);++ /* turn on DREX0, DREX1 */+ writel((mem.concontrol | AREF_EN), &dmc->concontrol);+}++void mem_ctrl_init(int reset)+{+ struct exynos4_dmc *dmc;++ /*
+ * Async bridge configuration at CPU_core:
+ * 1: half_sync
+ * 0: full_sync
+ */+ writel(1, ASYNC_CONFIG);++#ifndef TINY4412+#ifdef CONFIG_ORIGE+ /* Interleave: 2Bit, Interleave_bit1: 0x15, Interleave_bit0: 0x7 */+ writel(APB_SFR_INTERLEAVE_CONF_VAL, EXYNOS4_MIU_BASE + APB_SFR_INTERLEAVE_CONF_OFFSET);+ /* Update MIU Configuration */+ writel(APB_SFR_ARBRITATION_CONF_VAL, EXYNOS4_MIU_BASE + APB_SFR_ARBRITATION_CONF_OFFSET);+#else
+ writel(APB_SFR_INTERLEAVE_CONF_VAL, EXYNOS4_MIU_BASE + APB_SFR_INTERLEAVE_CONF_OFFSET);+ writel(INTERLEAVE_ADDR_MAP_START_ADDR, EXYNOS4_MIU_BASE + ABP_SFR_INTERLEAVE_ADDRMAP_START_OFFSET);+ writel(INTERLEAVE_ADDR_MAP_END_ADDR, EXYNOS4_MIU_BASE + ABP_SFR_INTERLEAVE_ADDRMAP_END_OFFSET);+ writel(INTERLEAVE_ADDR_MAP_EN, EXYNOS4_MIU_BASE + ABP_SFR_SLV_ADDRMAP_CONF_OFFSET);+#ifdef CONFIG_MIU_LINEAR+ writel(SLAVE0_SINGLE_ADDR_MAP_START_ADDR, EXYNOS4_MIU_BASE + ABP_SFR_SLV0_SINGLE_ADDRMAP_START_OFFSET);+ writel(SLAVE0_SINGLE_ADDR_MAP_END_ADDR, EXYNOS4_MIU_BASE + ABP_SFR_SLV0_SINGLE_ADDRMAP_END_OFFSET);+ writel(SLAVE1_SINGLE_ADDR_MAP_START_ADDR, EXYNOS4_MIU_BASE + ABP_SFR_SLV1_SINGLE_ADDRMAP_START_OFFSET);+ writel(SLAVE1_SINGLE_ADDR_MAP_END_ADDR, EXYNOS4_MIU_BASE + ABP_SFR_SLV1_SINGLE_ADDRMAP_END_OFFSET);+ writel(APB_SFR_SLV_ADDR_MAP_CONF_VAL, EXYNOS4_MIU_BASE + ABP_SFR_SLV_ADDRMAP_CONF_OFFSET);+#endif
+#endif
+#endif
++ /* DREX0 */+ dmc = (struct exynos4_dmc *)samsung_get_base_dmc_ctrl();+ dmc_init(dmc);++ /* DREX1 */+ dmc = (struct exynos4_dmc *)(samsung_get_base_dmc_ctrl()+ +DMC_OFFSET);+ dmc_init(dmc);+}
diff --git a/arch/arm/mach-exynos/exynos4412_setup.h b/arch/arm/mach-exyn
index 11e9d09..fced9a8 100644
--- a/arch/arm/mach-exynos/exynos4412_setup.h
+++ b/arch/arm/mach-exynos/exynos4412_setup.h
+/* Bus Configuration Register Address */+#define ASYNC_CONFIG 0x10010350
++/* 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 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_DIV (0 << 4)
+#define CTRL_ZQ_MODE_DDS (0x7 << 8)
+#define CTRL_ZQ_MODE_TERM (0x2 << 11)
+#define CTRL_ZQ_FORCE_IMPN (0x5 << 14)
+#define CTRL_ZQ_FORCE_IMPP (0x6 << 17)
+#define CTRL_DCC (0xE38 << 20)
+#define ZQ_CONTROL_VAL (CTRL_ZQ_MODE_NOTERM | CTRL_ZQ_START\
+ | 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 (1 << 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 (0x2 << 4)
+#define CHIP_COL_10 (0x3 << 8)
+#define CHIP_MAP_INTERLEAVED (1 << 12)
+#define CHIP_MASK (0xe0 << 16)
+#ifdef CONFIG_MIU_LINEAR+#define CHIP0_BASE (0x40 << 24)
+#define CHIP1_BASE (0x60 << 24)
+#else
+#define CHIP0_BASE (0x20 << 24)
+#define CHIP1_BASE (0x40 << 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
++#ifdef TINY4412+#define TIMINGREF_VAL 0x000000BB
+#define TIMINGROW_VAL 0x4046654f
+#define TIMINGDATA_VAL 0x46400506
+#define TIMINGPOWER_VAL 0x52000A3C
+#else
+#define TIMINGREF_VAL 0x000000BC
+#ifdef DRAM_CLK_330+#define TIMINGROW_VAL 0x3545548d
+#define TIMINGDATA_VAL 0x45430506
+#define TIMINGPOWER_VAL 0x4439033c
+#endif
+#ifdef DRAM_CLK_400+#define TIMINGROW_VAL 0x45430506
+#define TIMINGDATA_VAL 0x56500506
+#define TIMINGPOWER_VAL 0x5444033d
+#endif
+#endif
++++ #endif /*__EXYNOS4412_SETUP__ */
diff --git a/arch/arm/mach-exynos/lowlevel_init.c b/arch/arm/mach-exynos/
index c69be57..2963b9d 100644
--- a/arch/arm/mach-exynos/lowlevel_init.c
+++ b/arch/arm/mach-exynos/lowlevel_init.c
@@ -229,7 +229,34 @@ int do_lowlevel_init(void)
printascii("UART0 init ... OK !!!\n\r");
#endif
mem_ctrl_init(actions & DO_MEM_RESET);
- tzpc_init();
+
+ writel(0x44444444, 0x40000000);
+ if(readl(0x40000000) == 0x44444444)
+ printascii("addriss is :0x40000000 ;value is 0x44444444... !!!\n\
+
+ writel(0x55555555, 0x50000004);
+ if(readl(0x50000004) == 0x55555555)
+ printascii("addriss is :0x50000004 ;value is 0x55555555... !!!\n\
+
+ writel(0x66666666, 0x60000000);
+ if(readl(0x60000000) == 0x66666666)
+ printascii("addriss is :0x60000000 ;value is 0x66666666... !!!\n\
+
+ writel(0x77777777, 0x70000000);
+ if(readl(0x70000000) == 0x77777777)
+ printascii("addriss is :0x70000000 ;value is 0x77777777... !!!\n\
+
+ writel(0x88888888, 0x70000001);
+ if(readl(0x70000001) == 0x88888888)
+ printascii("addriss is :0x70000001 ;value is 0x88888888... !!!\n\
+
+ writel(0x88888888, 0x7000000f);
+ if(readl(0x7000000f) == 0x88888888)
+ printascii("addriss is :0x7000000f ;value is 0x88888888... !!!\n\
+
+ #ifndef TINY4412
+ tzpc_init();
+ #endif
}
return actions & DO_WAKEUP;
diff --git a/include/configs/tiny4412.h b/include/configs/tiny4412.h
index fef910f..197fd14 100644
--- a/include/configs/tiny4412.h
+++ b/include/configs/tiny4412.h
@@ -20,11 +20,11 @@
#define CONFIG_SYS_DCACHE_OFF 1
-/* ORIGEN has 4 bank of DRAM */
-#define CONFIG_NR_DRAM_BANKS 4
+/* TINY4412 has 8 bank of DRAM */
+#define CONFIG_NR_DRAM_BANKS 8
#define CONFIG_SYS_SDRAM_BASE 0x40000000
#define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE
-#define SDRAM_BANK_SIZE (256 << 20) /* 256 MB
+#define SDRAM_BANK_SIZE (128 << 20) /* 128 MB
3、测试结果
UART0 init ... OK !!!
addriss is :0x40000000 ;value is 0x44444444... !!!
addriss is :0x50000004 ;value is 0x55555555... !!!
addriss is :0x60000000 ;value is 0x66666666... !!!
addriss is :0x70000000 ;value is 0x77777777... !!!
addriss is :0x70000001 ;value is 0x88888888... !!!
addriss is :0x7000000f ;value is 0x88888888... !!!
到这里,我们就完成了把u-boot.bin从SD卡拷贝到DDR内存中并在内存中执行u-boot。
u-boot可以在DDR内存执行后,我们转向使用printf函数来打印调试信息。因此可以把SPL阶段的调试串口关闭了:
diff --git a/configs/tiny4412_defconfig b/configs/tiny4412_defconfig
index 25c6bfb..f02edbe 100644
--- a/configs/tiny4412_defconfig
+++ b/configs/tiny4412_defconfig
@@ -40,11 +40,11 @@ CONFIG_OF_CONTROL=y
#DEBUG UART
#
-CONFIG_DEBUG_UART=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL_GPIO_SUPPORT=y
-CONFIG_DEBUG_UART_S5P=y
-CONFIG_DEBUG_UART_BASE=0x13800000
-CONFIG_DEBUG_UART_CLOCK=100000000
+#CONFIG_DEBUG_UART=y
+#CONFIG_SPL_SERIAL_SUPPORT=y
+#CONFIG_SPL_GPIO_SUPPORT=y
+#CONFIG_DEBUG_UART_S5P=y
+#CONFIG_DEBUG_UART_BASE=0x13800000
+#CONFIG_DEBUG_UART_CLOCK=100000000
#
——————————————————————————————————————————————————————————————————————————————————
本来自己也是迷迷糊糊跟着 LoTGu 这位大佬的脚步在前进,前几篇也有一些磕磕绊绊,但都不是什么大的问题。直到这里,DDR3 由于使用的核心板版本不同,外接的DDR3的型号不同,导致拷贝过来之后也是不能达到预期的效果。然后就只能自己死磕,看芯片手册确实的由很大的帮助,上面的初始化流程都有。我主要用于查看上面程序中标红的配置数字,花费了两天时间,终于出了结果。但是我的DROM显示出来还是只有512M,(原本应该是1G)。目前没有好的解决方法,还不知道对后续有没有影响。这条路很辛苦,我很享受辛苦过后的喜悦感。一切都会好起来的呃。。
——————————————————————————————————————————————————————---——————————
感谢:
https://home.cnblogs.com/u/LoTGu/ (主要是跟着这位走)
Tiny4412裸机程序之代码在DDR SDRAM中运行 http://www.techbulo.com/1509.html
Tiny4412裸机程序之DDR3初始化流程 http://www.techbulo.com/1501.html
DDR3内存详解,存储器结构+时序+初始化过程 https://blog.csdn.net/a_chinese_man/article/details/73381338
tiny4412sdk-1506原生uboot卡死 http://www.cnblogs.com/kevinhwang/p/5617629.html
大水猫:https://me.csdn.net/sinat_20006769