mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Compare commits
149 Commits
v2013.07-r
...
v2013.07
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62c175fbb8 | ||
|
|
50ffc3b64a | ||
|
|
8b415f703f | ||
|
|
b899fa3901 | ||
|
|
fdf86c202c | ||
|
|
9a5dad2393 | ||
|
|
9ba30f6bc2 | ||
|
|
971c450a44 | ||
|
|
4ef400b9f8 | ||
|
|
576aacdb91 | ||
|
|
c3e0afca48 | ||
|
|
f78cb2ab1e | ||
|
|
a61da72bda | ||
|
|
ca6d4d0f8f | ||
|
|
b8e5b07225 | ||
|
|
2a6936059a | ||
|
|
b9944a77f9 | ||
|
|
b8eee4354f | ||
|
|
c01939c764 | ||
|
|
b778c1b5de | ||
|
|
be6c1529c1 | ||
|
|
baa8841d6c | ||
|
|
f4eaf88e6d | ||
|
|
f4ea9f86d1 | ||
|
|
04735e9c55 | ||
|
|
0eb33ad253 | ||
|
|
457dd025a2 | ||
|
|
c8605bb4d8 | ||
|
|
4f6aa3468d | ||
|
|
54e458de55 | ||
|
|
68c517eafc | ||
|
|
8d94e6848f | ||
|
|
b7a1d13462 | ||
|
|
1c90369437 | ||
|
|
e3a5bbce45 | ||
|
|
fbbbc86e8e | ||
|
|
d72da15828 | ||
|
|
f320a4d845 | ||
|
|
7af26b1669 | ||
|
|
ec39029193 | ||
|
|
970150a167 | ||
|
|
efc284e325 | ||
|
|
a3f170cdbf | ||
|
|
e97721c41a | ||
|
|
86812c4d5b | ||
|
|
94aeb8a62d | ||
|
|
21692281ea | ||
|
|
254fd8da45 | ||
|
|
ab94cd491f | ||
|
|
3104ce1f6f | ||
|
|
32cc24d3c7 | ||
|
|
d035fcf9b6 | ||
|
|
b46694df84 | ||
|
|
d6cf707e81 | ||
|
|
7e44d9320e | ||
|
|
56867d88c4 | ||
|
|
630aacb085 | ||
|
|
ecc8edbf69 | ||
|
|
81c065d2a0 | ||
|
|
225fd8c5d4 | ||
|
|
2b9599e010 | ||
|
|
fb1b139bb7 | ||
|
|
a5266d6b5d | ||
|
|
a26913f32d | ||
|
|
385501d38b | ||
|
|
2f4998ab44 | ||
|
|
1ae76d438b | ||
|
|
e161f60f4d | ||
|
|
ff8fb56b6f | ||
|
|
9dfa3d0734 | ||
|
|
9199fce239 | ||
|
|
643be9c07e | ||
|
|
198a40b9f6 | ||
|
|
6e50e5ca02 | ||
|
|
dc20fdd76a | ||
|
|
c479c1361a | ||
|
|
a544eaddcc | ||
|
|
c1273d7162 | ||
|
|
d4125ebc8d | ||
|
|
1a260fe3ef | ||
|
|
9df49553a4 | ||
|
|
051f9a3eed | ||
|
|
36f05e60f9 | ||
|
|
87bd05d78f | ||
|
|
e3f53104e2 | ||
|
|
58c86c7d1d | ||
|
|
b0857c45c1 | ||
|
|
2cb0e55a3c | ||
|
|
327598945b | ||
|
|
59b1592211 | ||
|
|
dd4425e852 | ||
|
|
f7ef9d610c | ||
|
|
5af7d0f090 | ||
|
|
b1d8654b41 | ||
|
|
5a34d9bf31 | ||
|
|
befd387242 | ||
|
|
b37c4a2baa | ||
|
|
e059a400ad | ||
|
|
7a34278542 | ||
|
|
c5398cc968 | ||
|
|
ad5f977889 | ||
|
|
12595e99e4 | ||
|
|
7f3cf4060f | ||
|
|
e7e75c70c5 | ||
|
|
e6c7f86f03 | ||
|
|
d6c6d127c5 | ||
|
|
ca21f61e28 | ||
|
|
620ca1c174 | ||
|
|
fca42cd659 | ||
|
|
493c073ff4 | ||
|
|
8b6b51a617 | ||
|
|
5307188889 | ||
|
|
17f3f36652 | ||
|
|
54965b6136 | ||
|
|
7333eca5f4 | ||
|
|
3f5e2e2a7d | ||
|
|
84286c22e6 | ||
|
|
262326b4c3 | ||
|
|
3655829511 | ||
|
|
9b9ba6f035 | ||
|
|
87de2d64db | ||
|
|
79713f0ad8 | ||
|
|
6247c4653b | ||
|
|
c174797061 | ||
|
|
87d720e0c2 | ||
|
|
7aa1e8bb1b | ||
|
|
2dbe64ca24 | ||
|
|
9a30903b44 | ||
|
|
8d4c4ffb95 | ||
|
|
491f2947a1 | ||
|
|
70125f3411 | ||
|
|
79a6fcf257 | ||
|
|
a67cc37e69 | ||
|
|
c5171d1c67 | ||
|
|
d4ec8f0885 | ||
|
|
4603e8cf8b | ||
|
|
ee1e3c2f23 | ||
|
|
2955d60015 | ||
|
|
2c07bb9b53 | ||
|
|
9dc8fef258 | ||
|
|
84c617beb2 | ||
|
|
097d86d098 | ||
|
|
3497d43215 | ||
|
|
0dc0e846f3 | ||
|
|
9b80aa8ec9 | ||
|
|
9169543d1e | ||
|
|
b2f794125e | ||
|
|
eab2276458 | ||
|
|
211bf20c35 |
4
CREDITS
4
CREDITS
@@ -124,6 +124,10 @@ N: James F. Dougherty
|
||||
E: jfd@GigabitNetworks.COM
|
||||
D: Port to the MOUSSE board
|
||||
|
||||
N: Mike Dunn
|
||||
E: mikedunn@newsguy.com
|
||||
D: Palmtreo680 board, docg4 nand flash driver
|
||||
|
||||
N: Dave Ellis
|
||||
E: DGE@sixnetio.com
|
||||
D: EEPROM Speedup, SXNI855T port
|
||||
|
||||
14
MAINTAINERS
14
MAINTAINERS
@@ -160,8 +160,9 @@ egnite GmbH <info@egnite.de>
|
||||
|
||||
Dirk Eibach <eibach@gdsys.de>
|
||||
|
||||
controlcenterd P1022
|
||||
devconcenter PPC460EX
|
||||
dlvision PPC405EP
|
||||
dlvision PPC405EP
|
||||
dlvision-10g PPC405EP
|
||||
gdppc440etx PPC440EP/GR
|
||||
intip PPC460EX
|
||||
@@ -651,6 +652,9 @@ Wolfgang Denk <wd@denx.de>
|
||||
imx27lite i.MX27
|
||||
qong i.MX31
|
||||
|
||||
Mike Dunn <mikedunn@newsguy.com>
|
||||
palmtreo680 pxa270
|
||||
|
||||
Kristoffer Ericson <kristoffer.ericson@gmail.com>
|
||||
|
||||
jornada SA1110
|
||||
@@ -662,9 +666,9 @@ Fabio Estevam <fabio.estevam@freescale.com>
|
||||
mx31pdk i.MX31
|
||||
mx53ard i.MX53
|
||||
mx53smd i.MX53
|
||||
mx6qsabresd i.MX6Q
|
||||
mx6sabresd i.MX6Q/DL
|
||||
mx6qsabreauto i.MX6Q
|
||||
wandboard i.MX6DL/S
|
||||
wandboard i.MX6DL/S/Q
|
||||
mx6slevk i.MX6SL
|
||||
|
||||
Daniel Gorsulowski <daniel.gorsulowski@esd.eu>
|
||||
@@ -1130,10 +1134,6 @@ Stefan Roese <sr@denx.de>
|
||||
|
||||
vct_xxx MIPS32 4Kc
|
||||
|
||||
Xiangfu Liu <xiangfu@openmobilefree.net>
|
||||
|
||||
qi_lb60 MIPS32 (XBurst Jz4740 SoC)
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Unknown / orphaned boards:
|
||||
|
||||
5
MAKEALL
5
MAKEALL
@@ -435,16 +435,11 @@ LIST_mips=" \
|
||||
## MIPS Systems (little endian)
|
||||
#########################################################################
|
||||
|
||||
LIST_xburst_el=" \
|
||||
qi_lb60 \
|
||||
"
|
||||
|
||||
LIST_au1xx0_el=" \
|
||||
dbau1550_el \
|
||||
pb1000 \
|
||||
"
|
||||
LIST_mips_el=" \
|
||||
${LIST_xburst_el} \
|
||||
${LIST_au1xx0_el} \
|
||||
"
|
||||
#########################################################################
|
||||
|
||||
4
Makefile
4
Makefile
@@ -24,7 +24,7 @@
|
||||
VERSION = 2013
|
||||
PATCHLEVEL = 07
|
||||
SUBLEVEL =
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION =
|
||||
ifneq "$(SUBLEVEL)" ""
|
||||
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
|
||||
else
|
||||
@@ -747,7 +747,7 @@ endif # config.mk
|
||||
# ARM relocations should all be R_ARM_RELATIVE.
|
||||
checkarmreloc: $(obj)u-boot
|
||||
@if test "R_ARM_RELATIVE" != \
|
||||
"`readelf -r $< | cut -d ' ' -f 4 | grep R_ARM | sort -u`"; \
|
||||
"`$(CROSS_COMPILE)readelf -r $< | cut -d ' ' -f 4 | grep R_ARM | sort -u`"; \
|
||||
then echo "$< contains relocations other than \
|
||||
R_ARM_RELATIVE"; false; fi
|
||||
|
||||
|
||||
31
README
31
README
@@ -1238,6 +1238,9 @@ The following options need to be configured:
|
||||
CONFIG_TPM_TIS_I2C_BURST_LIMITATION
|
||||
Define the burst count bytes upper limit
|
||||
|
||||
CONFIG_TPM_ATMEL_TWI
|
||||
Support for Atmel TWI TPM device. Requires I2C support.
|
||||
|
||||
CONFIG_TPM_TIS_LPC
|
||||
Support for generic parallel port TPM devices. Only one device
|
||||
per system is supported at this time.
|
||||
@@ -1247,6 +1250,20 @@ The following options need to be configured:
|
||||
to. Contemporary x86 systems usually map it at
|
||||
0xfed40000.
|
||||
|
||||
CONFIG_CMD_TPM
|
||||
Add tpm monitor functions.
|
||||
Requires CONFIG_TPM. If CONFIG_TPM_AUTH_SESSIONS is set, also
|
||||
provides monitor access to authorized functions.
|
||||
|
||||
CONFIG_TPM
|
||||
Define this to enable the TPM support library which provides
|
||||
functional interfaces to some TPM commands.
|
||||
Requires support for a TPM device.
|
||||
|
||||
CONFIG_TPM_AUTH_SESSIONS
|
||||
Define this to enable authorized functions in the TPM library.
|
||||
Requires CONFIG_TPM and CONFIG_SHA1.
|
||||
|
||||
- USB Support:
|
||||
At the moment only the UHCI host controller is
|
||||
supported (PIP405, MIP405, MPC5200); define
|
||||
@@ -1392,6 +1409,12 @@ The following options need to be configured:
|
||||
CONFIG_DFU_NAND
|
||||
This enables support for exposing NAND devices via DFU.
|
||||
|
||||
CONFIG_SYS_DFU_DATA_BUF_SIZE
|
||||
Dfu transfer uses a buffer before writing data to the
|
||||
raw storage device. Make the size (in bytes) of this buffer
|
||||
configurable. The size of this buffer is also configurable
|
||||
through the "dfu_bufsiz" environment variable.
|
||||
|
||||
CONFIG_SYS_DFU_MAX_FILE_SIZE
|
||||
When updating files rather than the raw storage device,
|
||||
we use a static buffer to copy the file into and then write
|
||||
@@ -1642,14 +1665,6 @@ CBFS (Coreboot Filesystem) support
|
||||
=> vertically centered image
|
||||
at x = dspWidth - bmpWidth - 9
|
||||
|
||||
CONFIG_SPLASH_SCREEN_PREPARE
|
||||
|
||||
If this option is set then the board_splash_screen_prepare()
|
||||
function, which must be defined in your code, is called as part
|
||||
of the splash screen display sequence. It gives the board an
|
||||
opportunity to prepare the splash image data before it is
|
||||
processed and sent to the frame buffer by U-Boot.
|
||||
|
||||
- Gzip compressed BMP image support: CONFIG_VIDEO_BMP_GZIP
|
||||
|
||||
If this option is set, additionally to standard BMP
|
||||
|
||||
@@ -159,6 +159,8 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
|
||||
switch (clk) {
|
||||
case MXC_ARM_CLK:
|
||||
return imx_get_armclk();
|
||||
case MXC_I2C_CLK:
|
||||
return imx_get_ahbclk()/2;
|
||||
case MXC_UART_CLK:
|
||||
return imx_get_perclk1();
|
||||
case MXC_FEC_CLK:
|
||||
@@ -380,3 +382,11 @@ void mx27_sd2_init_pins(void)
|
||||
|
||||
}
|
||||
#endif /* CONFIG_MXC_MMC */
|
||||
|
||||
#ifndef CONFIG_SYS_DCACHE_OFF
|
||||
void enable_caches(void)
|
||||
{
|
||||
/* Enable D-cache. I-cache is already enabled in start.S */
|
||||
dcache_enable();
|
||||
}
|
||||
#endif /* CONFIG_SYS_DCACHE_OFF */
|
||||
|
||||
@@ -22,10 +22,19 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(SOC).o
|
||||
|
||||
COBJS += clock.o power.o soc.o system.o pinmux.o tzpc.o
|
||||
COBJS-y += clock.o power.o soc.o system.o pinmux.o tzpc.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS))
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
COBJS-$(CONFIG_EXYNOS5) += clock_init_exynos5.o
|
||||
COBJS-$(CONFIG_EXYNOS5) += dmc_common.o dmc_init_ddr3.o
|
||||
COBJS-$(CONFIG_EXYNOS4210)+= dmc_init_exynos4.o clock_init_exynos4.o
|
||||
COBJS-y += spl_boot.o
|
||||
COBJS-y += lowlevel_init.o
|
||||
endif
|
||||
|
||||
COBJS := $(COBJS-y)
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
|
||||
all: $(obj).depend $(LIB)
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
#include <asm/arch/clk.h>
|
||||
#include <asm/arch/periph.h>
|
||||
|
||||
#define PLL_DIV_1024 1024
|
||||
#define PLL_DIV_65535 65535
|
||||
#define PLL_DIV_65536 65536
|
||||
|
||||
/* *
|
||||
* This structure is to store the src bit, div bit and prediv bit
|
||||
* positions of the peripheral clocks of the src and div registers
|
||||
@@ -85,6 +89,7 @@ static struct set_epll_con_val exynos5_epll_div[] = {
|
||||
static int exynos_get_pll_clk(int pllreg, unsigned int r, unsigned int k)
|
||||
{
|
||||
unsigned long m, p, s = 0, mask, fout;
|
||||
unsigned int div;
|
||||
unsigned int freq;
|
||||
/*
|
||||
* APLL_CON: MIDV [25:16]
|
||||
@@ -110,16 +115,43 @@ static int exynos_get_pll_clk(int pllreg, unsigned int r, unsigned int k)
|
||||
if (pllreg == EPLL) {
|
||||
k = k & 0xffff;
|
||||
/* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV) */
|
||||
fout = (m + k / 65536) * (freq / (p * (1 << s)));
|
||||
fout = (m + k / PLL_DIV_65536) * (freq / (p * (1 << s)));
|
||||
} else if (pllreg == VPLL) {
|
||||
k = k & 0xfff;
|
||||
/* FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV) */
|
||||
fout = (m + k / 1024) * (freq / (p * (1 << s)));
|
||||
} else {
|
||||
/* FOUT = MDIV * FIN / (PDIV * 2^SDIV) */
|
||||
fout = m * (freq / (p * (1 << s)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Exynos4210
|
||||
* FOUT = (MDIV + K / 1024) * FIN / (PDIV * 2^SDIV)
|
||||
*
|
||||
* Exynos4412
|
||||
* FOUT = (MDIV + K / 65535) * FIN / (PDIV * 2^SDIV)
|
||||
*
|
||||
* Exynos5250
|
||||
* FOUT = (MDIV + K / 65536) * FIN / (PDIV * 2^SDIV)
|
||||
*/
|
||||
if (proid_is_exynos4210())
|
||||
div = PLL_DIV_1024;
|
||||
else if (proid_is_exynos4412())
|
||||
div = PLL_DIV_65535;
|
||||
else if (proid_is_exynos5250())
|
||||
div = PLL_DIV_65536;
|
||||
else
|
||||
return 0;
|
||||
|
||||
fout = (m + k / div) * (freq / (p * (1 << s)));
|
||||
} else {
|
||||
/*
|
||||
* Exynos4412 / Exynos5250
|
||||
* FOUT = MDIV * FIN / (PDIV * 2^SDIV)
|
||||
*
|
||||
* Exynos4210
|
||||
* FOUT = MDIV * FIN / (PDIV * 2^(SDIV-1))
|
||||
*/
|
||||
if (proid_is_exynos4210())
|
||||
fout = m * (freq / (p * (1 << (s - 1))));
|
||||
else
|
||||
fout = m * (freq / (p * (1 << s)));
|
||||
}
|
||||
return fout;
|
||||
}
|
||||
|
||||
|
||||
95
arch/arm/cpu/armv7/exynos/clock_init_exynos4.c
Normal file
95
arch/arm/cpu/armv7/exynos/clock_init_exynos4.c
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Clock Initialization for board based on EXYNOS4210
|
||||
*
|
||||
* 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 <common.h>
|
||||
#include <config.h>
|
||||
#include <version.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
#include <asm/arch/clk.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include "common_setup.h"
|
||||
#include "exynos4_setup.h"
|
||||
|
||||
/*
|
||||
* system_clock_init: Initialize core clock and bus clock.
|
||||
* void system_clock_init(void)
|
||||
*/
|
||||
void system_clock_init(void)
|
||||
{
|
||||
struct exynos4_clock *clk =
|
||||
(struct exynos4_clock *)samsung_get_base_clock();
|
||||
|
||||
writel(CLK_SRC_CPU_VAL, &clk->src_cpu);
|
||||
|
||||
sdelay(0x10000);
|
||||
|
||||
writel(CLK_SRC_TOP0_VAL, &clk->src_top0);
|
||||
writel(CLK_SRC_TOP1_VAL, &clk->src_top1);
|
||||
writel(CLK_SRC_DMC_VAL, &clk->src_dmc);
|
||||
writel(CLK_SRC_LEFTBUS_VAL, &clk->src_leftbus);
|
||||
writel(CLK_SRC_RIGHTBUS_VAL, &clk->src_rightbus);
|
||||
writel(CLK_SRC_FSYS_VAL, &clk->src_fsys);
|
||||
writel(CLK_SRC_PERIL0_VAL, &clk->src_peril0);
|
||||
writel(CLK_SRC_CAM_VAL, &clk->src_cam);
|
||||
writel(CLK_SRC_MFC_VAL, &clk->src_mfc);
|
||||
writel(CLK_SRC_G3D_VAL, &clk->src_g3d);
|
||||
writel(CLK_SRC_LCD0_VAL, &clk->src_lcd0);
|
||||
|
||||
sdelay(0x10000);
|
||||
|
||||
writel(CLK_DIV_CPU0_VAL, &clk->div_cpu0);
|
||||
writel(CLK_DIV_CPU1_VAL, &clk->div_cpu1);
|
||||
writel(CLK_DIV_DMC0_VAL, &clk->div_dmc0);
|
||||
writel(CLK_DIV_DMC1_VAL, &clk->div_dmc1);
|
||||
writel(CLK_DIV_LEFTBUS_VAL, &clk->div_leftbus);
|
||||
writel(CLK_DIV_RIGHTBUS_VAL, &clk->div_rightbus);
|
||||
writel(CLK_DIV_TOP_VAL, &clk->div_top);
|
||||
writel(CLK_DIV_FSYS1_VAL, &clk->div_fsys1);
|
||||
writel(CLK_DIV_FSYS2_VAL, &clk->div_fsys2);
|
||||
writel(CLK_DIV_FSYS3_VAL, &clk->div_fsys3);
|
||||
writel(CLK_DIV_PERIL0_VAL, &clk->div_peril0);
|
||||
writel(CLK_DIV_CAM_VAL, &clk->div_cam);
|
||||
writel(CLK_DIV_MFC_VAL, &clk->div_mfc);
|
||||
writel(CLK_DIV_G3D_VAL, &clk->div_g3d);
|
||||
writel(CLK_DIV_LCD0_VAL, &clk->div_lcd0);
|
||||
|
||||
/* Set PLL locktime */
|
||||
writel(PLL_LOCKTIME, &clk->apll_lock);
|
||||
writel(PLL_LOCKTIME, &clk->mpll_lock);
|
||||
writel(PLL_LOCKTIME, &clk->epll_lock);
|
||||
writel(PLL_LOCKTIME, &clk->vpll_lock);
|
||||
|
||||
writel(APLL_CON1_VAL, &clk->apll_con1);
|
||||
writel(APLL_CON0_VAL, &clk->apll_con0);
|
||||
writel(MPLL_CON1_VAL, &clk->mpll_con1);
|
||||
writel(MPLL_CON0_VAL, &clk->mpll_con0);
|
||||
writel(EPLL_CON1_VAL, &clk->epll_con1);
|
||||
writel(EPLL_CON0_VAL, &clk->epll_con0);
|
||||
writel(VPLL_CON1_VAL, &clk->vpll_con1);
|
||||
writel(VPLL_CON0_VAL, &clk->vpll_con0);
|
||||
|
||||
sdelay(0x30000);
|
||||
}
|
||||
@@ -31,7 +31,8 @@
|
||||
#include <asm/arch/dwmmc.h>
|
||||
|
||||
#include "clock_init.h"
|
||||
#include "setup.h"
|
||||
#include "common_setup.h"
|
||||
#include "exynos5_setup.h"
|
||||
|
||||
#define FSYS1_MMC0_DIV_MASK 0xff0f
|
||||
#define FSYS1_MMC0_DIV_VAL 0x0701
|
||||
@@ -214,10 +215,10 @@ struct mem_timings mem_timings[] = {
|
||||
DMC_MEMCONTROL_BL_8 |
|
||||
DMC_MEMCONTROL_PZQ_DISABLE |
|
||||
DMC_MEMCONTROL_MRR_BYTE_7_0,
|
||||
.memconfig = DMC_MEMCONFIGx_CHIP_MAP_INTERLEAVED |
|
||||
DMC_MEMCONFIGx_CHIP_COL_10 |
|
||||
DMC_MEMCONFIGx_CHIP_ROW_15 |
|
||||
DMC_MEMCONFIGx_CHIP_BANK_8,
|
||||
.memconfig = DMC_MEMCONFIGX_CHIP_MAP_INTERLEAVED |
|
||||
DMC_MEMCONFIGX_CHIP_COL_10 |
|
||||
DMC_MEMCONFIGX_CHIP_ROW_15 |
|
||||
DMC_MEMCONFIGX_CHIP_BANK_8,
|
||||
.membaseconfig0 = DMC_MEMBASECONFIG_VAL(0x40),
|
||||
.membaseconfig1 = DMC_MEMBASECONFIG_VAL(0x80),
|
||||
.prechconfig_tp_cnt = 0xff,
|
||||
@@ -317,10 +318,10 @@ struct mem_timings mem_timings[] = {
|
||||
DMC_MEMCONTROL_BL_8 |
|
||||
DMC_MEMCONTROL_PZQ_DISABLE |
|
||||
DMC_MEMCONTROL_MRR_BYTE_7_0,
|
||||
.memconfig = DMC_MEMCONFIGx_CHIP_MAP_INTERLEAVED |
|
||||
DMC_MEMCONFIGx_CHIP_COL_10 |
|
||||
DMC_MEMCONFIGx_CHIP_ROW_15 |
|
||||
DMC_MEMCONFIGx_CHIP_BANK_8,
|
||||
.memconfig = DMC_MEMCONFIGX_CHIP_MAP_INTERLEAVED |
|
||||
DMC_MEMCONFIGX_CHIP_COL_10 |
|
||||
DMC_MEMCONFIGX_CHIP_ROW_15 |
|
||||
DMC_MEMCONFIGX_CHIP_BANK_8,
|
||||
.membaseconfig0 = DMC_MEMBASECONFIG_VAL(0x40),
|
||||
.membaseconfig1 = DMC_MEMBASECONFIG_VAL(0x80),
|
||||
.prechconfig_tp_cnt = 0xff,
|
||||
@@ -350,9 +351,8 @@ struct mem_timings mem_timings[] = {
|
||||
* @param frequency_mhz Returns memory speed in MHz
|
||||
* @param arm_freq Returns ARM clock speed in MHz
|
||||
* @param mem_manuf Return Memory Manufacturer name
|
||||
* @return 0 if all ok
|
||||
*/
|
||||
static int clock_get_mem_selection(enum ddr_mode *mem_type,
|
||||
static void clock_get_mem_selection(enum ddr_mode *mem_type,
|
||||
unsigned *frequency_mhz, unsigned *arm_freq,
|
||||
enum mem_manuf *mem_manuf)
|
||||
{
|
||||
@@ -363,8 +363,6 @@ static int clock_get_mem_selection(enum ddr_mode *mem_type,
|
||||
*frequency_mhz = params->frequency_mhz;
|
||||
*arm_freq = params->arm_freq_mhz;
|
||||
*mem_manuf = params->mem_manuf;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get the ratios for setting ARM clock */
|
||||
@@ -376,9 +374,9 @@ struct arm_clk_ratios *get_arm_ratios(void)
|
||||
unsigned frequency_mhz, arm_freq;
|
||||
int i;
|
||||
|
||||
if (clock_get_mem_selection(&mem_type, &frequency_mhz,
|
||||
&arm_freq, &mem_manuf))
|
||||
;
|
||||
clock_get_mem_selection(&mem_type, &frequency_mhz,
|
||||
&arm_freq, &mem_manuf);
|
||||
|
||||
for (i = 0, arm_ratio = arm_clk_ratios; i < ARRAY_SIZE(arm_clk_ratios);
|
||||
i++, arm_ratio++) {
|
||||
if (arm_ratio->arm_freq_mhz == arm_freq)
|
||||
@@ -400,15 +398,14 @@ struct mem_timings *clock_get_mem_timings(void)
|
||||
unsigned frequency_mhz, arm_freq;
|
||||
int i;
|
||||
|
||||
if (!clock_get_mem_selection(&mem_type, &frequency_mhz,
|
||||
&arm_freq, &mem_manuf)) {
|
||||
for (i = 0, mem = mem_timings; i < ARRAY_SIZE(mem_timings);
|
||||
i++, mem++) {
|
||||
if (mem->mem_type == mem_type &&
|
||||
mem->frequency_mhz == frequency_mhz &&
|
||||
mem->mem_manuf == mem_manuf)
|
||||
return mem;
|
||||
}
|
||||
clock_get_mem_selection(&mem_type, &frequency_mhz,
|
||||
&arm_freq, &mem_manuf);
|
||||
for (i = 0, mem = mem_timings; i < ARRAY_SIZE(mem_timings);
|
||||
i++, mem++) {
|
||||
if (mem->mem_type == mem_type &&
|
||||
mem->frequency_mhz == frequency_mhz &&
|
||||
mem->mem_manuf == mem_manuf)
|
||||
return mem;
|
||||
}
|
||||
|
||||
/* will hang if failed to find memory timings */
|
||||
@@ -420,7 +417,8 @@ struct mem_timings *clock_get_mem_timings(void)
|
||||
|
||||
void system_clock_init()
|
||||
{
|
||||
struct exynos5_clock *clk = (struct exynos5_clock *)EXYNOS5_CLOCK_BASE;
|
||||
struct exynos5_clock *clk =
|
||||
(struct exynos5_clock *)samsung_get_base_clock();
|
||||
struct mem_timings *mem;
|
||||
struct arm_clk_ratios *arm_clk_ratio;
|
||||
u32 val, tmp;
|
||||
@@ -660,7 +658,8 @@ void system_clock_init()
|
||||
|
||||
void clock_init_dp_clock(void)
|
||||
{
|
||||
struct exynos5_clock *clk = (struct exynos5_clock *)EXYNOS5_CLOCK_BASE;
|
||||
struct exynos5_clock *clk =
|
||||
(struct exynos5_clock *)samsung_get_base_clock();
|
||||
|
||||
/* DP clock enable */
|
||||
setbits_le32(&clk->gate_ip_disp1, CLK_GATE_DP1_ALLOW);
|
||||
@@ -675,7 +674,8 @@ void clock_init_dp_clock(void)
|
||||
*/
|
||||
void emmc_boot_clk_div_set(void)
|
||||
{
|
||||
struct exynos5_clock *clk = (struct exynos5_clock *)EXYNOS5_CLOCK_BASE;
|
||||
struct exynos5_clock *clk =
|
||||
(struct exynos5_clock *)samsung_get_base_clock();
|
||||
unsigned int div_mmc;
|
||||
|
||||
div_mmc = readl((unsigned int) &clk->div_fsys1) & ~FSYS1_MMC0_DIV_MASK;
|
||||
45
arch/arm/cpu/armv7/exynos/common_setup.h
Normal file
45
arch/arm/cpu/armv7/exynos/common_setup.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Common APIs for EXYNOS based board
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#define DMC_OFFSET 0x10000
|
||||
|
||||
/*
|
||||
* Memory initialization
|
||||
*
|
||||
* @param reset Reset PHY during initialization.
|
||||
*/
|
||||
void mem_ctrl_init(int reset);
|
||||
|
||||
/* System Clock initialization */
|
||||
void system_clock_init(void);
|
||||
|
||||
/*
|
||||
* Init subsystems according to the reset status
|
||||
*
|
||||
* @return 0 for a normal boot, non-zero for a resume
|
||||
*/
|
||||
int do_lowlevel_init(void);
|
||||
|
||||
void sdelay(unsigned long);
|
||||
@@ -26,7 +26,8 @@
|
||||
#include <asm/arch/spl.h>
|
||||
|
||||
#include "clock_init.h"
|
||||
#include "setup.h"
|
||||
#include "common_setup.h"
|
||||
#include "exynos5_setup.h"
|
||||
|
||||
#define ZQ_INIT_TIMEOUT 10000
|
||||
|
||||
@@ -175,7 +176,7 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc)
|
||||
writel(DMC_MEMBASECONFIG1_VAL, &dmc->membaseconfig1);
|
||||
}
|
||||
|
||||
void mem_ctrl_init()
|
||||
void mem_ctrl_init(int reset)
|
||||
{
|
||||
struct spl_machine_param *param = spl_get_machine_params();
|
||||
struct mem_timings *mem;
|
||||
@@ -185,7 +186,7 @@ void mem_ctrl_init()
|
||||
|
||||
/* If there are any other memory variant, add their init call below */
|
||||
if (param->mem_type == DDR_MODE_DDR3) {
|
||||
ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size);
|
||||
ret = ddr3_mem_ctrl_init(mem, param->mem_iv_size, reset);
|
||||
if (ret) {
|
||||
/* will hang if failed to init memory control */
|
||||
while (1)
|
||||
@@ -27,31 +27,36 @@
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
#include <asm/arch/dmc.h>
|
||||
#include "setup.h"
|
||||
#include "common_setup.h"
|
||||
#include "exynos5_setup.h"
|
||||
#include "clock_init.h"
|
||||
|
||||
#define RDLVL_COMPLETE_TIMEOUT 10000
|
||||
|
||||
static void reset_phy_ctrl(void)
|
||||
{
|
||||
struct exynos5_clock *clk = (struct exynos5_clock *)EXYNOS5_CLOCK_BASE;
|
||||
struct exynos5_clock *clk =
|
||||
(struct exynos5_clock *)samsung_get_base_clock();
|
||||
|
||||
writel(DDR3PHY_CTRL_PHY_RESET_OFF, &clk->lpddr3phy_ctrl);
|
||||
writel(DDR3PHY_CTRL_PHY_RESET, &clk->lpddr3phy_ctrl);
|
||||
}
|
||||
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
int reset)
|
||||
{
|
||||
unsigned int val;
|
||||
struct exynos5_phy_control *phy0_ctrl, *phy1_ctrl;
|
||||
struct exynos5_dmc *dmc;
|
||||
int i;
|
||||
|
||||
phy0_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY0_BASE;
|
||||
phy1_ctrl = (struct exynos5_phy_control *)EXYNOS5_DMC_PHY1_BASE;
|
||||
dmc = (struct exynos5_dmc *)EXYNOS5_DMC_CTRL_BASE;
|
||||
phy0_ctrl = (struct exynos5_phy_control *)samsung_get_base_dmc_phy();
|
||||
phy1_ctrl = (struct exynos5_phy_control *)(samsung_get_base_dmc_phy()
|
||||
+ DMC_OFFSET);
|
||||
dmc = (struct exynos5_dmc *)samsung_get_base_dmc_ctrl();
|
||||
|
||||
reset_phy_ctrl();
|
||||
if (reset)
|
||||
reset_phy_ctrl();
|
||||
|
||||
/* Set Impedance Output Driver */
|
||||
val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
|
||||
@@ -100,14 +105,14 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
|
||||
|
||||
/* Start DLL locking */
|
||||
writel(val | (mem->ctrl_start << PHY_CON12_CTRL_START_SHIFT),
|
||||
&phy0_ctrl->phy_con12);
|
||||
&phy0_ctrl->phy_con12);
|
||||
writel(val | (mem->ctrl_start << PHY_CON12_CTRL_START_SHIFT),
|
||||
&phy1_ctrl->phy_con12);
|
||||
&phy1_ctrl->phy_con12);
|
||||
|
||||
update_reset_dll(dmc, DDR_MODE_DDR3);
|
||||
|
||||
writel(mem->concontrol | (mem->rd_fetch << CONCONTROL_RD_FETCH_SHIFT),
|
||||
&dmc->concontrol);
|
||||
&dmc->concontrol);
|
||||
|
||||
/* Memory Channel Inteleaving Size */
|
||||
writel(mem->iv_size, &dmc->ivcontrol);
|
||||
@@ -119,7 +124,7 @@ int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size)
|
||||
|
||||
/* Precharge Configuration */
|
||||
writel(mem->prechconfig_tp_cnt << PRECHCONFIG_TP_CNT_SHIFT,
|
||||
&dmc->prechconfig);
|
||||
&dmc->prechconfig);
|
||||
|
||||
/* Power Down mode Configuration */
|
||||
writel(mem->dpwrdn_cyc << PWRDNCONFIG_DPWRDN_CYC_SHIFT |
|
||||
213
arch/arm/cpu/armv7/exynos/dmc_init_exynos4.c
Normal file
213
arch/arm/cpu/armv7/exynos/dmc_init_exynos4.c
Normal file
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* Memory setup for board based on EXYNOS4210
|
||||
*
|
||||
* 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 "exynos4_setup.h"
|
||||
|
||||
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,
|
||||
};
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
#ifdef CONFIG_ORIGEN
|
||||
/* 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
|
||||
/* DREX0 */
|
||||
dmc = (struct exynos4_dmc *)samsung_get_base_dmc_ctrl();
|
||||
dmc_init(dmc);
|
||||
dmc = (struct exynos4_dmc *)(samsung_get_base_dmc_ctrl()
|
||||
+ DMC_OFFSET);
|
||||
dmc_init(dmc);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Machine Specific Values for ORIGEN board based on S5PV310
|
||||
* Machine Specific Values for EXYNOS4012 based board
|
||||
*
|
||||
* Copyright (C) 2011 Samsung Electronics
|
||||
*
|
||||
@@ -29,98 +29,22 @@
|
||||
#include <version.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
|
||||
/* Offsets of clock registers (sources and dividers) */
|
||||
#define CLK_SRC_CPU_OFFSET 0x14200
|
||||
#define CLK_DIV_CPU0_OFFSET 0x14500
|
||||
#define CLK_DIV_CPU1_OFFSET 0x14504
|
||||
|
||||
#define CLK_SRC_DMC_OFFSET 0x10200
|
||||
#define CLK_DIV_DMC0_OFFSET 0x10500
|
||||
#define CLK_DIV_DMC1_OFFSET 0x10504
|
||||
|
||||
#define CLK_SRC_TOP0_OFFSET 0xC210
|
||||
#define CLK_SRC_TOP1_OFFSET 0xC214
|
||||
#define CLK_DIV_TOP_OFFSET 0xC510
|
||||
|
||||
#define CLK_SRC_LEFTBUS_OFFSET 0x4200
|
||||
#define CLK_DIV_LEFTBUS_OFFSET 0x4500
|
||||
|
||||
#define CLK_SRC_RIGHTBUS_OFFSET 0x8200
|
||||
#define CLK_DIV_RIGHTBUS_OFFSET 0x8500
|
||||
|
||||
#define CLK_SRC_FSYS_OFFSET 0xC240
|
||||
#define CLK_DIV_FSYS1_OFFSET 0xC544
|
||||
#define CLK_DIV_FSYS2_OFFSET 0xC548
|
||||
#define CLK_DIV_FSYS3_OFFSET 0xC54C
|
||||
|
||||
#define CLK_SRC_CAM_OFFSET 0xC220
|
||||
#define CLK_SRC_TV_OFFSET 0xC224
|
||||
#define CLK_SRC_MFC_OFFSET 0xC228
|
||||
#define CLK_SRC_G3D_OFFSET 0xC22C
|
||||
#define CLK_SRC_LCD0_OFFSET 0xC234
|
||||
#define CLK_SRC_PERIL0_OFFSET 0xC250
|
||||
|
||||
#define CLK_DIV_CAM_OFFSET 0xC520
|
||||
#define CLK_DIV_TV_OFFSET 0xC524
|
||||
#define CLK_DIV_MFC_OFFSET 0xC528
|
||||
#define CLK_DIV_G3D_OFFSET 0xC52C
|
||||
#define CLK_DIV_LCD0_OFFSET 0xC534
|
||||
#define CLK_DIV_PERIL0_OFFSET 0xC550
|
||||
|
||||
#define CLK_SRC_LCD0_OFFSET 0xC234
|
||||
|
||||
#define APLL_LOCK_OFFSET 0x14000
|
||||
#define MPLL_LOCK_OFFSET 0x14008
|
||||
#define APLL_CON0_OFFSET 0x14100
|
||||
#define APLL_CON1_OFFSET 0x14104
|
||||
#define MPLL_CON0_OFFSET 0x14108
|
||||
#define MPLL_CON1_OFFSET 0x1410C
|
||||
|
||||
#define EPLL_LOCK_OFFSET 0xC010
|
||||
#define VPLL_LOCK_OFFSET 0xC020
|
||||
#define EPLL_CON0_OFFSET 0xC110
|
||||
#define EPLL_CON1_OFFSET 0xC114
|
||||
#define VPLL_CON0_OFFSET 0xC120
|
||||
#define VPLL_CON1_OFFSET 0xC124
|
||||
|
||||
/* DMC: DRAM Controllor Register offsets */
|
||||
#define DMC_CONCONTROL 0x00
|
||||
#define DMC_MEMCONTROL 0x04
|
||||
#define DMC_MEMCONFIG0 0x08
|
||||
#define DMC_MEMCONFIG1 0x0C
|
||||
#define DMC_DIRECTCMD 0x10
|
||||
#define DMC_PRECHCONFIG 0x14
|
||||
#define DMC_PHYCONTROL0 0x18
|
||||
#define DMC_PHYCONTROL1 0x1C
|
||||
#define DMC_PHYCONTROL2 0x20
|
||||
#define DMC_TIMINGAREF 0x30
|
||||
#define DMC_TIMINGROW 0x34
|
||||
#define DMC_TIMINGDATA 0x38
|
||||
#define DMC_TIMINGPOWER 0x3C
|
||||
#define DMC_PHYZQCONTROL 0x44
|
||||
#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
|
||||
|
||||
/* MIU Config Register Offsets*/
|
||||
#define APB_SFR_INTERLEAVE_CONF_OFFSET 0x400
|
||||
#define APB_SFR_ARBRITATION_CONF_OFFSET 0xC00
|
||||
|
||||
/* Offset for inform registers */
|
||||
#define INFORM0_OFFSET 0x800
|
||||
#define INFORM1_OFFSET 0x804
|
||||
|
||||
/* GPIO Offsets for UART: GPIO Contol Register */
|
||||
#define EXYNOS4_GPIO_A0_CON_OFFSET 0x00
|
||||
#define EXYNOS4_GPIO_A1_CON_OFFSET 0x20
|
||||
|
||||
/* UART Register offsets */
|
||||
#define ULCON_OFFSET 0x00
|
||||
#define UCON_OFFSET 0x04
|
||||
#define UFCON_OFFSET 0x08
|
||||
#define UBRDIV_OFFSET 0x28
|
||||
#define UFRACVAL_OFFSET 0x2C
|
||||
|
||||
/* CLK_SRC_CPU */
|
||||
#define MUX_HPM_SEL_MOUTAPLL 0x0
|
||||
#define MUX_HPM_SEL_SCLKMPLL 0x1
|
||||
@@ -485,123 +409,186 @@
|
||||
| (VPLL_MRR << 24) \
|
||||
| (VPLL_MFR << 16) \
|
||||
| (VPLL_K << 0))
|
||||
/*
|
||||
* UART GPIO_A0/GPIO_A1 Control Register Value
|
||||
* 0x2: UART Function
|
||||
*/
|
||||
#define EXYNOS4_GPIO_A0_CON_VAL 0x22222222
|
||||
#define EXYNOS4_GPIO_A1_CON_VAL 0x222222
|
||||
|
||||
/* ULCON: UART Line Control Value 8N1 */
|
||||
#define WORD_LEN_5_BIT 0x00
|
||||
#define WORD_LEN_6_BIT 0x01
|
||||
#define WORD_LEN_7_BIT 0x02
|
||||
#define WORD_LEN_8_BIT 0x03
|
||||
/* 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)
|
||||
|
||||
#define STOP_BIT_1 0x00
|
||||
#define STOP_BIT_2 0x01
|
||||
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;
|
||||
};
|
||||
|
||||
#define NO_PARITY 0x00
|
||||
#define ODD_PARITY 0x4
|
||||
#define EVEN_PARITY 0x5
|
||||
#define FORCED_PARITY_CHECK_AS_1 0x6
|
||||
#define FORCED_PARITY_CHECK_AS_0 0x7
|
||||
/* 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
|
||||
|
||||
#define INFRAMODE_NORMAL 0x00
|
||||
#define INFRAMODE_INFRARED 0x01
|
||||
|
||||
#define ULCON_VAL ((INFRAMODE_NORMAL << 6) \
|
||||
| (NO_PARITY << 3) \
|
||||
| (STOP_BIT_1 << 2) \
|
||||
| (WORD_LEN_8_BIT << 0))
|
||||
|
||||
/*
|
||||
* UCON: UART Control Value
|
||||
* Tx_interrupt Type: Level
|
||||
* Rx_interrupt Type: Level
|
||||
* Rx Timeout Enabled: Yes
|
||||
* Rx-Error Atatus_Int Enable: Yes
|
||||
* Loop_Back: No
|
||||
* Break Signal: No
|
||||
* Transmit mode : Interrupt request/polling
|
||||
* Receive mode : Interrupt request/polling
|
||||
*/
|
||||
#define TX_PULSE_INTERRUPT 0
|
||||
#define TX_LEVEL_INTERRUPT 1
|
||||
#define RX_PULSE_INTERRUPT 0
|
||||
#define RX_LEVEL_INTERRUPT 1
|
||||
|
||||
#define RX_TIME_OUT ENABLE
|
||||
#define RX_ERROR_STATE_INT_ENB ENABLE
|
||||
#define LOOP_BACK DISABLE
|
||||
#define BREAK_SIGNAL DISABLE
|
||||
|
||||
#define TX_MODE_DISABLED 0X00
|
||||
#define TX_MODE_IRQ_OR_POLL 0X01
|
||||
#define TX_MODE_DMA 0X02
|
||||
|
||||
#define RX_MODE_DISABLED 0X00
|
||||
#define RX_MODE_IRQ_OR_POLL 0X01
|
||||
#define RX_MODE_DMA 0X02
|
||||
|
||||
#define UCON_VAL ((TX_LEVEL_INTERRUPT << 9) \
|
||||
| (RX_LEVEL_INTERRUPT << 8) \
|
||||
| (RX_TIME_OUT << 7) \
|
||||
| (RX_ERROR_STATE_INT_ENB << 6) \
|
||||
| (LOOP_BACK << 5) \
|
||||
| (BREAK_SIGNAL << 4) \
|
||||
| (TX_MODE_IRQ_OR_POLL << 2) \
|
||||
| (RX_MODE_IRQ_OR_POLL << 0))
|
||||
|
||||
/*
|
||||
* UFCON: UART FIFO Control Value
|
||||
* Tx FIFO Trigger LEVEL: 2 Bytes (001)
|
||||
* Rx FIFO Trigger LEVEL: 2 Bytes (001)
|
||||
* Tx Fifo Reset: No
|
||||
* Rx Fifo Reset: No
|
||||
* FIFO Enable: Yes
|
||||
*/
|
||||
#define TX_FIFO_TRIGGER_LEVEL_0_BYTES 0x00
|
||||
#define TX_FIFO_TRIGGER_LEVEL_2_BYTES 0x1
|
||||
#define TX_FIFO_TRIGGER_LEVEL_4_BYTES 0x2
|
||||
#define TX_FIFO_TRIGGER_LEVEL_6_BYTES 0x3
|
||||
#define TX_FIFO_TRIGGER_LEVEL_8_BYTES 0x4
|
||||
#define TX_FIFO_TRIGGER_LEVEL_10_BYTES 0x5
|
||||
#define TX_FIFO_TRIGGER_LEVEL_12_BYTES 0x6
|
||||
#define TX_FIFO_TRIGGER_LEVEL_14_BYTES 0x7
|
||||
|
||||
#define RX_FIFO_TRIGGER_LEVEL_2_BYTES 0x0
|
||||
#define RX_FIFO_TRIGGER_LEVEL_4_BYTES 0x1
|
||||
#define RX_FIFO_TRIGGER_LEVEL_6_BYTES 0x2
|
||||
#define RX_FIFO_TRIGGER_LEVEL_8_BYTES 0x3
|
||||
#define RX_FIFO_TRIGGER_LEVEL_10_BYTES 0x4
|
||||
#define RX_FIFO_TRIGGER_LEVEL_12_BYTES 0x5
|
||||
#define RX_FIFO_TRIGGER_LEVEL_14_BYTES 0x6
|
||||
#define RX_FIFO_TRIGGER_LEVEL_16_BYTES 0x7
|
||||
|
||||
#define TX_FIFO_TRIGGER_LEVEL TX_FIFO_TRIGGER_LEVEL_2_BYTES
|
||||
#define RX_FIFO_TRIGGER_LEVEL RX_FIFO_TRIGGER_LEVEL_4_BYTES
|
||||
#define TX_FIFO_RESET DISABLE
|
||||
#define RX_FIFO_RESET DISABLE
|
||||
#define FIFO_ENABLE ENABLE
|
||||
#define UFCON_VAL ((TX_FIFO_TRIGGER_LEVEL << 8) \
|
||||
| (RX_FIFO_TRIGGER_LEVEL << 4) \
|
||||
| (TX_FIFO_RESET << 2) \
|
||||
| (RX_FIFO_RESET << 1) \
|
||||
| (FIFO_ENABLE << 0))
|
||||
/*
|
||||
* Baud Rate Division Value
|
||||
* 115200 BAUD:
|
||||
* UBRDIV_VAL = SCLK_UART/((115200 * 16) - 1)
|
||||
* UBRDIV_VAL = (800 MHz)/((115200 * 16) - 1)
|
||||
*/
|
||||
#define UBRDIV_VAL 0x35
|
||||
|
||||
/*
|
||||
* Fractional Part of Baud Rate Divisor:
|
||||
* 115200 BAUD:
|
||||
* UBRFRACVAL = ((((SCLK_UART*10/(115200*16) -10))%10)*16/10)
|
||||
* UBRFRACVAL = ((((800MHz*10/(115200*16) -10))%10)*16/10)
|
||||
*/
|
||||
#define UFRACVAL_VAL 0x4
|
||||
#ifdef CONFIG_ORIGEN
|
||||
/* 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 CONFIG_ORIGEN
|
||||
#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
|
||||
@@ -93,17 +93,17 @@
|
||||
#define DMC_MEMCONTROL_MRR_BYTE_31_24 (3 << 25)
|
||||
|
||||
/* MEMCONFIG0 register bit fields */
|
||||
#define DMC_MEMCONFIGx_CHIP_MAP_INTERLEAVED (1 << 12)
|
||||
#define DMC_MEMCONFIGx_CHIP_COL_10 (3 << 8)
|
||||
#define DMC_MEMCONFIGx_CHIP_ROW_14 (2 << 4)
|
||||
#define DMC_MEMCONFIGx_CHIP_ROW_15 (3 << 4)
|
||||
#define DMC_MEMCONFIGx_CHIP_BANK_8 (3 << 0)
|
||||
#define DMC_MEMCONFIGX_CHIP_MAP_INTERLEAVED (1 << 12)
|
||||
#define DMC_MEMCONFIGX_CHIP_COL_10 (3 << 8)
|
||||
#define DMC_MEMCONFIGX_CHIP_ROW_14 (2 << 4)
|
||||
#define DMC_MEMCONFIGX_CHIP_ROW_15 (3 << 4)
|
||||
#define DMC_MEMCONFIGX_CHIP_BANK_8 (3 << 0)
|
||||
|
||||
#define DMC_MEMBASECONFIGx_CHIP_BASE(x) (x << 16)
|
||||
#define DMC_MEMBASECONFIGx_CHIP_MASK(x) (x << 0)
|
||||
#define DMC_MEMBASECONFIGX_CHIP_BASE(x) (x << 16)
|
||||
#define DMC_MEMBASECONFIGX_CHIP_MASK(x) (x << 0)
|
||||
#define DMC_MEMBASECONFIG_VAL(x) ( \
|
||||
DMC_MEMBASECONFIGx_CHIP_BASE(x) | \
|
||||
DMC_MEMBASECONFIGx_CHIP_MASK(0x780) \
|
||||
DMC_MEMBASECONFIGX_CHIP_BASE(x) | \
|
||||
DMC_MEMBASECONFIGX_CHIP_MASK(0x780) \
|
||||
)
|
||||
|
||||
#define DMC_MEMBASECONFIG0_VAL DMC_MEMBASECONFIG_VAL(0x40)
|
||||
@@ -513,9 +513,11 @@ enum {
|
||||
* which the DMC uses to decide how to split a memory
|
||||
* chunk into smaller chunks to support concurrent
|
||||
* accesses; may vary across boards.
|
||||
* @param reset Reset DDR PHY during initialization.
|
||||
* @return 0 if ok, SETUP_ERR_... if there is a problem
|
||||
*/
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size);
|
||||
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
|
||||
int reset);
|
||||
|
||||
/*
|
||||
* Configure ZQ I/O interface
|
||||
@@ -562,8 +564,4 @@ void dmc_config_memory(struct mem_timings *mem, struct exynos5_dmc *dmc);
|
||||
* @param ddr_mode Type of DDR memory
|
||||
*/
|
||||
void update_reset_dll(struct exynos5_dmc *, enum ddr_mode);
|
||||
|
||||
void sdelay(unsigned long);
|
||||
void mem_ctrl_init(void);
|
||||
void system_clock_init(void);
|
||||
#endif
|
||||
73
arch/arm/cpu/armv7/exynos/lowlevel_init.c
Normal file
73
arch/arm/cpu/armv7/exynos/lowlevel_init.c
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Lowlevel setup for EXYNOS5 based board
|
||||
*
|
||||
* 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 <common.h>
|
||||
#include <config.h>
|
||||
#include <asm/arch/cpu.h>
|
||||
#include <asm/arch/dmc.h>
|
||||
#include <asm/arch/power.h>
|
||||
#include <asm/arch/tzpc.h>
|
||||
#include <asm/arch/periph.h>
|
||||
#include <asm/arch/pinmux.h>
|
||||
#include "common_setup.h"
|
||||
|
||||
/* These are the things we can do during low-level init */
|
||||
enum {
|
||||
DO_WAKEUP = 1 << 0,
|
||||
DO_CLOCKS = 1 << 1,
|
||||
DO_MEM_RESET = 1 << 2,
|
||||
DO_UART = 1 << 3,
|
||||
};
|
||||
|
||||
int do_lowlevel_init(void)
|
||||
{
|
||||
uint32_t reset_status;
|
||||
int actions = 0;
|
||||
|
||||
arch_cpu_init();
|
||||
|
||||
reset_status = get_reset_status();
|
||||
|
||||
switch (reset_status) {
|
||||
case S5P_CHECK_SLEEP:
|
||||
actions = DO_CLOCKS | DO_WAKEUP;
|
||||
break;
|
||||
case S5P_CHECK_DIDLE:
|
||||
case S5P_CHECK_LPA:
|
||||
actions = DO_WAKEUP;
|
||||
break;
|
||||
default:
|
||||
/* This is a normal boot (not a wake from sleep) */
|
||||
actions = DO_CLOCKS | DO_MEM_RESET;
|
||||
}
|
||||
|
||||
if (actions & DO_CLOCKS) {
|
||||
system_clock_init();
|
||||
mem_ctrl_init(actions & DO_MEM_RESET);
|
||||
tzpc_init();
|
||||
}
|
||||
|
||||
return actions & DO_WAKEUP;
|
||||
}
|
||||
@@ -408,9 +408,49 @@ static int exynos4_mmc_config(int peripheral, int flags)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void exynos4_uart_config(int peripheral)
|
||||
{
|
||||
struct exynos4_gpio_part1 *gpio1 =
|
||||
(struct exynos4_gpio_part1 *)samsung_get_base_gpio_part1();
|
||||
struct s5p_gpio_bank *bank;
|
||||
int i, start, count;
|
||||
|
||||
switch (peripheral) {
|
||||
case PERIPH_ID_UART0:
|
||||
bank = &gpio1->a0;
|
||||
start = 0;
|
||||
count = 4;
|
||||
break;
|
||||
case PERIPH_ID_UART1:
|
||||
bank = &gpio1->a0;
|
||||
start = 4;
|
||||
count = 4;
|
||||
break;
|
||||
case PERIPH_ID_UART2:
|
||||
bank = &gpio1->a1;
|
||||
start = 0;
|
||||
count = 4;
|
||||
break;
|
||||
case PERIPH_ID_UART3:
|
||||
bank = &gpio1->a1;
|
||||
start = 4;
|
||||
count = 2;
|
||||
break;
|
||||
}
|
||||
for (i = start; i < start + count; i++) {
|
||||
s5p_gpio_set_pull(bank, i, GPIO_PULL_NONE);
|
||||
s5p_gpio_cfg_pin(bank, i, GPIO_FUNC(0x2));
|
||||
}
|
||||
}
|
||||
static int exynos4_pinmux_config(int peripheral, int flags)
|
||||
{
|
||||
switch (peripheral) {
|
||||
case PERIPH_ID_UART0:
|
||||
case PERIPH_ID_UART1:
|
||||
case PERIPH_ID_UART2:
|
||||
case PERIPH_ID_UART3:
|
||||
exynos4_uart_config(peripheral);
|
||||
break;
|
||||
case PERIPH_ID_I2C0:
|
||||
case PERIPH_ID_I2C1:
|
||||
case PERIPH_ID_I2C2:
|
||||
|
||||
@@ -140,3 +140,53 @@ void set_hw_thermal_trip(void)
|
||||
setbits_le32(&power->ps_hold_control, POWER_ENABLE_HW_TRIP);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t exynos5_get_reset_status(void)
|
||||
{
|
||||
struct exynos5_power *power =
|
||||
(struct exynos5_power *)samsung_get_base_power();
|
||||
|
||||
return power->inform1;
|
||||
}
|
||||
|
||||
static uint32_t exynos4_get_reset_status(void)
|
||||
{
|
||||
struct exynos4_power *power =
|
||||
(struct exynos4_power *)samsung_get_base_power();
|
||||
|
||||
return power->inform1;
|
||||
}
|
||||
|
||||
uint32_t get_reset_status(void)
|
||||
{
|
||||
if (cpu_is_exynos5())
|
||||
return exynos5_get_reset_status();
|
||||
else
|
||||
return exynos4_get_reset_status();
|
||||
}
|
||||
|
||||
static void exynos5_power_exit_wakeup(void)
|
||||
{
|
||||
struct exynos5_power *power =
|
||||
(struct exynos5_power *)samsung_get_base_power();
|
||||
typedef void (*resume_func)(void);
|
||||
|
||||
((resume_func)power->inform0)();
|
||||
}
|
||||
|
||||
static void exynos4_power_exit_wakeup(void)
|
||||
{
|
||||
struct exynos4_power *power =
|
||||
(struct exynos4_power *)samsung_get_base_power();
|
||||
typedef void (*resume_func)(void);
|
||||
|
||||
((resume_func)power->inform0)();
|
||||
}
|
||||
|
||||
void power_exit_wakeup(void)
|
||||
{
|
||||
if (cpu_is_exynos5())
|
||||
exynos5_power_exit_wakeup();
|
||||
else
|
||||
exynos4_power_exit_wakeup();
|
||||
}
|
||||
|
||||
@@ -23,12 +23,18 @@
|
||||
#include<common.h>
|
||||
#include<config.h>
|
||||
|
||||
#include <asm/arch-exynos/dmc.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/clk.h>
|
||||
#include <asm/arch/dmc.h>
|
||||
#include <asm/arch/power.h>
|
||||
#include <asm/arch/spl.h>
|
||||
|
||||
#include "common_setup.h"
|
||||
#include "clock_init.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
#define OM_STAT (0x1f << 1)
|
||||
|
||||
/* Index into irom ptr table */
|
||||
enum index {
|
||||
MMC_INDEX,
|
||||
@@ -48,20 +54,12 @@ u32 irom_ptr_table[] = {
|
||||
[USB_INDEX] = 0x02020070, /* iROM Function Pointer-USB boot*/
|
||||
};
|
||||
|
||||
enum boot_mode {
|
||||
BOOT_MODE_MMC = 4,
|
||||
BOOT_MODE_SERIAL = 20,
|
||||
BOOT_MODE_EMMC = 8, /* EMMC4.4 */
|
||||
/* Boot based on Operating Mode pin settings */
|
||||
BOOT_MODE_OM = 32,
|
||||
BOOT_MODE_USB, /* Boot using USB download */
|
||||
};
|
||||
|
||||
void *get_irom_func(int index)
|
||||
{
|
||||
return (void *)*(u32 *)irom_ptr_table[index];
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USB_BOOTING
|
||||
/*
|
||||
* Set/clear program flow prediction and return the previous state.
|
||||
*/
|
||||
@@ -75,6 +73,7 @@ static int config_branch_prediction(int set_cr_z)
|
||||
|
||||
return cr & CR_Z;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Copy U-boot from mmc to RAM:
|
||||
@@ -83,35 +82,42 @@ static int config_branch_prediction(int set_cr_z)
|
||||
*/
|
||||
void copy_uboot_to_ram(void)
|
||||
{
|
||||
int is_cr_z_set;
|
||||
unsigned int sec_boot_check;
|
||||
enum boot_mode bootmode = BOOT_MODE_OM;
|
||||
|
||||
u32 (*spi_copy)(u32 offset, u32 nblock, u32 dst);
|
||||
u32 (*copy_bl2)(u32 offset, u32 nblock, u32 dst);
|
||||
u32 (*copy_bl2)(u32 offset, u32 nblock, u32 dst) = NULL;
|
||||
u32 offset = 0, size = 0;
|
||||
#ifdef CONFIG_SUPPORT_EMMC_BOOT
|
||||
u32 (*copy_bl2_from_emmc)(u32 nblock, u32 dst);
|
||||
void (*end_bootop_from_emmc)(void);
|
||||
#endif
|
||||
#ifdef CONFIG_USB_BOOTING
|
||||
u32 (*usb_copy)(void);
|
||||
int is_cr_z_set;
|
||||
unsigned int sec_boot_check;
|
||||
|
||||
/* Read iRAM location to check for secondary USB boot mode */
|
||||
sec_boot_check = readl(EXYNOS_IRAM_SECONDARY_BASE);
|
||||
if (sec_boot_check == EXYNOS_USB_SECONDARY_BOOT)
|
||||
bootmode = BOOT_MODE_USB;
|
||||
#endif
|
||||
|
||||
if (bootmode == BOOT_MODE_OM)
|
||||
bootmode = readl(EXYNOS5_POWER_BASE) & OM_STAT;
|
||||
bootmode = readl(samsung_get_base_power()) & OM_STAT;
|
||||
|
||||
switch (bootmode) {
|
||||
#ifdef CONFIG_SPI_BOOTING
|
||||
case BOOT_MODE_SERIAL:
|
||||
spi_copy = get_irom_func(SPI_INDEX);
|
||||
spi_copy(SPI_FLASH_UBOOT_POS, CONFIG_BL2_SIZE,
|
||||
CONFIG_SYS_TEXT_BASE);
|
||||
offset = SPI_FLASH_UBOOT_POS;
|
||||
size = CONFIG_BL2_SIZE;
|
||||
copy_bl2 = get_irom_func(SPI_INDEX);
|
||||
break;
|
||||
#endif
|
||||
case BOOT_MODE_MMC:
|
||||
offset = BL2_START_OFFSET;
|
||||
size = BL2_SIZE_BLOC_COUNT;
|
||||
copy_bl2 = get_irom_func(MMC_INDEX);
|
||||
copy_bl2(BL2_START_OFFSET, BL2_SIZE_BLOC_COUNT,
|
||||
CONFIG_SYS_TEXT_BASE);
|
||||
break;
|
||||
#ifdef CONFIG_SUPPORT_EMMC_BOOT
|
||||
case BOOT_MODE_EMMC:
|
||||
/* Set the FSYS1 clock divisor value for EMMC boot */
|
||||
emmc_boot_clk_div_set();
|
||||
@@ -122,6 +128,8 @@ void copy_uboot_to_ram(void)
|
||||
copy_bl2_from_emmc(BL2_SIZE_BLOC_COUNT, CONFIG_SYS_TEXT_BASE);
|
||||
end_bootop_from_emmc();
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_USB_BOOTING
|
||||
case BOOT_MODE_USB:
|
||||
/*
|
||||
* iROM needs program flow prediction to be disabled
|
||||
@@ -132,14 +140,50 @@ void copy_uboot_to_ram(void)
|
||||
usb_copy();
|
||||
config_branch_prediction(is_cr_z_set);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (copy_bl2)
|
||||
copy_bl2(offset, size, CONFIG_SYS_TEXT_BASE);
|
||||
}
|
||||
|
||||
void memzero(void *s, size_t n)
|
||||
{
|
||||
char *ptr = s;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
*ptr++ = '\0';
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up the U-Boot global_data pointer
|
||||
*
|
||||
* This sets the address of the global data, and sets up basic values.
|
||||
*
|
||||
* @param gdp Value to give to gd
|
||||
*/
|
||||
static void setup_global_data(gd_t *gdp)
|
||||
{
|
||||
gd = gdp;
|
||||
memzero((void *)gd, sizeof(gd_t));
|
||||
gd->flags |= GD_FLG_RELOC;
|
||||
gd->baudrate = CONFIG_BAUDRATE;
|
||||
gd->have_console = 1;
|
||||
}
|
||||
|
||||
void board_init_f(unsigned long bootflag)
|
||||
{
|
||||
__aligned(8) gd_t local_gd;
|
||||
__attribute__((noreturn)) void (*uboot)(void);
|
||||
|
||||
setup_global_data(&local_gd);
|
||||
|
||||
if (do_lowlevel_init())
|
||||
power_exit_wakeup();
|
||||
|
||||
copy_uboot_to_ram();
|
||||
|
||||
/* Jump to U-Boot image */
|
||||
@@ -1200,6 +1200,9 @@ void dmm_init(u32 base)
|
||||
/* TRAP for invalid TILER mappings in section 0 */
|
||||
lis_map_regs_calculated.dmm_lisa_map_0 = DMM_LISA_MAP_0_INVAL_ADDR_TRAP;
|
||||
|
||||
if (omap_revision() >= OMAP4460_ES1_0)
|
||||
lis_map_regs_calculated.is_ma_present = 1;
|
||||
|
||||
lisa_map_regs = &lis_map_regs_calculated;
|
||||
#endif
|
||||
struct dmm_lisa_map_regs *hw_lisa_map_regs =
|
||||
|
||||
@@ -412,6 +412,8 @@ void enable_basic_clocks(void)
|
||||
(*prcm)->cm_l4per_gpio4_clkctrl,
|
||||
(*prcm)->cm_l4per_gpio5_clkctrl,
|
||||
(*prcm)->cm_l4per_gpio6_clkctrl,
|
||||
(*prcm)->cm_l4per_gpio7_clkctrl,
|
||||
(*prcm)->cm_l4per_gpio8_clkctrl,
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
@@ -43,13 +43,15 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
u32 *const omap_si_rev = (u32 *)OMAP_SRAM_SCRATCH_OMAP_REV;
|
||||
|
||||
static struct gpio_bank gpio_bank_54xx[6] = {
|
||||
static struct gpio_bank gpio_bank_54xx[8] = {
|
||||
{ (void *)OMAP54XX_GPIO1_BASE, METHOD_GPIO_24XX },
|
||||
{ (void *)OMAP54XX_GPIO2_BASE, METHOD_GPIO_24XX },
|
||||
{ (void *)OMAP54XX_GPIO3_BASE, METHOD_GPIO_24XX },
|
||||
{ (void *)OMAP54XX_GPIO4_BASE, METHOD_GPIO_24XX },
|
||||
{ (void *)OMAP54XX_GPIO5_BASE, METHOD_GPIO_24XX },
|
||||
{ (void *)OMAP54XX_GPIO6_BASE, METHOD_GPIO_24XX },
|
||||
{ (void *)OMAP54XX_GPIO7_BASE, METHOD_GPIO_24XX },
|
||||
{ (void *)OMAP54XX_GPIO8_BASE, METHOD_GPIO_24XX },
|
||||
};
|
||||
|
||||
const struct gpio_bank *const omap_gpio_bank = gpio_bank_54xx;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
PLATFORM_RELFLAGS += -fno-common -ffixed-r8 -msoft-float
|
||||
|
||||
PLATFORM_CPPFLAGS += -march=armv5te -mtune=xscale
|
||||
PLATFORM_CPPFLAGS += -mcpu=xscale
|
||||
# =========================================================================
|
||||
#
|
||||
# Supply options according to compiler version
|
||||
|
||||
@@ -208,10 +208,9 @@ cpu_init_crit:
|
||||
* disable MMU stuff and caches
|
||||
*/
|
||||
mrc p15, 0, r0, c1, c0, 0
|
||||
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
|
||||
bic r0, r0, #0x00003300 @ clear bits 13:12, 9:8 (--VI --RS)
|
||||
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
|
||||
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
|
||||
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
|
||||
mov pc, lr /* back to my caller */
|
||||
|
||||
@@ -202,6 +202,34 @@
|
||||
interrupts = <0 78 0>;
|
||||
};
|
||||
|
||||
serial@12C00000 {
|
||||
compatible = "samsung,exynos4210-uart";
|
||||
reg = <0x12C00000 0x100>;
|
||||
interrupts = <0 51 0>;
|
||||
id = <0>;
|
||||
};
|
||||
|
||||
serial@12C10000 {
|
||||
compatible = "samsung,exynos4210-uart";
|
||||
reg = <0x12C10000 0x100>;
|
||||
interrupts = <0 52 0>;
|
||||
id = <1>;
|
||||
};
|
||||
|
||||
serial@12C20000 {
|
||||
compatible = "samsung,exynos4210-uart";
|
||||
reg = <0x12C20000 0x100>;
|
||||
interrupts = <0 53 0>;
|
||||
id = <2>;
|
||||
};
|
||||
|
||||
serial@12C30000 {
|
||||
compatible = "samsung,exynos4210-uart";
|
||||
reg = <0x12C30000 0x100>;
|
||||
interrupts = <0 54 0>;
|
||||
id = <3>;
|
||||
};
|
||||
|
||||
gpio: gpio {
|
||||
};
|
||||
};
|
||||
|
||||
@@ -216,4 +216,31 @@
|
||||
clocks = <&tegra_car 15>;
|
||||
status = "disable";
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
compatible = "nvidia,tegra114-ehci";
|
||||
reg = <0x7d000000 0x4000>;
|
||||
interrupts = <52>;
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car 22>; /* PERIPH_ID_USBD */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@7d004000 {
|
||||
compatible = "nvidia,tegra114-ehci";
|
||||
reg = <0x7d004000 0x4000>;
|
||||
interrupts = <53>;
|
||||
phy_type = "hsic";
|
||||
clocks = <&tegra_car 58>; /* PERIPH_ID_USB2 */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
compatible = "nvidia,tegra114-ehci";
|
||||
reg = <0x7d008000 0x4000>;
|
||||
interrupts = <129>;
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car 59>; /* PERIPH_ID_USB3 */
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -216,4 +216,31 @@
|
||||
clocks = <&tegra_car 15>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
compatible = "nvidia,tegra30-ehci";
|
||||
reg = <0x7d000000 0x4000>;
|
||||
interrupts = <52>;
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car 22>; /* PERIPH_ID_USBD */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@7d004000 {
|
||||
compatible = "nvidia,tegra30-ehci";
|
||||
reg = <0x7d004000 0x4000>;
|
||||
interrupts = <53>;
|
||||
phy_type = "hsic";
|
||||
clocks = <&tegra_car 58>; /* PERIPH_ID_USB2 */
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
compatible = "nvidia,tegra30-ehci";
|
||||
reg = <0x7d008000 0x4000>;
|
||||
interrupts = <129>;
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car 59>; /* PERIPH_ID_USB3 */
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -284,7 +284,6 @@ void config_ddr_data(const struct ddr_data *data, int nr);
|
||||
* This structure represents the DDR io control on AM33XX devices.
|
||||
*/
|
||||
struct ddr_cmdtctrl {
|
||||
unsigned int resv1[1];
|
||||
unsigned int cm0ioctl;
|
||||
unsigned int cm1ioctl;
|
||||
unsigned int cm2ioctl;
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
|
||||
#include <asm/omap_gpio.h>
|
||||
|
||||
#define OMAP_MAX_GPIO 128
|
||||
|
||||
#define AM33XX_GPIO0_BASE 0x44E07000
|
||||
#define AM33XX_GPIO1_BASE 0x4804C000
|
||||
#define AM33XX_GPIO2_BASE 0x481AC000
|
||||
|
||||
@@ -40,8 +40,7 @@
|
||||
#define EXYNOS4_WATCHDOG_BASE 0x10060000
|
||||
#define EXYNOS4_TZPC_BASE 0x10110000
|
||||
#define EXYNOS4_MIU_BASE 0x10600000
|
||||
#define EXYNOS4_DMC0_BASE 0x10400000
|
||||
#define EXYNOS4_DMC1_BASE 0x10410000
|
||||
#define EXYNOS4_DMC_CTRL_BASE 0x10400000
|
||||
#define EXYNOS4_GPIO_PART2_BASE 0x11000000
|
||||
#define EXYNOS4_GPIO_PART1_BASE 0x11400000
|
||||
#define EXYNOS4_FIMD_BASE 0x11C00000
|
||||
@@ -64,6 +63,7 @@
|
||||
#define EXYNOS4_DP_BASE DEVICE_NOT_AVAILABLE
|
||||
#define EXYNOS4_SPI_ISP_BASE DEVICE_NOT_AVAILABLE
|
||||
#define EXYNOS4_ACE_SFR_BASE DEVICE_NOT_AVAILABLE
|
||||
#define EXYNOS4_DMC_PHY_BASE DEVICE_NOT_AVAILABLE
|
||||
|
||||
/* EXYNOS4X12 */
|
||||
#define EXYNOS4X12_GPIO_PART3_BASE 0x03860000
|
||||
@@ -76,8 +76,7 @@
|
||||
#define EXYNOS4X12_SYSTIMER_BASE 0x10050000
|
||||
#define EXYNOS4X12_WATCHDOG_BASE 0x10060000
|
||||
#define EXYNOS4X12_TZPC_BASE 0x10110000
|
||||
#define EXYNOS4X12_DMC0_BASE 0x10600000
|
||||
#define EXYNOS4X12_DMC1_BASE 0x10610000
|
||||
#define EXYNOS4X12_DMC_CTRL_BASE 0x10600000
|
||||
#define EXYNOS4X12_GPIO_PART4_BASE 0x106E0000
|
||||
#define EXYNOS4X12_GPIO_PART2_BASE 0x11000000
|
||||
#define EXYNOS4X12_GPIO_PART1_BASE 0x11400000
|
||||
@@ -99,6 +98,7 @@
|
||||
#define EXYNOS4X12_SPI_BASE DEVICE_NOT_AVAILABLE
|
||||
#define EXYNOS4X12_SPI_ISP_BASE DEVICE_NOT_AVAILABLE
|
||||
#define EXYNOS4X12_ACE_SFR_BASE DEVICE_NOT_AVAILABLE
|
||||
#define EXYNOS4X12_DMC_PHY_BASE DEVICE_NOT_AVAILABLE
|
||||
|
||||
/* EXYNOS5 Common*/
|
||||
#define EXYNOS5_I2C_SPACING 0x10000
|
||||
@@ -112,8 +112,7 @@
|
||||
#define EXYNOS5_TZPC_BASE 0x10100000
|
||||
#define EXYNOS5_WATCHDOG_BASE 0x101D0000
|
||||
#define EXYNOS5_ACE_SFR_BASE 0x10830000
|
||||
#define EXYNOS5_DMC_PHY0_BASE 0x10C00000
|
||||
#define EXYNOS5_DMC_PHY1_BASE 0x10C10000
|
||||
#define EXYNOS5_DMC_PHY_BASE 0x10C00000
|
||||
#define EXYNOS5_GPIO_PART3_BASE 0x10D10000
|
||||
#define EXYNOS5_DMC_CTRL_BASE 0x10DD0000
|
||||
#define EXYNOS5_GPIO_PART1_BASE 0x11400000
|
||||
@@ -239,6 +238,8 @@ SAMSUNG_BASE(power, POWER_BASE)
|
||||
SAMSUNG_BASE(spi, SPI_BASE)
|
||||
SAMSUNG_BASE(spi_isp, SPI_ISP_BASE)
|
||||
SAMSUNG_BASE(tzpc, TZPC_BASE)
|
||||
SAMSUNG_BASE(dmc_ctrl, DMC_CTRL_BASE)
|
||||
SAMSUNG_BASE(dmc_phy, DMC_PHY_BASE)
|
||||
#endif
|
||||
|
||||
#endif /* _EXYNOS4_CPU_H */
|
||||
|
||||
@@ -888,4 +888,16 @@ void set_ps_hold_ctrl(void);
|
||||
* source as XXTI
|
||||
*/
|
||||
void set_xclkout(void);
|
||||
|
||||
/*
|
||||
* Read inform1 to get the reset status.
|
||||
* @return: the value can be either S5P_CHECK_SLEEP or
|
||||
* S5P_CHECK_DIDLE or S5P_CHECK_LPA as stored in inform1
|
||||
* if none of these then its normal booting.
|
||||
*/
|
||||
uint32_t get_reset_status(void);
|
||||
|
||||
|
||||
/* Read the resume function and call it */
|
||||
void power_exit_wakeup(void);
|
||||
#endif
|
||||
|
||||
@@ -32,6 +32,7 @@ enum boot_mode {
|
||||
* pin values are the same across Exynos4 and Exynos5.
|
||||
*/
|
||||
BOOT_MODE_MMC = 4,
|
||||
BOOT_MODE_EMMC = 8, /* EMMC4.4 */
|
||||
BOOT_MODE_SERIAL = 20,
|
||||
/* Boot based on Operating Mode pin settings */
|
||||
BOOT_MODE_OM = 32,
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
enum mxc_clock {
|
||||
MXC_ARM_CLK,
|
||||
MXC_I2C_CLK,
|
||||
MXC_UART_CLK,
|
||||
MXC_ESDHC_CLK,
|
||||
MXC_FEC_CLK,
|
||||
|
||||
@@ -364,7 +364,7 @@ struct iomuxc {
|
||||
|
||||
#define IOMUXC_GPR2_MODE_DISABLED 0
|
||||
#define IOMUXC_GPR2_MODE_ENABLED_DI0 1
|
||||
#define IOMUXC_GPR2_MODE_ENABLED_DI1 2
|
||||
#define IOMUXC_GPR2_MODE_ENABLED_DI1 3
|
||||
|
||||
#define IOMUXC_GPR2_LVDS_CH1_MODE_OFFSET 2
|
||||
#define IOMUXC_GPR2_LVDS_CH1_MODE_MASK (3<<IOMUXC_GPR2_LVDS_CH1_MODE_OFFSET)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -40,6 +40,8 @@
|
||||
|
||||
#include <asm/omap_gpio.h>
|
||||
|
||||
#define OMAP_MAX_GPIO 192
|
||||
|
||||
#define OMAP34XX_GPIO1_BASE 0x48310000
|
||||
#define OMAP34XX_GPIO2_BASE 0x49050000
|
||||
#define OMAP34XX_GPIO3_BASE 0x49052000
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
|
||||
#include <asm/omap_gpio.h>
|
||||
|
||||
#define OMAP_MAX_GPIO 192
|
||||
|
||||
#define OMAP44XX_GPIO1_BASE 0x4A310000
|
||||
#define OMAP44XX_GPIO2_BASE 0x48055000
|
||||
#define OMAP44XX_GPIO3_BASE 0x48057000
|
||||
|
||||
@@ -40,11 +40,15 @@
|
||||
|
||||
#include <asm/omap_gpio.h>
|
||||
|
||||
#define OMAP_MAX_GPIO 256
|
||||
|
||||
#define OMAP54XX_GPIO1_BASE 0x4Ae10000
|
||||
#define OMAP54XX_GPIO2_BASE 0x48055000
|
||||
#define OMAP54XX_GPIO3_BASE 0x48057000
|
||||
#define OMAP54XX_GPIO4_BASE 0x48059000
|
||||
#define OMAP54XX_GPIO5_BASE 0x4805B000
|
||||
#define OMAP54XX_GPIO6_BASE 0x4805D000
|
||||
#define OMAP54XX_GPIO7_BASE 0x48051000
|
||||
#define OMAP54XX_GPIO8_BASE 0x48053000
|
||||
|
||||
#endif /* _GPIO_OMAP5_H */
|
||||
|
||||
@@ -225,6 +225,16 @@ enum {
|
||||
IN_408_OUT_9_6_DIVISOR = 83,
|
||||
};
|
||||
|
||||
/* CLK_RST_CONTROLLER_UTMIP_PLL_CFG1_0 */
|
||||
#define PLLU_POWERDOWN (1 << 16)
|
||||
#define PLL_ENABLE_POWERDOWN (1 << 14)
|
||||
#define PLL_ACTIVE_POWERDOWN (1 << 12)
|
||||
|
||||
/* CLK_RST_CONTROLLER_UTMIP_PLL_CFG2_0 */
|
||||
#define UTMIP_FORCE_PD_SAMP_C_POWERDOWN (1 << 4)
|
||||
#define UTMIP_FORCE_PD_SAMP_B_POWERDOWN (1 << 2)
|
||||
#define UTMIP_FORCE_PD_SAMP_A_POWERDOWN (1 << 0)
|
||||
|
||||
/* CLK_RST_CONTROLLER_OSC_CTRL_0 */
|
||||
#define OSC_XOBP_SHIFT 1
|
||||
#define OSC_XOBP_MASK (1U << OSC_XOBP_SHIFT)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
* Copyright (c) 2013 NVIDIA Corporation
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
@@ -22,120 +23,6 @@
|
||||
#ifndef _TEGRA_USB_H_
|
||||
#define _TEGRA_USB_H_
|
||||
|
||||
|
||||
/* USB Controller (USBx_CONTROLLER_) regs */
|
||||
struct usb_ctlr {
|
||||
/* 0x000 */
|
||||
uint id;
|
||||
uint reserved0;
|
||||
uint host;
|
||||
uint device;
|
||||
|
||||
/* 0x010 */
|
||||
uint txbuf;
|
||||
uint rxbuf;
|
||||
uint reserved1[2];
|
||||
|
||||
/* 0x020 */
|
||||
uint reserved2[56];
|
||||
|
||||
/* 0x100 */
|
||||
u16 cap_length;
|
||||
u16 hci_version;
|
||||
uint hcs_params;
|
||||
uint hcc_params;
|
||||
uint reserved3[5];
|
||||
|
||||
/* 0x120 */
|
||||
uint dci_version;
|
||||
uint dcc_params;
|
||||
uint reserved4[6];
|
||||
|
||||
/* 0x140 */
|
||||
uint usb_cmd;
|
||||
uint usb_sts;
|
||||
uint usb_intr;
|
||||
uint frindex;
|
||||
|
||||
/* 0x150 */
|
||||
uint reserved5;
|
||||
uint periodic_list_base;
|
||||
uint async_list_addr;
|
||||
uint async_tt_sts;
|
||||
|
||||
/* 0x160 */
|
||||
uint burst_size;
|
||||
uint tx_fill_tuning;
|
||||
uint reserved6; /* is this port_sc1 on some controllers? */
|
||||
uint icusb_ctrl;
|
||||
|
||||
/* 0x170 */
|
||||
uint ulpi_viewport;
|
||||
uint reserved7;
|
||||
uint endpt_nak;
|
||||
uint endpt_nak_enable;
|
||||
|
||||
/* 0x180 */
|
||||
uint reserved;
|
||||
uint port_sc1;
|
||||
uint reserved8[6];
|
||||
|
||||
/* 0x1a0 */
|
||||
uint reserved9;
|
||||
uint otgsc;
|
||||
uint usb_mode;
|
||||
uint endpt_setup_stat;
|
||||
|
||||
/* 0x1b0 */
|
||||
uint reserved10[20];
|
||||
|
||||
/* 0x200 */
|
||||
uint reserved11[0x80];
|
||||
|
||||
/* 0x400 */
|
||||
uint susp_ctrl;
|
||||
uint phy_vbus_sensors;
|
||||
uint phy_vbus_wakeup_id;
|
||||
uint phy_alt_vbus_sys;
|
||||
|
||||
/* 0x410 */
|
||||
uint usb1_legacy_ctrl;
|
||||
uint reserved12[4];
|
||||
|
||||
/* 0x424 */
|
||||
uint ulpi_timing_ctrl_0;
|
||||
uint ulpi_timing_ctrl_1;
|
||||
uint reserved13[53];
|
||||
|
||||
/* 0x500 */
|
||||
uint reserved14[64 * 3];
|
||||
|
||||
/* 0x800 */
|
||||
uint utmip_pll_cfg0;
|
||||
uint utmip_pll_cfg1;
|
||||
uint utmip_xcvr_cfg0;
|
||||
uint utmip_bias_cfg0;
|
||||
|
||||
/* 0x810 */
|
||||
uint utmip_hsrx_cfg0;
|
||||
uint utmip_hsrx_cfg1;
|
||||
uint utmip_fslsrx_cfg0;
|
||||
uint utmip_fslsrx_cfg1;
|
||||
|
||||
/* 0x820 */
|
||||
uint utmip_tx_cfg0;
|
||||
uint utmip_misc_cfg0;
|
||||
uint utmip_misc_cfg1;
|
||||
uint utmip_debounce_cfg0;
|
||||
|
||||
/* 0x830 */
|
||||
uint utmip_bat_chrg_cfg0;
|
||||
uint utmip_spare_cfg0;
|
||||
uint utmip_xcvr_cfg1;
|
||||
uint utmip_bias_cfg1;
|
||||
};
|
||||
|
||||
|
||||
/* USB1_LEGACY_CTRL */
|
||||
#define USB1_NO_LEGACY_MODE 1
|
||||
|
||||
@@ -146,25 +33,18 @@ struct usb_ctlr {
|
||||
#define VBUS_SENSE_CTL_AB_SESS_VLD 2
|
||||
#define VBUS_SENSE_CTL_A_SESS_VLD 3
|
||||
|
||||
/* USB2_IF_ULPI_TIMING_CTRL_0 */
|
||||
#define ULPI_OUTPUT_PINMUX_BYP (1 << 10)
|
||||
#define ULPI_CLKOUT_PINMUX_BYP (1 << 11)
|
||||
|
||||
/* USB2_IF_ULPI_TIMING_CTRL_1 */
|
||||
#define ULPI_DATA_TRIMMER_LOAD (1 << 0)
|
||||
#define ULPI_DATA_TRIMMER_SEL(x) (((x) & 0x7) << 1)
|
||||
#define ULPI_STPDIRNXT_TRIMMER_LOAD (1 << 16)
|
||||
#define ULPI_STPDIRNXT_TRIMMER_SEL(x) (((x) & 0x7) << 17)
|
||||
#define ULPI_DIR_TRIMMER_LOAD (1 << 24)
|
||||
#define ULPI_DIR_TRIMMER_SEL(x) (((x) & 0x7) << 25)
|
||||
|
||||
/* USBx_IF_USB_SUSP_CTRL_0 */
|
||||
#define ULPI_PHY_ENB (1 << 13)
|
||||
#define UTMIP_PHY_ENB (1 << 12)
|
||||
#define UTMIP_RESET (1 << 11)
|
||||
#define USB_PHY_CLK_VALID (1 << 7)
|
||||
#define USB_SUSP_CLR (1 << 5)
|
||||
|
||||
/* USB2_IF_USB_SUSP_CTRL_0 */
|
||||
#define ULPI_PHY_ENB (1 << 13)
|
||||
|
||||
/* USBx_UTMIP_MISC_CFG0 */
|
||||
#define UTMIP_SUSPEND_EXIT_ON_EDGE (1 << 22)
|
||||
|
||||
/* USBx_UTMIP_MISC_CFG1 */
|
||||
#define UTMIP_PLLU_STABLE_COUNT_SHIFT 6
|
||||
#define UTMIP_PLLU_STABLE_COUNT_MASK \
|
||||
@@ -177,15 +57,28 @@ struct usb_ctlr {
|
||||
/* USBx_UTMIP_PLL_CFG1_0 */
|
||||
#define UTMIP_PLLU_ENABLE_DLY_COUNT_SHIFT 27
|
||||
#define UTMIP_PLLU_ENABLE_DLY_COUNT_MASK \
|
||||
(0xf << UTMIP_PLLU_ENABLE_DLY_COUNT_SHIFT)
|
||||
(0x1f << UTMIP_PLLU_ENABLE_DLY_COUNT_SHIFT)
|
||||
#define UTMIP_XTAL_FREQ_COUNT_SHIFT 0
|
||||
#define UTMIP_XTAL_FREQ_COUNT_MASK 0xfff
|
||||
|
||||
/* USBx_UTMIP_BIAS_CFG0_0 */
|
||||
#define UTMIP_HSDISCON_LEVEL_MSB (1 << 24)
|
||||
#define UTMIP_OTGPD (1 << 11)
|
||||
#define UTMIP_BIASPD (1 << 10)
|
||||
#define UTMIP_HSDISCON_LEVEL_SHIFT 2
|
||||
#define UTMIP_HSDISCON_LEVEL_MASK \
|
||||
(0x3 << UTMIP_HSDISCON_LEVEL_SHIFT)
|
||||
#define UTMIP_HSSQUELCH_LEVEL_SHIFT 0
|
||||
#define UTMIP_HSSQUELCH_LEVEL_MASK \
|
||||
(0x3 << UTMIP_HSSQUELCH_LEVEL_SHIFT)
|
||||
|
||||
/* USBx_UTMIP_BIAS_CFG1_0 */
|
||||
#define UTMIP_FORCE_PDTRK_POWERDOWN 1
|
||||
#define UTMIP_BIAS_PDTRK_COUNT_SHIFT 3
|
||||
#define UTMIP_BIAS_PDTRK_COUNT_MASK \
|
||||
(0x1f << UTMIP_BIAS_PDTRK_COUNT_SHIFT)
|
||||
|
||||
/* USBx_UTMIP_DEBOUNCE_CFG0_0 */
|
||||
#define UTMIP_DEBOUNCE_CFG0_SHIFT 0
|
||||
#define UTMIP_DEBOUNCE_CFG0_MASK 0xffff
|
||||
|
||||
@@ -195,9 +88,6 @@ struct usb_ctlr {
|
||||
/* USBx_UTMIP_BAT_CHRG_CFG0_0 */
|
||||
#define UTMIP_PD_CHRG 1
|
||||
|
||||
/* USBx_UTMIP_XCVR_CFG0_0 */
|
||||
#define UTMIP_XCVR_LSBIAS_SE (1 << 21)
|
||||
|
||||
/* USBx_UTMIP_SPARE_CFG0_0 */
|
||||
#define FUSE_SETUP_SEL (1 << 3)
|
||||
|
||||
@@ -208,23 +98,26 @@ struct usb_ctlr {
|
||||
#define UTMIP_ELASTIC_LIMIT_MASK \
|
||||
(0x1f << UTMIP_ELASTIC_LIMIT_SHIFT)
|
||||
|
||||
/* USBx_UTMIP_HSRX_CFG0_1 */
|
||||
/* USBx_UTMIP_HSRX_CFG1_0 */
|
||||
#define UTMIP_HS_SYNC_START_DLY_SHIFT 1
|
||||
#define UTMIP_HS_SYNC_START_DLY_MASK \
|
||||
(0xf << UTMIP_HS_SYNC_START_DLY_SHIFT)
|
||||
(0x1f << UTMIP_HS_SYNC_START_DLY_SHIFT)
|
||||
|
||||
/* USBx_CONTROLLER_2_USB2D_ICUSB_CTRL_0 */
|
||||
#define IC_ENB1 (1 << 3)
|
||||
|
||||
/* SB2_CONTROLLER_2_USB2D_PORTSC1_0 */
|
||||
#define PTS_SHIFT 30
|
||||
#define PTS_MASK (3U << PTS_SHIFT)
|
||||
#define PTS_UTMI 0
|
||||
#define PTS_RESERVED 1
|
||||
#define PTS_ULPI 2
|
||||
#define PTS_ICUSB_SER 3
|
||||
/* PORTSC1, USB1, defined for Tegra20 */
|
||||
#define PTS1_SHIFT 31
|
||||
#define PTS1_MASK (1 << PTS1_SHIFT)
|
||||
#define STS1 (1 << 30)
|
||||
|
||||
#define STS (1 << 29)
|
||||
#define PTS_UTMI 0
|
||||
#define PTS_RESERVED 1
|
||||
#define PTS_ULPI 2
|
||||
#define PTS_ICUSB_SER 3
|
||||
#define PTS_HSIC 4
|
||||
|
||||
/* SB2_CONTROLLER_2_USB2D_PORTSC1_0 */
|
||||
#define WKOC (1 << 22)
|
||||
#define WKDS (1 << 21)
|
||||
#define WKCN (1 << 20)
|
||||
@@ -233,8 +126,19 @@ struct usb_ctlr {
|
||||
#define UTMIP_FORCE_PD_POWERDOWN (1 << 14)
|
||||
#define UTMIP_FORCE_PD2_POWERDOWN (1 << 16)
|
||||
#define UTMIP_FORCE_PDZI_POWERDOWN (1 << 18)
|
||||
#define UTMIP_XCVR_LSBIAS_SE (1 << 21)
|
||||
#define UTMIP_XCVR_HSSLEW_MSB_SHIFT 25
|
||||
#define UTMIP_XCVR_HSSLEW_MSB_MASK \
|
||||
(0x7f << UTMIP_XCVR_HSSLEW_MSB_SHIFT)
|
||||
#define UTMIP_XCVR_SETUP_MSB_SHIFT 22
|
||||
#define UTMIP_XCVR_SETUP_MSB_MASK (0x7 << UTMIP_XCVR_SETUP_MSB_SHIFT)
|
||||
#define UTMIP_XCVR_SETUP_SHIFT 0
|
||||
#define UTMIP_XCVR_SETUP_MASK (0xf << UTMIP_XCVR_SETUP_SHIFT)
|
||||
|
||||
/* USBx_UTMIP_XCVR_CFG1_0 */
|
||||
#define UTMIP_XCVR_TERM_RANGE_ADJ_SHIFT 18
|
||||
#define UTMIP_XCVR_TERM_RANGE_ADJ_MASK \
|
||||
(0xf << UTMIP_XCVR_TERM_RANGE_ADJ_SHIFT)
|
||||
#define UTMIP_FORCE_PDDISC_POWERDOWN (1 << 0)
|
||||
#define UTMIP_FORCE_PDCHRP_POWERDOWN (1 << 2)
|
||||
#define UTMIP_FORCE_PDDR_POWERDOWN (1 << 4)
|
||||
|
||||
156
arch/arm/include/asm/arch-tegra114/usb.h
Normal file
156
arch/arm/include/asm/arch-tegra114/usb.h
Normal file
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
* Copyright (c) 2013 NVIDIA Corporation
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _TEGRA114_USB_H_
|
||||
#define _TEGRA114_USB_H_
|
||||
|
||||
/* USB Controller (USBx_CONTROLLER_) regs */
|
||||
struct usb_ctlr {
|
||||
/* 0x000 */
|
||||
uint id;
|
||||
uint reserved0;
|
||||
uint host;
|
||||
uint device;
|
||||
|
||||
/* 0x010 */
|
||||
uint txbuf;
|
||||
uint rxbuf;
|
||||
uint reserved1[2];
|
||||
|
||||
/* 0x020 */
|
||||
uint reserved2[56];
|
||||
|
||||
/* 0x100 */
|
||||
u16 cap_length;
|
||||
u16 hci_version;
|
||||
uint hcs_params;
|
||||
uint hcc_params;
|
||||
uint reserved3[5];
|
||||
|
||||
/* 0x120 */
|
||||
uint dci_version;
|
||||
uint dcc_params;
|
||||
uint reserved4[2];
|
||||
|
||||
/* 0x130 */
|
||||
uint usb_cmd;
|
||||
uint usb_sts;
|
||||
uint usb_intr;
|
||||
uint frindex;
|
||||
|
||||
/* 0x140 */
|
||||
uint reserved5;
|
||||
uint periodic_list_base;
|
||||
uint async_list_addr;
|
||||
uint reserved5_1;
|
||||
|
||||
/* 0x150 */
|
||||
uint burst_size;
|
||||
uint tx_fill_tuning;
|
||||
uint reserved6;
|
||||
uint icusb_ctrl;
|
||||
|
||||
/* 0x160 */
|
||||
uint ulpi_viewport;
|
||||
uint reserved7[3];
|
||||
|
||||
/* 0x170 */
|
||||
uint reserved;
|
||||
uint port_sc1;
|
||||
uint reserved8[6];
|
||||
|
||||
/* 0x190 */
|
||||
uint reserved9[8];
|
||||
|
||||
/* 0x1b0 */
|
||||
uint reserved10;
|
||||
uint hostpc1_devlc;
|
||||
uint reserved10_1[2];
|
||||
|
||||
/* 0x1c0 */
|
||||
uint reserved10_2[4];
|
||||
|
||||
/* 0x1d0 */
|
||||
uint reserved10_3[4];
|
||||
|
||||
/* 0x1e0 */
|
||||
uint reserved10_4[4];
|
||||
|
||||
/* 0x1f0 */
|
||||
uint reserved10_5;
|
||||
uint otgsc;
|
||||
uint usb_mode;
|
||||
uint reserved10_6;
|
||||
|
||||
/* 0x200 */
|
||||
uint endpt_nak;
|
||||
uint endpt_nak_enable;
|
||||
uint endpt_setup_stat;
|
||||
uint reserved11_1[0x7D];
|
||||
|
||||
/* 0x400 */
|
||||
uint susp_ctrl;
|
||||
uint phy_vbus_sensors;
|
||||
uint phy_vbus_wakeup_id;
|
||||
uint phy_alt_vbus_sys;
|
||||
|
||||
/* 0x410 */
|
||||
uint usb1_legacy_ctrl;
|
||||
uint reserved12[3];
|
||||
|
||||
/* 0x420 */
|
||||
uint reserved13[56];
|
||||
|
||||
/* 0x500 */
|
||||
uint reserved14[64 * 3];
|
||||
|
||||
/* 0x800 */
|
||||
uint utmip_pll_cfg0;
|
||||
uint utmip_pll_cfg1;
|
||||
uint utmip_xcvr_cfg0;
|
||||
uint utmip_bias_cfg0;
|
||||
|
||||
/* 0x810 */
|
||||
uint utmip_hsrx_cfg0;
|
||||
uint utmip_hsrx_cfg1;
|
||||
uint utmip_fslsrx_cfg0;
|
||||
uint utmip_fslsrx_cfg1;
|
||||
|
||||
/* 0x820 */
|
||||
uint utmip_tx_cfg0;
|
||||
uint utmip_misc_cfg0;
|
||||
uint utmip_misc_cfg1;
|
||||
uint utmip_debounce_cfg0;
|
||||
|
||||
/* 0x830 */
|
||||
uint utmip_bat_chrg_cfg0;
|
||||
uint utmip_spare_cfg0;
|
||||
uint utmip_xcvr_cfg1;
|
||||
uint utmip_bias_cfg1;
|
||||
};
|
||||
|
||||
/* USB2D_HOSTPC1_DEVLC_0 */
|
||||
#define PTS_SHIFT 29
|
||||
#define PTS_MASK (0x7U << PTS_SHIFT)
|
||||
|
||||
#define STS (1 << 28)
|
||||
#endif /* _TEGRA114_USB_H_ */
|
||||
155
arch/arm/include/asm/arch-tegra20/usb.h
Normal file
155
arch/arm/include/asm/arch-tegra20/usb.h
Normal file
@@ -0,0 +1,155 @@
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
* Copyright (c) 2013 NVIDIA Corporation
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _TEGRA20_USB_H_
|
||||
#define _TEGRA20_USB_H_
|
||||
|
||||
/* USB Controller (USBx_CONTROLLER_) regs */
|
||||
struct usb_ctlr {
|
||||
/* 0x000 */
|
||||
uint id;
|
||||
uint reserved0;
|
||||
uint host;
|
||||
uint device;
|
||||
|
||||
/* 0x010 */
|
||||
uint txbuf;
|
||||
uint rxbuf;
|
||||
uint reserved1[2];
|
||||
|
||||
/* 0x020 */
|
||||
uint reserved2[56];
|
||||
|
||||
/* 0x100 */
|
||||
u16 cap_length;
|
||||
u16 hci_version;
|
||||
uint hcs_params;
|
||||
uint hcc_params;
|
||||
uint reserved3[5];
|
||||
|
||||
/* 0x120 */
|
||||
uint dci_version;
|
||||
uint dcc_params;
|
||||
uint reserved4[6];
|
||||
|
||||
/* 0x140 */
|
||||
uint usb_cmd;
|
||||
uint usb_sts;
|
||||
uint usb_intr;
|
||||
uint frindex;
|
||||
|
||||
/* 0x150 */
|
||||
uint reserved5;
|
||||
uint periodic_list_base;
|
||||
uint async_list_addr;
|
||||
uint async_tt_sts;
|
||||
|
||||
/* 0x160 */
|
||||
uint burst_size;
|
||||
uint tx_fill_tuning;
|
||||
uint reserved6; /* is this port_sc1 on some controllers? */
|
||||
uint icusb_ctrl;
|
||||
|
||||
/* 0x170 */
|
||||
uint ulpi_viewport;
|
||||
uint reserved7;
|
||||
uint endpt_nak;
|
||||
uint endpt_nak_enable;
|
||||
|
||||
/* 0x180 */
|
||||
uint reserved;
|
||||
uint port_sc1;
|
||||
uint reserved8[6];
|
||||
|
||||
/* 0x1a0 */
|
||||
uint reserved9;
|
||||
uint otgsc;
|
||||
uint usb_mode;
|
||||
uint endpt_setup_stat;
|
||||
|
||||
/* 0x1b0 */
|
||||
uint reserved10[20];
|
||||
|
||||
/* 0x200 */
|
||||
uint reserved11[0x80];
|
||||
|
||||
/* 0x400 */
|
||||
uint susp_ctrl;
|
||||
uint phy_vbus_sensors;
|
||||
uint phy_vbus_wakeup_id;
|
||||
uint phy_alt_vbus_sys;
|
||||
|
||||
/* 0x410 */
|
||||
uint usb1_legacy_ctrl;
|
||||
uint reserved12[4];
|
||||
|
||||
/* 0x424 */
|
||||
uint ulpi_timing_ctrl_0;
|
||||
uint ulpi_timing_ctrl_1;
|
||||
uint reserved13[53];
|
||||
|
||||
/* 0x500 */
|
||||
uint reserved14[64 * 3];
|
||||
|
||||
/* 0x800 */
|
||||
uint utmip_pll_cfg0;
|
||||
uint utmip_pll_cfg1;
|
||||
uint utmip_xcvr_cfg0;
|
||||
uint utmip_bias_cfg0;
|
||||
|
||||
/* 0x810 */
|
||||
uint utmip_hsrx_cfg0;
|
||||
uint utmip_hsrx_cfg1;
|
||||
uint utmip_fslsrx_cfg0;
|
||||
uint utmip_fslsrx_cfg1;
|
||||
|
||||
/* 0x820 */
|
||||
uint utmip_tx_cfg0;
|
||||
uint utmip_misc_cfg0;
|
||||
uint utmip_misc_cfg1;
|
||||
uint utmip_debounce_cfg0;
|
||||
|
||||
/* 0x830 */
|
||||
uint utmip_bat_chrg_cfg0;
|
||||
uint utmip_spare_cfg0;
|
||||
uint utmip_xcvr_cfg1;
|
||||
uint utmip_bias_cfg1;
|
||||
};
|
||||
|
||||
/* USB2_IF_ULPI_TIMING_CTRL_0 */
|
||||
#define ULPI_OUTPUT_PINMUX_BYP (1 << 10)
|
||||
#define ULPI_CLKOUT_PINMUX_BYP (1 << 11)
|
||||
|
||||
/* USB2_IF_ULPI_TIMING_CTRL_1 */
|
||||
#define ULPI_DATA_TRIMMER_LOAD (1 << 0)
|
||||
#define ULPI_DATA_TRIMMER_SEL(x) (((x) & 0x7) << 1)
|
||||
#define ULPI_STPDIRNXT_TRIMMER_LOAD (1 << 16)
|
||||
#define ULPI_STPDIRNXT_TRIMMER_SEL(x) (((x) & 0x7) << 17)
|
||||
#define ULPI_DIR_TRIMMER_LOAD (1 << 24)
|
||||
#define ULPI_DIR_TRIMMER_SEL(x) (((x) & 0x7) << 25)
|
||||
|
||||
/* PORTSC, USB2, USB3 */
|
||||
#define PTS_SHIFT 30
|
||||
#define PTS_MASK (3U << PTS_SHIFT)
|
||||
|
||||
#define STS (1 << 29)
|
||||
#endif /* _TEGRA20_USB_H_ */
|
||||
168
arch/arm/include/asm/arch-tegra30/usb.h
Normal file
168
arch/arm/include/asm/arch-tegra30/usb.h
Normal file
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
* Copyright (c) 2011 The Chromium OS Authors.
|
||||
* Copyright (c) 2013 NVIDIA Corporation
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _TEGRA30_USB_H_
|
||||
#define _TEGRA30_USB_H_
|
||||
|
||||
/* USB Controller (USBx_CONTROLLER_) regs */
|
||||
struct usb_ctlr {
|
||||
/* 0x000 */
|
||||
uint id;
|
||||
uint reserved0;
|
||||
uint host;
|
||||
uint device;
|
||||
|
||||
/* 0x010 */
|
||||
uint txbuf;
|
||||
uint rxbuf;
|
||||
uint reserved1[2];
|
||||
|
||||
/* 0x020 */
|
||||
uint reserved2[56];
|
||||
|
||||
/* 0x100 */
|
||||
u16 cap_length;
|
||||
u16 hci_version;
|
||||
uint hcs_params;
|
||||
uint hcc_params;
|
||||
uint reserved3[5];
|
||||
|
||||
/* 0x120 */
|
||||
uint dci_version;
|
||||
uint dcc_params;
|
||||
uint reserved4[2];
|
||||
|
||||
/* 0x130 */
|
||||
uint usb_cmd;
|
||||
uint usb_sts;
|
||||
uint usb_intr;
|
||||
uint frindex;
|
||||
|
||||
/* 0x140 */
|
||||
uint reserved5;
|
||||
uint periodic_list_base;
|
||||
uint async_list_addr;
|
||||
uint reserved5_1;
|
||||
|
||||
/* 0x150 */
|
||||
uint burst_size;
|
||||
uint tx_fill_tuning;
|
||||
uint reserved6;
|
||||
uint icusb_ctrl;
|
||||
|
||||
/* 0x160 */
|
||||
uint ulpi_viewport;
|
||||
uint reserved7[3];
|
||||
|
||||
/* 0x170 */
|
||||
uint reserved;
|
||||
uint port_sc1;
|
||||
uint reserved8[6];
|
||||
|
||||
/* 0x190 */
|
||||
uint reserved9[8];
|
||||
|
||||
/* 0x1b0 */
|
||||
uint reserved10;
|
||||
uint hostpc1_devlc;
|
||||
uint reserved10_1[2];
|
||||
|
||||
/* 0x1c0 */
|
||||
uint reserved10_2[4];
|
||||
|
||||
/* 0x1d0 */
|
||||
uint reserved10_3[4];
|
||||
|
||||
/* 0x1e0 */
|
||||
uint reserved10_4[4];
|
||||
|
||||
/* 0x1f0 */
|
||||
uint reserved10_5;
|
||||
uint otgsc;
|
||||
uint usb_mode;
|
||||
uint reserved10_6;
|
||||
|
||||
/* 0x200 */
|
||||
uint endpt_nak;
|
||||
uint endpt_nak_enable;
|
||||
uint endpt_setup_stat;
|
||||
uint reserved11_1[0x7D];
|
||||
|
||||
/* 0x400 */
|
||||
uint susp_ctrl;
|
||||
uint phy_vbus_sensors;
|
||||
uint phy_vbus_wakeup_id;
|
||||
uint phy_alt_vbus_sys;
|
||||
|
||||
/* 0x410 */
|
||||
uint usb1_legacy_ctrl;
|
||||
uint reserved12[3];
|
||||
|
||||
/* 0x420 */
|
||||
uint reserved13[56];
|
||||
|
||||
/* 0x500 */
|
||||
uint reserved14[64 * 3];
|
||||
|
||||
/* 0x800 */
|
||||
uint utmip_pll_cfg0;
|
||||
uint utmip_pll_cfg1;
|
||||
uint utmip_xcvr_cfg0;
|
||||
uint utmip_bias_cfg0;
|
||||
|
||||
/* 0x810 */
|
||||
uint utmip_hsrx_cfg0;
|
||||
uint utmip_hsrx_cfg1;
|
||||
uint utmip_fslsrx_cfg0;
|
||||
uint utmip_fslsrx_cfg1;
|
||||
|
||||
/* 0x820 */
|
||||
uint utmip_tx_cfg0;
|
||||
uint utmip_misc_cfg0;
|
||||
uint utmip_misc_cfg1;
|
||||
uint utmip_debounce_cfg0;
|
||||
|
||||
/* 0x830 */
|
||||
uint utmip_bat_chrg_cfg0;
|
||||
uint utmip_spare_cfg0;
|
||||
uint utmip_xcvr_cfg1;
|
||||
uint utmip_bias_cfg1;
|
||||
};
|
||||
|
||||
/* USB2_IF_ULPI_TIMING_CTRL_0 */
|
||||
#define ULPI_OUTPUT_PINMUX_BYP (1 << 10)
|
||||
#define ULPI_CLKOUT_PINMUX_BYP (1 << 11)
|
||||
|
||||
/* USB2_IF_ULPI_TIMING_CTRL_1 */
|
||||
#define ULPI_DATA_TRIMMER_LOAD (1 << 0)
|
||||
#define ULPI_DATA_TRIMMER_SEL(x) (((x) & 0x7) << 1)
|
||||
#define ULPI_STPDIRNXT_TRIMMER_LOAD (1 << 16)
|
||||
#define ULPI_STPDIRNXT_TRIMMER_SEL(x) (((x) & 0x7) << 17)
|
||||
#define ULPI_DIR_TRIMMER_LOAD (1 << 24)
|
||||
#define ULPI_DIR_TRIMMER_SEL(x) (((x) & 0x7) << 25)
|
||||
|
||||
/* USB2D_HOSTPC1_DEVLC_0 */
|
||||
#define PTS_SHIFT 29
|
||||
#define PTS_MASK (0x7U << PTS_SHIFT)
|
||||
|
||||
#define STS (1 << 28)
|
||||
#endif /* _TEGRA30_USB_H_ */
|
||||
@@ -45,8 +45,8 @@ COBJS-y += board.o
|
||||
endif
|
||||
COBJS-y += sections.o
|
||||
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_OF_LIBFDT) += bootm-fdt.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-$(CONFIG_SYS_L2_PL310) += cache-pl310.o
|
||||
SOBJS-$(CONFIG_USE_ARCH_MEMSET) += memset.o
|
||||
SOBJS-$(CONFIG_USE_ARCH_MEMCPY) += memcpy.o
|
||||
|
||||
@@ -300,21 +300,23 @@ struct zimage_header {
|
||||
|
||||
#define LINUX_ARM_ZIMAGE_MAGIC 0x016f2818
|
||||
|
||||
int bootz_setup(void *image, void **start, void **end)
|
||||
int bootz_setup(ulong image, ulong *start, ulong *end)
|
||||
{
|
||||
struct zimage_header *zi = (struct zimage_header *)image;
|
||||
struct zimage_header *zi;
|
||||
|
||||
zi = (struct zimage_header *)map_sysmem(image, 0);
|
||||
if (zi->zi_magic != LINUX_ARM_ZIMAGE_MAGIC) {
|
||||
puts("Bad Linux ARM zImage magic!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
*start = (void *)zi->zi_start;
|
||||
*end = (void *)zi->zi_end;
|
||||
*start = zi->zi_start;
|
||||
*end = zi->zi_end;
|
||||
|
||||
debug("Kernel image @ 0x%08x [ 0x%08x - 0x%08x ]\n",
|
||||
(uint32_t)image, (uint32_t)*start, (uint32_t)*end);
|
||||
printf("Kernel image @ %#08lx [ %#08lx - %#08lx ]\n", image, *start,
|
||||
*end);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_CMD_BOOTZ */
|
||||
|
||||
@@ -70,6 +70,15 @@ fixnext:
|
||||
|
||||
relocate_done:
|
||||
|
||||
#ifdef __XSCALE__
|
||||
/*
|
||||
* On xscale, icache must be invalidated and write buffers drained,
|
||||
* even with cache disabled - 4.2.7 of xscale core developer's manual
|
||||
*/
|
||||
mcr p15, 0, r0, c7, c7, 0 /* invalidate icache */
|
||||
mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */
|
||||
#endif
|
||||
|
||||
/* ARMv4- don't know bx lr but the assembler fails to see that */
|
||||
|
||||
#ifdef __ARM_ARCH_4__
|
||||
|
||||
@@ -30,7 +30,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y += memset.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += interrupts.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -187,6 +187,15 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
|
||||
struct tag *params, *params_start;
|
||||
char *commandline = getenv("bootargs");
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*
|
||||
* TODO: Andreas Bießmann <andreas.devel@googlemail.com> refactor the
|
||||
* do_bootm_linux() for avr32
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -42,6 +42,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
|
||||
int (*appl) (char *cmdline);
|
||||
char *cmdline;
|
||||
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += cache.o
|
||||
COBJS-y += interrupts.o
|
||||
COBJS-y += time.o
|
||||
|
||||
@@ -75,6 +75,12 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
|
||||
void (*kernel) (bd_t *, ulong, ulong, ulong, ulong);
|
||||
struct lmb *lmb = &images->lmb;
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += muldi3.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -40,6 +40,12 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
|
||||
char *commandline = getenv("bootargs");
|
||||
ulong rd_data_start, rd_data_end;
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -36,9 +36,9 @@ SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
ifeq ($(CONFIG_QEMU_MIPS),y)
|
||||
COBJS-y += bootm_qemu_mips.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm_qemu_mips.o
|
||||
else
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
endif
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -29,7 +29,8 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(ARCH).o
|
||||
|
||||
OBJS := board.o bootm.o cache.o interrupts.o
|
||||
OBJS := board.o cache.o interrupts.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
|
||||
all: $(LIB)
|
||||
|
||||
|
||||
@@ -58,6 +58,12 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
|
||||
char *commandline = getenv("bootargs");
|
||||
#endif
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y += cache.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += libgcc.o
|
||||
COBJS-y += time.o
|
||||
|
||||
|
||||
@@ -45,6 +45,12 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
|
||||
if (of_flat_tree)
|
||||
initrd_end = (ulong)of_flat_tree;
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += timer.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -41,6 +41,12 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
|
||||
void (*kernel) (unsigned int);
|
||||
ulong rd_data_start, rd_data_end;
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -180,7 +180,9 @@ void cpu_init_early_f(void)
|
||||
|
||||
invalidate_tlb(1);
|
||||
|
||||
#if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_NAND_SPL)
|
||||
#if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && \
|
||||
!(defined(CONFIG_SPL_INIT_MINIMAL) && defined(CONFIG_SPL_BUILD)) && \
|
||||
!defined(CONFIG_NAND_SPL)
|
||||
disable_tlb(CONFIG_SYS_PPC_E500_DEBUG_TLB);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ ifndef CONFIG_SYS_GENERIC_BOARD
|
||||
COBJS-y += board.o
|
||||
endif
|
||||
endif
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += cache.o
|
||||
COBJS-y += extable.o
|
||||
COBJS-y += interrupts.o
|
||||
|
||||
@@ -33,7 +33,7 @@ GLSOBJS += lshrdi3.o
|
||||
GLSOBJS += movmem.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
ifeq ($(CONFIG_SH2),y)
|
||||
COBJS-y += time_sh2.o
|
||||
else
|
||||
|
||||
@@ -79,6 +79,12 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima
|
||||
unsigned long size = images->ep - (unsigned long)param;
|
||||
char *bootargs = getenv("bootargs");
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -27,7 +27,8 @@ LIB = $(obj)lib$(ARCH).o
|
||||
|
||||
SOBJS =
|
||||
|
||||
COBJS = board.o cache.o interrupts.o time.o bootm.o
|
||||
COBJS = board.o cache.o interrupts.o time.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
|
||||
@@ -99,6 +99,12 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t * im
|
||||
void (*kernel) (struct linux_romvec *, void *);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* allow the PREP bootm subcommand, it is required for bootm to work
|
||||
*/
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(ARCH).o
|
||||
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += cmd_boot.o
|
||||
COBJS-y += gcc.o
|
||||
COBJS-y += init_helpers.o
|
||||
|
||||
@@ -48,6 +48,8 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
|
||||
size_t len;
|
||||
#endif
|
||||
|
||||
if (flag & BOOTM_STATE_OS_PREP)
|
||||
return 0;
|
||||
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO))
|
||||
return 1;
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ static void at91sam9n12ek_nand_hw_init(void)
|
||||
/* Configure databus */
|
||||
csa &= ~AT91_MATRIX_NFD0_ON_D16; /* nandflash connect to D0~D15 */
|
||||
/* Configure IO drive */
|
||||
csa &= ~AT91_MATRIX_EBI_EBI_IOSR_NORMAL;
|
||||
csa |= AT91_MATRIX_EBI_EBI_IOSR_NORMAL;
|
||||
|
||||
writel(csa, &matrix->ebicsa);
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ DATA 4, MX6_IOM_DRAM_RAS, 0x00020030
|
||||
DATA 4, MX6_IOM_DRAM_SDCLK_0, 0x00020030
|
||||
DATA 4, MX6_IOM_DRAM_SDCLK_1, 0x00020030
|
||||
|
||||
DATA 4, MX6_IOM_DRAM_RESET, 0x000e0030
|
||||
DATA 4, MX6_IOM_DRAM_RESET, 0x00020030
|
||||
DATA 4, MX6_IOM_DRAM_SDCKE0, 0x00003000
|
||||
DATA 4, MX6_IOM_DRAM_SDCKE1, 0x00003000
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ static inline int splash_load_from_nand(void)
|
||||
}
|
||||
#endif /* CONFIG_CMD_NAND */
|
||||
|
||||
int board_splash_screen_prepare(void)
|
||||
int splash_screen_prepare(void)
|
||||
{
|
||||
char *env_splashimage_value;
|
||||
u32 bmp_load_addr;
|
||||
|
||||
@@ -9,5 +9,5 @@ arch/arm/include/asm/arch-mxs/ - Header files for the Freescale i.MX28
|
||||
board/denx/m28evk/ - M28EVK board specific files
|
||||
include/configs/m28evk.h - M28EVK configuration file
|
||||
|
||||
Follow the instructions from doc/README.mx28_common to generate a bootable SD
|
||||
card or to boot from NAND flash.
|
||||
Follow the instructions from doc/README.mxs to generate a bootable SD card or to
|
||||
boot from NAND flash.
|
||||
@@ -195,7 +195,11 @@ int mac_read_from_eeprom(void)
|
||||
printf("\nEEPROM @ 0x%02x read FAILED!!!\n",
|
||||
CONFIG_SYS_I2C_EEPROM_ADDR);
|
||||
} else {
|
||||
if (crc32(crc, buf, 24) == *(unsigned int *)&buf[24]) {
|
||||
uint32_t crc_buf;
|
||||
|
||||
memcpy(&crc_buf, &buf[24], sizeof(uint32_t));
|
||||
|
||||
if (crc32(crc, buf, 24) == crc_buf) {
|
||||
printf("Reading MAC from EEPROM\n");
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (memcmp(&buf[i * 6], "\0\0\0\0\0\0", 6)) {
|
||||
|
||||
@@ -41,7 +41,6 @@ Note: The mx28evk board does not come with a NAND flash populated from the
|
||||
factory. It comes with an empty slot (U23), which allows the insertion of a
|
||||
48-pin TSOP flash device.
|
||||
|
||||
Follow the instructions from doc/README.mx28_common to generate a bootable SD
|
||||
card.
|
||||
Follow the instructions from doc/README.mxs to generate a bootable SD card.
|
||||
|
||||
Insert the SD card in slot 0, power up the board and U-boot will boot.
|
||||
@@ -23,7 +23,7 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).o
|
||||
|
||||
COBJS := mx6qsabresd.o
|
||||
COBJS := mx6sabresd.o
|
||||
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
@@ -17,12 +17,10 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/imx-regs.h>
|
||||
#include <asm/arch/iomux.h>
|
||||
#include <asm/arch/mx6q_pins.h>
|
||||
#include <asm/arch/mx6-pins.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <asm/imx-common/iomux-v3.h>
|
||||
@@ -291,7 +289,6 @@ int board_late_init(void)
|
||||
|
||||
int checkboard(void)
|
||||
{
|
||||
puts("Board: MX6Q-SabreSD\n");
|
||||
|
||||
puts("Board: MX6-SabreSD\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -33,6 +33,7 @@ COBJS-$(CONFIG_IO) += miiphybb.o
|
||||
COBJS-$(CONFIG_IO64) += miiphybb.o
|
||||
COBJS-$(CONFIG_IOCON) += osd.o
|
||||
COBJS-$(CONFIG_DLVISION_10G) += osd.o
|
||||
COBJS-$(CONFIG_CONTROLCENTERD) += dp501.o
|
||||
|
||||
COBJS := $(COBJS-y)
|
||||
SOBJS =
|
||||
|
||||
107
board/gdsys/common/dp501.c
Normal file
107
board/gdsys/common/dp501.c
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* (C) Copyright 2012
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* Parade Technologies Inc. DP501 DisplayPort DVI/HDMI Transmitter */
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <errno.h>
|
||||
#include <i2c.h>
|
||||
|
||||
static void dp501_setbits(u8 addr, u8 reg, u8 mask)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
val = i2c_reg_read(addr, reg);
|
||||
setbits_8(&val, mask);
|
||||
i2c_reg_write(addr, reg, val);
|
||||
}
|
||||
|
||||
static void dp501_clrbits(u8 addr, u8 reg, u8 mask)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
val = i2c_reg_read(addr, reg);
|
||||
clrbits_8(&val, mask);
|
||||
i2c_reg_write(addr, reg, val);
|
||||
}
|
||||
|
||||
static int dp501_detect_cable_adapter(u8 addr)
|
||||
{
|
||||
u8 val = i2c_reg_read(addr, 0x00);
|
||||
|
||||
return !(val & 0x04);
|
||||
}
|
||||
|
||||
static void dp501_link_training(u8 addr)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
val = i2c_reg_read(addr, 0x51);
|
||||
i2c_reg_write(addr, 0x5d, val); /* set link_bw */
|
||||
val = i2c_reg_read(addr, 0x52);
|
||||
i2c_reg_write(addr, 0x5e, val); /* set lane_cnt */
|
||||
val = i2c_reg_read(addr, 0x53);
|
||||
i2c_reg_write(addr, 0x5c, val); /* set downspread_ctl */
|
||||
|
||||
i2c_reg_write(addr, 0x5f, 0x0d); /* start training */
|
||||
}
|
||||
|
||||
void dp501_powerup(u8 addr)
|
||||
{
|
||||
dp501_clrbits(addr, 0x0a, 0x30); /* power on encoder */
|
||||
i2c_reg_write(addr, 0x27, 0x30); /* Hardware auto detect DVO timing */
|
||||
dp501_setbits(addr, 0x72, 0x80); /* DPCD read enable */
|
||||
dp501_setbits(addr, 0x30, 0x20); /* RS polynomial select */
|
||||
i2c_reg_write(addr, 0x71, 0x20); /* Enable Aux burst write */
|
||||
dp501_setbits(addr, 0x78, 0x30); /* Disable HPD2 IRQ */
|
||||
dp501_clrbits(addr, 0x2f, 0x40); /* Link FIFO reset selection */
|
||||
i2c_reg_write(addr, 0x24, 0xc0); /* SDR mode 0, ext. H/VSYNC */
|
||||
i2c_reg_write(addr + 2, 0x24, 0x02); /* clock input single ended */
|
||||
|
||||
if (dp501_detect_cable_adapter(addr)) {
|
||||
printf("DVI/HDMI cable adapter detected\n");
|
||||
i2c_reg_write(addr, 0x5e, 0x04); /* enable 4 channel */
|
||||
dp501_clrbits(addr, 0x00, 0x08); /* DVI/HDMI HDCP operation */
|
||||
} else {
|
||||
printf("no DVI/HDMI cable adapter detected\n");
|
||||
i2c_reg_write(addr + 2, 0x00, 0x18); /* driving strength */
|
||||
i2c_reg_write(addr + 2, 0x03, 0x06); /* driving strength */
|
||||
i2c_reg_write(addr, 0x2c, 0x00); /* configure N value */
|
||||
i2c_reg_write(addr, 0x2d, 0x00); /* configure N value */
|
||||
i2c_reg_write(addr, 0x2e, 0x0c); /* configure N value */
|
||||
i2c_reg_write(addr, 0x76, 0xff); /* clear all interrupt */
|
||||
dp501_setbits(addr, 0x78, 0x03); /* clear all interrupt */
|
||||
i2c_reg_write(addr, 0x75, 0xf8); /* aux channel reset */
|
||||
i2c_reg_write(addr, 0x75, 0x00); /* clear aux channel reset */
|
||||
i2c_reg_write(addr, 0x87, 0x70); /* set retry counter as 7 */
|
||||
dp501_setbits(addr, 0x00, 0x08); /* for DP HDCP operation */
|
||||
|
||||
dp501_link_training(addr);
|
||||
}
|
||||
}
|
||||
|
||||
void dp501_powerdown(u8 addr)
|
||||
{
|
||||
dp501_setbits(addr, 0x0a, 0x30); /* power down encoder, standby mode */
|
||||
}
|
||||
30
board/gdsys/common/dp501.h
Normal file
30
board/gdsys/common/dp501.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* (C) Copyright 2012
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _DP501_H_
|
||||
#define _DP501_H_
|
||||
|
||||
void dp501_powerup(u8 addr);
|
||||
void dp501_powerdown(u8 addr);
|
||||
|
||||
#endif
|
||||
37
board/gdsys/p1022/Makefile
Normal file
37
board/gdsys/p1022/Makefile
Normal file
@@ -0,0 +1,37 @@
|
||||
#
|
||||
# Copyright 2010 Freescale Semiconductor, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).o
|
||||
|
||||
# COBJS-y += $(BOARD).o
|
||||
COBJS-y += law.o
|
||||
COBJS-y += ddr.o
|
||||
COBJS-y += tlb.o
|
||||
COBJS-y += sdhc_boot.o
|
||||
COBJS-$(CONFIG_CONTROLCENTERD) += controlcenterd.o controlcenterd-id.o
|
||||
|
||||
COBJS-$(CONFIG_FSL_DIU_FB) += diu.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||
|
||||
$(LIB): $(OBJS) $(SOBJS)
|
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
1224
board/gdsys/p1022/controlcenterd-id.c
Normal file
1224
board/gdsys/p1022/controlcenterd-id.c
Normal file
File diff suppressed because it is too large
Load Diff
29
board/gdsys/p1022/controlcenterd-id.h
Normal file
29
board/gdsys/p1022/controlcenterd-id.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* (C) Copyright 2013
|
||||
* Reinhard Pfau, Guntermann & Drunck GmbH, reinhard.pfau@gdsys.cc
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __CONTROLCENTER_ID_H
|
||||
#define __CONTROLCENTER_ID_H
|
||||
|
||||
int ccdm_compute_self_hash(void);
|
||||
int startup_ccdm_id_module(void);
|
||||
|
||||
int show_self_hash(void);
|
||||
|
||||
#endif /* __CONTROLCENTER_ID_H */
|
||||
425
board/gdsys/p1022/controlcenterd.c
Normal file
425
board/gdsys/p1022/controlcenterd.c
Normal file
@@ -0,0 +1,425 @@
|
||||
/*
|
||||
* (C) Copyright 2013
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
|
||||
*
|
||||
* 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 <common.h>
|
||||
#include <command.h>
|
||||
#include <pci.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/immap_85xx.h>
|
||||
#include <asm/fsl_pci.h>
|
||||
#include <asm/fsl_ddr_sdram.h>
|
||||
#include <asm/fsl_serdes.h>
|
||||
#include <asm/io.h>
|
||||
#include <libfdt.h>
|
||||
#include <fdt_support.h>
|
||||
#include <fsl_mdio.h>
|
||||
#include <tsec.h>
|
||||
#include <asm/fsl_law.h>
|
||||
#include <netdev.h>
|
||||
#include <i2c.h>
|
||||
#include <pca9698.h>
|
||||
#include <watchdog.h>
|
||||
#include "../common/dp501.h"
|
||||
#include "controlcenterd-id.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
enum {
|
||||
HWVER_100 = 0,
|
||||
HWVER_110 = 1,
|
||||
HWVER_120 = 2,
|
||||
};
|
||||
|
||||
struct ihs_fpga {
|
||||
u32 reflection_low; /* 0x0000 */
|
||||
u32 versions; /* 0x0004 */
|
||||
u32 fpga_version; /* 0x0008 */
|
||||
u32 fpga_features; /* 0x000c */
|
||||
};
|
||||
|
||||
#ifndef CONFIG_TRAILBLAZER
|
||||
static struct pci_device_id hydra_supported[] = {
|
||||
{ 0x6d5e, 0xcdc0 },
|
||||
{}
|
||||
};
|
||||
|
||||
static void hydra_initialize(void);
|
||||
#endif
|
||||
|
||||
int board_early_init_f(void)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
/* Reset eLBC_DIU and SPI_eLBC in case we are booting from SD */
|
||||
clrsetbits_be32(&gur->pmuxcr, 0x00600000, 0x80000000);
|
||||
|
||||
/* Set pmuxcr to allow both i2c1 and i2c2 */
|
||||
setbits_be32(&gur->pmuxcr, 0x00001000);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 3_11-3_13 */
|
||||
setbits_be32(&gur->pmuxcr, 0x00000010);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 2_31,3_9+10 */
|
||||
setbits_be32(&gur->pmuxcr, 0x00000020);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 2_28-2_30 */
|
||||
setbits_be32(&gur->pmuxcr, 0x000000c0);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 3_20-3_22 */
|
||||
setbits_be32(&gur->pmuxcr2, 0x03000000);
|
||||
|
||||
/* Set pmuxcr to enable IRQ0-2 */
|
||||
clrbits_be32(&gur->pmuxcr, 0x00000300);
|
||||
|
||||
/* Set pmuxcr to disable IRQ3-11 */
|
||||
setbits_be32(&gur->pmuxcr, 0x000000F0);
|
||||
|
||||
/* Read back the register to synchronize the write. */
|
||||
in_be32(&gur->pmuxcr);
|
||||
|
||||
/* Set the pin muxing to enable ETSEC2. */
|
||||
clrbits_be32(&gur->pmuxcr2, 0x001F8000);
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
/*
|
||||
* GPIO3_10 SPERRTRIGGER
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00200000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00200000);
|
||||
udelay(100);
|
||||
setbits_be32(&pgpio->gpdat, 0x00200000);
|
||||
udelay(100);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00200000);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* GPIO3_11 CPU-TO-FPGA-RESET#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00100000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00100000);
|
||||
|
||||
/*
|
||||
* GPIO3_21 CPU-STATUS-WATCHDOG-TRIGGER#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00000400);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int checkboard(void)
|
||||
{
|
||||
printf("Board: ControlCenter DIGITAL\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int misc_init_r(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* A list of PCI and SATA slots
|
||||
*/
|
||||
enum slot_id {
|
||||
SLOT_PCIE1 = 1,
|
||||
SLOT_PCIE2,
|
||||
SLOT_PCIE3,
|
||||
SLOT_PCIE4,
|
||||
SLOT_PCIE5,
|
||||
SLOT_SATA1,
|
||||
SLOT_SATA2
|
||||
};
|
||||
|
||||
/*
|
||||
* This array maps the slot identifiers to their names on the P1022DS board.
|
||||
*/
|
||||
static const char * const slot_names[] = {
|
||||
[SLOT_PCIE1] = "Slot 1",
|
||||
[SLOT_PCIE2] = "Slot 2",
|
||||
[SLOT_PCIE3] = "Slot 3",
|
||||
[SLOT_PCIE4] = "Slot 4",
|
||||
[SLOT_PCIE5] = "Mini-PCIe",
|
||||
[SLOT_SATA1] = "SATA 1",
|
||||
[SLOT_SATA2] = "SATA 2",
|
||||
};
|
||||
|
||||
/*
|
||||
* This array maps a given SERDES configuration and SERDES device to the PCI or
|
||||
* SATA slot that it connects to. This mapping is hard-coded in the FPGA.
|
||||
*/
|
||||
static u8 serdes_dev_slot[][SATA2 + 1] = {
|
||||
[0x01] = { [PCIE3] = SLOT_PCIE4, [PCIE2] = SLOT_PCIE5 },
|
||||
[0x02] = { [SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x09] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE4,
|
||||
[PCIE2] = SLOT_PCIE5 },
|
||||
[0x16] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE2,
|
||||
[PCIE2] = SLOT_PCIE3,
|
||||
[SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x17] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE2,
|
||||
[PCIE2] = SLOT_PCIE3 },
|
||||
[0x1a] = { [PCIE1] = SLOT_PCIE1, [PCIE2] = SLOT_PCIE3,
|
||||
[PCIE2] = SLOT_PCIE3,
|
||||
[SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x1c] = { [PCIE1] = SLOT_PCIE1,
|
||||
[SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x1e] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE3 },
|
||||
[0x1f] = { [PCIE1] = SLOT_PCIE1 },
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Returns the name of the slot to which the PCIe or SATA controller is
|
||||
* connected
|
||||
*/
|
||||
const char *board_serdes_name(enum srds_prtcl device)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
|
||||
u32 pordevsr = in_be32(&gur->pordevsr);
|
||||
unsigned int srds_cfg = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >>
|
||||
MPC85xx_PORDEVSR_IO_SEL_SHIFT;
|
||||
enum slot_id slot = serdes_dev_slot[srds_cfg][device];
|
||||
const char *name = slot_names[slot];
|
||||
|
||||
if (name)
|
||||
return name;
|
||||
else
|
||||
return "Nothing";
|
||||
}
|
||||
|
||||
void hw_watchdog_reset(void)
|
||||
{
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
clrbits_be32(&pgpio->gpdat, 0x00000400);
|
||||
setbits_be32(&pgpio->gpdat, 0x00000400);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
int do_bootd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int rcode = 0;
|
||||
|
||||
if (run_command(getenv("bootcmd"), flag) < 0)
|
||||
rcode = 1;
|
||||
return rcode;
|
||||
}
|
||||
|
||||
int board_early_init_r(void)
|
||||
{
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
/*
|
||||
* GPIO3_12 PPC_SYSTEMREADY#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00080000);
|
||||
setbits_be32(&pgpio->gpodr, 0x00080000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00080000);
|
||||
|
||||
return ccdm_compute_self_hash();
|
||||
}
|
||||
|
||||
int last_stage_init(void)
|
||||
{
|
||||
startup_ccdm_id_module();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
void pci_init_board(void)
|
||||
{
|
||||
fsl_pcie_init_board(0);
|
||||
|
||||
hydra_initialize();
|
||||
}
|
||||
|
||||
int board_early_init_r(void)
|
||||
{
|
||||
unsigned int k = 0;
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
/* wait for FPGA configuration to finish */
|
||||
while (!pca9698_get_value(0x22, 11) && (k++ < 30))
|
||||
udelay(100000);
|
||||
|
||||
if (k > 30) {
|
||||
puts("FPGA configuration timed out.\n");
|
||||
} else {
|
||||
/* clear FPGA reset */
|
||||
udelay(1000);
|
||||
setbits_be32(&pgpio->gpdat, 0x00100000);
|
||||
}
|
||||
|
||||
/* give time for PCIe link training */
|
||||
udelay(100000);
|
||||
|
||||
/*
|
||||
* GPIO3_12 PPC_SYSTEMREADY#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00080000);
|
||||
setbits_be32(&pgpio->gpodr, 0x00080000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00080000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int last_stage_init(void)
|
||||
{
|
||||
/* Turn on Parade DP501 */
|
||||
pca9698_direction_output(0x22, 7, 1);
|
||||
udelay(500000);
|
||||
|
||||
dp501_powerup(0x08);
|
||||
|
||||
startup_ccdm_id_module();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize on-board and/or PCI Ethernet devices
|
||||
*
|
||||
* Returns:
|
||||
* <0, error
|
||||
* 0, no ethernet devices found
|
||||
* >0, number of ethernet devices initialized
|
||||
*/
|
||||
int board_eth_init(bd_t *bis)
|
||||
{
|
||||
struct fsl_pq_mdio_info mdio_info;
|
||||
struct tsec_info_struct tsec_info[2];
|
||||
unsigned int num = 0;
|
||||
|
||||
#ifdef CONFIG_TSEC1
|
||||
SET_STD_TSEC_INFO(tsec_info[num], 1);
|
||||
num++;
|
||||
#endif
|
||||
#ifdef CONFIG_TSEC2
|
||||
SET_STD_TSEC_INFO(tsec_info[num], 2);
|
||||
num++;
|
||||
#endif
|
||||
|
||||
mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
|
||||
mdio_info.name = DEFAULT_MII_NAME;
|
||||
fsl_pq_mdio_init(bis, &mdio_info);
|
||||
|
||||
return tsec_eth_init(bis, tsec_info, num) + pci_eth_init(bis);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF_BOARD_SETUP
|
||||
void ft_board_setup(void *blob, bd_t *bd)
|
||||
{
|
||||
phys_addr_t base;
|
||||
phys_size_t size;
|
||||
|
||||
ft_cpu_setup(blob, bd);
|
||||
|
||||
base = getenv_bootm_low();
|
||||
size = getenv_bootm_size();
|
||||
|
||||
fdt_fixup_memory(blob, (u64)base, (u64)size);
|
||||
|
||||
#ifdef CONFIG_HAS_FSL_DR_USB
|
||||
fdt_fixup_dr_usb(blob, bd);
|
||||
#endif
|
||||
|
||||
FT_FSL_PCI_SETUP;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void hydra_initialize(void)
|
||||
{
|
||||
unsigned int i;
|
||||
pci_dev_t devno;
|
||||
|
||||
/* Find and probe all the matching PCI devices */
|
||||
for (i = 0; (devno = pci_find_devices(hydra_supported, i)) >= 0; i++) {
|
||||
u32 val;
|
||||
struct ihs_fpga *fpga;
|
||||
u32 versions;
|
||||
u32 fpga_version;
|
||||
u32 fpga_features;
|
||||
|
||||
unsigned hardware_version;
|
||||
unsigned feature_uart_channels;
|
||||
unsigned feature_sb_channels;
|
||||
|
||||
/* Try to enable I/O accesses and bus-mastering */
|
||||
val = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
|
||||
pci_write_config_dword(devno, PCI_COMMAND, val);
|
||||
|
||||
/* Make sure it worked */
|
||||
pci_read_config_dword(devno, PCI_COMMAND, &val);
|
||||
if (!(val & PCI_COMMAND_MEMORY)) {
|
||||
puts("Can't enable I/O memory\n");
|
||||
continue;
|
||||
}
|
||||
if (!(val & PCI_COMMAND_MASTER)) {
|
||||
puts("Can't enable bus-mastering\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* read FPGA details */
|
||||
fpga = pci_map_bar(devno, PCI_BASE_ADDRESS_0,
|
||||
PCI_REGION_MEM);
|
||||
|
||||
versions = readl(fpga->versions);
|
||||
fpga_version = readl(fpga->fpga_version);
|
||||
fpga_features = readl(fpga->fpga_features);
|
||||
|
||||
hardware_version = versions & 0xf;
|
||||
feature_uart_channels = (fpga_features >> 6) & 0x1f;
|
||||
feature_sb_channels = fpga_features & 0x1f;
|
||||
|
||||
printf("FPGA%d: ", i);
|
||||
|
||||
switch (hardware_version) {
|
||||
case HWVER_100:
|
||||
printf("HW-Ver 1.00\n");
|
||||
break;
|
||||
|
||||
case HWVER_110:
|
||||
printf("HW-Ver 1.10\n");
|
||||
break;
|
||||
|
||||
case HWVER_120:
|
||||
printf("HW-Ver 1.20\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("HW-Ver %d(not supported)\n",
|
||||
hardware_version);
|
||||
break;
|
||||
}
|
||||
|
||||
printf(" FPGA V %d.%02d, features:",
|
||||
fpga_version / 100, fpga_version % 100);
|
||||
|
||||
printf(" %d uart channel(s)", feature_uart_channels);
|
||||
printf(" %d sideband channel(s)\n", feature_sb_channels);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
71
board/gdsys/p1022/ddr.c
Normal file
71
board/gdsys/p1022/ddr.c
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
* Authors: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <i2c.h>
|
||||
|
||||
#include <asm/fsl_ddr_sdram.h>
|
||||
#include <asm/fsl_ddr_dimm_params.h>
|
||||
|
||||
void fsl_ddr_board_options(memctl_options_t *popts, dimm_params_t *pdimm,
|
||||
unsigned int ctrl_num)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (ctrl_num) {
|
||||
printf("Wrong parameter for controller number %d", ctrl_num);
|
||||
return;
|
||||
}
|
||||
if (!pdimm->n_ranks)
|
||||
return;
|
||||
|
||||
/* set odt_rd_cfg and odt_wr_cfg. */
|
||||
for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
|
||||
popts->cs_local_opts[i].odt_rd_cfg = 0;
|
||||
popts->cs_local_opts[i].odt_wr_cfg = 1;
|
||||
}
|
||||
|
||||
popts->clk_adjust = 5;
|
||||
popts->cpo_override = 0x1f;
|
||||
popts->write_data_delay = 2;
|
||||
popts->half_strength_driver_enable = 1;
|
||||
|
||||
/* Per AN4039, enable ZQ calibration. */
|
||||
popts->zq_en = 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPD_EEPROM
|
||||
/*
|
||||
* we only have a "fake" SPD-EEPROM here, which has 16 bit addresses
|
||||
*/
|
||||
void get_spd(generic_spd_eeprom_t *spd, u8 i2c_address)
|
||||
{
|
||||
int ret = i2c_read(i2c_address, 0, 2, (uchar *)spd,
|
||||
sizeof(generic_spd_eeprom_t));
|
||||
|
||||
if (ret) {
|
||||
if (i2c_address ==
|
||||
#ifdef SPD_EEPROM_ADDRESS
|
||||
SPD_EEPROM_ADDRESS
|
||||
#elif defined(SPD_EEPROM_ADDRESS1)
|
||||
SPD_EEPROM_ADDRESS1
|
||||
#endif
|
||||
) {
|
||||
printf("DDR: failed to read SPD from address %u\n",
|
||||
i2c_address);
|
||||
} else {
|
||||
debug("DDR: failed to read SPD from address %u\n",
|
||||
i2c_address);
|
||||
}
|
||||
memset(spd, 0, sizeof(generic_spd_eeprom_t));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
87
board/gdsys/p1022/diu.c
Normal file
87
board/gdsys/p1022/diu.c
Normal file
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright 2010-2011 Freescale Semiconductor, Inc.
|
||||
* Authors: Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* FSL DIU Framebuffer driver
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <asm/io.h>
|
||||
#include <stdio_dev.h>
|
||||
#include <video_fb.h>
|
||||
#include <fsl_diu_fb.h>
|
||||
|
||||
#define PMUXCR_ELBCDIU_MASK 0xc0000000
|
||||
#define PMUXCR_ELBCDIU_NOR16 0x80000000
|
||||
#define PMUXCR_ELBCDIU_DIU 0x40000000
|
||||
|
||||
/*
|
||||
* DIU Area Descriptor
|
||||
*
|
||||
* Note that we need to byte-swap the value before it's written to the AD
|
||||
* register. So even though the registers don't look like they're in the same
|
||||
* bit positions as they are on the MPC8610, the same value is written to the
|
||||
* AD register on the MPC8610 and on the P1022.
|
||||
*/
|
||||
#define AD_BYTE_F 0x10000000
|
||||
#define AD_ALPHA_C_SHIFT 25
|
||||
#define AD_BLUE_C_SHIFT 23
|
||||
#define AD_GREEN_C_SHIFT 21
|
||||
#define AD_RED_C_SHIFT 19
|
||||
#define AD_PIXEL_S_SHIFT 16
|
||||
#define AD_COMP_3_SHIFT 12
|
||||
#define AD_COMP_2_SHIFT 8
|
||||
#define AD_COMP_1_SHIFT 4
|
||||
#define AD_COMP_0_SHIFT 0
|
||||
|
||||
/*
|
||||
* Variables used by the DIU/LBC switching code. It's safe to makes these
|
||||
* global, because the DIU requires DDR, so we'll only run this code after
|
||||
* relocation.
|
||||
*/
|
||||
static u32 pmuxcr;
|
||||
|
||||
void diu_set_pixel_clock(unsigned int pixclock)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
|
||||
unsigned long speed_ccb, temp;
|
||||
u32 pixval;
|
||||
|
||||
speed_ccb = get_bus_freq(0);
|
||||
temp = 1000000000 / pixclock;
|
||||
temp *= 1000;
|
||||
pixval = speed_ccb / temp;
|
||||
debug("DIU pixval = %u\n", pixval);
|
||||
|
||||
/* Modify PXCLK in GUTS CLKDVDR */
|
||||
temp = in_be32(&gur->clkdvdr) & 0x2000FFFF;
|
||||
out_be32(&gur->clkdvdr, temp); /* turn off clock */
|
||||
out_be32(&gur->clkdvdr, temp | 0x80000000 | ((pixval & 0x1F) << 16));
|
||||
}
|
||||
|
||||
int platform_diu_init(unsigned int xres, unsigned int yres, const char *port)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
|
||||
u32 pixel_format;
|
||||
|
||||
pixel_format = cpu_to_le32(AD_BYTE_F | (3 << AD_ALPHA_C_SHIFT) |
|
||||
(0 << AD_BLUE_C_SHIFT) | (1 << AD_GREEN_C_SHIFT) |
|
||||
(2 << AD_RED_C_SHIFT) | (8 << AD_COMP_3_SHIFT) |
|
||||
(8 << AD_COMP_2_SHIFT) | (8 << AD_COMP_1_SHIFT) |
|
||||
(8 << AD_COMP_0_SHIFT) | (3 << AD_PIXEL_S_SHIFT));
|
||||
|
||||
printf("DIU: Switching to %ux%u\n", xres, yres);
|
||||
|
||||
/* Set PMUXCR to switch the muxed pins from the LBC to the DIU */
|
||||
clrsetbits_be32(&gur->pmuxcr, PMUXCR_ELBCDIU_MASK, PMUXCR_ELBCDIU_DIU);
|
||||
pmuxcr = in_be32(&gur->pmuxcr);
|
||||
|
||||
return fsl_diu_init(xres, yres, pixel_format, 0);
|
||||
}
|
||||
20
board/gdsys/p1022/law.c
Normal file
20
board/gdsys/p1022/law.c
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
* Authors: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/fsl_law.h>
|
||||
#include <asm/mmu.h>
|
||||
|
||||
struct law_entry law_table[] = {
|
||||
SET_LAW(CONFIG_SYS_ELBC_BASE_PHYS, LAW_SIZE_1M, LAW_TRGT_IF_LBC),
|
||||
};
|
||||
|
||||
int num_law_entries = ARRAY_SIZE(law_table);
|
||||
63
board/gdsys/p1022/sdhc_boot.c
Normal file
63
board/gdsys/p1022/sdhc_boot.c
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright 2011 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* 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 <common.h>
|
||||
#include <mmc.h>
|
||||
#include <malloc.h>
|
||||
|
||||
/*
|
||||
* The environment variables are written to just after the u-boot image
|
||||
* on SDCard, so we must read the MBR to get the start address and code
|
||||
* length of the u-boot image, then calculate the address of the env.
|
||||
*/
|
||||
#define ESDHC_BOOT_IMAGE_SIZE 0x48
|
||||
#define ESDHC_BOOT_IMAGE_ADDR 0x50
|
||||
|
||||
int mmc_get_env_addr(struct mmc *mmc, u32 *env_addr)
|
||||
{
|
||||
u8 *tmp_buf;
|
||||
u32 blklen, code_offset, code_len, n;
|
||||
|
||||
blklen = mmc->read_bl_len;
|
||||
tmp_buf = malloc(blklen);
|
||||
if (!tmp_buf)
|
||||
return 1;
|
||||
|
||||
/* read out the first block, get the config data information */
|
||||
n = mmc->block_dev.block_read(mmc->block_dev.dev, 0, 1, tmp_buf);
|
||||
if (!n) {
|
||||
free(tmp_buf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Get the Source Address, from offset 0x50 */
|
||||
code_offset = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_ADDR);
|
||||
|
||||
/* Get the code size from offset 0x48 */
|
||||
code_len = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_SIZE);
|
||||
|
||||
*env_addr = code_offset + code_len;
|
||||
|
||||
free(tmp_buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
77
board/gdsys/p1022/tlb.c
Normal file
77
board/gdsys/p1022/tlb.c
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
* Authors: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/mmu.h>
|
||||
|
||||
struct fsl_e_tlb_entry tlb_table[] = {
|
||||
/* TLB 0 - for temp stack in cache */
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR, CONFIG_SYS_INIT_RAM_ADDR,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
|
||||
CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
|
||||
CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
|
||||
CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
|
||||
/* TLB 1 */
|
||||
/* *I*** - Covers boot page */
|
||||
SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I,
|
||||
0, 0, BOOKE_PAGESZ_4K, 1),
|
||||
|
||||
/* *I*G* - CCSRBAR */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 1, BOOKE_PAGESZ_1M, 1),
|
||||
|
||||
/* *I*G* - eLBC */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_ELBC_BASE, CONFIG_SYS_ELBC_BASE_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 2, BOOKE_PAGESZ_1M, 1),
|
||||
|
||||
#if defined(CONFIG_TRAILBLAZER)
|
||||
/* *I*G - L2SRAM */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_INIT_L2_ADDR, CONFIG_SYS_INIT_L2_ADDR_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 9, BOOKE_PAGESZ_256K, 1),
|
||||
#else
|
||||
/* *I*G* - PCI */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 3, BOOKE_PAGESZ_256M, 1),
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x10000000,
|
||||
CONFIG_SYS_PCIE1_MEM_PHYS + 0x10000000,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 4, BOOKE_PAGESZ_256M, 1),
|
||||
|
||||
/* *I*G* - PCI I/O */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_IO_VIRT, CONFIG_SYS_PCIE1_IO_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 5, BOOKE_PAGESZ_256K, 1),
|
||||
|
||||
#ifdef CONFIG_SYS_RAMBOOT
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 6, BOOKE_PAGESZ_1G, 1),
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
int num_tlb_entries = ARRAY_SIZE(tlb_table);
|
||||
@@ -47,6 +47,7 @@
|
||||
#endif
|
||||
#ifdef CONFIG_USB_EHCI_TEGRA
|
||||
#include <asm/arch-tegra/usb.h>
|
||||
#include <asm/arch/usb.h>
|
||||
#endif
|
||||
#ifdef CONFIG_TEGRA_MMC
|
||||
#include <asm/arch-tegra/tegra_mmc.h>
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000400";
|
||||
usb0 = "/usb@7d008000";
|
||||
};
|
||||
|
||||
memory {
|
||||
@@ -61,4 +62,10 @@
|
||||
bus-width = <8>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
/* SPDIF_IN: USB_VBUS_EN1 */
|
||||
nvidia,vbus-gpio = <&gpio 86 0>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -17,6 +17,17 @@
|
||||
reg = <0x00000000 0x40000000>;
|
||||
};
|
||||
|
||||
host1x {
|
||||
status = "okay";
|
||||
dc@54200000 {
|
||||
status = "okay";
|
||||
rgb {
|
||||
status = "okay";
|
||||
nvidia,panel = <&lcd_panel>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
serial@70006300 {
|
||||
clock-frequency = < 216000000 >;
|
||||
};
|
||||
@@ -70,4 +81,25 @@
|
||||
power-gpios = <&gpio 70 0>; /* gpio PI6 */
|
||||
bus-width = <8>;
|
||||
};
|
||||
|
||||
lcd_panel: panel {
|
||||
clock = <42430000>;
|
||||
xres = <1024>;
|
||||
yres = <600>;
|
||||
left-margin = <138>;
|
||||
right-margin = <34>;
|
||||
hsync-len = <136>;
|
||||
lower-margin = <4>;
|
||||
upper-margin = <21>;
|
||||
vsync-len = <4>;
|
||||
hsync-active-high;
|
||||
vsyncx-active-high;
|
||||
nvidia,bits-per-pixel = <16>;
|
||||
nvidia,pwm = <&pwm 0 0>;
|
||||
nvidia,backlight-enable-gpios = <&gpio 13 0>; /* PB5 */
|
||||
nvidia,lvds-shutdown-gpios = <&gpio 10 0>; /* PB2 */
|
||||
nvidia,backlight-vdd-gpios = <&gpio 176 0>; /* PW0 */
|
||||
nvidia,panel-vdd-gpios = <&gpio 22 0>; /* PC6 */
|
||||
nvidia,panel-timings = <0 0 200 0 0>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -16,6 +16,17 @@
|
||||
reg = <0x00000000 0x40000000>;
|
||||
};
|
||||
|
||||
host1x {
|
||||
status = "okay";
|
||||
dc@54200000 {
|
||||
status = "okay";
|
||||
rgb {
|
||||
status = "okay";
|
||||
nvidia,panel = <&lcd_panel>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
serial@70006300 {
|
||||
clock-frequency = < 216000000 >;
|
||||
};
|
||||
@@ -56,4 +67,25 @@
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
};
|
||||
|
||||
lcd_panel: panel {
|
||||
clock = <72072000>;
|
||||
xres = <1366>;
|
||||
yres = <768>;
|
||||
left-margin = <58>;
|
||||
right-margin = <58>;
|
||||
hsync-len = <58>;
|
||||
lower-margin = <4>;
|
||||
upper-margin = <4>;
|
||||
vsync-len = <4>;
|
||||
hsync-active-high;
|
||||
vsync-active-high;
|
||||
nvidia,bits-per-pixel = <16>;
|
||||
nvidia,pwm = <&pwm 2 0>;
|
||||
nvidia,backlight-enable-gpios = <&gpio 28 0>; /* PD4 */
|
||||
nvidia,lvds-shutdown-gpios = <&gpio 10 0>; /* PB2 */
|
||||
nvidia,backlight-vdd-gpios = <&gpio 176 0>; /* PW0 */
|
||||
nvidia,panel-vdd-gpios = <&gpio 22 0>; /* PC6 */
|
||||
nvidia,panel-timings = <0 0 200 0 0>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000000";
|
||||
usb0 = "/usb@7d008000";
|
||||
};
|
||||
|
||||
memory {
|
||||
@@ -68,4 +69,9 @@
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
nvidia,vbus-gpio = <&gpio 236 0>; /* PDD4 */
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000000";
|
||||
usb0 = "/usb@7d008000";
|
||||
};
|
||||
|
||||
memory {
|
||||
@@ -63,4 +64,9 @@
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
nvidia,vbus-gpio = <&gpio 236 0>; /* PDD4 */
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <lcd.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/funcmux.h>
|
||||
@@ -59,3 +60,9 @@ void pin_mux_usb(void)
|
||||
/* USB2 PHY reset GPIO */
|
||||
pinmux_tristate_disable(PINGRP_UAC);
|
||||
}
|
||||
|
||||
void pin_mux_display(void)
|
||||
{
|
||||
pinmux_set_func(PINGRP_SDC, PMUX_FUNC_PWM);
|
||||
pinmux_tristate_disable(PINGRP_SDC);
|
||||
}
|
||||
|
||||
34
board/palmtreo680/Makefile
Normal file
34
board/palmtreo680/Makefile
Normal file
@@ -0,0 +1,34 @@
|
||||
#
|
||||
# Palm Treo680 Support
|
||||
#
|
||||
# Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>
|
||||
#
|
||||
# This file is released under the terms of GPL v2 and any later version.
|
||||
# See the file COPYING in the root directory of the source tree for details.
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).o
|
||||
|
||||
COBJS := palmtreo680.o
|
||||
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS)
|
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS)
|
||||
|
||||
distclean: clean
|
||||
rm -f $(LIB) core *.bak $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
581
board/palmtreo680/README
Normal file
581
board/palmtreo680/README
Normal file
@@ -0,0 +1,581 @@
|
||||
|
||||
README for the Palm Treo 680.
|
||||
|
||||
Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>
|
||||
|
||||
You may reproduce the contents of this file entirely or in part, but please
|
||||
credit me by name if you do. Thanks.
|
||||
|
||||
|
||||
Intro
|
||||
=====
|
||||
|
||||
Yes, you can program u-boot onto the flash of your Palm Treo 680 so that u-boot
|
||||
(then Linux, Android, ...) runs at power-up. This document describes how, and
|
||||
gives some implementation details on this port of u-boot and describes how the
|
||||
Treo 680 boots from reset.
|
||||
|
||||
But first, I probably don't need to tell you that after doing this, your phone
|
||||
will no longer run PalmOS. You *may* be able to later restore your phone to its
|
||||
original state by creating a backup image of the flash before writing u-boot
|
||||
(details below), but this is not heavily tested and should not be relied upon.
|
||||
There is also the possibility that something may go wrong during the process of
|
||||
programming u-boot, leaving you with a bricked phone. If you follow these
|
||||
instructions carefully this chance will be minimized, but I do not recommend
|
||||
that you program u-boot onto a phone that you can not afford to lose, and
|
||||
certainly not one that contains important data that is not backed up elsewhere.
|
||||
I AM NOT RESPONSIBLE FOR THE LOSS OF YOUR PHONE. DO THIS AT YOUR OWN RISK.
|
||||
Having said that, feel free to send me a note cursing me out if something does
|
||||
go wrong, but please tell me what happened exactly. For that matter, I'd love
|
||||
to hear from you if you succeed.
|
||||
|
||||
|
||||
|
||||
Details on the SPL
|
||||
==================
|
||||
|
||||
The docg4 features a 2k region at the start of its address space that interfaces
|
||||
to the system bus like a NOR flash. This allows the docg4 to function as a boot
|
||||
ROM. The Treo 680 uses this feature. The contents of this 2k region are
|
||||
write-protected and can not be reprogrammed. Fortunately, the code it contains
|
||||
does what we need to do, at least partially. After some essential hardware
|
||||
initialization (like the SDRAM controller), it runs an IPL (initial program
|
||||
loader) that copies 128K (no more, no less) from flash to a fixed address in
|
||||
SDRAM (0xa1700000) and jumps to it. 128K is too small for u-boot, so we use it
|
||||
to load a u-boot secondary program loader (SPL). But since our SPL only
|
||||
occupies a little over 1k, we can economize on flash usage by having the IPL
|
||||
load a portion of u-boot proper as well. We let the IPL load the first 128k of
|
||||
a concatenated spl + u-boot image, and because the SPL is placed before u-boot
|
||||
proper, the IPL jumps to the SPL, which copies the portion of u-boot that the
|
||||
IPL has already loaded to its correct SDRAM address, and then loads the
|
||||
remainder of u-boot and jumps to it.
|
||||
|
||||
|
||||
|
||||
The docg4's "reliable mode"
|
||||
===========================
|
||||
|
||||
This is a special mode of operation of the docg4's integrated controller whereby
|
||||
consecutive pairs of 2k regions are used in parallel (in some fashion) to store
|
||||
2k of data. In other words, the normal capacity is halved, but the data
|
||||
integrity is improved. In this mode, the data is read or written from pages in
|
||||
even-numbered 2k regions (regions starting at 0x000, 0x1000, 0x2000, ...). The
|
||||
odd-numbered 2k regions (regions starting at 0x800, 0x1800, 0x2800, ...) are
|
||||
transparently used in parallel. In reliable mode, the odd-numbered 2k regions
|
||||
are not meant to be read or written directly.
|
||||
|
||||
Reliable mode is used by the IPL because there is not enough space in its 2k
|
||||
footprint to implement the BCH ecc algorithm. Data that is read while reliable
|
||||
mode is enabled must have been written in reliable mode, or the read fails.
|
||||
However, data written in reliable mode can also be read in normal mode (just not
|
||||
as reliably), but only from the even-numbered 2k regions; the odd-numbered 2k
|
||||
regions appear to contain junk, and will generate ecc errors. When the IPL and
|
||||
SPL read from flash, the odd-numbered 2k regions are explicitly skipped. The
|
||||
same is true for the flash_u-boot utility when it writes the u-boot image in
|
||||
reliable mode.
|
||||
|
||||
The docg4 Linux driver supports writing in reliable mode (it is enabled by the
|
||||
module parameter), but not reading. However, the u-boot docg4_spl driver does
|
||||
read in reliable mode, in the same fashion as the IPL.
|
||||
|
||||
|
||||
|
||||
Details on the IPL and its data format
|
||||
======================================
|
||||
|
||||
Starting from block 5 and counting upward, the IPL will search for and load the
|
||||
first two blocks it finds that contain a magic number in the oob of the first
|
||||
page of the block. The contents are loaded to SDRAM starting at address
|
||||
0xa1700000. After two blocks have been loaded, it jumps to 0xa1700000. The
|
||||
number of blocks loaded and the load address in SDRAM are hard-coded; only the
|
||||
flash offset of the blocks can vary at run-time (based on the presence of the
|
||||
magic number).
|
||||
|
||||
In addition to using the docg4's reliable mode, the IPL expects each 512 byte
|
||||
page to be written redundantly in the subsequent page. The hardware is capable
|
||||
of detecting bit errors (but not correcting them), and if a bit error is
|
||||
detected when a page is read, the page contents are discarded and the subsequent
|
||||
page is read.
|
||||
|
||||
Reliable mode reduces the capacity of a block by half, and the redundant pages
|
||||
reduce it by half again. As a result, the normal 256k capacity of a block is
|
||||
reduced to 64k for the purposes of the IPL/SPL.
|
||||
|
||||
For the sake of simplicity and uniformity, the u-boot SPL mimics the operation
|
||||
of the IPL, and expects the image to be stored in the same format.
|
||||
|
||||
|
||||
|
||||
Instructions on Programming u-boot to flash
|
||||
===========================================
|
||||
|
||||
To program u-boot to your flash, you will need to boot the Linux kernel on your
|
||||
phone using a PalmOS bootloader such as cocoboot. The details of building and
|
||||
running Linux on your Treo (cross-compiling, creating a root filesystem,
|
||||
configuring the kernel, etc) are beyond the scope of this document. The
|
||||
remainder of this document describes in detail how to program u-boot to the
|
||||
flash using Linux running on the Treo.
|
||||
|
||||
|
||||
|
||||
Hardware Prerequisites
|
||||
======================
|
||||
|
||||
A Palm Treo 680:
|
||||
(dugh)
|
||||
|
||||
A Palm usb cable:
|
||||
You'll need this to establish a usbtty console connection to u-boot from a
|
||||
desktop PC. Currently there is no support in u-boot for the pxa27x keypad
|
||||
(coming soon), so a serial link must be used for the console.
|
||||
These cables are still widely available if you don't already have one.
|
||||
|
||||
A Linux desktop PC.
|
||||
You may be able to use Windows for the u-boot console if you have a usb driver
|
||||
that is compatible with the Linux usbserial driver, but for programming u-boot
|
||||
to flash, you'll really want to use a Linux PC.
|
||||
|
||||
|
||||
|
||||
Treo-side Software Prerequisites
|
||||
================================
|
||||
|
||||
Linux bootloader for PalmOS:
|
||||
|
||||
Cocoboot is the only one I'm aware of. If you don't already have this, you
|
||||
can download it from
|
||||
https://download.enlightenment.org/misc/Illume/Treo-650/2008-11-13/sdcard-base.tar.gz
|
||||
which is a compressed tar archive of the contents of an sd card containing
|
||||
cocoboot. Use mkdosfs to create a fat16 filesystem on the first primary
|
||||
partition of the card, mount the partition, and extract the tar file to it.
|
||||
You will probably need to edit the cocoboot.conf file to customize the
|
||||
parameters passed to the kernel.
|
||||
|
||||
|
||||
|
||||
Linux kernel:
|
||||
|
||||
The kernel on the Treo 680 is still a little rough around the edges, and the
|
||||
official kernel frequently breaks on the Treo :( A development kernel
|
||||
specifically for the Treo 680 can be found on github:
|
||||
http://github.com/mike-dunn/linux-treo680
|
||||
The master branch of this tree has been tested on the Treo, and I recommend
|
||||
using this kernel for programming u-boot. As of this writing, there may be a
|
||||
bug in the docg4 nand flash driver that sometimes causes block erasures to
|
||||
fail. This has been fixed in the above tree.
|
||||
|
||||
If you choose to use the official kernel, it must contain the docg4 driver that
|
||||
includes the reliable_mode module parameter. This was a later enhancement to
|
||||
the driver, and was merged to the kernel as of v3.8. Do not try to use an
|
||||
earlier kernel that contains the docg4 driver without support for writing in
|
||||
reliable mode. If you try to program u-boot to flash with the docg4 driver
|
||||
loaded without the reliable_mode parameter enabled, you *will* brick your
|
||||
phone!
|
||||
|
||||
For the purpose of programming u-boot to flash, the following options must be
|
||||
enabled in the Treo kernel's .config:
|
||||
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_NAND_DOCG4=m
|
||||
|
||||
Note that the docg4 nand driver is configured as a module, because we will
|
||||
want to load and unload it with reliable_mode enabled or disabled as needed.
|
||||
|
||||
You will also need to specify mtd partitions on the kernel command line. In
|
||||
the instructions that follow, we will assume that the flash blocks to which
|
||||
u-boot will be programmed are defined by the second partition on the device.
|
||||
The u-boot config file (include/configs/palmtreo680.h) places the u-boot image
|
||||
at the start of block 6 (offset 0x180000), which is the first writable
|
||||
(non-protected) block on the flash (this is also where the PalmOS SPL starts).
|
||||
The u-boot image occupies four blocks, so to create the u-boot partition, pass
|
||||
this command line to the kernel:
|
||||
mtdparts=Msys_Diskonchip_G4:1536k(protected_part)ro,1024k(bootloader_part),-(filesys_part)
|
||||
This will create three partitions:
|
||||
protected_part: the first six blocks, which are read-only
|
||||
bootloader_part: the next four blocks, for the u-boot image
|
||||
filesys_part: the remainder of the device
|
||||
The mtdchar kernel device driver will use device nodes /dev/mtd0, /dev/mtd1,
|
||||
and /dev/mtd2 for these partitions, respectively. Ensure that your root file
|
||||
system at least has /dev/mtd1 if you are not running udev or mdev.
|
||||
|
||||
|
||||
Userspace Utilities:
|
||||
|
||||
In addition to everything necessary to provide a useful userspace environment
|
||||
(busybox is indispensable, of course), you will need the mtd-utils package on
|
||||
your root filesystem. I use version 1.5.0 of mtd-utils, and I suggest you use
|
||||
this version as well, or at leat a version very close to this one, as
|
||||
mtd-utils has tended to be fluid.
|
||||
|
||||
Note that busybox includes a version of mtd-utils. These are deficient and
|
||||
should not be used. When you run one of these utilities (nanddump, etc),
|
||||
ensure you are invoking the separate executable from mtd-utils, and not the
|
||||
one built into busybox. I recommend that you configure busybox with its
|
||||
mtd-utils disabled to avoid any possibility of confusion.
|
||||
|
||||
You will also need to cross-compile the userspace Linux utility in
|
||||
tools/palmtreo680/flash_u-boot.c, which we will run on the Treo to perform the
|
||||
actual write of the u-boot image to flash. This utility links against libmtd
|
||||
from the mtd-utils package.
|
||||
|
||||
|
||||
|
||||
Desktop PC-side Software Prerequisites
|
||||
======================================
|
||||
|
||||
Terminal emulator application:
|
||||
minicom, kermit, etc.
|
||||
|
||||
|
||||
Linux kernel:
|
||||
Compiled with CONFIG_USB_SERIAL enabled. Build this as a module.
|
||||
|
||||
|
||||
|
||||
Recommended (Not directly related to u-boot)
|
||||
============================================
|
||||
|
||||
Working directly on the Treo's tiny screen and keypad is difficult and
|
||||
error-prone. I recommend that you log into the Linux kernel running on your
|
||||
Treo from your desktop PC using ethernet over usb. The desktop's kernel must be
|
||||
configured with CONFIG_USB_USBNET, CONFIG_USB_NET_CDCETHER, and
|
||||
CONFIG_USB_NET_CDC_SUBSET. The Treo's kernel will need CONFIG_USB_ETH, and its
|
||||
init script will need to start an ssh daemon like dropbear. Note that the usb0
|
||||
network interface will not appear on the desktop PC until the Treo kernel's usb
|
||||
ethernet gadget driver has initialized. You must wait for this to occur (watch
|
||||
the PC's kernel log) before you can assign usb0 an ip address and log in to the
|
||||
Treo. If you also build the Treo's kernel with CONFIG_IP_PNP enabled, you can
|
||||
pass its ip address on the kernel command line, and obviate the need to
|
||||
initialize the network interface in your init script.
|
||||
|
||||
Having the Palm usb cable connected to the host has the added benefit of keeping
|
||||
power supplied to your Treo, reducing the drain on the battery. If something
|
||||
goes wrong while you're programming u-boot to the flash, you will have lots of
|
||||
time to correct it before the battery dies.
|
||||
|
||||
I have encountered a situation where the kernel is sometimes unable to mount a
|
||||
root filesystem on the mmc card due to the mmc controller not initializing in
|
||||
time, (and CONFIG_MMC_UNSAFE_RESUME doesn't seem to help) so I recommend that
|
||||
you build a minimal root filesystem into the kernel using the kernel's initramfs
|
||||
feature (CONFIG_BLK_DEV_INITRD). If you want your root filesystem on the mmc
|
||||
card, your init script can mount and switch_root to the mmc card after a short
|
||||
sleep. But keep in mind that in this case you won't be able to use an mmc card
|
||||
to transfer files between your desktop and the Treo once Linux is running.
|
||||
Another option for transfering files is to mount an nfs filesystem exported by
|
||||
the desktop PC. For greatest convenience, you can export the root filesystem
|
||||
itself from your desktop PC and switch_root to it in your init script. This
|
||||
will work if your initramfs init script contains a loop that waits for you to
|
||||
initialize the usb0 network interface on the desktop PC; e.g., loop while a ping
|
||||
to the desktop PC returns an error. After the loop exits, do the nfs mount and
|
||||
call switch_root. (You can not use the kernel nfsroot feature because the
|
||||
network will not be up when the kernel expects it to be; i.e., not until you
|
||||
configure the usb0 interface on the desktop.) Use the nfs 'nolock' option when
|
||||
mounting to avoid the need to run a portmapper like rpcbind.
|
||||
|
||||
|
||||
|
||||
Preliminaries
|
||||
=============
|
||||
|
||||
Once Linux is running on your Treo, you may want to perform a few sanity checks
|
||||
before programming u-boot. These checks will verify my assumptions regarding
|
||||
all the Treo 680s out there, and also ensure that the flash and mtd-utils are
|
||||
working correctly. If you are impatient and reckless, you may skip this
|
||||
section, but see disclaimer at the top of this file!
|
||||
|
||||
Load the docg4 driver:
|
||||
|
||||
$ modprobe docg4 ignore_badblocks=1 reliable_mode=1
|
||||
|
||||
We tell the driver to use the docg4's "reliable mode" when writing because this
|
||||
is the format required by the IPL, which runs from power-up and loads the first
|
||||
portion of u-boot. We must ignore bad blocks because linux mtd uses out-of-band
|
||||
(oob) bytes to mark bad blocks, which will cause the blocks written by PalmOS to
|
||||
be misidentified as "bad" by libmtd.
|
||||
|
||||
Check the kernel log to ensure that all's well:
|
||||
|
||||
$ dmesg | tail
|
||||
<... snip ...>
|
||||
docg4 docg4: NAND device: 128MiB Diskonchip G4 detected
|
||||
3 cmdlinepart partitions found on MTD device Msys_Diskonchip_G4
|
||||
Creating 3 MTD partitions on "Msys_Diskonchip_G4":
|
||||
0x000000000000-0x000000180000 : "protected_part"
|
||||
0x000000180000-0x000000280000 : "bootloader_part"
|
||||
0x000000280000-0x000008000000 : "filesys_part"
|
||||
|
||||
Ensure that the partition boundaries are as shown. (If no partitions are shown,
|
||||
did you remember to pass them to the kernel on the command line?) We will write
|
||||
u-boot to bootloader_part, which starts at offset 0x180000 (block 6) and spans 4
|
||||
256k blocks. This partition is accessed through the device node /dev/mtd1.
|
||||
|
||||
The docg4 contains a read-only table that identifies blocks that were marked as
|
||||
bad at the factory. This table is in the page at offset 0x2000, which is within
|
||||
the partition protected_part (/dev/mtd0). There is a slight chance that one or
|
||||
more of the four blocks that we will use for u-boot is listed in the table, so
|
||||
use nanddump to inspect the table to see if this is the case:
|
||||
|
||||
$ nanddump -p -l 512 -s 0x2000 -o /dev/mtd0
|
||||
ECC failed: 0
|
||||
ECC corrected: 0
|
||||
Number of bad blocks: 0
|
||||
Number of bbt blocks: 0
|
||||
Block size 262144, page size 512, OOB size 16
|
||||
Dumping data starting at 0x00002000 and ending at 0x00002200...
|
||||
0x00002000: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
|
||||
<... snip ...>
|
||||
|
||||
The format of the table is simple: one bit per block, with block numbers
|
||||
increasing from left to right, starting with block 0 as the most significant bit
|
||||
of the first byte. A bit will be clear if the corresponding block is bad. We
|
||||
want to use blocks 6 throgh 9, so both of the two least significant bits of the
|
||||
first byte must be set, as must the two most significant bits of the second
|
||||
byte. If this is not true in your case (you are very unlucky), you should use
|
||||
the first contiguous set of four good blocks after block 6, and adjust the
|
||||
partition boundaries accordingly. You will also have to change the value of
|
||||
CONFIG_SYS_NAND_U_BOOT_OFFS in include/configs/palmtreo680.h and recompile
|
||||
u-boot. Because the two blocks loaded by the IPL do not have to be contiguous,
|
||||
but our SPL expects them to be, you will need to erase any good blocks that are
|
||||
at an offset prior to CONFIG_SYS_NAND_U_BOOT_OFFS, so that the IPL does not find
|
||||
the magic number in oob and load it. Once you have done all this, the
|
||||
instructions in this file still apply, except that the instructions below for
|
||||
restoring the original PalmOS block contents may need to be modified.
|
||||
|
||||
Next, use nanddump to verify that the PalmOS SPL is where we expect it to be.
|
||||
The SPL can be identified by a magic number in the oob bytes of the first page
|
||||
of each of the two blocks containing the SPL image. Pages are 512 bytes in
|
||||
size, so to dump the first page, plus the oob:
|
||||
|
||||
$ nanddump -p -l 512 -s 0 -o /dev/mtd1
|
||||
ECC failed: 0
|
||||
ECC corrected: 0
|
||||
Number of bad blocks: 0
|
||||
Number of bbt blocks: 0
|
||||
Block size 262144, page size 512, OOB size 16
|
||||
Dumping data starting at 0x00000000 and ending at 0x00000200...
|
||||
0x00000000: 0a 00 00 ea 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
<... snip ...>
|
||||
0x000001f0: 13 4c 21 60 13 4d 2a 69 13 4b 29 69 89 1a 99 42
|
||||
OOB Data: 42 49 50 4f 30 30 30 10 3a e2 00 92 be a0 11 ff
|
||||
|
||||
Verify that the first seven bytes of oob data match those in the above line.
|
||||
(This is ASCII "BIPO000".)
|
||||
|
||||
Do the same for the next block:
|
||||
$ nanddump -p -l 512 -s 0x40000 -o /dev/mtd1
|
||||
|
||||
The first seven oob bytes in last line should read:
|
||||
|
||||
OOB Data: 42 49 50 4f 30 30 31 81 db 8e 8f 46 07 9b 59 ff
|
||||
|
||||
(This is ASCII "BIPO001".)
|
||||
|
||||
For additional assurance, verify that the next block does *not* contain SPL
|
||||
data.
|
||||
|
||||
$ nanddump -p -l 512 -s 0x80000 -o /dev/mtd1
|
||||
|
||||
It doesn't matter what the oob contains, as long as the first four bytes are
|
||||
*not* ASCII "BIPO". PalmOS should only be using two blocks for the SPL
|
||||
(although we will need four for u-boot).
|
||||
|
||||
If you want, you can back up the contents of bootloader_part to a file. You may
|
||||
be able to restore it later, if desired (see "Restoring PalmOS" below).
|
||||
|
||||
$ nanddump -l 0x100000 -s 0 -o -f bootloader_part.orig /dev/mtd1
|
||||
|
||||
nanddump will spew voluminous warnings about uncorrectable ecc errors. This is
|
||||
a consequence of reading pages that were written in reliable mode, and is
|
||||
expected (these should all occur on pages in odd-numbered 2k regions; i.e.,
|
||||
0x800, 0xa00, 0xc00, 0xe00, 0x1800, 0x1a00, ...). The size of the file
|
||||
bootloader_part.orig should be 1081344, which is 2048 pages, each of size 512
|
||||
plus 16 oob bytes. If you are using initramfs for the root filesystem, don't
|
||||
forget to copy the file to permanent storage, such as an mmc card.
|
||||
|
||||
If all of the above went well, you can now program u-boot.
|
||||
|
||||
|
||||
|
||||
Programming u-boot
|
||||
==================
|
||||
|
||||
Our u-boot includes a small SPL that must be prepended to u-boot proper. From
|
||||
the base u-boot source directory on your desktop PC:
|
||||
|
||||
$ cat spl/u-boot-spl.bin u-boot.bin > u-boot-concat.bin
|
||||
|
||||
cd to the tools/palmtreo680/ directory, and cross-compile flash_u-boot.c for the
|
||||
Treo:
|
||||
|
||||
$(CC) -o flash_u-boot $(CFLAGS) $(INCLUDEPATH) $(LIBPATH) flash_u-boot.c -lmtd
|
||||
|
||||
Substitute variable values from your cross-compilation environment as
|
||||
appropriate. Note that it links to libmtd from mtd-utils, and this must be
|
||||
included in $(LIBPATH) and $(INCLUDEPATH).
|
||||
|
||||
Transfer u-boot-concat.bin and the compiled flash_u-boot utility to the Treo's
|
||||
root filesystem. On the Treo, cd to the directory where these files were
|
||||
placed.
|
||||
|
||||
Load the docg4 driver if you have not already done so.
|
||||
|
||||
$ modprobe docg4 ignore_badblocks=1 reliable_mode=1
|
||||
|
||||
Erase the blocks to which we will write u-boot:
|
||||
|
||||
$ flash_erase /dev/mtd1 0x00 4
|
||||
|
||||
If no errors are reported, write u-boot to the flash:
|
||||
|
||||
$ ./flash_u-boot u-boot-concat.bin /dev/mtd1
|
||||
|
||||
You can use nanddump (see above) to verify that the data was written. This
|
||||
time, "BIPO" should be seen in the first four oob bytes of the first page of all
|
||||
four blocks in /dev/mtd1; i.e., at offsets 0x00000, 0x40000, 0x80000, 0xc0000.
|
||||
|
||||
Shutdown linux, remove and re-insert the battery, hold your breath...
|
||||
|
||||
|
||||
|
||||
Enjoying u-boot
|
||||
===============
|
||||
|
||||
After you insert the battery, the u-boot splash screen should appear on the lcd
|
||||
after a few seconds. With the usb cable connecting the Treo to your PC, in the
|
||||
kernel log of your PC you should see
|
||||
|
||||
<6>usb 3-1: New USB device found, idVendor=0525, idProduct=a4a6
|
||||
<6>usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
|
||||
<6>usb 3-1: Product: U-Boot 2013.01-00167-gd62ef56-dirty
|
||||
<6>usb 3-1: Manufacturer: Das U-Boot
|
||||
|
||||
Load the usbserial module on your desktop PC:
|
||||
|
||||
$ modprobe usbserial vendor=0x0525 product=0xa4a6
|
||||
|
||||
and run your favorite terminal emulation utility (minicom, kermit, etc) with the
|
||||
serial device set to /dev/ttyUSB0 (assuming this is your only usb serial
|
||||
device). You should be at the u-boot console (type 'help').
|
||||
|
||||
There is not much that is unique about using u-boot on the palm treo 680.
|
||||
Kernels can be loaded from mmc, flash, and from the desktop PC via kermit. You
|
||||
can expand the size of the second partition on the flash to contain a kernel, or
|
||||
else put the kernel(s) in their own partition.
|
||||
|
||||
Nand commands work as expected, with the excepton that blocks not written by the
|
||||
linux mtd subsystem may be misidentified by the u-boot docg4 driver as "bad" if
|
||||
they contain data in the oob bytes. This will be the case for the blocks
|
||||
containing the u-boot image, for example. To work around this, use 'nand scrub'
|
||||
instead of 'nand erase' to erase these blocks, and 'nand read.raw' to read them
|
||||
to memory. (It would be useful if u-boot's nand commands provided a way to
|
||||
explicitly ignore "bad" blocks, because read.raw does not perform ecc.) The
|
||||
'nand dump' command will read these "bad" blocks, however.
|
||||
|
||||
Currently u-boot itself can only be programmed to flash from Linux; there is no
|
||||
support for reliable mode in u-boot's docg4 flash driver. This should be
|
||||
corrected soon.
|
||||
|
||||
|
||||
|
||||
Customizing
|
||||
===========
|
||||
|
||||
If you change u-boot's configuration significantly (adding or removing
|
||||
features), you may have to adjust the value of CONFIG_SYS_NAND_U_BOOT_SIZE.
|
||||
This is the size of the concatenated spl + u-boot image, and tells the SPL how
|
||||
many flash blocks it needs to load. It will be rounded up to the next 64k
|
||||
boundary (the spl flash block capacity), so it does not have to be exact, but
|
||||
you must ensure that it is not less than the actual image size. If it is larger
|
||||
than the image, blocks may be needlessly loaded, but if too small, u-boot may
|
||||
only be partially loaded, resulting in a boot failure (bricked phone), so better
|
||||
to be too large. The flash_u-boot utility will work with any size image and
|
||||
write the required number of blocks, provided that the partition is large
|
||||
enough.
|
||||
|
||||
As the first writable block on the device, block 6 seems to make the most sense
|
||||
as the flash offset for writing u-boot (and this is where PalmOS places its
|
||||
SPL). But you can place it elsewhere if you like. If you do, you need to
|
||||
adjust CONFIG_SYS_NAND_U_BOOT_OFFS accordingly, and you must ensure that blocks
|
||||
preceeding the ones containing u-boot do *not* have the magic number in oob (the
|
||||
IPL looks for this). In other words, make sure that any blocks that previously
|
||||
contained the u-boot image or PalmOS SPL are erased (and optionally written with
|
||||
something else) so that the IPL does not load it. Also make sure that the new
|
||||
u-boot starting offset is at the start of a flash partition (check the kernel
|
||||
log after loading the docg4 driver), and pass the corresponding mtd device file
|
||||
to the flash_u-boot utility.
|
||||
|
||||
The u-boot built-in default environment is used because a writable environment
|
||||
in flash did not seem worth the cost of a 256k flash block. But adding this
|
||||
should be straightforward.
|
||||
|
||||
|
||||
|
||||
Restoring PalmOS
|
||||
================
|
||||
|
||||
If you backed up the contents of bootloader_part flash partition earlier, you
|
||||
should be able to restore it with the shell script shown below. The first two
|
||||
blocks of data contain the PalmOS SPL and were written in reliable mode, whereas
|
||||
the next two blocks were written in normal mode, so the script has to load and
|
||||
unload the docg4 driver. Make sure that the mtd-utils nandwrite and flash_erase
|
||||
are in your path (and are not those from busybox). Also double-check that the
|
||||
backup image file bootloader_part.orig is exactly 1081344 bytes in length. If
|
||||
not, it was not backed up correctly. Run the script as:
|
||||
|
||||
./restore_bootpart bootloader_part.orig /dev/mtd1
|
||||
|
||||
The script will take a minute or so to run. When it finishes, you may want to
|
||||
verify with nanddump that the data looks correct before you cycle power, because
|
||||
if the backup or restore failed, your phone will be bricked. Note that as a
|
||||
consequence of reliable mode, the odd-numbered 2k regions in the first two
|
||||
blocks will not exactly match the contents of the backup file, (so unfortunately
|
||||
we can't simply dump the flash contents to a file and do a binary diff with the
|
||||
original back-up image to verify that it was restored correctly). Also,
|
||||
nanddump will report uncorrectable ecc errors when it reads those regions.
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "usage: $0: <image file> <mtd device node>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# reliable mode used for the first two blocks
|
||||
modprobe -r docg4
|
||||
modprobe docg4 ignore_badblocks=1 reliable_mode=1 || exit 1
|
||||
|
||||
# erase all four blocks
|
||||
flash_erase $2 0 4
|
||||
|
||||
# Program the first two blocks in reliable mode.
|
||||
# 2k (4 pages) is written at a time, skipping alternate 2k regions
|
||||
# Note that "2k" is 2112 bytes, including 64 oob bytes
|
||||
file_ofs=0
|
||||
flash_ofs=0
|
||||
page=0
|
||||
while [ $page -ne 1024 ]; do
|
||||
dd if=$1 bs=2112 skip=$file_ofs count=1 | nandwrite -o -n -s $flash_ofs $2 - || exit 1
|
||||
file_ofs=$((file_ofs+2))
|
||||
flash_ofs=$((flash_ofs+0x1000))
|
||||
page=$((page+8))
|
||||
done;
|
||||
|
||||
# normal mode used for the next two blocks
|
||||
modprobe -r docg4
|
||||
modprobe docg4 ignore_badblocks=1 || exit 1
|
||||
dd if=$1 bs=1 skip=$file_ofs count=540672 | nandwrite -o -n -s 0x80000 $2 - || exit 1
|
||||
modprobe -r docg4
|
||||
|
||||
|
||||
TODO
|
||||
====
|
||||
|
||||
- Keypad support.
|
||||
- Interactive boot menu using keypad and lcd.
|
||||
- Add reliable mode support to the u-boot docg4 driver.
|
||||
- U-boot command that will write a new image to the bootloader partition in
|
||||
flash.
|
||||
- Linux FTD support.
|
||||
|
||||
148
board/palmtreo680/palmtreo680.c
Normal file
148
board/palmtreo680/palmtreo680.c
Normal file
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Palm Treo 680 Support
|
||||
*
|
||||
* Copyright (C) 2013 Mike Dunn <mikedunn@newsguy.com>
|
||||
*
|
||||
* This file is released under the terms of GPL v2 and any later version.
|
||||
* See the file COPYING in the root directory of the source tree for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <serial.h>
|
||||
#include <nand.h>
|
||||
#include <malloc.h>
|
||||
#include <asm/arch/pxa-regs.h>
|
||||
#include <asm/arch-pxa/pxa.h>
|
||||
#include <asm/arch-pxa/regs-mmc.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/global_data.h>
|
||||
#include <u-boot/crc.h>
|
||||
#include <linux/mtd/docg4.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static struct nand_chip docg4_nand_chip;
|
||||
|
||||
int board_init(void)
|
||||
{
|
||||
/* We have RAM, disable cache */
|
||||
dcache_disable();
|
||||
icache_disable();
|
||||
|
||||
gd->bd->bi_arch_number = CONFIG_MACH_TYPE;
|
||||
gd->bd->bi_boot_params = CONFIG_SYS_DRAM_BASE + 0x100;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dram_init(void)
|
||||
{
|
||||
/* IPL initializes SDRAM (we're already running from it) */
|
||||
gd->ram_size = PHYS_SDRAM_1_SIZE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LCD
|
||||
void lcd_enable(void)
|
||||
{
|
||||
/*
|
||||
* Undo the L_BIAS / gpio77 pin configuration performed by the pxa lcd
|
||||
* driver code. We need it as an output gpio.
|
||||
*/
|
||||
writel((readl(GAFR2_L) & ~(0xc << 24)), GAFR2_L);
|
||||
|
||||
/* power-up and enable the lcd */
|
||||
writel(0x00400000, GPSR(86)); /* enable; drive high */
|
||||
writel(0x00002000, GPSR(77)); /* power; drive high */
|
||||
writel(0x02000000, GPCR(25)); /* enable_n; drive low */
|
||||
|
||||
/* turn on LCD backlight and configure PWM for reasonable brightness */
|
||||
writel(0x00, PWM_CTRL0);
|
||||
writel(0x1b1, PWM_PERVAL0);
|
||||
writel(0xfd, PWM_PWDUTY0);
|
||||
writel(0x00000040, GPSR(38)); /* backlight power on */
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MMC
|
||||
int board_mmc_init(bd_t *bis)
|
||||
{
|
||||
writel(1 << 10, GPSR(42)); /* power on */
|
||||
return pxa_mmc_register(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
void board_nand_init(void)
|
||||
{
|
||||
/* we have one 128M diskonchip G4 */
|
||||
|
||||
struct mtd_info *mtd = &nand_info[0];
|
||||
struct nand_chip *nand = &docg4_nand_chip;
|
||||
if (docg4_nand_init(mtd, nand, 0))
|
||||
hang();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPL_BUILD
|
||||
void nand_boot(void)
|
||||
{
|
||||
__attribute__((noreturn)) void (*uboot)(void);
|
||||
|
||||
extern const void *_start, *_end; /* boundaries of spl in memory */
|
||||
|
||||
/* size of spl; ipl loads this, and then a portion of u-boot */
|
||||
const size_t spl_image_size = ((size_t)&_end - (size_t)&_start);
|
||||
|
||||
/* the flash offset of the blocks that are loaded by the spl */
|
||||
const uint32_t spl_load_offset = CONFIG_SYS_NAND_U_BOOT_OFFS +
|
||||
DOCG4_IPL_LOAD_BLOCK_COUNT * DOCG4_BLOCK_SIZE;
|
||||
|
||||
/* total number of bytes loaded by IPL */
|
||||
const size_t ipl_load_size =
|
||||
DOCG4_IPL_LOAD_BLOCK_COUNT * DOCG4_BLOCK_CAPACITY_SPL;
|
||||
|
||||
/* number of bytes of u-boot proper that was loaded by the IPL */
|
||||
const size_t ipl_uboot_load_size = ipl_load_size - spl_image_size;
|
||||
|
||||
/* number of remaining bytes of u-boot that the SPL must load */
|
||||
const size_t spl_load_size =
|
||||
CONFIG_SYS_NAND_U_BOOT_SIZE - ipl_load_size;
|
||||
|
||||
/* memory address where we resume loading u-boot */
|
||||
void *const load_addr =
|
||||
(void *)(CONFIG_SYS_NAND_U_BOOT_DST + ipl_uboot_load_size);
|
||||
|
||||
/*
|
||||
* Copy the portion of u-boot already read from flash by the IPL to its
|
||||
* correct load address.
|
||||
*/
|
||||
memcpy((void *)CONFIG_SYS_NAND_U_BOOT_DST, &_end, ipl_uboot_load_size);
|
||||
|
||||
/*
|
||||
* Resume loading u-boot where the IPL left off.
|
||||
*/
|
||||
nand_spl_load_image(spl_load_offset, spl_load_size, load_addr);
|
||||
|
||||
#ifdef CONFIG_NAND_ENV_DST
|
||||
nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
|
||||
(void *)CONFIG_NAND_ENV_DST);
|
||||
|
||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||
nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, CONFIG_ENV_SIZE,
|
||||
(void *)CONFIG_NAND_ENV_DST + CONFIG_ENV_SIZE);
|
||||
#endif
|
||||
#endif
|
||||
/*
|
||||
* Jump to U-Boot image
|
||||
*/
|
||||
uboot = (void *)CONFIG_SYS_NAND_U_BOOT_START;
|
||||
(*uboot)();
|
||||
}
|
||||
|
||||
void board_init_f(ulong bootflag)
|
||||
{
|
||||
nand_boot();
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPL_BUILD */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user