mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-19 05:31:32 +00:00
Merge branch 'master' of ssh://mercury/home/wd/git/u-boot/master
This commit is contained in:
commit
8155efbd7a
207 changed files with 8591 additions and 1280 deletions
12
CHANGELOG
12
CHANGELOG
|
@ -7221,7 +7221,7 @@ Date: Mon Mar 3 11:57:23 2008 +0000
|
||||||
Originally pointed out by Laurent Pinchart <laurent.pinchart@tbox.biz>,
|
Originally pointed out by Laurent Pinchart <laurent.pinchart@tbox.biz>,
|
||||||
see http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/22846
|
see http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/22846
|
||||||
|
|
||||||
Signed-off-by: Bernhard Nemec <bnemec <at> ganssloser.com>
|
Signed-off-by: Bernhard Nemec <bnemec@ganssloser.com>
|
||||||
|
|
||||||
commit 84d0c2f1e39caff58bf765a7ab7c72da23c25ec8
|
commit 84d0c2f1e39caff58bf765a7ab7c72da23c25ec8
|
||||||
Author: Kim B. Heino <Kim.Heino@bluegiga.com>
|
Author: Kim B. Heino <Kim.Heino@bluegiga.com>
|
||||||
|
@ -8451,7 +8451,7 @@ Date: Mon Feb 18 14:01:56 2008 -0600
|
||||||
86xx: Convert sbc8641d to use libfdt.
|
86xx: Convert sbc8641d to use libfdt.
|
||||||
|
|
||||||
This is the proper fix for a missing closing brace in the function
|
This is the proper fix for a missing closing brace in the function
|
||||||
ft_cpu_setup() noticed by joe.hamman <at> embeddedspecialties.com.
|
ft_cpu_setup() noticed by joe.hamman@embeddedspecialties.com.
|
||||||
The ft_cpu_setup() function in mpc8641hpcn.c should have been
|
The ft_cpu_setup() function in mpc8641hpcn.c should have been
|
||||||
removed earlier as it was under the obsolete CONFIG_OF_FLAT_TREE,
|
removed earlier as it was under the obsolete CONFIG_OF_FLAT_TREE,
|
||||||
but was missed. Only, the sbc8641d was nominally still using it.
|
but was missed. Only, the sbc8641d was nominally still using it.
|
||||||
|
@ -8846,7 +8846,7 @@ Date: Fri Feb 22 11:40:50 2008 +0000
|
||||||
|
|
||||||
We already have a vendor subdir for Atmel, so we should use it.
|
We already have a vendor subdir for Atmel, so we should use it.
|
||||||
|
|
||||||
Signed-off-by: Haavard Skinnemoen <hskinnemoen <at> atmel.com>
|
Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
|
||||||
|
|
||||||
commit 6d0943a6be99977d6d853d51749e9963d68eb192
|
commit 6d0943a6be99977d6d853d51749e9963d68eb192
|
||||||
Author: Andreas Engel <andreas.engel@ericsson.com>
|
Author: Andreas Engel <andreas.engel@ericsson.com>
|
||||||
|
@ -8896,8 +8896,8 @@ Date: Thu Jan 3 21:15:56 2008 +0000
|
||||||
|
|
||||||
AT91CAP9 support : MACB changes
|
AT91CAP9 support : MACB changes
|
||||||
|
|
||||||
Signed-off-by: Stelian Pop <stelian <at> popies.net>
|
Signed-off-by: Stelian Pop <stelian@popies.net>
|
||||||
Acked-by: Haavard Skinnemoen <hskinnemoen <at> atmel.com>
|
Acked-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
|
||||||
|
|
||||||
commit 6afcabf11d7321850f4feaadfee841488ace54c5
|
commit 6afcabf11d7321850f4feaadfee841488ace54c5
|
||||||
Author: Stelian Pop <stelian@popies.net>
|
Author: Stelian Pop <stelian@popies.net>
|
||||||
|
@ -8913,7 +8913,7 @@ Date: Wed Jan 30 21:15:54 2008 +0000
|
||||||
|
|
||||||
AT91CAP9 support : cpu/ files
|
AT91CAP9 support : cpu/ files
|
||||||
|
|
||||||
Signed-off-by: Stelian Pop <stelian <at> popies.net>
|
Signed-off-by: Stelian Pop <stelian@popies.net>
|
||||||
|
|
||||||
commit fa506a926cec348805143576c941f8e61b333cc0
|
commit fa506a926cec348805143576c941f8e61b333cc0
|
||||||
Author: Stelian Pop <stelian@popies.net>
|
Author: Stelian Pop <stelian@popies.net>
|
||||||
|
|
|
@ -204,6 +204,10 @@ Klaus Heydeck <heydeck@kieback-peter.de>
|
||||||
KUP4K MPC855
|
KUP4K MPC855
|
||||||
KUP4X MPC859
|
KUP4X MPC859
|
||||||
|
|
||||||
|
Gary Jennejohn <garyj@denx.de>
|
||||||
|
|
||||||
|
quad100hd PPC405EP
|
||||||
|
|
||||||
Murray Jensen <Murray.Jensen@csiro.au>
|
Murray Jensen <Murray.Jensen@csiro.au>
|
||||||
|
|
||||||
cogent_mpc8xx MPC8xx
|
cogent_mpc8xx MPC8xx
|
||||||
|
@ -538,6 +542,9 @@ Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
|
||||||
at91cap9adk ARM926EJS (AT91CAP9 SoC)
|
at91cap9adk ARM926EJS (AT91CAP9 SoC)
|
||||||
at91sam9260ek ARM926EJS (AT91SAM9260 SoC)
|
at91sam9260ek ARM926EJS (AT91SAM9260 SoC)
|
||||||
|
at91sam9261ek ARM926EJS (AT91SAM9261 SoC)
|
||||||
|
at91sam9263ek ARM926EJS (AT91SAM9263 SoC)
|
||||||
|
at91sam9rlek ARM926EJS (AT91SAM9RL SoC)
|
||||||
|
|
||||||
Stefan Roese <sr@denx.de>
|
Stefan Roese <sr@denx.de>
|
||||||
|
|
||||||
|
@ -695,6 +702,7 @@ Haavard Skinnemoen <hskinnemoen@atmel.com>
|
||||||
ATSTK1002 AT32AP7000
|
ATSTK1002 AT32AP7000
|
||||||
ATSTK1003 AT32AP7001
|
ATSTK1003 AT32AP7001
|
||||||
ATSTK1004 AT32AP7002
|
ATSTK1004 AT32AP7002
|
||||||
|
ATSTK1006 AT32AP7000
|
||||||
ATNGW100 AT32AP7000
|
ATNGW100 AT32AP7000
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
|
25
MAKEALL
25
MAKEALL
|
@ -219,6 +219,7 @@ LIST_4xx=" \
|
||||||
PMC405 \
|
PMC405 \
|
||||||
PMC440 \
|
PMC440 \
|
||||||
PPChameleonEVB \
|
PPChameleonEVB \
|
||||||
|
quad100hd \
|
||||||
rainier \
|
rainier \
|
||||||
sbc405 \
|
sbc405 \
|
||||||
sc3 \
|
sc3 \
|
||||||
|
@ -461,6 +462,9 @@ LIST_ARM9=" \
|
||||||
at91cap9adk \
|
at91cap9adk \
|
||||||
at91rm9200dk \
|
at91rm9200dk \
|
||||||
at91sam9260ek \
|
at91sam9260ek \
|
||||||
|
at91sam9261ek \
|
||||||
|
at91sam9263ek \
|
||||||
|
at91sam9rlek \
|
||||||
cmc_pu2 \
|
cmc_pu2 \
|
||||||
ap920t \
|
ap920t \
|
||||||
ap922_XA10 \
|
ap922_XA10 \
|
||||||
|
@ -520,6 +524,24 @@ LIST_ARM11=" \
|
||||||
mx31ads \
|
mx31ads \
|
||||||
"
|
"
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
## AT91 Systems
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
LIST_at91=" \
|
||||||
|
at91cap9adk \
|
||||||
|
at91rm9200dk \
|
||||||
|
at91sam9260ek \
|
||||||
|
at91sam9261ek \
|
||||||
|
at91sam9263ek \
|
||||||
|
at91sam9rlek \
|
||||||
|
cmc_pu2 \
|
||||||
|
csb637 \
|
||||||
|
kb9202 \
|
||||||
|
mp2usb \
|
||||||
|
m501sk \
|
||||||
|
"
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
## Xscale Systems
|
## Xscale Systems
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
@ -697,6 +719,7 @@ LIST_avr32=" \
|
||||||
atstk1002 \
|
atstk1002 \
|
||||||
atstk1003 \
|
atstk1003 \
|
||||||
atstk1004 \
|
atstk1004 \
|
||||||
|
atstk1006 \
|
||||||
atngw100 \
|
atngw100 \
|
||||||
"
|
"
|
||||||
|
|
||||||
|
@ -765,7 +788,7 @@ build_target() {
|
||||||
for arg in $@
|
for arg in $@
|
||||||
do
|
do
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
arm|SA|ARM7|ARM9|ARM10|ARM11|ixp|pxa \
|
arm|SA|ARM7|ARM9|ARM10|ARM11|at91|ixp|pxa \
|
||||||
|avr32 \
|
|avr32 \
|
||||||
|blackfin \
|
|blackfin \
|
||||||
|coldfire \
|
|coldfire \
|
||||||
|
|
17
Makefile
17
Makefile
|
@ -224,6 +224,7 @@ LIBS += drivers/mtd/libmtd.a
|
||||||
LIBS += drivers/mtd/nand/libnand.a
|
LIBS += drivers/mtd/nand/libnand.a
|
||||||
LIBS += drivers/mtd/nand_legacy/libnand_legacy.a
|
LIBS += drivers/mtd/nand_legacy/libnand_legacy.a
|
||||||
LIBS += drivers/mtd/onenand/libonenand.a
|
LIBS += drivers/mtd/onenand/libonenand.a
|
||||||
|
LIBS += drivers/mtd/spi/libspi_flash.a
|
||||||
LIBS += drivers/net/libnet.a
|
LIBS += drivers/net/libnet.a
|
||||||
LIBS += drivers/net/sk98lin/libsk98lin.a
|
LIBS += drivers/net/sk98lin/libsk98lin.a
|
||||||
LIBS += drivers/pci/libpci.a
|
LIBS += drivers/pci/libpci.a
|
||||||
|
@ -390,6 +391,7 @@ TAG_SUBDIRS += drivers/mtd
|
||||||
TAG_SUBDIRS += drivers/mtd/nand
|
TAG_SUBDIRS += drivers/mtd/nand
|
||||||
TAG_SUBDIRS += drivers/mtd/nand_legacy
|
TAG_SUBDIRS += drivers/mtd/nand_legacy
|
||||||
TAG_SUBDIRS += drivers/mtd/onenand
|
TAG_SUBDIRS += drivers/mtd/onenand
|
||||||
|
TAG_SUBDIRS += drivers/mtd/spi
|
||||||
TAG_SUBDIRS += drivers/net
|
TAG_SUBDIRS += drivers/net
|
||||||
TAG_SUBDIRS += drivers/net/sk98lin
|
TAG_SUBDIRS += drivers/net/sk98lin
|
||||||
TAG_SUBDIRS += drivers/pci
|
TAG_SUBDIRS += drivers/pci
|
||||||
|
@ -1391,6 +1393,9 @@ PPChameleonEVB_HI_33_config: unconfig
|
||||||
}
|
}
|
||||||
@$(MKCONFIG) -a $(call xtract_4xx,$@) ppc ppc4xx PPChameleonEVB dave
|
@$(MKCONFIG) -a $(call xtract_4xx,$@) ppc ppc4xx PPChameleonEVB dave
|
||||||
|
|
||||||
|
quad100hd_config: unconfig
|
||||||
|
@$(MKCONFIG) $(@:_config=) ppc ppc4xx quad100hd
|
||||||
|
|
||||||
sbc405_config: unconfig
|
sbc405_config: unconfig
|
||||||
@$(MKCONFIG) $(@:_config=) ppc ppc4xx sbc405
|
@$(MKCONFIG) $(@:_config=) ppc ppc4xx sbc405
|
||||||
|
|
||||||
|
@ -2335,6 +2340,15 @@ shannon_config : unconfig
|
||||||
at91rm9200dk_config : unconfig
|
at91rm9200dk_config : unconfig
|
||||||
@$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk atmel at91rm9200
|
@$(MKCONFIG) $(@:_config=) arm arm920t at91rm9200dk atmel at91rm9200
|
||||||
|
|
||||||
|
at91sam9261ek_config : unconfig
|
||||||
|
@$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9261ek atmel at91sam9
|
||||||
|
|
||||||
|
at91sam9263ek_config : unconfig
|
||||||
|
@$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9263ek atmel at91sam9
|
||||||
|
|
||||||
|
at91sam9rlek_config : unconfig
|
||||||
|
@$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9rlek atmel at91sam9
|
||||||
|
|
||||||
cmc_pu2_config : unconfig
|
cmc_pu2_config : unconfig
|
||||||
@$(MKCONFIG) $(@:_config=) arm arm920t cmc_pu2 NULL at91rm9200
|
@$(MKCONFIG) $(@:_config=) arm arm920t cmc_pu2 NULL at91rm9200
|
||||||
|
|
||||||
|
@ -2879,6 +2893,9 @@ atstk1003_config : unconfig
|
||||||
atstk1004_config : unconfig
|
atstk1004_config : unconfig
|
||||||
@$(MKCONFIG) $(@:_config=) avr32 at32ap atstk1000 atmel at32ap700x
|
@$(MKCONFIG) $(@:_config=) avr32 at32ap atstk1000 atmel at32ap700x
|
||||||
|
|
||||||
|
atstk1006_config : unconfig
|
||||||
|
@$(MKCONFIG) $(@:_config=) avr32 at32ap atstk1000 atmel at32ap700x
|
||||||
|
|
||||||
atngw100_config : unconfig
|
atngw100_config : unconfig
|
||||||
@$(MKCONFIG) $(@:_config=) avr32 at32ap atngw100 atmel at32ap700x
|
@$(MKCONFIG) $(@:_config=) avr32 at32ap atngw100 atmel at32ap700x
|
||||||
|
|
||||||
|
|
4
README
4
README
|
@ -961,6 +961,10 @@ The following options need to be configured:
|
||||||
display); also select one of the supported displays
|
display); also select one of the supported displays
|
||||||
by defining one of these:
|
by defining one of these:
|
||||||
|
|
||||||
|
CONFIG_ATMEL_LCD:
|
||||||
|
|
||||||
|
HITACHI TX09D70VM1CCA, 3.5", 240x320.
|
||||||
|
|
||||||
CONFIG_NEC_NL6448AC33:
|
CONFIG_NEC_NL6448AC33:
|
||||||
|
|
||||||
NEC NL6448AC33-18. Active, color, single scan.
|
NEC NL6448AC33-18. Active, color, single scan.
|
||||||
|
|
|
@ -165,16 +165,20 @@ unsigned char spi_read(void)
|
||||||
return (unsigned char)gpio_read_in_bit(SPI_DIN_GPIO15);
|
return (unsigned char)gpio_read_in_bit(SPI_DIN_GPIO15);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taihu_spi_chipsel(int cs)
|
int spi_cs_is_valid(unsigned int bus, unsigned int cs)
|
||||||
{
|
{
|
||||||
gpio_write_bit(SPI_CS_GPIO0, cs);
|
return bus == 0 && cs == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spi_chipsel_type spi_chipsel[]= {
|
void spi_cs_activate(struct spi_slave *slave)
|
||||||
taihu_spi_chipsel
|
{
|
||||||
};
|
gpio_write_bit(SPI_CS_GPIO0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]);
|
void spi_cs_deactivate(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
gpio_write_bit(SPI_CS_GPIO0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
static unsigned char int_lines[32] = {
|
static unsigned char int_lines[32] = {
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
# (C) Copyright 2003-2008
|
# (C) Copyright 2003-2008
|
||||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
#
|
#
|
||||||
|
# (C) Copyright 2008
|
||||||
|
# Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
# Lead Tech Design <www.leadtechdesign.com>
|
||||||
|
#
|
||||||
# See file CREDITS for list of people who contributed to this
|
# See file CREDITS for list of people who contributed to this
|
||||||
# project.
|
# project.
|
||||||
#
|
#
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#include <asm/arch/at91_rstc.h>
|
#include <asm/arch/at91_rstc.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/io.h>
|
#include <asm/arch/io.h>
|
||||||
|
#include <lcd.h>
|
||||||
|
#include <atmel_lcdc.h>
|
||||||
#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB)
|
#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB)
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -70,6 +72,33 @@ static void at91cap9_serial_hw_init(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void at91cap9_slowclock_hw_init(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* On AT91CAP9 revC CPUs, the slow clock can be based on an
|
||||||
|
* internal impreciseRC oscillator or an external 32kHz oscillator.
|
||||||
|
* Switch to the latter.
|
||||||
|
*/
|
||||||
|
#define ARCH_ID_AT91CAP9_REVB 0x399
|
||||||
|
#define ARCH_ID_AT91CAP9_REVC 0x601
|
||||||
|
if (at91_sys_read(AT91_PMC_VER) == ARCH_ID_AT91CAP9_REVC) {
|
||||||
|
unsigned i, tmp = at91_sys_read(AT91_SCKCR);
|
||||||
|
if ((tmp & AT91CAP9_SCKCR_OSCSEL) == AT91CAP9_SCKCR_OSCSEL_RC) {
|
||||||
|
extern void timer_init(void);
|
||||||
|
timer_init();
|
||||||
|
tmp |= AT91CAP9_SCKCR_OSC32EN;
|
||||||
|
at91_sys_write(AT91_SCKCR, tmp);
|
||||||
|
for (i = 0; i < 1200; i++)
|
||||||
|
udelay(1000);
|
||||||
|
tmp |= AT91CAP9_SCKCR_OSCSEL_32;
|
||||||
|
at91_sys_write(AT91_SCKCR, tmp);
|
||||||
|
udelay(200);
|
||||||
|
tmp &= ~AT91CAP9_SCKCR_RCEN;
|
||||||
|
at91_sys_write(AT91_SCKCR, tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void at91cap9_nor_hw_init(void)
|
static void at91cap9_nor_hw_init(void)
|
||||||
{
|
{
|
||||||
unsigned long csa;
|
unsigned long csa;
|
||||||
|
@ -116,7 +145,12 @@ static void at91cap9_nand_hw_init(void)
|
||||||
at91_sys_write(AT91_SMC_MODE(3),
|
at91_sys_write(AT91_SMC_MODE(3),
|
||||||
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
||||||
AT91_SMC_EXNWMODE_DISABLE |
|
AT91_SMC_EXNWMODE_DISABLE |
|
||||||
AT91_SMC_DBW_8 | AT91_SMC_TDF_(1));
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
AT91_SMC_DBW_16 |
|
||||||
|
#else /* CFG_NAND_DBW_8 */
|
||||||
|
AT91_SMC_DBW_8 |
|
||||||
|
#endif
|
||||||
|
AT91_SMC_TDF_(1));
|
||||||
|
|
||||||
at91_sys_write(AT91_PMC_PCER, 1 << AT91CAP9_ID_PIOABCD);
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91CAP9_ID_PIOABCD);
|
||||||
|
|
||||||
|
@ -228,6 +262,65 @@ static void at91cap9_uhp_hw_init(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
vidinfo_t panel_info = {
|
||||||
|
vl_col: 240,
|
||||||
|
vl_row: 320,
|
||||||
|
vl_clk: 4965000,
|
||||||
|
vl_sync: ATMEL_LCDC_INVLINE_INVERTED |
|
||||||
|
ATMEL_LCDC_INVFRAME_INVERTED,
|
||||||
|
vl_bpix: 3,
|
||||||
|
vl_tft: 1,
|
||||||
|
vl_hsync_len: 5,
|
||||||
|
vl_left_margin: 1,
|
||||||
|
vl_right_margin:33,
|
||||||
|
vl_vsync_len: 1,
|
||||||
|
vl_upper_margin:1,
|
||||||
|
vl_lower_margin:0,
|
||||||
|
mmio: AT91CAP9_LCDC_BASE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void lcd_enable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PC0, 0); /* power up */
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_disable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PC0, 1); /* power down */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void at91cap9_lcd_hw_init(void)
|
||||||
|
{
|
||||||
|
at91_set_A_periph(AT91_PIN_PC1, 0); /* LCDHSYNC */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC2, 0); /* LCDDOTCK */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDDEN */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB9, 0); /* LCDCC */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDD2 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDD3 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC8, 0); /* LCDD4 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC9, 0); /* LCDD5 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC10, 0); /* LCDD6 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC11, 0); /* LCDD7 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC14, 0); /* LCDD10 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC15, 0); /* LCDD11 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC16, 0); /* LCDD12 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC17, 0); /* LCDD13 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC18, 0); /* LCDD14 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC19, 0); /* LCDD15 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC22, 0); /* LCDD18 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC23, 0); /* LCDD19 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC24, 0); /* LCDD20 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC25, 0); /* LCDD21 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC26, 0); /* LCDD22 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC27, 0); /* LCDD23 */
|
||||||
|
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91CAP9_ID_LCDC);
|
||||||
|
|
||||||
|
gd->fb_base = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int board_init(void)
|
int board_init(void)
|
||||||
{
|
{
|
||||||
/* Enable Ctrlc */
|
/* Enable Ctrlc */
|
||||||
|
@ -239,6 +332,7 @@ int board_init(void)
|
||||||
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
|
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
|
||||||
|
|
||||||
at91cap9_serial_hw_init();
|
at91cap9_serial_hw_init();
|
||||||
|
at91cap9_slowclock_hw_init();
|
||||||
at91cap9_nor_hw_init();
|
at91cap9_nor_hw_init();
|
||||||
#ifdef CONFIG_CMD_NAND
|
#ifdef CONFIG_CMD_NAND
|
||||||
at91cap9_nand_hw_init();
|
at91cap9_nand_hw_init();
|
||||||
|
@ -252,7 +346,9 @@ int board_init(void)
|
||||||
#ifdef CONFIG_USB_OHCI_NEW
|
#ifdef CONFIG_USB_OHCI_NEW
|
||||||
at91cap9_uhp_hw_init();
|
at91cap9_uhp_hw_init();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
at91cap9_lcd_hw_init();
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,9 @@ static void at91cap9adk_nand_hwcontrol(struct mtd_info *mtd, int cmd)
|
||||||
int board_nand_init(struct nand_chip *nand)
|
int board_nand_init(struct nand_chip *nand)
|
||||||
{
|
{
|
||||||
nand->eccmode = NAND_ECC_SOFT;
|
nand->eccmode = NAND_ECC_SOFT;
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
nand->options = NAND_BUSWIDTH_16;
|
||||||
|
#endif
|
||||||
nand->hwcontrol = at91cap9adk_nand_hwcontrol;
|
nand->hwcontrol = at91cap9adk_nand_hwcontrol;
|
||||||
nand->chip_delay = 20;
|
nand->chip_delay = 20;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
# (C) Copyright 2003-2008
|
# (C) Copyright 2003-2008
|
||||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
#
|
#
|
||||||
|
# (C) Copyright 2008
|
||||||
|
# Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
# Lead Tech Design <www.leadtechdesign.com>
|
||||||
|
#
|
||||||
# See file CREDITS for list of people who contributed to this
|
# See file CREDITS for list of people who contributed to this
|
||||||
# project.
|
# project.
|
||||||
#
|
#
|
||||||
|
|
|
@ -90,7 +90,12 @@ static void at91sam9260ek_nand_hw_init(void)
|
||||||
at91_sys_write(AT91_SMC_MODE(3),
|
at91_sys_write(AT91_SMC_MODE(3),
|
||||||
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
||||||
AT91_SMC_EXNWMODE_DISABLE |
|
AT91_SMC_EXNWMODE_DISABLE |
|
||||||
AT91_SMC_DBW_8 | AT91_SMC_TDF_(2));
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
AT91_SMC_DBW_16 |
|
||||||
|
#else /* CFG_NAND_DBW_8 */
|
||||||
|
AT91_SMC_DBW_8 |
|
||||||
|
#endif
|
||||||
|
AT91_SMC_TDF_(2));
|
||||||
|
|
||||||
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC);
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC);
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,9 @@ static int at91sam9260ek_nand_ready(struct mtd_info *mtd)
|
||||||
int board_nand_init(struct nand_chip *nand)
|
int board_nand_init(struct nand_chip *nand)
|
||||||
{
|
{
|
||||||
nand->eccmode = NAND_ECC_SOFT;
|
nand->eccmode = NAND_ECC_SOFT;
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
nand->options = NAND_BUSWIDTH_16;
|
||||||
|
#endif
|
||||||
nand->hwcontrol = at91sam9260ek_nand_hwcontrol;
|
nand->hwcontrol = at91sam9260ek_nand_hwcontrol;
|
||||||
nand->dev_ready = at91sam9260ek_nand_ready;
|
nand->dev_ready = at91sam9260ek_nand_ready;
|
||||||
nand->chip_delay = 20;
|
nand->chip_delay = 20;
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
/*
|
|
||||||
* (C) Copyright 2002
|
|
||||||
* Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
|
|
||||||
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
|
|
||||||
OUTPUT_ARCH(arm)
|
|
||||||
ENTRY(_start)
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = 0x00000000;
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.text :
|
|
||||||
{
|
|
||||||
cpu/arm926ejs/start.o (.text)
|
|
||||||
*(.text)
|
|
||||||
}
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.rodata : { *(.rodata) }
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.data : { *(.data) }
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
.got : { *(.got) }
|
|
||||||
|
|
||||||
. = .;
|
|
||||||
__u_boot_cmd_start = .;
|
|
||||||
.u_boot_cmd : { *(.u_boot_cmd) }
|
|
||||||
__u_boot_cmd_end = .;
|
|
||||||
|
|
||||||
. = ALIGN(4);
|
|
||||||
__bss_start = .;
|
|
||||||
.bss : { *(.bss) }
|
|
||||||
_end = .;
|
|
||||||
}
|
|
57
board/atmel/at91sam9261ek/Makefile
Normal file
57
board/atmel/at91sam9261ek/Makefile
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2003-2008
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
#
|
||||||
|
# (C) Copyright 2008
|
||||||
|
# Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
# Lead Tech Design <www.leadtechdesign.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 $(TOPDIR)/config.mk
|
||||||
|
|
||||||
|
LIB = $(obj)lib$(BOARD).a
|
||||||
|
|
||||||
|
COBJS-y += at91sam9261ek.o
|
||||||
|
COBJS-y += led.o
|
||||||
|
COBJS-y += partition.o
|
||||||
|
COBJS-$(CONFIG_CMD_NAND) += nand.o
|
||||||
|
|
||||||
|
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||||
|
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||||
|
|
||||||
|
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(SOBJS) $(OBJS)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f $(LIB) core *.bak .depend
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
# defines $(obj).depend target
|
||||||
|
include $(SRCTREE)/rules.mk
|
||||||
|
|
||||||
|
sinclude $(obj).depend
|
||||||
|
|
||||||
|
#########################################################################
|
258
board/atmel/at91sam9261ek/at91sam9261ek.c
Normal file
258
board/atmel/at91sam9261ek/at91sam9261ek.c
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.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 <asm/arch/at91sam9261.h>
|
||||||
|
#include <asm/arch/at91sam9261_matrix.h>
|
||||||
|
#include <asm/arch/at91sam9_smc.h>
|
||||||
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/at91_rstc.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/io.h>
|
||||||
|
#include <lcd.h>
|
||||||
|
#include <atmel_lcdc.h>
|
||||||
|
#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_DRIVER_DM9000)
|
||||||
|
#include <net.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Miscelaneous platform dependent initialisations
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void at91sam9261ek_serial_hw_init(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USART0
|
||||||
|
at91_set_A_periph(AT91_PIN_PC8, 1); /* TXD0 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC9, 0); /* RXD0 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART1
|
||||||
|
at91_set_A_periph(AT91_PIN_PC12, 1); /* TXD1 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC13, 0); /* RXD1 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART2
|
||||||
|
at91_set_A_periph(AT91_PIN_PC14, 1); /* TXD2 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC15, 0); /* RXD2 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART3 /* DBGU */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA9, 0); /* DRXD */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA10, 1); /* DTXD */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_NAND
|
||||||
|
static void at91sam9261ek_nand_hw_init(void)
|
||||||
|
{
|
||||||
|
unsigned long csa;
|
||||||
|
|
||||||
|
/* Enable CS3 */
|
||||||
|
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
||||||
|
at91_sys_write(AT91_MATRIX_EBICSA,
|
||||||
|
csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
|
||||||
|
|
||||||
|
/* Configure SMC CS3 for NAND/SmartMedia */
|
||||||
|
at91_sys_write(AT91_SMC_SETUP(3),
|
||||||
|
AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) |
|
||||||
|
AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0));
|
||||||
|
at91_sys_write(AT91_SMC_PULSE(3),
|
||||||
|
AT91_SMC_NWEPULSE_(2) | AT91_SMC_NCS_WRPULSE_(5) |
|
||||||
|
AT91_SMC_NRDPULSE_(2) | AT91_SMC_NCS_RDPULSE_(5));
|
||||||
|
at91_sys_write(AT91_SMC_CYCLE(3),
|
||||||
|
AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7));
|
||||||
|
at91_sys_write(AT91_SMC_MODE(3),
|
||||||
|
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
||||||
|
AT91_SMC_EXNWMODE_DISABLE |
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
AT91_SMC_DBW_16 |
|
||||||
|
#else /* CFG_NAND_DBW_8 */
|
||||||
|
AT91_SMC_DBW_8 |
|
||||||
|
#endif
|
||||||
|
AT91_SMC_TDF_(1));
|
||||||
|
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_PIOC);
|
||||||
|
|
||||||
|
/* Configure RDY/BSY */
|
||||||
|
at91_set_gpio_input(AT91_PIN_PC15, 1);
|
||||||
|
|
||||||
|
/* Enable NandFlash */
|
||||||
|
at91_set_gpio_output(AT91_PIN_PC14, 1);
|
||||||
|
|
||||||
|
at91_set_A_periph(AT91_PIN_PC0, 0); /* NANDOE */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC1, 0); /* NANDWE */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_HAS_DATAFLASH
|
||||||
|
static void at91sam9261ek_spi_hw_init(void)
|
||||||
|
{
|
||||||
|
at91_set_A_periph(AT91_PIN_PA3, 0); /* SPI0_NPCS0 */
|
||||||
|
|
||||||
|
at91_set_A_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
||||||
|
|
||||||
|
/* Enable clock */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_SPI0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_DRIVER_DM9000
|
||||||
|
static void at91sam9261ek_dm9000_hw_init(void)
|
||||||
|
{
|
||||||
|
/* Configure SMC CS2 for DM9000 */
|
||||||
|
at91_sys_write(AT91_SMC_SETUP(2),
|
||||||
|
AT91_SMC_NWESETUP_(2) | AT91_SMC_NCS_WRSETUP_(0) |
|
||||||
|
AT91_SMC_NRDSETUP_(2) | AT91_SMC_NCS_RDSETUP_(0));
|
||||||
|
at91_sys_write(AT91_SMC_PULSE(2),
|
||||||
|
AT91_SMC_NWEPULSE_(4) | AT91_SMC_NCS_WRPULSE_(8) |
|
||||||
|
AT91_SMC_NRDPULSE_(4) | AT91_SMC_NCS_RDPULSE_(8));
|
||||||
|
at91_sys_write(AT91_SMC_CYCLE(2),
|
||||||
|
AT91_SMC_NWECYCLE_(16) | AT91_SMC_NRDCYCLE_(16));
|
||||||
|
at91_sys_write(AT91_SMC_MODE(2),
|
||||||
|
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
||||||
|
AT91_SMC_EXNWMODE_DISABLE |
|
||||||
|
AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16 |
|
||||||
|
AT91_SMC_TDF_(1));
|
||||||
|
|
||||||
|
/* Configure Reset signal as output */
|
||||||
|
at91_set_gpio_output(AT91_PIN_PC10, 0);
|
||||||
|
|
||||||
|
/* Configure Interrupt pin as input, no pull-up */
|
||||||
|
at91_set_gpio_input(AT91_PIN_PC11, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
vidinfo_t panel_info = {
|
||||||
|
vl_col: 240,
|
||||||
|
vl_row: 320,
|
||||||
|
vl_clk: 4965000,
|
||||||
|
vl_sync: ATMEL_LCDC_INVLINE_INVERTED |
|
||||||
|
ATMEL_LCDC_INVFRAME_INVERTED,
|
||||||
|
vl_bpix: 3,
|
||||||
|
vl_tft: 1,
|
||||||
|
vl_hsync_len: 5,
|
||||||
|
vl_left_margin: 1,
|
||||||
|
vl_right_margin:33,
|
||||||
|
vl_vsync_len: 1,
|
||||||
|
vl_upper_margin:1,
|
||||||
|
vl_lower_margin:0,
|
||||||
|
mmio: AT91SAM9261_LCDC_BASE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void lcd_enable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PA12, 0); /* power up */
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_disable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PA12, 1); /* power down */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void at91sam9261ek_lcd_hw_init(void)
|
||||||
|
{
|
||||||
|
at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB2, 0); /* LCDDOTCK */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB3, 0); /* LCDDEN */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB4, 0); /* LCDCC */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB7, 0); /* LCDD2 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB8, 0); /* LCDD3 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB9, 0); /* LCDD4 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB10, 0); /* LCDD5 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB11, 0); /* LCDD6 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB12, 0); /* LCDD7 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB15, 0); /* LCDD10 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB16, 0); /* LCDD11 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB17, 0); /* LCDD12 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB18, 0); /* LCDD13 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB19, 0); /* LCDD14 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB20, 0); /* LCDD15 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB23, 0); /* LCDD18 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB24, 0); /* LCDD19 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB25, 0); /* LCDD20 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB26, 0); /* LCDD21 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB27, 0); /* LCDD22 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB28, 0); /* LCDD23 */
|
||||||
|
|
||||||
|
at91_sys_write(AT91_PMC_SCER, AT91_PMC_HCK1);
|
||||||
|
|
||||||
|
gd->fb_base = AT91SAM9261_SRAM_BASE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int board_init(void)
|
||||||
|
{
|
||||||
|
/* Enable Ctrlc */
|
||||||
|
console_init_f();
|
||||||
|
|
||||||
|
/* arch number of AT91SAM9261EK-Board */
|
||||||
|
gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9261EK;
|
||||||
|
/* adress of boot parameters */
|
||||||
|
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
|
||||||
|
|
||||||
|
at91sam9261ek_serial_hw_init();
|
||||||
|
#ifdef CONFIG_CMD_NAND
|
||||||
|
at91sam9261ek_nand_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_HAS_DATAFLASH
|
||||||
|
at91sam9261ek_spi_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_DRIVER_DM9000
|
||||||
|
at91sam9261ek_dm9000_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
at91sam9261ek_lcd_hw_init();
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dram_init(void)
|
||||||
|
{
|
||||||
|
gd->bd->bi_dram[0].start = PHYS_SDRAM;
|
||||||
|
gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_RESET_PHY_R
|
||||||
|
void reset_phy(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_DRIVER_DM9000
|
||||||
|
/*
|
||||||
|
* Initialize ethernet HW addr prior to starting Linux,
|
||||||
|
* needed for nfsroot
|
||||||
|
*/
|
||||||
|
eth_init(gd->bd);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
1
board/atmel/at91sam9261ek/config.mk
Normal file
1
board/atmel/at91sam9261ek/config.mk
Normal file
|
@ -0,0 +1 @@
|
||||||
|
TEXT_BASE = 0x23f00000
|
78
board/atmel/at91sam9261ek/led.c
Normal file
78
board/atmel/at91sam9261ek/led.c
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.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 <asm/arch/at91sam9261.h>
|
||||||
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/io.h>
|
||||||
|
|
||||||
|
#define RED_LED AT91_PIN_PA23 /* this is the power led */
|
||||||
|
#define GREEN_LED AT91_PIN_PA13 /* this is the user1 led */
|
||||||
|
#define YELLOW_LED AT91_PIN_PA14 /* this is the user2 led */
|
||||||
|
|
||||||
|
void red_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(RED_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void red_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(RED_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void green_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(GREEN_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void green_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(GREEN_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void yellow_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void yellow_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void coloured_LED_init(void)
|
||||||
|
{
|
||||||
|
/* Enable clock */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9261_ID_PIOA);
|
||||||
|
|
||||||
|
at91_set_gpio_output(RED_LED, 1);
|
||||||
|
at91_set_gpio_output(GREEN_LED, 1);
|
||||||
|
at91_set_gpio_output(YELLOW_LED, 1);
|
||||||
|
|
||||||
|
at91_set_gpio_value(RED_LED, 0);
|
||||||
|
at91_set_gpio_value(GREEN_LED, 1);
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 1);
|
||||||
|
}
|
79
board/atmel/at91sam9261ek/nand.c
Normal file
79
board/atmel/at91sam9261ek/nand.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.com>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
|
||||||
|
*
|
||||||
|
* 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 <asm/arch/at91sam9261.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/at91_pio.h>
|
||||||
|
|
||||||
|
#include <nand.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hardware specific access to control-lines
|
||||||
|
*/
|
||||||
|
#define MASK_ALE (1 << 22) /* our ALE is AD22 */
|
||||||
|
#define MASK_CLE (1 << 21) /* our CLE is AD21 */
|
||||||
|
|
||||||
|
static void at91sam9261ek_nand_hwcontrol(struct mtd_info *mtd, int cmd)
|
||||||
|
{
|
||||||
|
struct nand_chip *this = mtd->priv;
|
||||||
|
ulong IO_ADDR_W = (ulong) this->IO_ADDR_W;
|
||||||
|
|
||||||
|
IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);
|
||||||
|
switch (cmd) {
|
||||||
|
case NAND_CTL_SETCLE:
|
||||||
|
IO_ADDR_W |= MASK_CLE;
|
||||||
|
break;
|
||||||
|
case NAND_CTL_SETALE:
|
||||||
|
IO_ADDR_W |= MASK_ALE;
|
||||||
|
break;
|
||||||
|
case NAND_CTL_CLRNCE:
|
||||||
|
at91_set_gpio_value(AT91_PIN_PC14, 1);
|
||||||
|
break;
|
||||||
|
case NAND_CTL_SETNCE:
|
||||||
|
at91_set_gpio_value(AT91_PIN_PC14, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this->IO_ADDR_W = (void *) IO_ADDR_W;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int at91sam9261ek_nand_ready(struct mtd_info *mtd)
|
||||||
|
{
|
||||||
|
return at91_get_gpio_value(AT91_PIN_PC15);
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_nand_init(struct nand_chip *nand)
|
||||||
|
{
|
||||||
|
nand->eccmode = NAND_ECC_SOFT;
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
nand->options = NAND_BUSWIDTH_16;
|
||||||
|
#endif
|
||||||
|
nand->hwcontrol = at91sam9261ek_nand_hwcontrol;
|
||||||
|
nand->dev_ready = at91sam9261ek_nand_ready;
|
||||||
|
nand->chip_delay = 20;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
40
board/atmel/at91sam9261ek/partition.c
Normal file
40
board/atmel/at91sam9261ek/partition.c
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2008
|
||||||
|
* Ulf Samuelsson <ulf@atmel.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.
|
||||||
|
*
|
||||||
|
* 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/hardware.h>
|
||||||
|
#include <dataflash.h>
|
||||||
|
|
||||||
|
AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS];
|
||||||
|
|
||||||
|
struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = {
|
||||||
|
{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */
|
||||||
|
{CFG_DATAFLASH_LOGIC_ADDR_CS3, 3}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*define the area offsets*/
|
||||||
|
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
|
||||||
|
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"},
|
||||||
|
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"},
|
||||||
|
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"},
|
||||||
|
{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"},
|
||||||
|
{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"},
|
||||||
|
};
|
57
board/atmel/at91sam9263ek/Makefile
Normal file
57
board/atmel/at91sam9263ek/Makefile
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2003-2008
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
#
|
||||||
|
# (C) Copyright 2008
|
||||||
|
# Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
# Lead Tech Design <www.leadtechdesign.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 $(TOPDIR)/config.mk
|
||||||
|
|
||||||
|
LIB = $(obj)lib$(BOARD).a
|
||||||
|
|
||||||
|
COBJS-y += at91sam9263ek.o
|
||||||
|
COBJS-y += led.o
|
||||||
|
COBJS-y += partition.o
|
||||||
|
COBJS-$(CONFIG_CMD_NAND) += nand.o
|
||||||
|
|
||||||
|
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||||
|
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||||
|
|
||||||
|
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(SOBJS) $(OBJS)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f $(LIB) core *.bak .depend
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
# defines $(obj).depend target
|
||||||
|
include $(SRCTREE)/rules.mk
|
||||||
|
|
||||||
|
sinclude $(obj).depend
|
||||||
|
|
||||||
|
#########################################################################
|
305
board/atmel/at91sam9263ek/at91sam9263ek.c
Normal file
305
board/atmel/at91sam9263ek/at91sam9263ek.c
Normal file
|
@ -0,0 +1,305 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.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 <asm/sizes.h>
|
||||||
|
#include <asm/arch/at91sam9263.h>
|
||||||
|
#include <asm/arch/at91sam9263_matrix.h>
|
||||||
|
#include <asm/arch/at91sam9_smc.h>
|
||||||
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/at91_rstc.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/io.h>
|
||||||
|
#include <lcd.h>
|
||||||
|
#include <atmel_lcdc.h>
|
||||||
|
#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB)
|
||||||
|
#include <net.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Miscelaneous platform dependent initialisations
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void at91sam9263ek_serial_hw_init(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USART0
|
||||||
|
at91_set_A_periph(AT91_PIN_PA26, 1); /* TXD0 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA27, 0); /* RXD0 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART1
|
||||||
|
at91_set_A_periph(AT91_PIN_PD0, 1); /* TXD1 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PD1, 0); /* RXD1 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART2
|
||||||
|
at91_set_A_periph(AT91_PIN_PD2, 1); /* TXD2 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PD3, 0); /* RXD2 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART3 /* DBGU */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC30, 0); /* DRXD */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC31, 1); /* DTXD */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_NAND
|
||||||
|
static void at91sam9263ek_nand_hw_init(void)
|
||||||
|
{
|
||||||
|
unsigned long csa;
|
||||||
|
|
||||||
|
/* Enable CS3 */
|
||||||
|
csa = at91_sys_read(AT91_MATRIX_EBI0CSA);
|
||||||
|
at91_sys_write(AT91_MATRIX_EBI0CSA,
|
||||||
|
csa | AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA);
|
||||||
|
|
||||||
|
/* Configure SMC CS3 for NAND/SmartMedia */
|
||||||
|
at91_sys_write(AT91_SMC_SETUP(3),
|
||||||
|
AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) |
|
||||||
|
AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0));
|
||||||
|
at91_sys_write(AT91_SMC_PULSE(3),
|
||||||
|
AT91_SMC_NWEPULSE_(3) | AT91_SMC_NCS_WRPULSE_(3) |
|
||||||
|
AT91_SMC_NRDPULSE_(3) | AT91_SMC_NCS_RDPULSE_(3));
|
||||||
|
at91_sys_write(AT91_SMC_CYCLE(3),
|
||||||
|
AT91_SMC_NWECYCLE_(5) | AT91_SMC_NRDCYCLE_(5));
|
||||||
|
at91_sys_write(AT91_SMC_MODE(3),
|
||||||
|
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
||||||
|
AT91_SMC_EXNWMODE_DISABLE |
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
AT91_SMC_DBW_16 |
|
||||||
|
#else /* CFG_NAND_DBW_8 */
|
||||||
|
AT91_SMC_DBW_8 |
|
||||||
|
#endif
|
||||||
|
AT91_SMC_TDF_(2));
|
||||||
|
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_PIOA |
|
||||||
|
1 << AT91SAM9263_ID_PIOCDE);
|
||||||
|
|
||||||
|
/* Configure RDY/BSY */
|
||||||
|
at91_set_gpio_input(AT91_PIN_PA22, 1);
|
||||||
|
|
||||||
|
/* Enable NandFlash */
|
||||||
|
at91_set_gpio_output(AT91_PIN_PD15, 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_HAS_DATAFLASH
|
||||||
|
static void at91sam9263ek_spi_hw_init(void)
|
||||||
|
{
|
||||||
|
at91_set_B_periph(AT91_PIN_PA5, 0); /* SPI0_NPCS0 */
|
||||||
|
|
||||||
|
at91_set_B_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */
|
||||||
|
at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */
|
||||||
|
at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */
|
||||||
|
|
||||||
|
/* Enable clock */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_SPI0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_MACB
|
||||||
|
static void at91sam9263ek_macb_hw_init(void)
|
||||||
|
{
|
||||||
|
/* Enable clock */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Disable pull-up on:
|
||||||
|
* RXDV (PC25) => PHY normal mode (not Test mode)
|
||||||
|
* ERX0 (PE25) => PHY ADDR0
|
||||||
|
* ERX1 (PE26) => PHY ADDR1 => PHYADDR = 0x0
|
||||||
|
*
|
||||||
|
* PHY has internal pull-down
|
||||||
|
*/
|
||||||
|
writel(pin_to_mask(AT91_PIN_PC25),
|
||||||
|
pin_to_controller(AT91_PIN_PC0) + PIO_PUDR);
|
||||||
|
writel(pin_to_mask(AT91_PIN_PE25) |
|
||||||
|
pin_to_mask(AT91_PIN_PE26),
|
||||||
|
pin_to_controller(AT91_PIN_PE0) + PIO_PUDR);
|
||||||
|
|
||||||
|
/* Need to reset PHY -> 500ms reset */
|
||||||
|
at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY |
|
||||||
|
AT91_RSTC_ERSTL | (0x0D << 8) |
|
||||||
|
AT91_RSTC_URSTEN);
|
||||||
|
|
||||||
|
at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_EXTRST);
|
||||||
|
|
||||||
|
/* Wait for end hardware reset */
|
||||||
|
while (!(at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_NRSTL));
|
||||||
|
|
||||||
|
/* Re-enable pull-up */
|
||||||
|
writel(pin_to_mask(AT91_PIN_PC25),
|
||||||
|
pin_to_controller(AT91_PIN_PC0) + PIO_PUER);
|
||||||
|
writel(pin_to_mask(AT91_PIN_PE25) |
|
||||||
|
pin_to_mask(AT91_PIN_PE26),
|
||||||
|
pin_to_controller(AT91_PIN_PE0) + PIO_PUER);
|
||||||
|
|
||||||
|
at91_set_A_periph(AT91_PIN_PE21, 0); /* ETXCK_EREFCK */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC25, 0); /* ERXDV */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE25, 0); /* ERX0 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE26, 0); /* ERX1 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE27, 0); /* ERXER */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE28, 0); /* ETXEN */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE23, 0); /* ETX0 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE24, 0); /* ETX1 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE30, 0); /* EMDIO */
|
||||||
|
at91_set_A_periph(AT91_PIN_PE29, 0); /* EMDC */
|
||||||
|
|
||||||
|
#ifndef CONFIG_RMII
|
||||||
|
at91_set_A_periph(AT91_PIN_PE22, 0); /* ECRS */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC26, 0); /* ECOL */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC22, 0); /* ERX2 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC23, 0); /* ERX3 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC27, 0); /* ERXCK */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC20, 0); /* ETX2 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC21, 0); /* ETX3 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC24, 0); /* ETXER */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USB_OHCI_NEW
|
||||||
|
static void at91sam9263ek_uhp_hw_init(void)
|
||||||
|
{
|
||||||
|
/* Enable VBus on UHP ports */
|
||||||
|
at91_set_gpio_output(AT91_PIN_PA21, 0);
|
||||||
|
at91_set_gpio_output(AT91_PIN_PA24, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
vidinfo_t panel_info = {
|
||||||
|
vl_col: 240,
|
||||||
|
vl_row: 320,
|
||||||
|
vl_clk: 4965000,
|
||||||
|
vl_sync: ATMEL_LCDC_INVLINE_INVERTED |
|
||||||
|
ATMEL_LCDC_INVFRAME_INVERTED,
|
||||||
|
vl_bpix: 3,
|
||||||
|
vl_tft: 1,
|
||||||
|
vl_hsync_len: 5,
|
||||||
|
vl_left_margin: 1,
|
||||||
|
vl_right_margin:33,
|
||||||
|
vl_vsync_len: 1,
|
||||||
|
vl_upper_margin:1,
|
||||||
|
vl_lower_margin:0,
|
||||||
|
mmio: AT91SAM9263_LCDC_BASE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void lcd_enable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PA30, 1); /* power up */
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_disable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PA30, 0); /* power down */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void at91sam9263ek_lcd_hw_init(void)
|
||||||
|
{
|
||||||
|
at91_set_A_periph(AT91_PIN_PC1, 0); /* LCDHSYNC */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC2, 0); /* LCDDOTCK */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDDEN */
|
||||||
|
at91_set_B_periph(AT91_PIN_PB9, 0); /* LCDCC */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDD2 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDD3 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC8, 0); /* LCDD4 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC9, 0); /* LCDD5 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC10, 0); /* LCDD6 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC11, 0); /* LCDD7 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC14, 0); /* LCDD10 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC15, 0); /* LCDD11 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC16, 0); /* LCDD12 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC12, 0); /* LCDD13 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC18, 0); /* LCDD14 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC19, 0); /* LCDD15 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC22, 0); /* LCDD18 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC23, 0); /* LCDD19 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC24, 0); /* LCDD20 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC17, 0); /* LCDD21 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC26, 0); /* LCDD22 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC27, 0); /* LCDD23 */
|
||||||
|
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_LCDC);
|
||||||
|
|
||||||
|
gd->fb_base = AT91SAM9263_SRAM0_BASE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int board_init(void)
|
||||||
|
{
|
||||||
|
/* Enable Ctrlc */
|
||||||
|
console_init_f();
|
||||||
|
|
||||||
|
/* arch number of AT91SAM9263EK-Board */
|
||||||
|
gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9263EK;
|
||||||
|
/* adress of boot parameters */
|
||||||
|
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
|
||||||
|
|
||||||
|
at91sam9263ek_serial_hw_init();
|
||||||
|
#ifdef CONFIG_CMD_NAND
|
||||||
|
at91sam9263ek_nand_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_HAS_DATAFLASH
|
||||||
|
at91sam9263ek_spi_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_MACB
|
||||||
|
at91sam9263ek_macb_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_USB_OHCI_NEW
|
||||||
|
at91sam9263ek_uhp_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
at91sam9263ek_lcd_hw_init();
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dram_init(void)
|
||||||
|
{
|
||||||
|
gd->bd->bi_dram[0].start = PHYS_SDRAM;
|
||||||
|
gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_RESET_PHY_R
|
||||||
|
void reset_phy(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_MACB
|
||||||
|
/*
|
||||||
|
* Initialize ethernet HW addr prior to starting Linux,
|
||||||
|
* needed for nfsroot
|
||||||
|
*/
|
||||||
|
eth_init(gd->bd);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
1
board/atmel/at91sam9263ek/config.mk
Normal file
1
board/atmel/at91sam9263ek/config.mk
Normal file
|
@ -0,0 +1 @@
|
||||||
|
TEXT_BASE = 0x23f00000
|
78
board/atmel/at91sam9263ek/led.c
Normal file
78
board/atmel/at91sam9263ek/led.c
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.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 <asm/arch/at91sam9263.h>
|
||||||
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/io.h>
|
||||||
|
|
||||||
|
#define RED_LED AT91_PIN_PB7 /* this is the power led */
|
||||||
|
#define GREEN_LED AT91_PIN_PB8 /* this is the user1 led */
|
||||||
|
#define YELLOW_LED AT91_PIN_PC29 /* this is the user2 led */
|
||||||
|
|
||||||
|
void red_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(RED_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void red_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(RED_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void green_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(GREEN_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void green_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(GREEN_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void yellow_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void yellow_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void coloured_LED_init(void)
|
||||||
|
{
|
||||||
|
/* Enable clock */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_PIOB |
|
||||||
|
1 << AT91SAM9263_ID_PIOCDE);
|
||||||
|
|
||||||
|
at91_set_gpio_output(RED_LED, 1);
|
||||||
|
at91_set_gpio_output(GREEN_LED, 1);
|
||||||
|
at91_set_gpio_output(YELLOW_LED, 1);
|
||||||
|
|
||||||
|
at91_set_gpio_value(RED_LED, 0);
|
||||||
|
at91_set_gpio_value(GREEN_LED, 1);
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 1);
|
||||||
|
}
|
79
board/atmel/at91sam9263ek/nand.c
Normal file
79
board/atmel/at91sam9263ek/nand.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.com>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
|
||||||
|
*
|
||||||
|
* 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 <asm/arch/at91sam9263.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/at91_pio.h>
|
||||||
|
|
||||||
|
#include <nand.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hardware specific access to control-lines
|
||||||
|
*/
|
||||||
|
#define MASK_ALE (1 << 21) /* our ALE is AD21 */
|
||||||
|
#define MASK_CLE (1 << 22) /* our CLE is AD22 */
|
||||||
|
|
||||||
|
static void at91sam9263ek_nand_hwcontrol(struct mtd_info *mtd, int cmd)
|
||||||
|
{
|
||||||
|
struct nand_chip *this = mtd->priv;
|
||||||
|
ulong IO_ADDR_W = (ulong) this->IO_ADDR_W;
|
||||||
|
|
||||||
|
IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);
|
||||||
|
switch (cmd) {
|
||||||
|
case NAND_CTL_SETCLE:
|
||||||
|
IO_ADDR_W |= MASK_CLE;
|
||||||
|
break;
|
||||||
|
case NAND_CTL_SETALE:
|
||||||
|
IO_ADDR_W |= MASK_ALE;
|
||||||
|
break;
|
||||||
|
case NAND_CTL_CLRNCE:
|
||||||
|
at91_set_gpio_value(AT91_PIN_PD15, 1);
|
||||||
|
break;
|
||||||
|
case NAND_CTL_SETNCE:
|
||||||
|
at91_set_gpio_value(AT91_PIN_PD15, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this->IO_ADDR_W = (void *) IO_ADDR_W;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int at91sam9263ek_nand_ready(struct mtd_info *mtd)
|
||||||
|
{
|
||||||
|
return at91_get_gpio_value(AT91_PIN_PA22);
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_nand_init(struct nand_chip *nand)
|
||||||
|
{
|
||||||
|
nand->eccmode = NAND_ECC_SOFT;
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
nand->options = NAND_BUSWIDTH_16;
|
||||||
|
#endif
|
||||||
|
nand->hwcontrol = at91sam9263ek_nand_hwcontrol;
|
||||||
|
nand->dev_ready = at91sam9263ek_nand_ready;
|
||||||
|
nand->chip_delay = 20;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,8 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2006 Atmel Corporation
|
* (C) Copyright 2008
|
||||||
*
|
* Ulf Samuelsson <ulf@atmel.com>
|
||||||
* See file CREDITS for list of people who contributed to this
|
|
||||||
* project.
|
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
@ -18,25 +16,24 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
* MA 02111-1307 USA
|
* MA 02111-1307 USA
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <config.h>
|
||||||
|
#include <asm/hardware.h>
|
||||||
|
#include <dataflash.h>
|
||||||
|
|
||||||
#ifdef CFG_POWER_MANAGER
|
AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS];
|
||||||
#include <asm/errno.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
#include <asm/arch/memory-map.h>
|
struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = {
|
||||||
|
{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */
|
||||||
|
};
|
||||||
|
|
||||||
#include "sm.h"
|
/*define the area offsets*/
|
||||||
|
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
|
||||||
|
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"},
|
||||||
#ifdef CONFIG_PLL
|
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"},
|
||||||
#define MAIN_CLK_RATE ((CFG_OSC0_HZ / CFG_PLL0_DIV) * CFG_PLL0_MUL)
|
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"},
|
||||||
#else
|
{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"},
|
||||||
#define MAIN_CLK_RATE (CFG_OSC0_HZ)
|
{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"},
|
||||||
#endif
|
};
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* CFG_POWER_MANAGER */
|
|
57
board/atmel/at91sam9rlek/Makefile
Normal file
57
board/atmel/at91sam9rlek/Makefile
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2003-2008
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
#
|
||||||
|
# (C) Copyright 2008
|
||||||
|
# Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
# Lead Tech Design <www.leadtechdesign.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 $(TOPDIR)/config.mk
|
||||||
|
|
||||||
|
LIB = $(obj)lib$(BOARD).a
|
||||||
|
|
||||||
|
COBJS-y += at91sam9rlek.o
|
||||||
|
COBJS-y += led.o
|
||||||
|
COBJS-y += partition.o
|
||||||
|
COBJS-$(CONFIG_CMD_NAND) += nand.o
|
||||||
|
|
||||||
|
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||||
|
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||||
|
|
||||||
|
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(SOBJS) $(OBJS)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f $(LIB) core *.bak .depend
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
# defines $(obj).depend target
|
||||||
|
include $(SRCTREE)/rules.mk
|
||||||
|
|
||||||
|
sinclude $(obj).depend
|
||||||
|
|
||||||
|
#########################################################################
|
215
board/atmel/at91sam9rlek/at91sam9rlek.c
Normal file
215
board/atmel/at91sam9rlek/at91sam9rlek.c
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.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 <asm/arch/at91sam9rl.h>
|
||||||
|
#include <asm/arch/at91sam9rl_matrix.h>
|
||||||
|
#include <asm/arch/at91sam9_smc.h>
|
||||||
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/at91_rstc.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/io.h>
|
||||||
|
#include <lcd.h>
|
||||||
|
#include <atmel_lcdc.h>
|
||||||
|
#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB)
|
||||||
|
#include <net.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Miscelaneous platform dependent initialisations
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void at91sam9rlek_serial_hw_init(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_USART0
|
||||||
|
at91_set_A_periph(AT91_PIN_PA6, 1); /* TXD0 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA7, 0); /* RXD0 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART1
|
||||||
|
at91_set_A_periph(AT91_PIN_PA11, 1); /* TXD1 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA12, 0); /* RXD1 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART2
|
||||||
|
at91_set_A_periph(AT91_PIN_PA13, 1); /* TXD2 */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA14, 0); /* RXD2 */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_USART3 /* DBGU */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA21, 0); /* DRXD */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA22, 1); /* DTXD */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_CMD_NAND
|
||||||
|
static void at91sam9rlek_nand_hw_init(void)
|
||||||
|
{
|
||||||
|
unsigned long csa;
|
||||||
|
|
||||||
|
/* Enable CS3 */
|
||||||
|
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
||||||
|
at91_sys_write(AT91_MATRIX_EBICSA,
|
||||||
|
csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
|
||||||
|
|
||||||
|
/* Configure SMC CS3 for NAND/SmartMedia */
|
||||||
|
at91_sys_write(AT91_SMC_SETUP(3),
|
||||||
|
AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) |
|
||||||
|
AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0));
|
||||||
|
at91_sys_write(AT91_SMC_PULSE(3),
|
||||||
|
AT91_SMC_NWEPULSE_(2) | AT91_SMC_NCS_WRPULSE_(5) |
|
||||||
|
AT91_SMC_NRDPULSE_(2) | AT91_SMC_NCS_RDPULSE_(5));
|
||||||
|
at91_sys_write(AT91_SMC_CYCLE(3),
|
||||||
|
AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7));
|
||||||
|
at91_sys_write(AT91_SMC_MODE(3),
|
||||||
|
AT91_SMC_READMODE | AT91_SMC_WRITEMODE |
|
||||||
|
AT91_SMC_EXNWMODE_DISABLE |
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
AT91_SMC_DBW_16 |
|
||||||
|
#else /* CFG_NAND_DBW_8 */
|
||||||
|
AT91_SMC_DBW_8 |
|
||||||
|
#endif
|
||||||
|
AT91_SMC_TDF_(1));
|
||||||
|
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_PIOD);
|
||||||
|
|
||||||
|
/* Configure RDY/BSY */
|
||||||
|
at91_set_gpio_input(AT91_PIN_PD17, 1);
|
||||||
|
|
||||||
|
/* Enable NandFlash */
|
||||||
|
at91_set_gpio_output(AT91_PIN_PB6, 1);
|
||||||
|
|
||||||
|
at91_set_A_periph(AT91_PIN_PB4, 0); /* NANDOE */
|
||||||
|
at91_set_A_periph(AT91_PIN_PB5, 0); /* NANDWE */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_HAS_DATAFLASH
|
||||||
|
static void at91sam9rlek_spi_hw_init(void)
|
||||||
|
{
|
||||||
|
at91_set_A_periph(AT91_PIN_PA28, 0); /* SPI0_NPCS0 */
|
||||||
|
|
||||||
|
at91_set_A_periph(AT91_PIN_PA25, 0); /* SPI0_MISO */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA26, 0); /* SPI0_MOSI */
|
||||||
|
at91_set_A_periph(AT91_PIN_PA27, 0); /* SPI0_SPCK */
|
||||||
|
|
||||||
|
/* Enable clock */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_SPI);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
vidinfo_t panel_info = {
|
||||||
|
vl_col: 240,
|
||||||
|
vl_row: 320,
|
||||||
|
vl_clk: 4965000,
|
||||||
|
vl_sync: ATMEL_LCDC_INVLINE_INVERTED |
|
||||||
|
ATMEL_LCDC_INVFRAME_INVERTED,
|
||||||
|
vl_bpix: 3,
|
||||||
|
vl_tft: 1,
|
||||||
|
vl_hsync_len: 5,
|
||||||
|
vl_left_margin: 1,
|
||||||
|
vl_right_margin:33,
|
||||||
|
vl_vsync_len: 1,
|
||||||
|
vl_upper_margin:1,
|
||||||
|
vl_lower_margin:0,
|
||||||
|
mmio: AT91SAM9RL_LCDC_BASE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void lcd_enable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PA30, 0); /* power up */
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcd_disable(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(AT91_PIN_PA30, 1); /* power down */
|
||||||
|
}
|
||||||
|
static void at91sam9rlek_lcd_hw_init(void)
|
||||||
|
{
|
||||||
|
at91_set_B_periph(AT91_PIN_PC1, 0); /* LCDPWR */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC5, 0); /* LCDHSYNC */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDDOTCK */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDDEN */
|
||||||
|
at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDCC */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC9, 0); /* LCDD3 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC10, 0); /* LCDD4 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC11, 0); /* LCDD5 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC12, 0); /* LCDD6 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC13, 0); /* LCDD7 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC15, 0); /* LCDD11 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC16, 0); /* LCDD12 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC17, 0); /* LCDD13 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC18, 0); /* LCDD14 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC19, 0); /* LCDD15 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC20, 0); /* LCDD18 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC21, 0); /* LCDD19 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC22, 0); /* LCDD20 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC23, 0); /* LCDD21 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */
|
||||||
|
at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */
|
||||||
|
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_LCDC);
|
||||||
|
|
||||||
|
gd->fb_base = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int board_init(void)
|
||||||
|
{
|
||||||
|
/* Enable Ctrlc */
|
||||||
|
console_init_f();
|
||||||
|
|
||||||
|
/* arch number of AT91SAM9RLEK-Board */
|
||||||
|
gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9RLEK;
|
||||||
|
/* adress of boot parameters */
|
||||||
|
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
|
||||||
|
|
||||||
|
at91sam9rlek_serial_hw_init();
|
||||||
|
#ifdef CONFIG_CMD_NAND
|
||||||
|
at91sam9rlek_nand_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_HAS_DATAFLASH
|
||||||
|
at91sam9rlek_spi_hw_init();
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
at91sam9rlek_lcd_hw_init();
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dram_init(void)
|
||||||
|
{
|
||||||
|
gd->bd->bi_dram[0].start = PHYS_SDRAM;
|
||||||
|
gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
|
||||||
|
return 0;
|
||||||
|
}
|
1
board/atmel/at91sam9rlek/config.mk
Normal file
1
board/atmel/at91sam9rlek/config.mk
Normal file
|
@ -0,0 +1 @@
|
||||||
|
TEXT_BASE = 0x23f00000
|
77
board/atmel/at91sam9rlek/led.c
Normal file
77
board/atmel/at91sam9rlek/led.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.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 <asm/arch/at91sam9rl.h>
|
||||||
|
#include <asm/arch/at91_pmc.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/io.h>
|
||||||
|
|
||||||
|
#define RED_LED AT91_PIN_PD14 /* this is the power led */
|
||||||
|
#define GREEN_LED AT91_PIN_PD15 /* this is the user1 led */
|
||||||
|
#define YELLOW_LED AT91_PIN_PD16 /* this is the user2 led */
|
||||||
|
|
||||||
|
void red_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(RED_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void red_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(RED_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void green_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(GREEN_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void green_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(GREEN_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void yellow_LED_on(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void yellow_LED_off(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void coloured_LED_init(void)
|
||||||
|
{
|
||||||
|
/* Enable clock */
|
||||||
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9RL_ID_PIOD);
|
||||||
|
|
||||||
|
at91_set_gpio_output(RED_LED, 1);
|
||||||
|
at91_set_gpio_output(GREEN_LED, 1);
|
||||||
|
at91_set_gpio_output(YELLOW_LED, 1);
|
||||||
|
|
||||||
|
at91_set_gpio_value(RED_LED, 0);
|
||||||
|
at91_set_gpio_value(GREEN_LED, 1);
|
||||||
|
at91_set_gpio_value(YELLOW_LED, 1);
|
||||||
|
}
|
79
board/atmel/at91sam9rlek/nand.c
Normal file
79
board/atmel/at91sam9rlek/nand.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2007-2008
|
||||||
|
* Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||||
|
* Lead Tech Design <www.leadtechdesign.com>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
|
||||||
|
*
|
||||||
|
* 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 <asm/arch/at91sam9rl.h>
|
||||||
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/at91_pio.h>
|
||||||
|
|
||||||
|
#include <nand.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hardware specific access to control-lines
|
||||||
|
*/
|
||||||
|
#define MASK_ALE (1 << 21) /* our ALE is AD21 */
|
||||||
|
#define MASK_CLE (1 << 22) /* our CLE is AD22 */
|
||||||
|
|
||||||
|
static void at91sam9rlek_nand_hwcontrol(struct mtd_info *mtd, int cmd)
|
||||||
|
{
|
||||||
|
struct nand_chip *this = mtd->priv;
|
||||||
|
ulong IO_ADDR_W = (ulong) this->IO_ADDR_W;
|
||||||
|
|
||||||
|
IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);
|
||||||
|
switch (cmd) {
|
||||||
|
case NAND_CTL_SETCLE:
|
||||||
|
IO_ADDR_W |= MASK_CLE;
|
||||||
|
break;
|
||||||
|
case NAND_CTL_SETALE:
|
||||||
|
IO_ADDR_W |= MASK_ALE;
|
||||||
|
break;
|
||||||
|
case NAND_CTL_CLRNCE:
|
||||||
|
at91_set_gpio_value(AT91_PIN_PB6, 1);
|
||||||
|
break;
|
||||||
|
case NAND_CTL_SETNCE:
|
||||||
|
at91_set_gpio_value(AT91_PIN_PB6, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this->IO_ADDR_W = (void *) IO_ADDR_W;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int at91sam9rlek_nand_ready(struct mtd_info *mtd)
|
||||||
|
{
|
||||||
|
return at91_get_gpio_value(AT91_PIN_PD17);
|
||||||
|
}
|
||||||
|
|
||||||
|
int board_nand_init(struct nand_chip *nand)
|
||||||
|
{
|
||||||
|
nand->eccmode = NAND_ECC_SOFT;
|
||||||
|
#ifdef CFG_NAND_DBW_16
|
||||||
|
nand->options = NAND_BUSWIDTH_16;
|
||||||
|
#endif
|
||||||
|
nand->hwcontrol = at91sam9rlek_nand_hwcontrol;
|
||||||
|
nand->dev_ready = at91sam9rlek_nand_ready;
|
||||||
|
nand->chip_delay = 20;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
39
board/atmel/at91sam9rlek/partition.c
Normal file
39
board/atmel/at91sam9rlek/partition.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2008
|
||||||
|
* Ulf Samuelsson <ulf@atmel.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.
|
||||||
|
*
|
||||||
|
* 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/hardware.h>
|
||||||
|
#include <dataflash.h>
|
||||||
|
|
||||||
|
AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS];
|
||||||
|
|
||||||
|
struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = {
|
||||||
|
{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*define the area offsets*/
|
||||||
|
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
|
||||||
|
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"},
|
||||||
|
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"},
|
||||||
|
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"},
|
||||||
|
{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"},
|
||||||
|
{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"},
|
||||||
|
};
|
|
@ -25,12 +25,12 @@
|
||||||
#include <asm/sdram.h>
|
#include <asm/sdram.h>
|
||||||
#include <asm/arch/clk.h>
|
#include <asm/arch/clk.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/hmatrix2.h>
|
#include <asm/arch/hmatrix.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
static const struct sdram_info sdram = {
|
static const struct sdram_config sdram_config = {
|
||||||
.phys_addr = CFG_SDRAM_BASE,
|
.data_bits = SDRAM_DATA_16BIT,
|
||||||
.row_bits = 13,
|
.row_bits = 13,
|
||||||
.col_bits = 9,
|
.col_bits = 9,
|
||||||
.bank_bits = 2,
|
.bank_bits = 2,
|
||||||
|
@ -47,8 +47,8 @@ static const struct sdram_info sdram = {
|
||||||
|
|
||||||
int board_early_init_f(void)
|
int board_early_init_f(void)
|
||||||
{
|
{
|
||||||
/* Set the SDRAM_ENABLE bit in the HEBI SFR */
|
/* Enable SDRAM in the EBI mux */
|
||||||
hmatrix2_writel(SFR4, 1 << 1);
|
hmatrix_slave_write(EBI, SFR, HMATRIX_BIT(EBI_SDRAM_ENABLE));
|
||||||
|
|
||||||
gpio_enable_ebi();
|
gpio_enable_ebi();
|
||||||
gpio_enable_usart1();
|
gpio_enable_usart1();
|
||||||
|
@ -66,7 +66,22 @@ int board_early_init_f(void)
|
||||||
|
|
||||||
long int initdram(int board_type)
|
long int initdram(int board_type)
|
||||||
{
|
{
|
||||||
return sdram_init(&sdram);
|
unsigned long expected_size;
|
||||||
|
unsigned long actual_size;
|
||||||
|
void *sdram_base;
|
||||||
|
|
||||||
|
sdram_base = map_physmem(EBI_SDRAM_BASE, EBI_SDRAM_SIZE, MAP_NOCACHE);
|
||||||
|
|
||||||
|
expected_size = sdram_init(sdram_base, &sdram_config);
|
||||||
|
actual_size = get_ram_size(sdram_base, expected_size);
|
||||||
|
|
||||||
|
unmap_physmem(sdram_base, EBI_SDRAM_SIZE);
|
||||||
|
|
||||||
|
if (expected_size != actual_size)
|
||||||
|
printf("Warning: Only %u of %u MiB SDRAM is working\n",
|
||||||
|
actual_size >> 20, expected_size >> 20);
|
||||||
|
|
||||||
|
return actual_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void board_init_info(void)
|
void board_init_info(void)
|
||||||
|
|
|
@ -29,17 +29,10 @@ SECTIONS
|
||||||
. = 0;
|
. = 0;
|
||||||
_text = .;
|
_text = .;
|
||||||
.text : {
|
.text : {
|
||||||
|
*(.exception.text)
|
||||||
*(.text)
|
*(.text)
|
||||||
*(.text.*)
|
*(.text.*)
|
||||||
}
|
}
|
||||||
|
|
||||||
. = ALIGN(32);
|
|
||||||
__flashprog_start = .;
|
|
||||||
.flashprog : {
|
|
||||||
*(.flashprog)
|
|
||||||
}
|
|
||||||
. = ALIGN(32);
|
|
||||||
__flashprog_end = .;
|
|
||||||
_etext = .;
|
_etext = .;
|
||||||
|
|
||||||
.rodata : {
|
.rodata : {
|
||||||
|
|
|
@ -25,13 +25,39 @@
|
||||||
#include <asm/sdram.h>
|
#include <asm/sdram.h>
|
||||||
#include <asm/arch/clk.h>
|
#include <asm/arch/clk.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
#include <asm/arch/hmatrix2.h>
|
#include <asm/arch/hmatrix.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
static const struct sdram_info sdram = {
|
static const struct sdram_config sdram_config = {
|
||||||
.phys_addr = CFG_SDRAM_BASE,
|
#if defined(CONFIG_ATSTK1006)
|
||||||
|
/* Dual MT48LC16M16A2-7E (64 MB) on daughterboard */
|
||||||
|
.data_bits = SDRAM_DATA_32BIT,
|
||||||
|
.row_bits = 13,
|
||||||
|
.col_bits = 9,
|
||||||
|
.bank_bits = 2,
|
||||||
|
.cas = 2,
|
||||||
|
.twr = 2,
|
||||||
|
.trc = 7,
|
||||||
|
.trp = 2,
|
||||||
|
.trcd = 2,
|
||||||
|
.tras = 4,
|
||||||
|
.txsr = 7,
|
||||||
|
/* 7.81 us */
|
||||||
|
.refresh_period = (781 * (SDRAMC_BUS_HZ / 1000)) / 100000,
|
||||||
|
#else
|
||||||
|
/* MT48LC2M32B2P-5 (8 MB) on motherboard */
|
||||||
|
#ifdef CONFIG_ATSTK1004
|
||||||
|
.data_bits = SDRAM_DATA_16BIT,
|
||||||
|
#else
|
||||||
|
.data_bits = SDRAM_DATA_32BIT,
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_ATSTK1000_16MB_SDRAM
|
||||||
|
/* MT48LC4M32B2P-6 (16 MB) on mod'ed motherboard */
|
||||||
|
.row_bits = 12,
|
||||||
|
#else
|
||||||
.row_bits = 11,
|
.row_bits = 11,
|
||||||
|
#endif
|
||||||
.col_bits = 8,
|
.col_bits = 8,
|
||||||
.bank_bits = 2,
|
.bank_bits = 2,
|
||||||
.cas = 3,
|
.cas = 3,
|
||||||
|
@ -43,12 +69,13 @@ static const struct sdram_info sdram = {
|
||||||
.txsr = 5,
|
.txsr = 5,
|
||||||
/* 15.6 us */
|
/* 15.6 us */
|
||||||
.refresh_period = (156 * (SDRAMC_BUS_HZ / 1000)) / 10000,
|
.refresh_period = (156 * (SDRAMC_BUS_HZ / 1000)) / 10000,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
int board_early_init_f(void)
|
int board_early_init_f(void)
|
||||||
{
|
{
|
||||||
/* Set the SDRAM_ENABLE bit in the HEBI SFR */
|
/* Enable SDRAM in the EBI mux */
|
||||||
hmatrix2_writel(SFR4, 1 << 1);
|
hmatrix_slave_write(EBI, SFR, HMATRIX_BIT(EBI_SDRAM_ENABLE));
|
||||||
|
|
||||||
gpio_enable_ebi();
|
gpio_enable_ebi();
|
||||||
gpio_enable_usart1();
|
gpio_enable_usart1();
|
||||||
|
@ -65,7 +92,22 @@ int board_early_init_f(void)
|
||||||
|
|
||||||
long int initdram(int board_type)
|
long int initdram(int board_type)
|
||||||
{
|
{
|
||||||
return sdram_init(&sdram);
|
unsigned long expected_size;
|
||||||
|
unsigned long actual_size;
|
||||||
|
void *sdram_base;
|
||||||
|
|
||||||
|
sdram_base = map_physmem(EBI_SDRAM_BASE, EBI_SDRAM_SIZE, MAP_NOCACHE);
|
||||||
|
|
||||||
|
expected_size = sdram_init(sdram_base, &sdram_config);
|
||||||
|
actual_size = get_ram_size(sdram_base, expected_size);
|
||||||
|
|
||||||
|
unmap_physmem(sdram_base, EBI_SDRAM_SIZE);
|
||||||
|
|
||||||
|
if (expected_size != actual_size)
|
||||||
|
printf("Warning: Only %u of %u MiB SDRAM is working\n",
|
||||||
|
actual_size >> 20, expected_size >> 20);
|
||||||
|
|
||||||
|
return actual_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void board_init_info(void)
|
void board_init_info(void)
|
||||||
|
|
|
@ -30,7 +30,7 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
flash_info_t flash_info[1];
|
flash_info_t flash_info[1];
|
||||||
|
|
||||||
static void __flashprog flash_identify(uint16_t *flash, flash_info_t *info)
|
static void flash_identify(uint16_t *flash, flash_info_t *info)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ void flash_print_info(flash_info_t *info)
|
||||||
info->size >> 10, info->sector_count);
|
info->size >> 10, info->sector_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __flashprog flash_erase(flash_info_t *info, int s_first, int s_last)
|
int flash_erase(flash_info_t *info, int s_first, int s_last)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned long start_time;
|
unsigned long start_time;
|
||||||
|
@ -154,7 +154,7 @@ int __flashprog flash_erase(flash_info_t *info, int s_first, int s_last)
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __flashprog write_buff(flash_info_t *info, uchar *src,
|
int write_buff(flash_info_t *info, uchar *src,
|
||||||
ulong addr, ulong count)
|
ulong addr, ulong count)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
|
@ -29,17 +29,10 @@ SECTIONS
|
||||||
. = 0;
|
. = 0;
|
||||||
_text = .;
|
_text = .;
|
||||||
.text : {
|
.text : {
|
||||||
|
*(.exception.text)
|
||||||
*(.text)
|
*(.text)
|
||||||
*(.text.*)
|
*(.text.*)
|
||||||
}
|
}
|
||||||
|
|
||||||
. = ALIGN(32);
|
|
||||||
__flashprog_start = .;
|
|
||||||
.flashprog : {
|
|
||||||
*(.flashprog)
|
|
||||||
}
|
|
||||||
. = ALIGN(32);
|
|
||||||
__flashprog_end = .;
|
|
||||||
_etext = .;
|
_etext = .;
|
||||||
|
|
||||||
.rodata : {
|
.rodata : {
|
||||||
|
|
|
@ -52,7 +52,7 @@ int checkboard (void)
|
||||||
|
|
||||||
*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */
|
*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */
|
||||||
|
|
||||||
proc_id = read_32bit_cp0_register(CP0_PRID);
|
proc_id = read_c0_prid();
|
||||||
|
|
||||||
switch (proc_id >> 24) {
|
switch (proc_id >> 24) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -257,25 +257,24 @@ void sdram_init(void)
|
||||||
|
|
||||||
#define SPI_CS_MASK 0x80000000
|
#define SPI_CS_MASK 0x80000000
|
||||||
|
|
||||||
void spi_eeprom_chipsel(int cs)
|
int spi_cs_is_valid(unsigned int bus, unsigned int cs)
|
||||||
|
{
|
||||||
|
return bus == 0 && cs == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_cs_activate(struct spi_slave *slave)
|
||||||
{
|
{
|
||||||
volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0];
|
volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0];
|
||||||
|
|
||||||
if (cs)
|
iopd->dat &= ~SPI_CS_MASK;
|
||||||
iopd->dat &= ~SPI_CS_MASK;
|
|
||||||
else
|
|
||||||
iopd->dat |= SPI_CS_MASK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void spi_cs_deactivate(struct spi_slave *slave)
|
||||||
* The SPI command uses this table of functions for controlling the SPI
|
{
|
||||||
* chip selects.
|
volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0];
|
||||||
*/
|
|
||||||
spi_chipsel_type spi_chipsel[] = {
|
|
||||||
spi_eeprom_chipsel,
|
|
||||||
};
|
|
||||||
int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]);
|
|
||||||
|
|
||||||
|
iopd->dat |= SPI_CS_MASK;
|
||||||
|
}
|
||||||
#endif /* CONFIG_HARD_SPI */
|
#endif /* CONFIG_HARD_SPI */
|
||||||
|
|
||||||
#if defined(CONFIG_OF_BOARD_SETUP)
|
#if defined(CONFIG_OF_BOARD_SETUP)
|
||||||
|
|
|
@ -135,7 +135,7 @@ int checkboard (void)
|
||||||
|
|
||||||
*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */
|
*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */
|
||||||
|
|
||||||
proc_id = read_32bit_cp0_register(CP0_PRID);
|
proc_id = read_c0_prid();
|
||||||
|
|
||||||
switch (proc_id >> 24) {
|
switch (proc_id >> 24) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -51,7 +51,7 @@ int checkboard (void)
|
||||||
|
|
||||||
*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */
|
*sys_counter = 0x100; /* Enable 32 kHz oscillator for RTC/TOY */
|
||||||
|
|
||||||
proc_id = read_32bit_cp0_register(CP0_PRID);
|
proc_id = read_c0_prid();
|
||||||
|
|
||||||
switch (proc_id >> 24) {
|
switch (proc_id >> 24) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -38,7 +38,7 @@ int checkboard(void)
|
||||||
u32 proc_id;
|
u32 proc_id;
|
||||||
u32 config1;
|
u32 config1;
|
||||||
|
|
||||||
proc_id = read_32bit_cp0_register(CP0_PRID);
|
proc_id = read_c0_prid();
|
||||||
printf("Board: Qemu -M mips CPU: ");
|
printf("Board: Qemu -M mips CPU: ");
|
||||||
switch (proc_id) {
|
switch (proc_id) {
|
||||||
case 0x00018000:
|
case 0x00018000:
|
||||||
|
@ -51,7 +51,7 @@ int checkboard(void)
|
||||||
printf("4KEc");
|
printf("4KEc");
|
||||||
break;
|
break;
|
||||||
case 0x00019300:
|
case 0x00019300:
|
||||||
config1 = read_mips32_cp0_config1();
|
config1 = read_c0_config1();
|
||||||
if (config1 & 1)
|
if (config1 & 1)
|
||||||
printf("24Kf");
|
printf("24Kf");
|
||||||
else
|
else
|
||||||
|
@ -64,7 +64,7 @@ int checkboard(void)
|
||||||
printf("R4000");
|
printf("R4000");
|
||||||
break;
|
break;
|
||||||
case 0x00018100:
|
case 0x00018100:
|
||||||
config1 = read_mips32_cp0_config1();
|
config1 = read_c0_config1();
|
||||||
if (config1 & 1)
|
if (config1 & 1)
|
||||||
printf("5Kf");
|
printf("5Kf");
|
||||||
else
|
else
|
||||||
|
|
51
board/quad100hd/Makefile
Normal file
51
board/quad100hd/Makefile
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2007
|
||||||
|
# Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||||
|
#
|
||||||
|
# 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 $(TOPDIR)/config.mk
|
||||||
|
|
||||||
|
LIB = $(obj)lib$(BOARD).a
|
||||||
|
|
||||||
|
COBJS = $(BOARD).o nand.o
|
||||||
|
SOBJS =
|
||||||
|
|
||||||
|
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(COBJS))
|
||||||
|
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||||
|
|
||||||
|
$(LIB): $(OBJS) $(SOBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(SOBJS) $(OBJS)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f $(LIB) core *.bak .depend
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
# defines $(obj).depend target
|
||||||
|
include $(SRCTREE)/rules.mk
|
||||||
|
|
||||||
|
sinclude $(obj).depend
|
||||||
|
|
||||||
|
#########################################################################
|
24
board/quad100hd/config.mk
Normal file
24
board/quad100hd/config.mk
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2000
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
#
|
||||||
|
|
||||||
|
TEXT_BASE = 0xFFFC0000
|
79
board/quad100hd/nand.c
Normal file
79
board/quad100hd/nand.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2008
|
||||||
|
* Gary Jennejohn, DENX Software Engineering GmbH, garyj@denx.de
|
||||||
|
*
|
||||||
|
* 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>
|
||||||
|
#if defined(CONFIG_CMD_NAND)
|
||||||
|
#include <asm/gpio.h>
|
||||||
|
#include <nand.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hardware specific access to control-lines
|
||||||
|
*/
|
||||||
|
static void quad100hd_hwcontrol(struct mtd_info *mtd, int cmd)
|
||||||
|
{
|
||||||
|
switch(cmd) {
|
||||||
|
case NAND_CTL_SETCLE:
|
||||||
|
gpio_write_bit(CFG_NAND_CLE, 1);
|
||||||
|
break;
|
||||||
|
case NAND_CTL_CLRCLE:
|
||||||
|
gpio_write_bit(CFG_NAND_CLE, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NAND_CTL_SETALE:
|
||||||
|
gpio_write_bit(CFG_NAND_ALE, 1);
|
||||||
|
break;
|
||||||
|
case NAND_CTL_CLRALE:
|
||||||
|
gpio_write_bit(CFG_NAND_ALE, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NAND_CTL_SETNCE:
|
||||||
|
gpio_write_bit(CFG_NAND_CE, 0);
|
||||||
|
break;
|
||||||
|
case NAND_CTL_CLRNCE:
|
||||||
|
gpio_write_bit(CFG_NAND_CE, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int quad100hd_nand_ready(struct mtd_info *mtd)
|
||||||
|
{
|
||||||
|
return gpio_read_in_bit(CFG_NAND_RDY);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Main initialization routine
|
||||||
|
*/
|
||||||
|
int board_nand_init(struct nand_chip *nand)
|
||||||
|
{
|
||||||
|
/* Set address of hardware control function */
|
||||||
|
nand->hwcontrol = quad100hd_hwcontrol;
|
||||||
|
nand->dev_ready = quad100hd_nand_ready;
|
||||||
|
nand->eccmode = NAND_ECC_SOFT;
|
||||||
|
/* 15 us command delay time */
|
||||||
|
nand->chip_delay = 20;
|
||||||
|
|
||||||
|
/* Return happy */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_CMD_NAND */
|
93
board/quad100hd/quad100hd.c
Normal file
93
board/quad100hd/quad100hd.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2008
|
||||||
|
* Gary Jennejohn, DENX Software Engineering GmbH, garyj@denx.de.
|
||||||
|
*
|
||||||
|
* Based in part on board/icecube/icecube.c from PPCBoot
|
||||||
|
* (C) Copyright 2003 Intrinsyc Software
|
||||||
|
*
|
||||||
|
* 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 <malloc.h>
|
||||||
|
#include <environment.h>
|
||||||
|
#include <logbuff.h>
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#include <asm/processor.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/gpio.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
int board_early_init_f(void)
|
||||||
|
{
|
||||||
|
/* taken from PPCBoot */
|
||||||
|
mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */
|
||||||
|
mtdcr(uicer, 0x00000000); /* disable all ints */
|
||||||
|
mtdcr(uiccr, 0x00000000);
|
||||||
|
mtdcr(uicpr, 0xFFFF7FFE); /* set int polarities */
|
||||||
|
mtdcr(uictr, 0x00000000); /* set int trigger levels */
|
||||||
|
mtdcr(uicsr, 0xFFFFFFFF); /* clear all ints */
|
||||||
|
mtdcr(uicvcr, 0x00000001); /* set vect base=0,INT0 highest priority */
|
||||||
|
|
||||||
|
mtdcr(CPC0_SRR, 0x00040000); /* Hold PCI bridge in reset */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check Board Identity:
|
||||||
|
*/
|
||||||
|
int checkboard(void)
|
||||||
|
{
|
||||||
|
char *s = getenv("serial#");
|
||||||
|
#ifdef DISPLAY_BOARD_INFO
|
||||||
|
sys_info_t sysinfo;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
puts("Board: Quad100hd");
|
||||||
|
|
||||||
|
if (s != NULL) {
|
||||||
|
puts(", serial# ");
|
||||||
|
puts(s);
|
||||||
|
}
|
||||||
|
putc('\n');
|
||||||
|
|
||||||
|
#ifdef DISPLAY_BOARD_INFO
|
||||||
|
/* taken from ppcboot */
|
||||||
|
get_sys_info(&sysinfo);
|
||||||
|
|
||||||
|
printf("\tVCO: %lu MHz\n", sysinfo.freqVCOMhz);
|
||||||
|
printf("\tCPU: %lu MHz\n", sysinfo.freqProcessor / 1000000);
|
||||||
|
printf("\tPLB: %lu MHz\n", sysinfo.freqPLB / 1000000);
|
||||||
|
printf("\tOPB: %lu MHz\n", sysinfo.freqOPB / 1000000);
|
||||||
|
printf("\tEPB: %lu MHz\n", sysinfo.freqPLB / (sysinfo.pllExtBusDiv *
|
||||||
|
1000000));
|
||||||
|
printf("\tPCI: %lu MHz\n", sysinfo.freqPCI / 1000000);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
long int initdram(int board_type)
|
||||||
|
{
|
||||||
|
return CFG_SDRAM_SIZE;
|
||||||
|
}
|
133
board/quad100hd/u-boot.lds
Normal file
133
board/quad100hd/u-boot.lds
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2000
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
OUTPUT_ARCH(powerpc)
|
||||||
|
SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
|
||||||
|
/* Do we need any of these for elf?
|
||||||
|
__DYNAMIC = 0; */
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.resetvec 0xFFFFFFFC :
|
||||||
|
{
|
||||||
|
*(.resetvec)
|
||||||
|
} = 0xffff
|
||||||
|
|
||||||
|
/* Read-only sections, merged into text segment: */
|
||||||
|
. = + SIZEOF_HEADERS;
|
||||||
|
.interp : { *(.interp) }
|
||||||
|
.hash : { *(.hash) }
|
||||||
|
.dynsym : { *(.dynsym) }
|
||||||
|
.dynstr : { *(.dynstr) }
|
||||||
|
.rel.text : { *(.rel.text) }
|
||||||
|
.rela.text : { *(.rela.text) }
|
||||||
|
.rel.data : { *(.rel.data) }
|
||||||
|
.rela.data : { *(.rela.data) }
|
||||||
|
.rel.rodata : { *(.rel.rodata) }
|
||||||
|
.rela.rodata : { *(.rela.rodata) }
|
||||||
|
.rel.got : { *(.rel.got) }
|
||||||
|
.rela.got : { *(.rela.got) }
|
||||||
|
.rel.ctors : { *(.rel.ctors) }
|
||||||
|
.rela.ctors : { *(.rela.ctors) }
|
||||||
|
.rel.dtors : { *(.rel.dtors) }
|
||||||
|
.rela.dtors : { *(.rela.dtors) }
|
||||||
|
.rel.bss : { *(.rel.bss) }
|
||||||
|
.rela.bss : { *(.rela.bss) }
|
||||||
|
.rel.plt : { *(.rel.plt) }
|
||||||
|
.rela.plt : { *(.rela.plt) }
|
||||||
|
.init : { *(.init) }
|
||||||
|
.plt : { *(.plt) }
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
cpu/ppc4xx/start.o (.text)
|
||||||
|
|
||||||
|
*(.text)
|
||||||
|
*(.fixup)
|
||||||
|
*(.got1)
|
||||||
|
}
|
||||||
|
_etext = .;
|
||||||
|
PROVIDE (etext = .);
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
*(.rodata1)
|
||||||
|
*(.rodata.str1.4)
|
||||||
|
}
|
||||||
|
.fini : { *(.fini) } =0
|
||||||
|
.ctors : { *(.ctors) }
|
||||||
|
.dtors : { *(.dtors) }
|
||||||
|
|
||||||
|
/* Read-write section, merged into data segment: */
|
||||||
|
. = (. + 0x00FF) & 0xFFFFFF00;
|
||||||
|
_erotext = .;
|
||||||
|
PROVIDE (erotext = .);
|
||||||
|
.reloc :
|
||||||
|
{
|
||||||
|
*(.got)
|
||||||
|
_GOT2_TABLE_ = .;
|
||||||
|
*(.got2)
|
||||||
|
_FIXUP_TABLE_ = .;
|
||||||
|
*(.fixup)
|
||||||
|
}
|
||||||
|
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
|
||||||
|
__fixup_entries = (. - _FIXUP_TABLE_)>>2;
|
||||||
|
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
*(.data1)
|
||||||
|
*(.sdata)
|
||||||
|
*(.sdata2)
|
||||||
|
*(.dynamic)
|
||||||
|
CONSTRUCTORS
|
||||||
|
}
|
||||||
|
_edata = .;
|
||||||
|
PROVIDE (edata = .);
|
||||||
|
|
||||||
|
. = .;
|
||||||
|
__u_boot_cmd_start = .;
|
||||||
|
.u_boot_cmd : { *(.u_boot_cmd) }
|
||||||
|
__u_boot_cmd_end = .;
|
||||||
|
|
||||||
|
. = .;
|
||||||
|
__start___ex_table = .;
|
||||||
|
__ex_table : { *(__ex_table) }
|
||||||
|
__stop___ex_table = .;
|
||||||
|
|
||||||
|
. = ALIGN(256);
|
||||||
|
__init_begin = .;
|
||||||
|
.text.init : { *(.text.init) }
|
||||||
|
.data.init : { *(.data.init) }
|
||||||
|
. = ALIGN(256);
|
||||||
|
__init_end = .;
|
||||||
|
|
||||||
|
__bss_start = .;
|
||||||
|
.bss (NOLOAD) :
|
||||||
|
{
|
||||||
|
*(.sbss) *(.scommon)
|
||||||
|
*(.dynbss)
|
||||||
|
*(.bss)
|
||||||
|
*(COMMON)
|
||||||
|
}
|
||||||
|
_end = . ;
|
||||||
|
PROVIDE (end = .);
|
||||||
|
}
|
|
@ -842,36 +842,29 @@ void show_boot_progress (int status)
|
||||||
#define SPI_ADC_CS_MASK 0x00000800
|
#define SPI_ADC_CS_MASK 0x00000800
|
||||||
#define SPI_DAC_CS_MASK 0x00001000
|
#define SPI_DAC_CS_MASK 0x00001000
|
||||||
|
|
||||||
void spi_adc_chipsel(int cs)
|
static const u32 cs_mask[] = {
|
||||||
{
|
SPI_ADC_CS_MASK,
|
||||||
volatile ioport_t *iopd = ioport_addr((immap_t *)CFG_IMMR, 3 /* port D */);
|
SPI_DAC_CS_MASK,
|
||||||
|
|
||||||
if(cs)
|
|
||||||
iopd->pdat &= ~SPI_ADC_CS_MASK; /* activate the chip select */
|
|
||||||
else
|
|
||||||
iopd->pdat |= SPI_ADC_CS_MASK; /* deactivate the chip select */
|
|
||||||
}
|
|
||||||
|
|
||||||
void spi_dac_chipsel(int cs)
|
|
||||||
{
|
|
||||||
volatile ioport_t *iopd = ioport_addr((immap_t *)CFG_IMMR, 3 /* port D */);
|
|
||||||
|
|
||||||
if(cs)
|
|
||||||
iopd->pdat &= ~SPI_DAC_CS_MASK; /* activate the chip select */
|
|
||||||
else
|
|
||||||
iopd->pdat |= SPI_DAC_CS_MASK; /* deactivate the chip select */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The SPI command uses this table of functions for controlling the SPI
|
|
||||||
* chip selects: it calls the appropriate function to control the SPI
|
|
||||||
* chip selects.
|
|
||||||
*/
|
|
||||||
spi_chipsel_type spi_chipsel[] = {
|
|
||||||
spi_adc_chipsel,
|
|
||||||
spi_dac_chipsel
|
|
||||||
};
|
};
|
||||||
int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]);
|
|
||||||
|
int spi_cs_is_valid(unsigned int bus, unsigned int cs)
|
||||||
|
{
|
||||||
|
return bus == 0 && cs < sizeof(cs_mask) / sizeof(cs_mask[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_cs_activate(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
volatile ioport_t *iopd = ioport_addr((immap_t *)CFG_IMMR, 3 /* port D */);
|
||||||
|
|
||||||
|
iopd->pdat &= ~cs_mask[slave->cs];
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_cs_deactivate(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
volatile ioport_t *iopd = ioport_addr((immap_t *)CFG_IMMR, 3 /* port D */);
|
||||||
|
|
||||||
|
iopd->pdat |= cs_mask[slave->cs];
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -69,25 +69,24 @@ long int initdram (int board_type)
|
||||||
|
|
||||||
#define SPI_RTC_CS_MASK 0x00000001
|
#define SPI_RTC_CS_MASK 0x00000001
|
||||||
|
|
||||||
void spi_rtc_chipsel(int cs)
|
int spi_cs_is_valid(unsigned int bus, unsigned int cs)
|
||||||
|
{
|
||||||
|
return bus == 0 && cs == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_cs_activate(struct spi_slave *slave)
|
||||||
{
|
{
|
||||||
nios_spi_t *spi = (nios_spi_t *)CFG_NIOS_SPIBASE;
|
nios_spi_t *spi = (nios_spi_t *)CFG_NIOS_SPIBASE;
|
||||||
|
|
||||||
if (cs)
|
spi->slaveselect = SPI_RTC_CS_MASK; /* activate (1) */
|
||||||
spi->slaveselect = SPI_RTC_CS_MASK; /* activate (1) */
|
|
||||||
else
|
|
||||||
spi->slaveselect = 0; /* deactivate (0) */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void spi_cs_deactivate(struct spi_slave *slave)
|
||||||
* The SPI command uses this table of functions for controlling the SPI
|
{
|
||||||
* chip selects: it calls the appropriate function to control the SPI
|
nios_spi_t *spi = (nios_spi_t *)CFG_NIOS_SPIBASE;
|
||||||
* chip selects.
|
|
||||||
*/
|
spi->slaveselect = 0; /* deactivate (0) */
|
||||||
spi_chipsel_type spi_chipsel[] = {
|
}
|
||||||
spi_rtc_chipsel
|
|
||||||
};
|
|
||||||
int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -113,6 +113,7 @@ COBJS-y += env_dataflash.o
|
||||||
COBJS-y += env_flash.o
|
COBJS-y += env_flash.o
|
||||||
COBJS-y += env_eeprom.o
|
COBJS-y += env_eeprom.o
|
||||||
COBJS-y += env_onenand.o
|
COBJS-y += env_onenand.o
|
||||||
|
COBJS-y += env_sf.o
|
||||||
COBJS-y += env_nvram.o
|
COBJS-y += env_nvram.o
|
||||||
COBJS-y += env_nowhere.o
|
COBJS-y += env_nowhere.o
|
||||||
COBJS-y += exports.o
|
COBJS-y += exports.o
|
||||||
|
@ -143,6 +144,7 @@ COBJS-y += xyzModem.o
|
||||||
COBJS-y += cmd_mac.o
|
COBJS-y += cmd_mac.o
|
||||||
COBJS-$(CONFIG_CMD_MFSL) += cmd_mfsl.o
|
COBJS-$(CONFIG_CMD_MFSL) += cmd_mfsl.o
|
||||||
COBJS-$(CONFIG_MP) += cmd_mp.o
|
COBJS-$(CONFIG_MP) += cmd_mp.o
|
||||||
|
COBJS-$(CONFIG_CMD_SF) += cmd_sf.o
|
||||||
|
|
||||||
COBJS := $(COBJS-y)
|
COBJS := $(COBJS-y)
|
||||||
SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c)
|
SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c)
|
||||||
|
|
37
common/cmd_df.c
Normal file
37
common/cmd_df.c
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Command for accessing DataFlash.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Atmel Corporation
|
||||||
|
*/
|
||||||
|
#include <common.h>
|
||||||
|
#include <df.h>
|
||||||
|
|
||||||
|
static int do_df(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
const char *cmd;
|
||||||
|
|
||||||
|
/* need at least two arguments */
|
||||||
|
if (argc < 2)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
cmd = argv[1];
|
||||||
|
|
||||||
|
if (strcmp(cmd, "init") == 0) {
|
||||||
|
df_init(0, 0, 1000000);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(cmd, "info") == 0) {
|
||||||
|
df_show_info();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
usage:
|
||||||
|
printf("Usage:\n%s\n", cmdtp->usage);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
U_BOOT_CMD(
|
||||||
|
sf, 2, 1, do_serial_flash,
|
||||||
|
"sf - Serial flash sub-system\n",
|
||||||
|
"probe [bus:]cs - init flash device on given SPI bus and CS\n")
|
|
@ -66,6 +66,12 @@ static logbuff_t *log;
|
||||||
#endif
|
#endif
|
||||||
static char *lbuf;
|
static char *lbuf;
|
||||||
|
|
||||||
|
unsigned long __logbuffer_base(void)
|
||||||
|
{
|
||||||
|
return CFG_SDRAM_BASE + gd->bd->bi_memsize - LOGBUFF_LEN;
|
||||||
|
}
|
||||||
|
unsigned long logbuffer_base (void) __attribute__((weak, alias("__logbuffer_base")));
|
||||||
|
|
||||||
void logbuff_init_ptrs (void)
|
void logbuff_init_ptrs (void)
|
||||||
{
|
{
|
||||||
unsigned long tag, post_word;
|
unsigned long tag, post_word;
|
||||||
|
@ -75,7 +81,7 @@ void logbuff_init_ptrs (void)
|
||||||
log = (logbuff_t *)CONFIG_ALT_LH_ADDR;
|
log = (logbuff_t *)CONFIG_ALT_LH_ADDR;
|
||||||
lbuf = (char *)CONFIG_ALT_LB_ADDR;
|
lbuf = (char *)CONFIG_ALT_LB_ADDR;
|
||||||
#else
|
#else
|
||||||
log = (logbuff_t *)(gd->bd->bi_memsize-LOGBUFF_LEN) - 1;
|
log = (logbuff_t *)(logbuffer_base ()) - 1;
|
||||||
lbuf = (char *)log->buf;
|
lbuf = (char *)log->buf;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,6 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,
|
||||||
u8 *part_num, struct part_info **part);
|
u8 *part_num, struct part_info **part);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern nand_info_t nand_info[]; /* info for NAND chips */
|
|
||||||
|
|
||||||
static int nand_dump_oob(nand_info_t *nand, ulong off)
|
static int nand_dump_oob(nand_info_t *nand, ulong off)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -58,8 +58,9 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
!defined(CFG_ENV_IS_IN_DATAFLASH) && \
|
!defined(CFG_ENV_IS_IN_DATAFLASH) && \
|
||||||
!defined(CFG_ENV_IS_IN_NAND) && \
|
!defined(CFG_ENV_IS_IN_NAND) && \
|
||||||
!defined(CFG_ENV_IS_IN_ONENAND) && \
|
!defined(CFG_ENV_IS_IN_ONENAND) && \
|
||||||
|
!defined(CFG_ENV_IS_IN_SPI_FLASH) && \
|
||||||
!defined(CFG_ENV_IS_NOWHERE)
|
!defined(CFG_ENV_IS_NOWHERE)
|
||||||
# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|ONENAND|NOWHERE}
|
# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|ONENAND|SPI_FLASH|NOWHERE}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define XMK_STR(x) #x
|
#define XMK_STR(x) #x
|
||||||
|
|
191
common/cmd_sf.c
Normal file
191
common/cmd_sf.c
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
/*
|
||||||
|
* Command for accessing SPI flash.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Atmel Corporation
|
||||||
|
*/
|
||||||
|
#include <common.h>
|
||||||
|
#include <spi_flash.h>
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#ifndef CONFIG_SF_DEFAULT_SPEED
|
||||||
|
# define CONFIG_SF_DEFAULT_SPEED 1000000
|
||||||
|
#endif
|
||||||
|
#ifndef CONFIG_SF_DEFAULT_MODE
|
||||||
|
# define CONFIG_SF_DEFAULT_MODE SPI_MODE_3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct spi_flash *flash;
|
||||||
|
|
||||||
|
static int do_spi_flash_probe(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
unsigned int bus = 0;
|
||||||
|
unsigned int cs;
|
||||||
|
unsigned int speed = CONFIG_SF_DEFAULT_SPEED;
|
||||||
|
unsigned int mode = CONFIG_SF_DEFAULT_MODE;
|
||||||
|
char *endp;
|
||||||
|
struct spi_flash *new;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
cs = simple_strtoul(argv[1], &endp, 0);
|
||||||
|
if (*argv[1] == 0 || (*endp != 0 && *endp != ':'))
|
||||||
|
goto usage;
|
||||||
|
if (*endp == ':') {
|
||||||
|
if (endp[1] == 0)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
bus = cs;
|
||||||
|
cs = simple_strtoul(endp + 1, &endp, 0);
|
||||||
|
if (*endp != 0)
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc >= 3) {
|
||||||
|
speed = simple_strtoul(argv[2], &endp, 0);
|
||||||
|
if (*argv[2] == 0 || *endp != 0)
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
if (argc >= 4) {
|
||||||
|
mode = simple_strtoul(argv[3], &endp, 0);
|
||||||
|
if (*argv[3] == 0 || *endp != 0)
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
new = spi_flash_probe(bus, cs, speed, mode);
|
||||||
|
if (!new) {
|
||||||
|
printf("Failed to initialize SPI flash at %u:%u\n", bus, cs);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flash)
|
||||||
|
spi_flash_free(flash);
|
||||||
|
flash = new;
|
||||||
|
|
||||||
|
printf("%u KiB %s at %u:%u is now current device\n",
|
||||||
|
flash->size >> 10, flash->name, bus, cs);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
usage:
|
||||||
|
puts("Usage: sf probe [bus:]cs [hz] [mode]\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_spi_flash_read_write(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
unsigned long addr;
|
||||||
|
unsigned long offset;
|
||||||
|
unsigned long len;
|
||||||
|
void *buf;
|
||||||
|
char *endp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (argc < 4)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
addr = simple_strtoul(argv[1], &endp, 16);
|
||||||
|
if (*argv[1] == 0 || *endp != 0)
|
||||||
|
goto usage;
|
||||||
|
offset = simple_strtoul(argv[2], &endp, 16);
|
||||||
|
if (*argv[2] == 0 || *endp != 0)
|
||||||
|
goto usage;
|
||||||
|
len = simple_strtoul(argv[3], &endp, 16);
|
||||||
|
if (*argv[3] == 0 || *endp != 0)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
buf = map_physmem(addr, len, MAP_WRBACK);
|
||||||
|
if (!buf) {
|
||||||
|
puts("Failed to map physical memory\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(argv[0], "read") == 0)
|
||||||
|
ret = spi_flash_read(flash, offset, len, buf);
|
||||||
|
else
|
||||||
|
ret = spi_flash_write(flash, offset, len, buf);
|
||||||
|
|
||||||
|
unmap_physmem(buf, len);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
printf("SPI flash %s failed\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
usage:
|
||||||
|
printf("Usage: sf %s addr offset len\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_spi_flash_erase(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
unsigned long offset;
|
||||||
|
unsigned long len;
|
||||||
|
char *endp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
offset = simple_strtoul(argv[1], &endp, 16);
|
||||||
|
if (*argv[1] == 0 || *endp != 0)
|
||||||
|
goto usage;
|
||||||
|
len = simple_strtoul(argv[2], &endp, 16);
|
||||||
|
if (*argv[2] == 0 || *endp != 0)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
ret = spi_flash_erase(flash, offset, len);
|
||||||
|
if (ret) {
|
||||||
|
printf("SPI flash %s failed\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
usage:
|
||||||
|
puts("Usage: sf erase offset len\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_spi_flash(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
|
{
|
||||||
|
const char *cmd;
|
||||||
|
|
||||||
|
/* need at least two arguments */
|
||||||
|
if (argc < 2)
|
||||||
|
goto usage;
|
||||||
|
|
||||||
|
cmd = argv[1];
|
||||||
|
|
||||||
|
if (strcmp(cmd, "probe") == 0)
|
||||||
|
return do_spi_flash_probe(argc - 1, argv + 1);
|
||||||
|
|
||||||
|
/* The remaining commands require a selected device */
|
||||||
|
if (!flash) {
|
||||||
|
puts("No SPI flash selected. Please run `sf probe'\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(cmd, "read") == 0 || strcmp(cmd, "write") == 0)
|
||||||
|
return do_spi_flash_read_write(argc - 1, argv + 1);
|
||||||
|
if (strcmp(cmd, "erase") == 0)
|
||||||
|
return do_spi_flash_erase(argc - 1, argv + 1);
|
||||||
|
|
||||||
|
usage:
|
||||||
|
printf("Usage:\n%s\n", cmdtp->usage);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
U_BOOT_CMD(
|
||||||
|
sf, 5, 1, do_spi_flash,
|
||||||
|
"sf - SPI flash sub-system\n",
|
||||||
|
"probe [bus:]cs [hz] [mode] - init flash device on given SPI bus\n"
|
||||||
|
" and chip select\n"
|
||||||
|
"sf read addr offset len - read `len' bytes starting at\n"
|
||||||
|
" `offset' to memory at `addr'\n"
|
||||||
|
"sf write addr offset len - write `len' bytes from memory\n"
|
||||||
|
" at `addr' to flash at `offset'\n"
|
||||||
|
"sf erase offset len - erase `len' bytes from `offset'\n");
|
|
@ -37,20 +37,20 @@
|
||||||
# define MAX_SPI_BYTES 32 /* Maximum number of bytes we can handle */
|
# define MAX_SPI_BYTES 32 /* Maximum number of bytes we can handle */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#ifndef CONFIG_DEFAULT_SPI_BUS
|
||||||
* External table of chip select functions (see the appropriate board
|
# define CONFIG_DEFAULT_SPI_BUS 0
|
||||||
* support for the actual definition of the table).
|
#endif
|
||||||
*/
|
#ifndef CONFIG_DEFAULT_SPI_MODE
|
||||||
extern spi_chipsel_type spi_chipsel[];
|
# define CONFIG_DEFAULT_SPI_MODE SPI_MODE_0
|
||||||
extern int spi_chipsel_cnt;
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Values from last command.
|
* Values from last command.
|
||||||
*/
|
*/
|
||||||
static int device;
|
static unsigned int device;
|
||||||
static int bitlen;
|
static int bitlen;
|
||||||
static uchar dout[MAX_SPI_BYTES];
|
static uchar dout[MAX_SPI_BYTES];
|
||||||
static uchar din[MAX_SPI_BYTES];
|
static uchar din[MAX_SPI_BYTES];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SPI read/write
|
* SPI read/write
|
||||||
|
@ -65,6 +65,7 @@ static uchar din[MAX_SPI_BYTES];
|
||||||
|
|
||||||
int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
struct spi_slave *slave;
|
||||||
char *cp = 0;
|
char *cp = 0;
|
||||||
uchar tmp;
|
uchar tmp;
|
||||||
int j;
|
int j;
|
||||||
|
@ -101,19 +102,24 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((device < 0) || (device >= spi_chipsel_cnt)) {
|
|
||||||
printf("Invalid device %d, giving up.\n", device);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) {
|
if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) {
|
||||||
printf("Invalid bitlen %d, giving up.\n", bitlen);
|
printf("Invalid bitlen %d, giving up.\n", bitlen);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug ("spi_chipsel[%d] = %08X\n",
|
/* FIXME: Make these parameters run-time configurable */
|
||||||
device, (uint)spi_chipsel[device]);
|
slave = spi_setup_slave(CONFIG_DEFAULT_SPI_BUS, device, 1000000,
|
||||||
|
CONFIG_DEFAULT_SPI_MODE);
|
||||||
|
if (!slave) {
|
||||||
|
printf("Invalid device %d, giving up.\n", device);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if(spi_xfer(spi_chipsel[device], bitlen, dout, din) != 0) {
|
debug ("spi chipsel = %08X\n", device);
|
||||||
|
|
||||||
|
spi_claim_bus(slave);
|
||||||
|
if(spi_xfer(slave, bitlen, dout, din,
|
||||||
|
SPI_XFER_BEGIN | SPI_XFER_END) != 0) {
|
||||||
printf("Error with the SPI transaction.\n");
|
printf("Error with the SPI transaction.\n");
|
||||||
rcode = 1;
|
rcode = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -123,6 +129,8 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
spi_release_bus(slave);
|
||||||
|
spi_free_slave(slave);
|
||||||
|
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
#if 0 /* Moved to malloc.h */
|
#if 0 /* Moved to malloc.h */
|
||||||
/* ---------- To make a malloc.h, start cutting here ------------ */
|
/* ---------- To make a malloc.h, start cutting here ------------ */
|
||||||
|
|
||||||
|
@ -947,7 +949,6 @@ void malloc_stats();
|
||||||
#endif /* 0 */
|
#endif /* 0 */
|
||||||
|
|
||||||
#endif /* 0 */ /* Moved to malloc.h */
|
#endif /* 0 */ /* Moved to malloc.h */
|
||||||
#include <common.h>
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,8 @@ uchar default_environment[] = {
|
||||||
"\0"
|
"\0"
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(CFG_ENV_IS_IN_NAND) /* Environment is in Nand Flash */
|
#if defined(CFG_ENV_IS_IN_NAND) /* Environment is in Nand Flash */ \
|
||||||
|
|| defined(CFG_ENV_IS_IN_SPI_FLASH)
|
||||||
int default_environment_size = sizeof(default_environment);
|
int default_environment_size = sizeof(default_environment);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -57,9 +57,6 @@ int nand_legacy_rw (struct nand_chip* nand, int cmd,
|
||||||
size_t start, size_t len,
|
size_t start, size_t len,
|
||||||
size_t * retlen, u_char * buf);
|
size_t * retlen, u_char * buf);
|
||||||
|
|
||||||
/* info for NAND chips, defined in drivers/mtd/nand/nand.c */
|
|
||||||
extern nand_info_t nand_info[];
|
|
||||||
|
|
||||||
/* references to names in env_common.c */
|
/* references to names in env_common.c */
|
||||||
extern uchar default_environment[];
|
extern uchar default_environment[];
|
||||||
extern int default_environment_size;
|
extern int default_environment_size;
|
||||||
|
|
131
common/env_sf.c
Normal file
131
common/env_sf.c
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2000-2002
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||||
|
* Andreas Heppel <aheppel@sysgo.de>
|
||||||
|
*
|
||||||
|
* (C) Copyright 2008 Atmel 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
|
||||||
|
*/
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CFG_ENV_IS_IN_SPI_FLASH
|
||||||
|
|
||||||
|
#include <environment.h>
|
||||||
|
#include <spi_flash.h>
|
||||||
|
|
||||||
|
#ifndef CFG_ENV_SPI_BUS
|
||||||
|
# define CFG_ENV_SPI_BUS 0
|
||||||
|
#endif
|
||||||
|
#ifndef CFG_ENV_SPI_CS
|
||||||
|
# define CFG_ENV_SPI_CS 0
|
||||||
|
#endif
|
||||||
|
#ifndef CFG_ENV_SPI_MAX_HZ
|
||||||
|
# define CFG_ENV_SPI_MAX_HZ 1000000
|
||||||
|
#endif
|
||||||
|
#ifndef CFG_ENV_SPI_MODE
|
||||||
|
# define CFG_ENV_SPI_MODE SPI_MODE_3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
/* references to names in env_common.c */
|
||||||
|
extern uchar default_environment[];
|
||||||
|
extern int default_environment_size;
|
||||||
|
|
||||||
|
char * env_name_spec = "SPI Flash";
|
||||||
|
env_t *env_ptr;
|
||||||
|
|
||||||
|
static struct spi_flash *env_flash;
|
||||||
|
|
||||||
|
uchar env_get_char_spec(int index)
|
||||||
|
{
|
||||||
|
return *((uchar *)(gd->env_addr + index));
|
||||||
|
}
|
||||||
|
|
||||||
|
int saveenv(void)
|
||||||
|
{
|
||||||
|
if (!env_flash) {
|
||||||
|
puts("Environment SPI flash not initialized\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
puts("Erasing SPI flash...");
|
||||||
|
if (spi_flash_erase(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
puts("Writing to SPI flash...");
|
||||||
|
if (spi_flash_write(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE, env_ptr))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
puts("done\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void env_relocate_spec(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
env_flash = spi_flash_probe(CFG_ENV_SPI_BUS, CFG_ENV_SPI_CS,
|
||||||
|
CFG_ENV_SPI_MAX_HZ, CFG_ENV_SPI_MODE);
|
||||||
|
if (!env_flash)
|
||||||
|
goto err_probe;
|
||||||
|
|
||||||
|
ret = spi_flash_read(env_flash, CFG_ENV_OFFSET, CFG_ENV_SIZE, env_ptr);
|
||||||
|
if (ret)
|
||||||
|
goto err_read;
|
||||||
|
|
||||||
|
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
|
||||||
|
goto err_crc;
|
||||||
|
|
||||||
|
gd->env_valid = 1;
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
err_read:
|
||||||
|
spi_flash_free(env_flash);
|
||||||
|
env_flash = NULL;
|
||||||
|
err_probe:
|
||||||
|
err_crc:
|
||||||
|
puts("*** Warning - bad CRC, using default environment\n\n");
|
||||||
|
|
||||||
|
if (default_environment_size > CFG_ENV_SIZE) {
|
||||||
|
gd->env_valid = 0;
|
||||||
|
puts("*** Error - default environment is too large\n\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(env_ptr, 0, sizeof(env_t));
|
||||||
|
memcpy(env_ptr->data, default_environment, default_environment_size);
|
||||||
|
env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE);
|
||||||
|
gd->env_valid = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int env_init(void)
|
||||||
|
{
|
||||||
|
/* SPI flash isn't usable before relocation */
|
||||||
|
gd->env_addr = (ulong)&default_environment[0];
|
||||||
|
gd->env_valid = 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CFG_ENV_IS_IN_SPI_FLASH */
|
|
@ -35,6 +35,10 @@
|
||||||
#include <dataflash.h>
|
#include <dataflash.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_LOGBUFFER
|
||||||
|
#include <logbuff.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
|
#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
|
||||||
#include <rtc.h>
|
#include <rtc.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -1013,6 +1017,12 @@ int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
|
||||||
initrd_high = ~0;
|
initrd_high = ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_LOGBUFFER
|
||||||
|
/* Prevent initrd from overwriting logbuffer */
|
||||||
|
lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE);
|
||||||
|
#endif
|
||||||
|
|
||||||
debug ("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
|
debug ("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
|
||||||
initrd_high, initrd_copy_to_ram);
|
initrd_high, initrd_copy_to_ram);
|
||||||
|
|
||||||
|
|
78
common/lcd.c
78
common/lcd.c
|
@ -50,6 +50,11 @@
|
||||||
#include <lcdvideo.h>
|
#include <lcdvideo.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_ATMEL_LCD)
|
||||||
|
#include <atmel_lcdc.h>
|
||||||
|
#include <nand.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_LCD
|
#ifdef CONFIG_LCD
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
@ -474,14 +479,22 @@ ulong lcd_setmem (ulong addr)
|
||||||
|
|
||||||
static void lcd_setfgcolor (int color)
|
static void lcd_setfgcolor (int color)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_ATMEL_LCD
|
||||||
|
lcd_color_fg = color;
|
||||||
|
#else
|
||||||
lcd_color_fg = color & 0x0F;
|
lcd_color_fg = color & 0x0F;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void lcd_setbgcolor (int color)
|
static void lcd_setbgcolor (int color)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_ATMEL_LCD
|
||||||
|
lcd_color_bg = color;
|
||||||
|
#else
|
||||||
lcd_color_bg = color & 0x0F;
|
lcd_color_bg = color & 0x0F;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
@ -508,7 +521,11 @@ static int lcd_getbgcolor (void)
|
||||||
#ifdef CONFIG_LCD_LOGO
|
#ifdef CONFIG_LCD_LOGO
|
||||||
void bitmap_plot (int x, int y)
|
void bitmap_plot (int x, int y)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_ATMEL_LCD
|
||||||
|
uint *cmap;
|
||||||
|
#else
|
||||||
ushort *cmap;
|
ushort *cmap;
|
||||||
|
#endif
|
||||||
ushort i, j;
|
ushort i, j;
|
||||||
uchar *bmap;
|
uchar *bmap;
|
||||||
uchar *fb;
|
uchar *fb;
|
||||||
|
@ -533,6 +550,8 @@ void bitmap_plot (int x, int y)
|
||||||
cmap = (ushort *)fbi->palette;
|
cmap = (ushort *)fbi->palette;
|
||||||
#elif defined(CONFIG_MPC823)
|
#elif defined(CONFIG_MPC823)
|
||||||
cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]);
|
cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]);
|
||||||
|
#elif defined(CONFIG_ATMEL_LCD)
|
||||||
|
cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
WATCHDOG_RESET();
|
||||||
|
@ -540,11 +559,26 @@ void bitmap_plot (int x, int y)
|
||||||
/* Set color map */
|
/* Set color map */
|
||||||
for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) {
|
for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) {
|
||||||
ushort colreg = bmp_logo_palette[i];
|
ushort colreg = bmp_logo_palette[i];
|
||||||
|
#ifdef CONFIG_ATMEL_LCD
|
||||||
|
uint lut_entry;
|
||||||
|
#ifdef CONFIG_ATMEL_LCD_BGR555
|
||||||
|
lut_entry = ((colreg & 0x000F) << 11) |
|
||||||
|
((colreg & 0x00F0) << 2) |
|
||||||
|
((colreg & 0x0F00) >> 7);
|
||||||
|
#else /* CONFIG_ATMEL_LCD_RGB565 */
|
||||||
|
lut_entry = ((colreg & 0x000F) << 1) |
|
||||||
|
((colreg & 0x00F0) << 3) |
|
||||||
|
((colreg & 0x0F00) << 4);
|
||||||
|
#endif
|
||||||
|
*(cmap + BMP_LOGO_OFFSET) = lut_entry;
|
||||||
|
cmap++;
|
||||||
|
#else /* !CONFIG_ATMEL_LCD */
|
||||||
#ifdef CFG_INVERT_COLORS
|
#ifdef CFG_INVERT_COLORS
|
||||||
*cmap++ = 0xffff - colreg;
|
*cmap++ = 0xffff - colreg;
|
||||||
#else
|
#else
|
||||||
*cmap++ = colreg;
|
*cmap++ = colreg;
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* CONFIG_ATMEL_LCD */
|
||||||
}
|
}
|
||||||
|
|
||||||
WATCHDOG_RESET();
|
WATCHDOG_RESET();
|
||||||
|
@ -578,7 +612,9 @@ void bitmap_plot (int x, int y)
|
||||||
*/
|
*/
|
||||||
int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_MCC200)
|
#ifdef CONFIG_ATMEL_LCD
|
||||||
|
uint *cmap;
|
||||||
|
#elif !defined(CONFIG_MCC200)
|
||||||
ushort *cmap;
|
ushort *cmap;
|
||||||
#endif
|
#endif
|
||||||
ushort i, j;
|
ushort i, j;
|
||||||
|
@ -633,6 +669,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
|
||||||
cmap = (ushort *)fbi->palette;
|
cmap = (ushort *)fbi->palette;
|
||||||
#elif defined(CONFIG_MPC823)
|
#elif defined(CONFIG_MPC823)
|
||||||
cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);
|
cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);
|
||||||
|
#elif defined(CONFIG_ATMEL_LCD)
|
||||||
|
cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0));
|
||||||
#else
|
#else
|
||||||
# error "Don't know location of color map"
|
# error "Don't know location of color map"
|
||||||
#endif
|
#endif
|
||||||
|
@ -708,6 +746,10 @@ static void *lcd_logo (void)
|
||||||
#ifdef CONFIG_LCD_INFO
|
#ifdef CONFIG_LCD_INFO
|
||||||
char info[80];
|
char info[80];
|
||||||
char temp[32];
|
char temp[32];
|
||||||
|
#ifdef CONFIG_ATMEL_LCD
|
||||||
|
int i;
|
||||||
|
ulong dram_size, nand_size;
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_LCD_INFO */
|
#endif /* CONFIG_LCD_INFO */
|
||||||
|
|
||||||
#ifdef CONFIG_SPLASH_SCREEN
|
#ifdef CONFIG_SPLASH_SCREEN
|
||||||
|
@ -765,6 +807,40 @@ static void *lcd_logo (void)
|
||||||
# endif /* CONFIG_LCD_INFO */
|
# endif /* CONFIG_LCD_INFO */
|
||||||
#endif /* CONFIG_MPC823 */
|
#endif /* CONFIG_MPC823 */
|
||||||
|
|
||||||
|
#ifdef CONFIG_ATMEL_LCD
|
||||||
|
# ifdef CONFIG_LCD_INFO
|
||||||
|
sprintf (info, "%s", U_BOOT_VERSION);
|
||||||
|
lcd_drawchars (LCD_INFO_X, LCD_INFO_Y, (uchar *)info, strlen(info));
|
||||||
|
|
||||||
|
sprintf (info, "(C) 2008 ATMEL Corp");
|
||||||
|
lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT,
|
||||||
|
(uchar *)info, strlen(info));
|
||||||
|
|
||||||
|
sprintf (info, "at91support@atmel.com");
|
||||||
|
lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 2,
|
||||||
|
(uchar *)info, strlen(info));
|
||||||
|
|
||||||
|
sprintf (info, "%s CPU at %s MHz",
|
||||||
|
AT91_CPU_NAME,
|
||||||
|
strmhz(temp, AT91_MAIN_CLOCK));
|
||||||
|
lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 3,
|
||||||
|
(uchar *)info, strlen(info));
|
||||||
|
|
||||||
|
dram_size = 0;
|
||||||
|
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
|
||||||
|
dram_size += gd->bd->bi_dram[i].size;
|
||||||
|
nand_size = 0;
|
||||||
|
for (i = 0; i < CFG_MAX_NAND_DEVICE; i++)
|
||||||
|
nand_size += nand_info[i].size;
|
||||||
|
sprintf (info, " %ld MB SDRAM, %ld MB NAND",
|
||||||
|
dram_size >> 20,
|
||||||
|
nand_size >> 20 );
|
||||||
|
lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4,
|
||||||
|
(uchar *)info, strlen(info));
|
||||||
|
# endif /* CONFIG_LCD_INFO */
|
||||||
|
#endif /* CONFIG_ATMEL_LCD */
|
||||||
|
|
||||||
|
|
||||||
#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
|
#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
|
||||||
return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));
|
return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -940,12 +940,6 @@ int readline_into_buffer (const char *const prompt, char * buffer)
|
||||||
int rc;
|
int rc;
|
||||||
static int initted = 0;
|
static int initted = 0;
|
||||||
|
|
||||||
if (!initted) {
|
|
||||||
hist_init();
|
|
||||||
initted = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* History uses a global array which is not
|
* History uses a global array which is not
|
||||||
* writable until after relocation to RAM.
|
* writable until after relocation to RAM.
|
||||||
|
|
|
@ -252,6 +252,7 @@ static uchar read_byte(int ack)
|
||||||
* Read 8 bits, MSB first.
|
* Read 8 bits, MSB first.
|
||||||
*/
|
*/
|
||||||
I2C_TRISTATE;
|
I2C_TRISTATE;
|
||||||
|
I2C_SDA(1);
|
||||||
data = 0;
|
data = 0;
|
||||||
for(j = 0; j < 8; j++) {
|
for(j = 0; j < 8; j++) {
|
||||||
I2C_SCL(0);
|
I2C_SCL(0);
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
|
|
||||||
#if defined(CONFIG_SOFT_SPI)
|
#if defined(CONFIG_SOFT_SPI)
|
||||||
|
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
* Definitions
|
* Definitions
|
||||||
*/
|
*/
|
||||||
|
@ -39,6 +41,15 @@
|
||||||
#define PRINTD(fmt,args...)
|
#define PRINTD(fmt,args...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct soft_spi_slave {
|
||||||
|
struct spi_slave slave;
|
||||||
|
unsigned int mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline struct soft_spi_slave *to_soft_spi(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
return container_of(slave, struct soft_spi_slave, slave);
|
||||||
|
}
|
||||||
|
|
||||||
/*=====================================================================*/
|
/*=====================================================================*/
|
||||||
/* Public Functions */
|
/* Public Functions */
|
||||||
|
@ -56,6 +67,57 @@ void spi_init (void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
|
||||||
|
unsigned int max_hz, unsigned int mode)
|
||||||
|
{
|
||||||
|
struct soft_spi_slave *ss;
|
||||||
|
|
||||||
|
if (!spi_cs_is_valid(bus, cs))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ss = malloc(sizeof(struct soft_spi_slave));
|
||||||
|
if (!ss)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ss->slave.bus = bus;
|
||||||
|
ss->slave.cs = cs;
|
||||||
|
ss->mode = mode;
|
||||||
|
|
||||||
|
/* TODO: Use max_hz to limit the SCK rate */
|
||||||
|
|
||||||
|
return &ss->slave;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_free_slave(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
struct soft_spi_slave *ss = to_soft_spi(slave);
|
||||||
|
|
||||||
|
free(ss);
|
||||||
|
}
|
||||||
|
|
||||||
|
int spi_claim_bus(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
#ifdef CFG_IMMR
|
||||||
|
volatile immap_t *immr = (immap_t *)CFG_IMMR;
|
||||||
|
#endif
|
||||||
|
struct soft_spi_slave *ss = to_soft_spi(slave);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the SPI clock is in idle state as defined for
|
||||||
|
* this slave.
|
||||||
|
*/
|
||||||
|
if (ss->mode & SPI_CPOL)
|
||||||
|
SPI_SCL(1);
|
||||||
|
else
|
||||||
|
SPI_SCL(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_release_bus(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
/* Nothing to do */
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------
|
/*-----------------------------------------------------------------------
|
||||||
* SPI transfer
|
* SPI transfer
|
||||||
|
@ -68,50 +130,54 @@ void spi_init (void)
|
||||||
* and "din" can point to the same memory location, in which case the
|
* and "din" can point to the same memory location, in which case the
|
||||||
* input data overwrites the output data (since both are buffered by
|
* input data overwrites the output data (since both are buffered by
|
||||||
* temporary variables, this is OK).
|
* temporary variables, this is OK).
|
||||||
*
|
|
||||||
* If the chipsel() function is not NULL, it is called with a parameter
|
|
||||||
* of '1' (chip select active) at the start of the transfer and again with
|
|
||||||
* a parameter of '0' at the end of the transfer.
|
|
||||||
*
|
|
||||||
* If the chipsel() function _is_ NULL, it the responsibility of the
|
|
||||||
* caller to make the appropriate chip select active before calling
|
|
||||||
* spi_xfer() and making it inactive after spi_xfer() returns.
|
|
||||||
*/
|
*/
|
||||||
int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)
|
int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
|
||||||
|
const void *dout, void *din, unsigned long flags)
|
||||||
{
|
{
|
||||||
#ifdef CFG_IMMR
|
#ifdef CFG_IMMR
|
||||||
volatile immap_t *immr = (immap_t *)CFG_IMMR;
|
volatile immap_t *immr = (immap_t *)CFG_IMMR;
|
||||||
#endif
|
#endif
|
||||||
uchar tmpdin = 0;
|
struct soft_spi_slave *ss = to_soft_spi(slave);
|
||||||
uchar tmpdout = 0;
|
uchar tmpdin = 0;
|
||||||
int j;
|
uchar tmpdout = 0;
|
||||||
|
const u8 *txd = dout;
|
||||||
|
u8 *rxd = din;
|
||||||
|
int cpol = ss->mode & SPI_CPOL;
|
||||||
|
int cpha = ss->mode & SPI_CPHA;
|
||||||
|
unsigned int j;
|
||||||
|
|
||||||
PRINTD("spi_xfer: chipsel %08X dout %08X din %08X bitlen %d\n",
|
PRINTD("spi_xfer: slave %u:%u dout %08X din %08X bitlen %u\n",
|
||||||
(int)chipsel, *(uint *)dout, *(uint *)din, bitlen);
|
slave->bus, slave->cs, *(uint *)txd, *(uint *)rxd, bitlen);
|
||||||
|
|
||||||
if(chipsel != NULL) {
|
if (flags & SPI_XFER_BEGIN)
|
||||||
(*chipsel)(1); /* select the target chip */
|
spi_cs_activate(slave);
|
||||||
}
|
|
||||||
|
|
||||||
for(j = 0; j < bitlen; j++) {
|
for(j = 0; j < bitlen; j++) {
|
||||||
/*
|
/*
|
||||||
* Check if it is time to work on a new byte.
|
* Check if it is time to work on a new byte.
|
||||||
*/
|
*/
|
||||||
if((j % 8) == 0) {
|
if((j % 8) == 0) {
|
||||||
tmpdout = *dout++;
|
tmpdout = *txd++;
|
||||||
if(j != 0) {
|
if(j != 0) {
|
||||||
*din++ = tmpdin;
|
*rxd++ = tmpdin;
|
||||||
}
|
}
|
||||||
tmpdin = 0;
|
tmpdin = 0;
|
||||||
}
|
}
|
||||||
SPI_SCL(0);
|
|
||||||
|
if (!cpha)
|
||||||
|
SPI_SCL(!cpol);
|
||||||
SPI_SDA(tmpdout & 0x80);
|
SPI_SDA(tmpdout & 0x80);
|
||||||
SPI_DELAY;
|
SPI_DELAY;
|
||||||
SPI_SCL(1);
|
if (cpha)
|
||||||
|
SPI_SCL(!cpol);
|
||||||
|
else
|
||||||
|
SPI_SCL(cpol);
|
||||||
|
tmpdin <<= 1;
|
||||||
|
tmpdin |= SPI_READ;
|
||||||
|
tmpdout <<= 1;
|
||||||
SPI_DELAY;
|
SPI_DELAY;
|
||||||
tmpdin <<= 1;
|
if (cpha)
|
||||||
tmpdin |= SPI_READ;
|
SPI_SCL(cpol);
|
||||||
tmpdout <<= 1;
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* If the number of bits isn't a multiple of 8, shift the last
|
* If the number of bits isn't a multiple of 8, shift the last
|
||||||
|
@ -120,14 +186,10 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)
|
||||||
*/
|
*/
|
||||||
if((bitlen % 8) != 0)
|
if((bitlen % 8) != 0)
|
||||||
tmpdin <<= 8 - (bitlen % 8);
|
tmpdin <<= 8 - (bitlen % 8);
|
||||||
*din++ = tmpdin;
|
*rxd++ = tmpdin;
|
||||||
|
|
||||||
SPI_SCL(0); /* SPI wants the clock left low for idle */
|
if (flags & SPI_XFER_END)
|
||||||
|
spi_cs_deactivate(slave);
|
||||||
if(chipsel != NULL) {
|
|
||||||
(*chipsel)(0); /* deselect the target chip */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,7 +316,7 @@ invalidate_bats:
|
||||||
mtspr IBAT1U, r0
|
mtspr IBAT1U, r0
|
||||||
mtspr IBAT2U, r0
|
mtspr IBAT2U, r0
|
||||||
mtspr IBAT3U, r0
|
mtspr IBAT3U, r0
|
||||||
#ifdef CONFIG_750FX
|
#ifdef CONFIG_HIGH_BATS
|
||||||
mtspr IBAT4U, r0
|
mtspr IBAT4U, r0
|
||||||
mtspr IBAT5U, r0
|
mtspr IBAT5U, r0
|
||||||
mtspr IBAT6U, r0
|
mtspr IBAT6U, r0
|
||||||
|
@ -327,7 +327,7 @@ invalidate_bats:
|
||||||
mtspr DBAT1U, r0
|
mtspr DBAT1U, r0
|
||||||
mtspr DBAT2U, r0
|
mtspr DBAT2U, r0
|
||||||
mtspr DBAT3U, r0
|
mtspr DBAT3U, r0
|
||||||
#ifdef CONFIG_750FX
|
#ifdef CONFIG_HIGH_BATS
|
||||||
mtspr DBAT4U, r0
|
mtspr DBAT4U, r0
|
||||||
mtspr DBAT5U, r0
|
mtspr DBAT5U, r0
|
||||||
mtspr DBAT6U, r0
|
mtspr DBAT6U, r0
|
||||||
|
@ -414,7 +414,7 @@ setup_bats:
|
||||||
mtspr DBAT3U, r3
|
mtspr DBAT3U, r3
|
||||||
isync
|
isync
|
||||||
|
|
||||||
#ifdef CONFIG_750FX
|
#ifdef CONFIG_HIGH_BATS
|
||||||
/* IBAT 4 */
|
/* IBAT 4 */
|
||||||
addis r4, r0, CFG_IBAT4L@h
|
addis r4, r0, CFG_IBAT4L@h
|
||||||
ori r4, r4, CFG_IBAT4L@l
|
ori r4, r4, CFG_IBAT4L@l
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
PLATFORM_CPPFLAGS += -march=armv5te
|
PLATFORM_CPPFLAGS += -march=armv5te
|
||||||
PLATFORM_CPPFLAGS += $(call cc-option,-mtune=arm926ejs,)
|
PLATFORM_CPPFLAGS += $(call cc-option,-mtune=arm926ejs,)
|
||||||
|
LDSCRIPT := $(SRCTREE)/cpu/arm926ejs/at91sam9/u-boot.lds
|
||||||
|
|
|
@ -33,7 +33,11 @@ int usb_cpu_init(void)
|
||||||
{
|
{
|
||||||
/* Enable USB host clock. */
|
/* Enable USB host clock. */
|
||||||
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_UHP);
|
at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_UHP);
|
||||||
|
#ifdef CONFIG_AT91SAM9261
|
||||||
|
at91_sys_write(AT91_PMC_SCER, AT91_PMC_UHP | AT91_PMC_HCK0);
|
||||||
|
#else
|
||||||
at91_sys_write(AT91_PMC_SCER, AT91_PMC_UHP);
|
at91_sys_write(AT91_PMC_SCER, AT91_PMC_UHP);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +46,11 @@ int usb_cpu_stop(void)
|
||||||
{
|
{
|
||||||
/* Disable USB host clock. */
|
/* Disable USB host clock. */
|
||||||
at91_sys_write(AT91_PMC_PCDR, 1 << AT91_ID_UHP);
|
at91_sys_write(AT91_PMC_PCDR, 1 << AT91_ID_UHP);
|
||||||
|
#ifdef CONFIG_AT91SAM9261
|
||||||
|
at91_sys_write(AT91_PMC_SCDR, AT91_PMC_UHP | AT91_PMC_HCK0);
|
||||||
|
#else
|
||||||
at91_sys_write(AT91_PMC_SCDR, AT91_PMC_UHP);
|
at91_sys_write(AT91_PMC_SCDR, AT91_PMC_UHP);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,13 +27,19 @@ include $(TOPDIR)/config.mk
|
||||||
|
|
||||||
LIB := $(obj)lib$(CPU).a
|
LIB := $(obj)lib$(CPU).a
|
||||||
|
|
||||||
START := start.o
|
START-y += start.o
|
||||||
SOBJS := entry.o
|
|
||||||
COBJS := cpu.o hsdramc.o exception.o cache.o
|
COBJS-y += cpu.o
|
||||||
COBJS += interrupts.o pio.o atmel_mci.o
|
COBJS-y += hsdramc.o
|
||||||
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
COBJS-y += exception.o
|
||||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
COBJS-y += cache.o
|
||||||
START := $(addprefix $(obj),$(START))
|
COBJS-y += interrupts.o
|
||||||
|
COBJS-y += pio.o
|
||||||
|
COBJS-$(CONFIG_MMC) += atmel_mci.o
|
||||||
|
|
||||||
|
SRCS := $(START-y:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
|
||||||
|
START := $(addprefix $(obj),$(START-y))
|
||||||
|
|
||||||
all: $(obj).depend $(START) $(LIB)
|
all: $(obj).depend $(START) $(LIB)
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ include $(TOPDIR)/config.mk
|
||||||
|
|
||||||
LIB := $(obj)lib$(SOC).a
|
LIB := $(obj)lib$(SOC).a
|
||||||
|
|
||||||
COBJS := gpio.o
|
COBJS := gpio.o clk.o
|
||||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||||
|
|
||||||
|
|
68
cpu/at32ap/at32ap700x/clk.c
Normal file
68
cpu/at32ap/at32ap700x/clk.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2008 Atmel 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
|
||||||
|
*/
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#include <asm/arch/clk.h>
|
||||||
|
#include <asm/arch/memory-map.h>
|
||||||
|
|
||||||
|
#include "sm.h"
|
||||||
|
|
||||||
|
void clk_init(void)
|
||||||
|
{
|
||||||
|
uint32_t cksel;
|
||||||
|
|
||||||
|
/* in case of soft resets, disable watchdog */
|
||||||
|
sm_writel(WDT_CTRL, SM_BF(KEY, 0x55));
|
||||||
|
sm_writel(WDT_CTRL, SM_BF(KEY, 0xaa));
|
||||||
|
|
||||||
|
#ifdef CONFIG_PLL
|
||||||
|
/* Initialize the PLL */
|
||||||
|
sm_writel(PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES)
|
||||||
|
| SM_BF(PLLMUL, CFG_PLL0_MUL - 1)
|
||||||
|
| SM_BF(PLLDIV, CFG_PLL0_DIV - 1)
|
||||||
|
| SM_BF(PLLOPT, CFG_PLL0_OPT)
|
||||||
|
| SM_BF(PLLOSC, 0)
|
||||||
|
| SM_BIT(PLLEN)));
|
||||||
|
|
||||||
|
/* Wait for lock */
|
||||||
|
while (!(sm_readl(PM_ISR) & SM_BIT(LOCK0))) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set up clocks for the CPU and all peripheral buses */
|
||||||
|
cksel = 0;
|
||||||
|
if (CFG_CLKDIV_CPU)
|
||||||
|
cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1);
|
||||||
|
if (CFG_CLKDIV_HSB)
|
||||||
|
cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1);
|
||||||
|
if (CFG_CLKDIV_PBA)
|
||||||
|
cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1);
|
||||||
|
if (CFG_CLKDIV_PBB)
|
||||||
|
cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1);
|
||||||
|
sm_writel(PM_CKSEL, cksel);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PLL
|
||||||
|
/* Use PLL0 as main clock */
|
||||||
|
sm_writel(PM_MCCTRL, SM_BIT(PLLSEL));
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -21,8 +21,11 @@
|
||||||
*/
|
*/
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
#include <asm/arch/chip-features.h>
|
#include <asm/arch/chip-features.h>
|
||||||
#include <asm/arch/gpio.h>
|
#include <asm/arch/gpio.h>
|
||||||
|
#include <asm/arch/memory-map.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lots of small functions here. We depend on --gc-sections getting
|
* Lots of small functions here. We depend on --gc-sections getting
|
||||||
|
@ -142,3 +145,43 @@ void gpio_enable_mmci(void)
|
||||||
gpio_select_periph_A(GPIO_PIN_PA15, 0); /* DATA3 */
|
gpio_select_periph_A(GPIO_PIN_PA15, 0); /* DATA3 */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef AT32AP700x_CHIP_HAS_SPI
|
||||||
|
void gpio_enable_spi0(unsigned long cs_mask)
|
||||||
|
{
|
||||||
|
u32 pa_mask = 0;
|
||||||
|
|
||||||
|
gpio_select_periph_A(GPIO_PIN_PA0, 0); /* MISO */
|
||||||
|
gpio_select_periph_A(GPIO_PIN_PA1, 0); /* MOSI */
|
||||||
|
gpio_select_periph_A(GPIO_PIN_PA2, 0); /* SCK */
|
||||||
|
|
||||||
|
if (cs_mask & (1 << 0))
|
||||||
|
pa_mask |= 1 << 3; /* NPCS0 */
|
||||||
|
if (cs_mask & (1 << 1))
|
||||||
|
pa_mask |= 1 << 4; /* NPCS1 */
|
||||||
|
if (cs_mask & (1 << 2))
|
||||||
|
pa_mask |= 1 << 5; /* NPCS2 */
|
||||||
|
if (cs_mask & (1 << 3))
|
||||||
|
pa_mask |= 1 << 20; /* NPCS3 */
|
||||||
|
|
||||||
|
__raw_writel(pa_mask, PIOA_BASE + 0x00);
|
||||||
|
__raw_writel(pa_mask, PIOA_BASE + 0x30);
|
||||||
|
__raw_writel(pa_mask, PIOA_BASE + 0x10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gpio_enable_spi1(unsigned long cs_mask)
|
||||||
|
{
|
||||||
|
gpio_select_periph_B(GPIO_PIN_PA0, 0); /* MISO */
|
||||||
|
gpio_select_periph_B(GPIO_PIN_PB1, 0); /* MOSI */
|
||||||
|
gpio_select_periph_B(GPIO_PIN_PB5, 0); /* SCK */
|
||||||
|
|
||||||
|
if (cs_mask & (1 << 0))
|
||||||
|
gpio_select_periph_B(GPIO_PIN_PB2, 0); /* NPCS0 */
|
||||||
|
if (cs_mask & (1 << 1))
|
||||||
|
gpio_select_periph_B(GPIO_PIN_PB3, 0); /* NPCS1 */
|
||||||
|
if (cs_mask & (1 << 2))
|
||||||
|
gpio_select_periph_B(GPIO_PIN_PB4, 0); /* NPCS2 */
|
||||||
|
if (cs_mask & (1 << 3))
|
||||||
|
gpio_select_periph_A(GPIO_PIN_PA27, 0); /* NPCS3 */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
*/
|
*/
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
|
||||||
#ifdef CONFIG_MMC
|
|
||||||
|
|
||||||
#include <part.h>
|
#include <part.h>
|
||||||
#include <mmc.h>
|
#include <mmc.h>
|
||||||
|
|
||||||
|
@ -139,7 +137,7 @@ mmc_cmd(unsigned long cmd, unsigned long arg,
|
||||||
|
|
||||||
pr_debug("mmc: status 0x%08lx\n", status);
|
pr_debug("mmc: status 0x%08lx\n", status);
|
||||||
|
|
||||||
if (status & ERROR_FLAGS) {
|
if (status & error_flags) {
|
||||||
printf("mmc: command %lu failed (status: 0x%08lx)\n",
|
printf("mmc: command %lu failed (status: 0x%08lx)\n",
|
||||||
cmd, status);
|
cmd, status);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
@ -182,12 +180,13 @@ static int mmc_acmd(unsigned long cmd, unsigned long arg,
|
||||||
|
|
||||||
static unsigned long
|
static unsigned long
|
||||||
mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,
|
mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,
|
||||||
unsigned long *buffer)
|
void *buffer)
|
||||||
{
|
{
|
||||||
int ret, i = 0;
|
int ret, i = 0;
|
||||||
unsigned long resp[4];
|
unsigned long resp[4];
|
||||||
unsigned long card_status, data;
|
unsigned long card_status, data;
|
||||||
unsigned long wordcount;
|
unsigned long wordcount;
|
||||||
|
u32 *p = buffer;
|
||||||
u32 status;
|
u32 status;
|
||||||
|
|
||||||
if (blkcnt == 0)
|
if (blkcnt == 0)
|
||||||
|
@ -225,7 +224,7 @@ mmc_bread(int dev, unsigned long start, lbaint_t blkcnt,
|
||||||
if (status & MMCI_BIT(RXRDY)) {
|
if (status & MMCI_BIT(RXRDY)) {
|
||||||
data = mmci_readl(RDR);
|
data = mmci_readl(RDR);
|
||||||
/* pr_debug("%x\n", data); */
|
/* pr_debug("%x\n", data); */
|
||||||
*buffer++ = data;
|
*p++ = data;
|
||||||
wordcount++;
|
wordcount++;
|
||||||
}
|
}
|
||||||
} while(wordcount < (mmc_blkdev.blksz / 4));
|
} while(wordcount < (mmc_blkdev.blksz / 4));
|
||||||
|
@ -443,6 +442,7 @@ static void mci_set_data_timeout(struct mmc_csd *csd)
|
||||||
|
|
||||||
dtocyc = timeout_clks;
|
dtocyc = timeout_clks;
|
||||||
dtomul = 0;
|
dtomul = 0;
|
||||||
|
shift = 0;
|
||||||
while (dtocyc > 15 && dtomul < 8) {
|
while (dtocyc > 15 && dtomul < 8) {
|
||||||
dtomul++;
|
dtomul++;
|
||||||
shift = dtomul_to_shift[dtomul];
|
shift = dtomul_to_shift[dtomul];
|
||||||
|
@ -546,5 +546,3 @@ int mmc2info(ulong addr)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_MMC */
|
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include <asm/arch/memory-map.h>
|
#include <asm/arch/memory-map.h>
|
||||||
|
|
||||||
#include "hsmc3.h"
|
#include "hsmc3.h"
|
||||||
#include "sm.h"
|
|
||||||
|
|
||||||
/* Sanity checks */
|
/* Sanity checks */
|
||||||
#if (CFG_CLKDIV_CPU > CFG_CLKDIV_HSB) \
|
#if (CFG_CLKDIV_CPU > CFG_CLKDIV_HSB) \
|
||||||
|
@ -44,47 +43,9 @@
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
static void pm_init(void)
|
|
||||||
{
|
|
||||||
uint32_t cksel;
|
|
||||||
|
|
||||||
#ifdef CONFIG_PLL
|
|
||||||
/* Initialize the PLL */
|
|
||||||
sm_writel(PM_PLL0, (SM_BF(PLLCOUNT, CFG_PLL0_SUPPRESS_CYCLES)
|
|
||||||
| SM_BF(PLLMUL, CFG_PLL0_MUL - 1)
|
|
||||||
| SM_BF(PLLDIV, CFG_PLL0_DIV - 1)
|
|
||||||
| SM_BF(PLLOPT, CFG_PLL0_OPT)
|
|
||||||
| SM_BF(PLLOSC, 0)
|
|
||||||
| SM_BIT(PLLEN)));
|
|
||||||
|
|
||||||
/* Wait for lock */
|
|
||||||
while (!(sm_readl(PM_ISR) & SM_BIT(LOCK0))) ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Set up clocks for the CPU and all peripheral buses */
|
|
||||||
cksel = 0;
|
|
||||||
if (CFG_CLKDIV_CPU)
|
|
||||||
cksel |= SM_BIT(CPUDIV) | SM_BF(CPUSEL, CFG_CLKDIV_CPU - 1);
|
|
||||||
if (CFG_CLKDIV_HSB)
|
|
||||||
cksel |= SM_BIT(HSBDIV) | SM_BF(HSBSEL, CFG_CLKDIV_HSB - 1);
|
|
||||||
if (CFG_CLKDIV_PBA)
|
|
||||||
cksel |= SM_BIT(PBADIV) | SM_BF(PBASEL, CFG_CLKDIV_PBA - 1);
|
|
||||||
if (CFG_CLKDIV_PBB)
|
|
||||||
cksel |= SM_BIT(PBBDIV) | SM_BF(PBBSEL, CFG_CLKDIV_PBB - 1);
|
|
||||||
sm_writel(PM_CKSEL, cksel);
|
|
||||||
|
|
||||||
gd->cpu_hz = get_cpu_clk_rate();
|
|
||||||
|
|
||||||
#ifdef CONFIG_PLL
|
|
||||||
/* Use PLL0 as main clock */
|
|
||||||
sm_writel(PM_MCCTRL, SM_BIT(PLLSEL));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int cpu_init(void)
|
int cpu_init(void)
|
||||||
{
|
{
|
||||||
extern void _evba(void);
|
extern void _evba(void);
|
||||||
char *p;
|
|
||||||
|
|
||||||
gd->cpu_hz = CFG_OSC0_HZ;
|
gd->cpu_hz = CFG_OSC0_HZ;
|
||||||
|
|
||||||
|
@ -95,16 +56,15 @@ int cpu_init(void)
|
||||||
hsmc3_writel(PULSE0, 0x0b0a0906);
|
hsmc3_writel(PULSE0, 0x0b0a0906);
|
||||||
hsmc3_writel(SETUP0, 0x00010002);
|
hsmc3_writel(SETUP0, 0x00010002);
|
||||||
|
|
||||||
pm_init();
|
clk_init();
|
||||||
|
|
||||||
|
/* Update the CPU speed according to the PLL configuration */
|
||||||
|
gd->cpu_hz = get_cpu_clk_rate();
|
||||||
|
|
||||||
|
/* Set up the exception handler table and enable exceptions */
|
||||||
sysreg_write(EVBA, (unsigned long)&_evba);
|
sysreg_write(EVBA, (unsigned long)&_evba);
|
||||||
asm volatile("csrf %0" : : "i"(SYSREG_EM_OFFSET));
|
asm volatile("csrf %0" : : "i"(SYSREG_EM_OFFSET));
|
||||||
|
|
||||||
/* Lock everything that mess with the flash in the icache */
|
|
||||||
for (p = __flashprog_start; p <= (__flashprog_end + CFG_ICACHE_LINESZ);
|
|
||||||
p += CFG_ICACHE_LINESZ)
|
|
||||||
asm volatile("cache %0, 0x02" : "=m"(*p) :: "memory");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2004-2006 Atmel 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
|
|
||||||
*/
|
|
||||||
#include <asm/sysreg.h>
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
|
|
||||||
.section .text.exception,"ax"
|
|
||||||
.global _evba
|
|
||||||
.type _evba,@function
|
|
||||||
.align 10
|
|
||||||
_evba:
|
|
||||||
.irp x,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
|
|
||||||
.align 2
|
|
||||||
rjmp unknown_exception
|
|
||||||
.endr
|
|
||||||
|
|
||||||
.global timer_interrupt_handler
|
|
||||||
.type timer_interrupt_handler,@function
|
|
||||||
.align 2
|
|
||||||
timer_interrupt_handler:
|
|
||||||
/*
|
|
||||||
* Increment timer_overflow and re-write COMPARE with 0xffffffff.
|
|
||||||
*
|
|
||||||
* We're running at interrupt level 3, so we don't need to save
|
|
||||||
* r8-r12 or lr to the stack.
|
|
||||||
*/
|
|
||||||
lda.w r8, timer_overflow
|
|
||||||
ld.w r9, r8[0]
|
|
||||||
mov r10, -1
|
|
||||||
mtsr SYSREG_COMPARE, r10
|
|
||||||
sub r9, -1
|
|
||||||
st.w r8[0], r9
|
|
||||||
rete
|
|
||||||
|
|
||||||
.type unknown_exception, @function
|
|
||||||
unknown_exception:
|
|
||||||
pushm r0-r12
|
|
||||||
sub r8, sp, REG_R12 - REG_R0 - 4
|
|
||||||
mov r9, lr
|
|
||||||
mfsr r10, SYSREG_RAR_EX
|
|
||||||
mfsr r11, SYSREG_RSR_EX
|
|
||||||
pushm r8-r11
|
|
||||||
mfsr r12, SYSREG_ECR
|
|
||||||
mov r11, sp
|
|
||||||
rcall do_unknown_exception
|
|
||||||
1: rjmp 1b
|
|
|
@ -111,7 +111,8 @@ void do_unknown_exception(unsigned int ecr, struct pt_regs *regs)
|
||||||
printf("CPU Mode: %s\n", cpu_modes[mode]);
|
printf("CPU Mode: %s\n", cpu_modes[mode]);
|
||||||
|
|
||||||
/* Avoid exception loops */
|
/* Avoid exception loops */
|
||||||
if (regs->sp < CFG_SDRAM_BASE || regs->sp >= gd->stack_end)
|
if (regs->sp < (gd->stack_end - CONFIG_STACKSIZE)
|
||||||
|
|| regs->sp >= gd->stack_end)
|
||||||
printf("\nStack pointer seems bogus, won't do stack dump\n");
|
printf("\nStack pointer seems bogus, won't do stack dump\n");
|
||||||
else
|
else
|
||||||
dump_mem("\nStack: ", regs->sp, gd->stack_end);
|
dump_mem("\nStack: ", regs->sp, gd->stack_end);
|
||||||
|
|
|
@ -30,39 +30,32 @@
|
||||||
|
|
||||||
#include "hsdramc1.h"
|
#include "hsdramc1.h"
|
||||||
|
|
||||||
unsigned long sdram_init(const struct sdram_info *info)
|
unsigned long sdram_init(void *sdram_base, const struct sdram_config *config)
|
||||||
{
|
{
|
||||||
unsigned long *sdram = (unsigned long *)uncached(info->phys_addr);
|
|
||||||
unsigned long sdram_size;
|
unsigned long sdram_size;
|
||||||
unsigned long tmp;
|
uint32_t cfgreg;
|
||||||
unsigned long bus_hz;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (!info->refresh_period)
|
cfgreg = (HSDRAMC1_BF(NC, config->col_bits - 8)
|
||||||
panic("ERROR: SDRAM refresh period == 0. "
|
| HSDRAMC1_BF(NR, config->row_bits - 11)
|
||||||
"Please update the board code\n");
|
| HSDRAMC1_BF(NB, config->bank_bits - 1)
|
||||||
|
| HSDRAMC1_BF(CAS, config->cas)
|
||||||
|
| HSDRAMC1_BF(TWR, config->twr)
|
||||||
|
| HSDRAMC1_BF(TRC, config->trc)
|
||||||
|
| HSDRAMC1_BF(TRP, config->trp)
|
||||||
|
| HSDRAMC1_BF(TRCD, config->trcd)
|
||||||
|
| HSDRAMC1_BF(TRAS, config->tras)
|
||||||
|
| HSDRAMC1_BF(TXSR, config->txsr));
|
||||||
|
|
||||||
tmp = (HSDRAMC1_BF(NC, info->col_bits - 8)
|
if (config->data_bits == SDRAM_DATA_16BIT)
|
||||||
| HSDRAMC1_BF(NR, info->row_bits - 11)
|
cfgreg |= HSDRAMC1_BIT(DBW);
|
||||||
| HSDRAMC1_BF(NB, info->bank_bits - 1)
|
|
||||||
| HSDRAMC1_BF(CAS, info->cas)
|
|
||||||
| HSDRAMC1_BF(TWR, info->twr)
|
|
||||||
| HSDRAMC1_BF(TRC, info->trc)
|
|
||||||
| HSDRAMC1_BF(TRP, info->trp)
|
|
||||||
| HSDRAMC1_BF(TRCD, info->trcd)
|
|
||||||
| HSDRAMC1_BF(TRAS, info->tras)
|
|
||||||
| HSDRAMC1_BF(TXSR, info->txsr));
|
|
||||||
|
|
||||||
#ifdef CFG_SDRAM_16BIT
|
hsdramc1_writel(CR, cfgreg);
|
||||||
tmp |= HSDRAMC1_BIT(DBW);
|
|
||||||
sdram_size = 1 << (info->row_bits + info->col_bits
|
|
||||||
+ info->bank_bits + 1);
|
|
||||||
#else
|
|
||||||
sdram_size = 1 << (info->row_bits + info->col_bits
|
|
||||||
+ info->bank_bits + 2);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hsdramc1_writel(CR, tmp);
|
/* Send a NOP to turn on the clock (necessary on some chips) */
|
||||||
|
hsdramc1_writel(MR, HSDRAMC1_MODE_NOP);
|
||||||
|
hsdramc1_readl(MR);
|
||||||
|
writel(0, sdram_base);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialization sequence for SDRAM, from the data sheet:
|
* Initialization sequence for SDRAM, from the data sheet:
|
||||||
|
@ -77,7 +70,7 @@ unsigned long sdram_init(const struct sdram_info *info)
|
||||||
*/
|
*/
|
||||||
hsdramc1_writel(MR, HSDRAMC1_MODE_BANKS_PRECHARGE);
|
hsdramc1_writel(MR, HSDRAMC1_MODE_BANKS_PRECHARGE);
|
||||||
hsdramc1_readl(MR);
|
hsdramc1_readl(MR);
|
||||||
writel(0, sdram);
|
writel(0, sdram_base);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 3. Eight auto-refresh (CBR) cycles are provided
|
* 3. Eight auto-refresh (CBR) cycles are provided
|
||||||
|
@ -85,58 +78,41 @@ unsigned long sdram_init(const struct sdram_info *info)
|
||||||
hsdramc1_writel(MR, HSDRAMC1_MODE_AUTO_REFRESH);
|
hsdramc1_writel(MR, HSDRAMC1_MODE_AUTO_REFRESH);
|
||||||
hsdramc1_readl(MR);
|
hsdramc1_readl(MR);
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
writel(0, sdram);
|
writel(0, sdram_base);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 4. A mode register set (MRS) cycle is issued to program
|
* 4. A mode register set (MRS) cycle is issued to program
|
||||||
* SDRAM parameters, in particular CAS latency and burst
|
* SDRAM parameters, in particular CAS latency and burst
|
||||||
* length.
|
* length.
|
||||||
*
|
*
|
||||||
* CAS from info struct, burst length 1, serial burst type
|
* The address will be chosen by the SDRAMC automatically; we
|
||||||
|
* just have to make sure BA[1:0] are set to 0.
|
||||||
*/
|
*/
|
||||||
hsdramc1_writel(MR, HSDRAMC1_MODE_LOAD_MODE);
|
hsdramc1_writel(MR, HSDRAMC1_MODE_LOAD_MODE);
|
||||||
hsdramc1_readl(MR);
|
hsdramc1_readl(MR);
|
||||||
writel(0, sdram + (info->cas << 4));
|
writel(0, sdram_base);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 5. A Normal Mode command is provided, 3 clocks after tMRD
|
* 5. The application must go into Normal Mode, setting Mode
|
||||||
* is met.
|
* to 0 in the Mode Register and performing a write access
|
||||||
*
|
* at any location in the SDRAM.
|
||||||
* From the timing diagram, it looks like tMRD is 3
|
|
||||||
* cycles...try a dummy read from the peripheral bus.
|
|
||||||
*/
|
*/
|
||||||
hsdramc1_readl(MR);
|
|
||||||
hsdramc1_writel(MR, HSDRAMC1_MODE_NORMAL);
|
hsdramc1_writel(MR, HSDRAMC1_MODE_NORMAL);
|
||||||
hsdramc1_readl(MR);
|
hsdramc1_readl(MR);
|
||||||
writel(0, sdram);
|
writel(0, sdram_base);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 6. Write refresh rate into SDRAMC refresh timer count
|
* 6. Write refresh rate into SDRAMC refresh timer count
|
||||||
* register (refresh rate = timing between refresh cycles).
|
* register (refresh rate = timing between refresh cycles).
|
||||||
*
|
|
||||||
* 15.6 us is a typical value for a burst of length one
|
|
||||||
*/
|
*/
|
||||||
bus_hz = get_sdram_clk_rate();
|
hsdramc1_writel(TR, config->refresh_period);
|
||||||
hsdramc1_writel(TR, info->refresh_period);
|
|
||||||
|
|
||||||
printf("SDRAM: %u MB at address 0x%08lx\n",
|
if (config->data_bits == SDRAM_DATA_16BIT)
|
||||||
sdram_size >> 20, info->phys_addr);
|
sdram_size = 1 << (config->row_bits + config->col_bits
|
||||||
|
+ config->bank_bits + 1);
|
||||||
printf("Testing SDRAM...");
|
else
|
||||||
for (i = 0; i < sdram_size / 4; i++)
|
sdram_size = 1 << (config->row_bits + config->col_bits
|
||||||
sdram[i] = i;
|
+ config->bank_bits + 2);
|
||||||
|
|
||||||
for (i = 0; i < sdram_size / 4; i++) {
|
|
||||||
tmp = sdram[i];
|
|
||||||
if (tmp != i) {
|
|
||||||
printf("FAILED at address 0x%08lx\n",
|
|
||||||
info->phys_addr + i * 4);
|
|
||||||
printf("SDRAM: read 0x%lx, expected 0x%lx\n", tmp, i);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
puts("OK\n");
|
|
||||||
|
|
||||||
return sdram_size;
|
return sdram_size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,18 +98,16 @@ void set_timer(unsigned long t)
|
||||||
*/
|
*/
|
||||||
void udelay(unsigned long usec)
|
void udelay(unsigned long usec)
|
||||||
{
|
{
|
||||||
unsigned long now, end;
|
unsigned long cycles;
|
||||||
|
unsigned long base;
|
||||||
|
unsigned long now;
|
||||||
|
|
||||||
now = sysreg_read(COUNT);
|
base = sysreg_read(COUNT);
|
||||||
|
cycles = ((usec * (get_tbclk() / 10000)) + 50) / 100;
|
||||||
|
|
||||||
end = ((usec * (get_tbclk() / 10000)) + 50) / 100;
|
do {
|
||||||
end += now;
|
|
||||||
|
|
||||||
while (now > end)
|
|
||||||
now = sysreg_read(COUNT);
|
|
||||||
|
|
||||||
while (now < end)
|
|
||||||
now = sysreg_read(COUNT);
|
now = sysreg_read(COUNT);
|
||||||
|
} while ((now - base) < cycles);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_interrupt_handler(unsigned int nr, void (*handler)(void),
|
static int set_interrupt_handler(unsigned int nr, void (*handler)(void),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2006 Atmel Corporation
|
* Copyright (C) 2005-2008 Atmel Corporation
|
||||||
*
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
* project.
|
* project.
|
||||||
|
@ -20,12 +20,9 @@
|
||||||
* MA 02111-1307 USA
|
* MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
#include <asm/sysreg.h>
|
#include <asm/sysreg.h>
|
||||||
|
|
||||||
#ifndef PART_SPECIFIC_BOOTSTRAP
|
|
||||||
# define PART_SPECIFIC_BOOTSTRAP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SYSREG_MMUCR_I_OFFSET 2
|
#define SYSREG_MMUCR_I_OFFSET 2
|
||||||
#define SYSREG_MMUCR_S_OFFSET 4
|
#define SYSREG_MMUCR_S_OFFSET 4
|
||||||
|
|
||||||
|
@ -34,11 +31,115 @@
|
||||||
| SYSREG_BIT(FE) | SYSREG_BIT(RE) \
|
| SYSREG_BIT(FE) | SYSREG_BIT(RE) \
|
||||||
| SYSREG_BIT(IBE) | SYSREG_BIT(IEE))
|
| SYSREG_BIT(IBE) | SYSREG_BIT(IEE))
|
||||||
|
|
||||||
.text
|
/*
|
||||||
|
* To save some space, we use the same entry point for
|
||||||
|
* exceptions and reset. This avoids lots of alignment padding
|
||||||
|
* since the reset vector is always suitably aligned.
|
||||||
|
*/
|
||||||
|
.section .exception.text, "ax", @progbits
|
||||||
.global _start
|
.global _start
|
||||||
|
.global _evba
|
||||||
|
.type _start, @function
|
||||||
|
.type _evba, @function
|
||||||
_start:
|
_start:
|
||||||
PART_SPECIFIC_BOOTSTRAP
|
.size _start, 0
|
||||||
|
_evba:
|
||||||
|
.org 0x00
|
||||||
|
rjmp unknown_exception /* Unrecoverable exception */
|
||||||
|
.org 0x04
|
||||||
|
rjmp unknown_exception /* TLB multiple hit */
|
||||||
|
.org 0x08
|
||||||
|
rjmp unknown_exception /* Bus error data fetch */
|
||||||
|
.org 0x0c
|
||||||
|
rjmp unknown_exception /* Bus error instruction fetch */
|
||||||
|
.org 0x10
|
||||||
|
rjmp unknown_exception /* NMI */
|
||||||
|
.org 0x14
|
||||||
|
rjmp unknown_exception /* Instruction address */
|
||||||
|
.org 0x18
|
||||||
|
rjmp unknown_exception /* ITLB protection */
|
||||||
|
.org 0x1c
|
||||||
|
rjmp unknown_exception /* Breakpoint */
|
||||||
|
.org 0x20
|
||||||
|
rjmp unknown_exception /* Illegal opcode */
|
||||||
|
.org 0x24
|
||||||
|
rjmp unknown_exception /* Unimplemented instruction */
|
||||||
|
.org 0x28
|
||||||
|
rjmp unknown_exception /* Privilege violation */
|
||||||
|
.org 0x2c
|
||||||
|
rjmp unknown_exception /* Floating-point */
|
||||||
|
.org 0x30
|
||||||
|
rjmp unknown_exception /* Coprocessor absent */
|
||||||
|
.org 0x34
|
||||||
|
rjmp unknown_exception /* Data Address (read) */
|
||||||
|
.org 0x38
|
||||||
|
rjmp unknown_exception /* Data Address (write) */
|
||||||
|
.org 0x3c
|
||||||
|
rjmp unknown_exception /* DTLB Protection (read) */
|
||||||
|
.org 0x40
|
||||||
|
rjmp unknown_exception /* DTLB Protection (write) */
|
||||||
|
.org 0x44
|
||||||
|
rjmp unknown_exception /* DTLB Modified */
|
||||||
|
|
||||||
|
.org 0x50
|
||||||
|
rjmp unknown_exception /* ITLB Miss */
|
||||||
|
.org 0x60
|
||||||
|
rjmp unknown_exception /* DTLB Miss (read) */
|
||||||
|
.org 0x70
|
||||||
|
rjmp unknown_exception /* DTLB Miss (write) */
|
||||||
|
|
||||||
|
.size _evba, . - _evba
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
.type unknown_exception, @function
|
||||||
|
unknown_exception:
|
||||||
|
/* Figure out whether we're handling an exception (Exception
|
||||||
|
* mode) or just booting (Supervisor mode). */
|
||||||
|
csrfcz SYSREG_M1_OFFSET
|
||||||
|
brcc at32ap_cpu_bootstrap
|
||||||
|
|
||||||
|
/* This is an exception. Complain. */
|
||||||
|
pushm r0-r12
|
||||||
|
sub r8, sp, REG_R12 - REG_R0 - 4
|
||||||
|
mov r9, lr
|
||||||
|
mfsr r10, SYSREG_RAR_EX
|
||||||
|
mfsr r11, SYSREG_RSR_EX
|
||||||
|
pushm r8-r11
|
||||||
|
mfsr r12, SYSREG_ECR
|
||||||
|
mov r11, sp
|
||||||
|
rcall do_unknown_exception
|
||||||
|
1: rjmp 1b
|
||||||
|
|
||||||
|
/* The COUNT/COMPARE timer interrupt handler */
|
||||||
|
.global timer_interrupt_handler
|
||||||
|
.type timer_interrupt_handler,@function
|
||||||
|
.align 2
|
||||||
|
timer_interrupt_handler:
|
||||||
|
/*
|
||||||
|
* Increment timer_overflow and re-write COMPARE with 0xffffffff.
|
||||||
|
*
|
||||||
|
* We're running at interrupt level 3, so we don't need to save
|
||||||
|
* r8-r12 or lr to the stack.
|
||||||
|
*/
|
||||||
|
lda.w r8, timer_overflow
|
||||||
|
ld.w r9, r8[0]
|
||||||
|
mov r10, -1
|
||||||
|
mtsr SYSREG_COMPARE, r10
|
||||||
|
sub r9, -1
|
||||||
|
st.w r8[0], r9
|
||||||
|
rete
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CPU bootstrap after reset is handled here. SoC code may
|
||||||
|
* override this in case they need to initialize oscillators,
|
||||||
|
* etc.
|
||||||
|
*/
|
||||||
|
.section .text.at32ap_cpu_bootstrap, "ax", @progbits
|
||||||
|
.global at32ap_cpu_bootstrap
|
||||||
|
.weak at32ap_cpu_bootstrap
|
||||||
|
.type at32ap_cpu_bootstrap, @function
|
||||||
|
.align 2
|
||||||
|
at32ap_cpu_bootstrap:
|
||||||
/* Reset the Status Register */
|
/* Reset the Status Register */
|
||||||
mov r0, lo(SR_INIT)
|
mov r0, lo(SR_INIT)
|
||||||
orh r0, hi(SR_INIT)
|
orh r0, hi(SR_INIT)
|
||||||
|
@ -66,9 +167,16 @@ _start:
|
||||||
lddpc pc, 1f
|
lddpc pc, 1f
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
1: .long 2f
|
1: .long at32ap_low_level_init
|
||||||
|
.size _start, . - _start
|
||||||
|
|
||||||
2: lddpc sp, sp_init
|
/* Common CPU bootstrap code after oscillator/cache/etc. init */
|
||||||
|
.section .text.avr32ap_low_level_init, "ax", @progbits
|
||||||
|
.global at32ap_low_level_init
|
||||||
|
.type at32ap_low_level_init, @function
|
||||||
|
.align 2
|
||||||
|
at32ap_low_level_init:
|
||||||
|
lddpc sp, sp_init
|
||||||
|
|
||||||
/* Initialize the GOT pointer */
|
/* Initialize the GOT pointer */
|
||||||
lddpc r6, got_init
|
lddpc r6, got_init
|
||||||
|
@ -90,6 +198,7 @@ got_init:
|
||||||
* Relocate the u-boot image into RAM and continue from there.
|
* Relocate the u-boot image into RAM and continue from there.
|
||||||
* Does not return.
|
* Does not return.
|
||||||
*/
|
*/
|
||||||
|
.section .text.relocate_code,"ax",@progbits
|
||||||
.global relocate_code
|
.global relocate_code
|
||||||
.type relocate_code,@function
|
.type relocate_code,@function
|
||||||
relocate_code:
|
relocate_code:
|
||||||
|
@ -162,3 +271,5 @@ in_ram:
|
||||||
.align 2
|
.align 2
|
||||||
got_init_reloc:
|
got_init_reloc:
|
||||||
.long 3b - _GLOBAL_OFFSET_TABLE_
|
.long 3b - _GLOBAL_OFFSET_TABLE_
|
||||||
|
|
||||||
|
.size relocate_code, . - relocate_code
|
||||||
|
|
|
@ -66,10 +66,10 @@ void flush_cache(ulong start_addr, ulong size)
|
||||||
|
|
||||||
void write_one_tlb(int index, u32 pagemask, u32 hi, u32 low0, u32 low1)
|
void write_one_tlb(int index, u32 pagemask, u32 hi, u32 low0, u32 low1)
|
||||||
{
|
{
|
||||||
write_32bit_cp0_register(CP0_ENTRYLO0, low0);
|
write_c0_entrylo0(low0);
|
||||||
write_32bit_cp0_register(CP0_PAGEMASK, pagemask);
|
write_c0_pagemask(pagemask);
|
||||||
write_32bit_cp0_register(CP0_ENTRYLO1, low1);
|
write_c0_entrylo1(low1);
|
||||||
write_32bit_cp0_register(CP0_ENTRYHI, hi);
|
write_c0_entryhi(hi);
|
||||||
write_32bit_cp0_register(CP0_INDEX, index);
|
write_c0_index(index);
|
||||||
tlb_write_indexed();
|
tlb_write_indexed();
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,13 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
extern unsigned long search_exception_table(unsigned long);
|
extern unsigned long search_exception_table(unsigned long);
|
||||||
|
|
||||||
#define END_OF_MEM (gd->bd->bi_memstart + gd->bd->bi_memsize)
|
/*
|
||||||
|
* End of addressable memory. This may be less than the actual
|
||||||
|
* amount of memory on the system if we're unable to keep all
|
||||||
|
* the memory mapped in.
|
||||||
|
*/
|
||||||
|
extern ulong get_effective_memsize(void);
|
||||||
|
#define END_OF_MEM (gd->bd->bi_memstart + get_effective_memsize())
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Trap & Exception support
|
* Trap & Exception support
|
||||||
|
|
|
@ -557,7 +557,7 @@ invalidate_bats:
|
||||||
mtspr IBAT1U, r0
|
mtspr IBAT1U, r0
|
||||||
mtspr IBAT2U, r0
|
mtspr IBAT2U, r0
|
||||||
mtspr IBAT3U, r0
|
mtspr IBAT3U, r0
|
||||||
#if (CFG_HID2 & HID2_HBE)
|
#ifdef CONFIG_HIGH_BATS
|
||||||
mtspr IBAT4U, r0
|
mtspr IBAT4U, r0
|
||||||
mtspr IBAT5U, r0
|
mtspr IBAT5U, r0
|
||||||
mtspr IBAT6U, r0
|
mtspr IBAT6U, r0
|
||||||
|
@ -568,7 +568,7 @@ invalidate_bats:
|
||||||
mtspr DBAT1U, r0
|
mtspr DBAT1U, r0
|
||||||
mtspr DBAT2U, r0
|
mtspr DBAT2U, r0
|
||||||
mtspr DBAT3U, r0
|
mtspr DBAT3U, r0
|
||||||
#if (CFG_HID2 & HID2_HBE)
|
#ifdef CONFIG_HIGH_BATS
|
||||||
mtspr DBAT4U, r0
|
mtspr DBAT4U, r0
|
||||||
mtspr DBAT5U, r0
|
mtspr DBAT5U, r0
|
||||||
mtspr DBAT6U, r0
|
mtspr DBAT6U, r0
|
||||||
|
@ -655,7 +655,7 @@ setup_bats:
|
||||||
mtspr DBAT3U, r3
|
mtspr DBAT3U, r3
|
||||||
isync
|
isync
|
||||||
|
|
||||||
#if (CFG_HID2 & HID2_HBE)
|
#ifdef CONFIG_HIGH_BATS
|
||||||
/* IBAT 4 */
|
/* IBAT 4 */
|
||||||
addis r4, r0, CFG_IBAT4L@h
|
addis r4, r0, CFG_IBAT4L@h
|
||||||
ori r4, r4, CFG_IBAT4L@l
|
ori r4, r4, CFG_IBAT4L@l
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <watchdog.h>
|
#include <watchdog.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
#include <asm/mmu.h>
|
||||||
#include <mpc86xx.h>
|
#include <mpc86xx.h>
|
||||||
#include <asm/fsl_law.h>
|
#include <asm/fsl_law.h>
|
||||||
|
|
||||||
|
@ -268,13 +269,14 @@ dma_xfer(void *dest, uint count, void *src)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Print out the state of various machine registers.
|
* Print out the state of various machine registers.
|
||||||
* Currently prints out LAWs and BR0/OR0
|
* Currently prints out LAWs, BR0/OR0, and BATs
|
||||||
*/
|
*/
|
||||||
void mpc86xx_reginfo(void)
|
void mpc86xx_reginfo(void)
|
||||||
{
|
{
|
||||||
immap_t *immap = (immap_t *)CFG_IMMR;
|
immap_t *immap = (immap_t *)CFG_IMMR;
|
||||||
ccsr_lbc_t *lbc = &immap->im_lbc;
|
ccsr_lbc_t *lbc = &immap->im_lbc;
|
||||||
|
|
||||||
|
print_bats();
|
||||||
print_laws();
|
print_laws();
|
||||||
|
|
||||||
printf ("Local Bus Controller Registers\n"
|
printf ("Local Bus Controller Registers\n"
|
||||||
|
|
|
@ -63,10 +63,10 @@ static char quickhex (int i)
|
||||||
return hex_digit[i];
|
return hex_digit[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void memdump (void *pv, int num)
|
static void memdump (const void *pv, int num)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned char *pc = (unsigned char *) pv;
|
const unsigned char *pc = (const unsigned char *) pv;
|
||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for (i = 0; i < num; i++)
|
||||||
printf ("%c%c ", quickhex (pc[i] >> 4), quickhex (pc[i] & 0x0f));
|
printf ("%c%c ", quickhex (pc[i] >> 4), quickhex (pc[i] & 0x0f));
|
||||||
|
@ -83,26 +83,64 @@ static void memdump (void *pv, int num)
|
||||||
#endif /* DEBUG */
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
|
||||||
|
struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
|
||||||
|
unsigned int max_hz, unsigned int mode)
|
||||||
|
{
|
||||||
|
struct spi_slave *slave;
|
||||||
|
|
||||||
|
if (!spi_cs_is_valid(bus, cs))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
slave = malloc(sizeof(struct spi_slave));
|
||||||
|
if (!slave)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
slave->bus = bus;
|
||||||
|
slave->cs = cs;
|
||||||
|
|
||||||
|
/* TODO: Add support for different modes and speeds */
|
||||||
|
|
||||||
|
return slave;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_free_slave(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
free(slave);
|
||||||
|
}
|
||||||
|
|
||||||
|
int spi_claim_bus(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_release_bus(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SPI transfer:
|
* SPI transfer:
|
||||||
*
|
*
|
||||||
* See include/spi.h and http://www.altera.com/literature/ds/ds_nios_spi.pdf
|
* See include/spi.h and http://www.altera.com/literature/ds/ds_nios_spi.pdf
|
||||||
* for more informations.
|
* for more informations.
|
||||||
*/
|
*/
|
||||||
int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)
|
int spi_xfer(struct spi_slave *slave, int bitlen, const void *dout,
|
||||||
|
void *din, unsigned long flags)
|
||||||
{
|
{
|
||||||
|
const u8 *txd = dout;
|
||||||
|
u8 *rxd = din;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
DPRINT(("spi_xfer: chipsel %08X dout %08X din %08X bitlen %d\n",
|
DPRINT(("spi_xfer: slave %u:%u dout %08X din %08X bitlen %d\n",
|
||||||
(int)chipsel, *(uint *)dout, *(uint *)din, bitlen));
|
slave->bus, slave->cs, *(uint *)dout, *(uint *)din, bitlen));
|
||||||
|
|
||||||
memdump((void*)dout, (bitlen + 7) / 8);
|
memdump(dout, (bitlen + 7) / 8);
|
||||||
|
|
||||||
if(chipsel != NULL) {
|
if (flags & SPI_XFER_BEGIN)
|
||||||
chipsel(1); /* select the target chip */
|
spi_cs_activate(slave);
|
||||||
}
|
|
||||||
|
|
||||||
if (bitlen > CFG_NIOS_SPIBITS) { /* leave chip select active */
|
if (!(flags & SPI_XFER_END) || bitlen > CFG_NIOS_SPIBITS) {
|
||||||
|
/* leave chip select active */
|
||||||
spi->control |= NIOS_SPI_SSO;
|
spi->control |= NIOS_SPI_SSO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,11 +152,11 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)
|
||||||
|
|
||||||
while ((spi->status & NIOS_SPI_TRDY) == 0)
|
while ((spi->status & NIOS_SPI_TRDY) == 0)
|
||||||
;
|
;
|
||||||
spi->txdata = (unsigned)(dout[j]);
|
spi->txdata = (unsigned)(txd[j]);
|
||||||
|
|
||||||
while ((spi->status & NIOS_SPI_RRDY) == 0)
|
while ((spi->status & NIOS_SPI_RRDY) == 0)
|
||||||
;
|
;
|
||||||
din[j] = (unsigned char)(spi->rxdata & 0xff);
|
rxd[j] = (unsigned char)(spi->rxdata & 0xff);
|
||||||
|
|
||||||
#elif (CFG_NIOS_SPIBITS == 16)
|
#elif (CFG_NIOS_SPIBITS == 16)
|
||||||
j++, j++) {
|
j++, j++) {
|
||||||
|
@ -126,15 +164,15 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)
|
||||||
while ((spi->status & NIOS_SPI_TRDY) == 0)
|
while ((spi->status & NIOS_SPI_TRDY) == 0)
|
||||||
;
|
;
|
||||||
if ((j+1) < ((bitlen + 7) / 8))
|
if ((j+1) < ((bitlen + 7) / 8))
|
||||||
spi->txdata = (unsigned)((dout[j] << 8) | dout[j+1]);
|
spi->txdata = (unsigned)((txd[j] << 8) | txd[j+1]);
|
||||||
else
|
else
|
||||||
spi->txdata = (unsigned)(dout[j] << 8);
|
spi->txdata = (unsigned)(txd[j] << 8);
|
||||||
|
|
||||||
while ((spi->status & NIOS_SPI_RRDY) == 0)
|
while ((spi->status & NIOS_SPI_RRDY) == 0)
|
||||||
;
|
;
|
||||||
din[j] = (unsigned char)((spi->rxdata >> 8) & 0xff);
|
rxd[j] = (unsigned char)((spi->rxdata >> 8) & 0xff);
|
||||||
if ((j+1) < ((bitlen + 7) / 8))
|
if ((j+1) < ((bitlen + 7) / 8))
|
||||||
din[j+1] = (unsigned char)(spi->rxdata & 0xff);
|
rxd[j+1] = (unsigned char)(spi->rxdata & 0xff);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error "*** unsupported value of CFG_NIOS_SPIBITS ***"
|
#error "*** unsupported value of CFG_NIOS_SPIBITS ***"
|
||||||
|
@ -142,15 +180,14 @@ int spi_xfer(spi_chipsel_type chipsel, int bitlen, uchar *dout, uchar *din)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bitlen > CFG_NIOS_SPIBITS) {
|
if (bitlen > CFG_NIOS_SPIBITS && (flags & SPI_XFER_END)) {
|
||||||
spi->control &= ~NIOS_SPI_SSO;
|
spi->control &= ~NIOS_SPI_SSO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chipsel != NULL) {
|
if (flags & SPI_XFER_END)
|
||||||
chipsel(0); /* deselect the target chip */
|
spi_cs_deactivate(slave);
|
||||||
}
|
|
||||||
|
|
||||||
memdump((void*)din, (bitlen + 7) / 8);
|
memdump(din, (bitlen + 7) / 8);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,29 +30,25 @@
|
||||||
|
|
||||||
#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
|
#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
|
||||||
|
|
||||||
#if defined(CFG_POST_ALT_WORD_ADDR)
|
#if defined(CFG_POST_WORD_ADDR)
|
||||||
|
# define _POST_ADDR ((CFG_OCM_DATA_ADDR) + (CFG_POST_WORD_ADDR))
|
||||||
|
#elif defined(CFG_POST_ALT_WORD_ADDR)
|
||||||
|
# define _POST_ADDR (CFG_POST_ALT_WORD_ADDR)
|
||||||
|
#endif
|
||||||
|
|
||||||
void post_word_store (ulong a)
|
void post_word_store (ulong a)
|
||||||
{
|
{
|
||||||
out_be32((void *)CFG_POST_ALT_WORD_ADDR, a);
|
volatile void *save_addr = (volatile void *)(_POST_ADDR);
|
||||||
|
|
||||||
|
out_be32(save_addr, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong post_word_load (void)
|
ulong post_word_load (void)
|
||||||
{
|
{
|
||||||
return in_be32((void *)CFG_POST_ALT_WORD_ADDR);
|
volatile void *save_addr = (volatile void *)(_POST_ADDR);
|
||||||
}
|
|
||||||
#else /* CFG_POST_ALT_WORD_ADDR */
|
|
||||||
void post_word_store (ulong a)
|
|
||||||
{
|
|
||||||
volatile void *save_addr = (volatile void *)(CFG_OCM_DATA_ADDR + CFG_POST_WORD_ADDR);
|
|
||||||
*(volatile ulong *) save_addr = a;
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong post_word_load (void)
|
return in_be32(save_addr);
|
||||||
{
|
|
||||||
volatile void *save_addr = (volatile void *)(CFG_OCM_DATA_ADDR + CFG_POST_WORD_ADDR);
|
|
||||||
return *(volatile ulong *) save_addr;
|
|
||||||
}
|
}
|
||||||
#endif /* CFG_POST_ALT_WORD_ADDR */
|
|
||||||
|
|
||||||
#endif /* CONFIG_POST || CONFIG_LOGBUFFER*/
|
#endif /* CONFIG_POST || CONFIG_LOGBUFFER*/
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ void dev_print (block_dev_desc_t *dev_desc)
|
||||||
lbaint_t lba512;
|
lbaint_t lba512;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (dev_desc->type) {
|
switch (dev_desc->if_type) {
|
||||||
case IF_TYPE_SCSI:
|
case IF_TYPE_SCSI:
|
||||||
printf ("(%d:%d) Vendor: %s Prod.: %s Rev: %s\n",
|
printf ("(%d:%d) Vendor: %s Prod.: %s Rev: %s\n",
|
||||||
dev_desc->target,dev_desc->lun,
|
dev_desc->target,dev_desc->lun,
|
||||||
|
@ -124,7 +124,7 @@ void dev_print (block_dev_desc_t *dev_desc)
|
||||||
dev_desc->revision,
|
dev_desc->revision,
|
||||||
dev_desc->product);
|
dev_desc->product);
|
||||||
break;
|
break;
|
||||||
case DEV_TYPE_UNKNOWN:
|
case IF_TYPE_UNKNOWN:
|
||||||
default:
|
default:
|
||||||
puts ("not available\n");
|
puts ("not available\n");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -47,6 +47,19 @@ int dtt_read(int sensor, int reg)
|
||||||
int dlen;
|
int dlen;
|
||||||
uchar data[2];
|
uchar data[2];
|
||||||
|
|
||||||
|
#ifdef CONFIG_DTT_AD7414
|
||||||
|
/*
|
||||||
|
* On AD7414 the first value upon bootup is not read correctly.
|
||||||
|
* This is most likely because of the 800ms update time of the
|
||||||
|
* temp register in normal update mode. To get current values
|
||||||
|
* each time we issue the "dtt" command including upon powerup
|
||||||
|
* we switch into one-short mode.
|
||||||
|
*
|
||||||
|
* Issue one-shot mode command
|
||||||
|
*/
|
||||||
|
dtt_write(sensor, DTT_CONFIG, 0x64);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate 'reg' param
|
* Validate 'reg' param
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1720,6 +1720,8 @@ ulong flash_get_size (ulong base, int banknum)
|
||||||
int erase_region_count;
|
int erase_region_count;
|
||||||
struct cfi_qry qry;
|
struct cfi_qry qry;
|
||||||
|
|
||||||
|
memset(&qry, 0, sizeof(qry));
|
||||||
|
|
||||||
info->ext_addr = 0;
|
info->ext_addr = 0;
|
||||||
info->cfi_version = 0;
|
info->cfi_version = 0;
|
||||||
#ifdef CFG_FLASH_PROTECTION
|
#ifdef CFG_FLASH_PROTECTION
|
||||||
|
|
|
@ -153,6 +153,13 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
|
||||||
priv_nand->bbt = NULL;
|
priv_nand->bbt = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (erase_length < meminfo->erasesize) {
|
||||||
|
printf("Warning: Erase size 0x%08x smaller than one " \
|
||||||
|
"erase block 0x%08x\n",erase_length, meminfo->erasesize);
|
||||||
|
printf(" Erasing 0x%08x instead\n", meminfo->erasesize);
|
||||||
|
erase_length = meminfo->erasesize;
|
||||||
|
}
|
||||||
|
|
||||||
for (;
|
for (;
|
||||||
erase.addr < opts->offset + erase_length;
|
erase.addr < opts->offset + erase_length;
|
||||||
erase.addr += meminfo->erasesize) {
|
erase.addr += meminfo->erasesize) {
|
||||||
|
|
47
drivers/mtd/spi/Makefile
Normal file
47
drivers/mtd/spi/Makefile
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2006
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
#
|
||||||
|
# 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 $(TOPDIR)/config.mk
|
||||||
|
|
||||||
|
LIB := $(obj)libspi_flash.a
|
||||||
|
|
||||||
|
COBJS-$(CONFIG_SPI_FLASH) += spi_flash.o
|
||||||
|
COBJS-$(CONFIG_SPI_FLASH_ATMEL) += atmel.o
|
||||||
|
|
||||||
|
COBJS := $(COBJS-y)
|
||||||
|
SRCS := $(COBJS:.o=.c)
|
||||||
|
OBJS := $(addprefix $(obj),$(COBJS))
|
||||||
|
|
||||||
|
all: $(LIB)
|
||||||
|
|
||||||
|
$(LIB): $(obj).depend $(OBJS)
|
||||||
|
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
# defines $(obj).depend target
|
||||||
|
include $(SRCTREE)/rules.mk
|
||||||
|
|
||||||
|
sinclude $(obj).depend
|
||||||
|
|
||||||
|
#########################################################################
|
362
drivers/mtd/spi/atmel.c
Normal file
362
drivers/mtd/spi/atmel.c
Normal file
|
@ -0,0 +1,362 @@
|
||||||
|
/*
|
||||||
|
* Atmel SPI DataFlash support
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Atmel Corporation
|
||||||
|
*/
|
||||||
|
#define DEBUG
|
||||||
|
#include <common.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <spi_flash.h>
|
||||||
|
|
||||||
|
#include "spi_flash_internal.h"
|
||||||
|
|
||||||
|
/* AT45-specific commands */
|
||||||
|
#define CMD_AT45_READ_STATUS 0xd7
|
||||||
|
#define CMD_AT45_ERASE_PAGE 0x81
|
||||||
|
#define CMD_AT45_LOAD_PROG_BUF1 0x82
|
||||||
|
#define CMD_AT45_LOAD_BUF1 0x84
|
||||||
|
#define CMD_AT45_LOAD_PROG_BUF2 0x85
|
||||||
|
#define CMD_AT45_LOAD_BUF2 0x87
|
||||||
|
#define CMD_AT45_PROG_BUF1 0x88
|
||||||
|
#define CMD_AT45_PROG_BUF2 0x89
|
||||||
|
|
||||||
|
/* AT45 status register bits */
|
||||||
|
#define AT45_STATUS_P2_PAGE_SIZE (1 << 0)
|
||||||
|
#define AT45_STATUS_READY (1 << 7)
|
||||||
|
|
||||||
|
/* DataFlash family IDs, as obtained from the second idcode byte */
|
||||||
|
#define DF_FAMILY_AT26F 0
|
||||||
|
#define DF_FAMILY_AT45 1
|
||||||
|
#define DF_FAMILY_AT26DF 2 /* AT25DF and AT26DF */
|
||||||
|
|
||||||
|
struct atmel_spi_flash_params {
|
||||||
|
u8 idcode1;
|
||||||
|
/* Log2 of page size in power-of-two mode */
|
||||||
|
u8 l2_page_size;
|
||||||
|
u8 pages_per_block;
|
||||||
|
u8 blocks_per_sector;
|
||||||
|
u8 nr_sectors;
|
||||||
|
const char *name;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct atmel_spi_flash {
|
||||||
|
const struct atmel_spi_flash_params *params;
|
||||||
|
struct spi_flash flash;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline struct atmel_spi_flash *
|
||||||
|
to_atmel_spi_flash(struct spi_flash *flash)
|
||||||
|
{
|
||||||
|
return container_of(flash, struct atmel_spi_flash, flash);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct atmel_spi_flash_params atmel_spi_flash_table[] = {
|
||||||
|
{
|
||||||
|
.idcode1 = 0x28,
|
||||||
|
.l2_page_size = 10,
|
||||||
|
.pages_per_block = 8,
|
||||||
|
.blocks_per_sector = 32,
|
||||||
|
.nr_sectors = 32,
|
||||||
|
.name = "AT45DB642D",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int at45_wait_ready(struct spi_flash *flash, unsigned long timeout)
|
||||||
|
{
|
||||||
|
struct spi_slave *spi = flash->spi;
|
||||||
|
unsigned long timebase;
|
||||||
|
int ret;
|
||||||
|
u8 cmd = CMD_AT45_READ_STATUS;
|
||||||
|
u8 status;
|
||||||
|
|
||||||
|
timebase = get_timer(0);
|
||||||
|
|
||||||
|
ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
|
||||||
|
if (ret)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ret = spi_xfer(spi, 8, NULL, &status, 0);
|
||||||
|
if (ret)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (status & AT45_STATUS_READY)
|
||||||
|
break;
|
||||||
|
} while (get_timer(timebase) < timeout);
|
||||||
|
|
||||||
|
/* Deactivate CS */
|
||||||
|
spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
|
||||||
|
|
||||||
|
if (status & AT45_STATUS_READY)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Timed out */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assemble the address part of a command for AT45 devices in
|
||||||
|
* non-power-of-two page size mode.
|
||||||
|
*/
|
||||||
|
static void at45_build_address(struct atmel_spi_flash *asf, u8 *cmd, u32 offset)
|
||||||
|
{
|
||||||
|
unsigned long page_addr;
|
||||||
|
unsigned long byte_addr;
|
||||||
|
unsigned long page_size;
|
||||||
|
unsigned int page_shift;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The "extra" space per page is the power-of-two page size
|
||||||
|
* divided by 32.
|
||||||
|
*/
|
||||||
|
page_shift = asf->params->l2_page_size;
|
||||||
|
page_size = (1 << page_shift) + (1 << (page_shift - 5));
|
||||||
|
page_shift++;
|
||||||
|
page_addr = offset / page_size;
|
||||||
|
byte_addr = offset % page_size;
|
||||||
|
|
||||||
|
cmd[0] = page_addr >> (16 - page_shift);
|
||||||
|
cmd[1] = page_addr << (page_shift - 8) | (byte_addr >> 8);
|
||||||
|
cmd[2] = byte_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dataflash_read_fast_p2(struct spi_flash *flash,
|
||||||
|
u32 offset, size_t len, void *buf)
|
||||||
|
{
|
||||||
|
u8 cmd[5];
|
||||||
|
|
||||||
|
cmd[0] = CMD_READ_ARRAY_FAST;
|
||||||
|
cmd[1] = offset >> 16;
|
||||||
|
cmd[2] = offset >> 8;
|
||||||
|
cmd[3] = offset;
|
||||||
|
cmd[4] = 0x00;
|
||||||
|
|
||||||
|
return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dataflash_read_fast_at45(struct spi_flash *flash,
|
||||||
|
u32 offset, size_t len, void *buf)
|
||||||
|
{
|
||||||
|
struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
|
||||||
|
u8 cmd[5];
|
||||||
|
|
||||||
|
cmd[0] = CMD_READ_ARRAY_FAST;
|
||||||
|
at45_build_address(asf, cmd + 1, offset);
|
||||||
|
cmd[4] = 0x00;
|
||||||
|
|
||||||
|
return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dataflash_write_at45(struct spi_flash *flash,
|
||||||
|
u32 offset, size_t len, const void *buf)
|
||||||
|
{
|
||||||
|
struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
|
||||||
|
unsigned long page_addr;
|
||||||
|
unsigned long byte_addr;
|
||||||
|
unsigned long page_size;
|
||||||
|
unsigned int page_shift;
|
||||||
|
size_t chunk_len;
|
||||||
|
size_t actual;
|
||||||
|
int ret;
|
||||||
|
u8 cmd[4];
|
||||||
|
|
||||||
|
page_shift = asf->params->l2_page_size;
|
||||||
|
page_size = (1 << page_shift) + (1 << (page_shift - 5));
|
||||||
|
page_shift++;
|
||||||
|
page_addr = offset / page_size;
|
||||||
|
byte_addr = offset % page_size;
|
||||||
|
|
||||||
|
ret = spi_claim_bus(flash->spi);
|
||||||
|
if (ret) {
|
||||||
|
debug("SF: Unable to claim SPI bus\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (actual = 0; actual < len; actual += chunk_len) {
|
||||||
|
chunk_len = min(len - actual, page_size - byte_addr);
|
||||||
|
|
||||||
|
/* Use the same address bits for both commands */
|
||||||
|
cmd[0] = CMD_AT45_LOAD_BUF1;
|
||||||
|
cmd[1] = page_addr >> (16 - page_shift);
|
||||||
|
cmd[2] = page_addr << (page_shift - 8) | (byte_addr >> 8);
|
||||||
|
cmd[3] = byte_addr;
|
||||||
|
|
||||||
|
ret = spi_flash_cmd_write(flash->spi, cmd, 4,
|
||||||
|
buf + actual, chunk_len);
|
||||||
|
if (ret < 0) {
|
||||||
|
debug("SF: Loading AT45 buffer failed\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd[0] = CMD_AT45_PROG_BUF1;
|
||||||
|
ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);
|
||||||
|
if (ret < 0) {
|
||||||
|
debug("SF: AT45 page programming failed\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = at45_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
|
||||||
|
if (ret < 0) {
|
||||||
|
debug("SF: AT45 page programming timed out\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
page_addr++;
|
||||||
|
byte_addr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("SF: AT45: Successfully programmed %u bytes @ 0x%x\n",
|
||||||
|
len, offset);
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
spi_release_bus(flash->spi);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dataflash_erase_at45(struct spi_flash *flash, u32 offset, size_t len)
|
||||||
|
{
|
||||||
|
struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
|
||||||
|
unsigned long page_addr;
|
||||||
|
unsigned long page_size;
|
||||||
|
unsigned int page_shift;
|
||||||
|
size_t actual;
|
||||||
|
int ret;
|
||||||
|
u8 cmd[4];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: This function currently uses page erase only. We can
|
||||||
|
* probably speed things up by using block and/or sector erase
|
||||||
|
* when possible.
|
||||||
|
*/
|
||||||
|
|
||||||
|
page_shift = asf->params->l2_page_size;
|
||||||
|
page_size = (1 << page_shift) + (1 << (page_shift - 5));
|
||||||
|
page_shift++;
|
||||||
|
page_addr = offset / page_size;
|
||||||
|
|
||||||
|
if (offset % page_size || len % page_size) {
|
||||||
|
debug("SF: Erase offset/length not multiple of page size\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd[0] = CMD_AT45_ERASE_PAGE;
|
||||||
|
cmd[3] = 0x00;
|
||||||
|
|
||||||
|
ret = spi_claim_bus(flash->spi);
|
||||||
|
if (ret) {
|
||||||
|
debug("SF: Unable to claim SPI bus\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (actual = 0; actual < len; actual += page_size) {
|
||||||
|
cmd[1] = page_addr >> (16 - page_shift);
|
||||||
|
cmd[2] = page_addr << (page_shift - 8);
|
||||||
|
|
||||||
|
ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);
|
||||||
|
if (ret < 0) {
|
||||||
|
debug("SF: AT45 page erase failed\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = at45_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT);
|
||||||
|
if (ret < 0) {
|
||||||
|
debug("SF: AT45 page erase timed out\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
page_addr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("SF: AT45: Successfully erased %u bytes @ 0x%x\n",
|
||||||
|
len, offset);
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
spi_release_bus(flash->spi);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode)
|
||||||
|
{
|
||||||
|
const struct atmel_spi_flash_params *params;
|
||||||
|
unsigned long page_size;
|
||||||
|
unsigned int family;
|
||||||
|
struct atmel_spi_flash *asf;
|
||||||
|
unsigned int i;
|
||||||
|
int ret;
|
||||||
|
u8 status;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(atmel_spi_flash_table); i++) {
|
||||||
|
params = &atmel_spi_flash_table[i];
|
||||||
|
if (params->idcode1 == idcode[1])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == ARRAY_SIZE(atmel_spi_flash_table)) {
|
||||||
|
debug("SF: Unsupported DataFlash ID %02x\n",
|
||||||
|
idcode[1]);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
asf = malloc(sizeof(struct atmel_spi_flash));
|
||||||
|
if (!asf) {
|
||||||
|
debug("SF: Failed to allocate memory\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
asf->params = params;
|
||||||
|
asf->flash.spi = spi;
|
||||||
|
asf->flash.name = params->name;
|
||||||
|
|
||||||
|
/* Assuming power-of-two page size initially. */
|
||||||
|
page_size = 1 << params->l2_page_size;
|
||||||
|
|
||||||
|
family = idcode[1] >> 5;
|
||||||
|
|
||||||
|
switch (family) {
|
||||||
|
case DF_FAMILY_AT45:
|
||||||
|
/*
|
||||||
|
* AT45 chips have configurable page size. The status
|
||||||
|
* register indicates which configuration is active.
|
||||||
|
*/
|
||||||
|
ret = spi_flash_cmd(spi, CMD_AT45_READ_STATUS, &status, 1);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
debug("SF: AT45 status register: %02x\n", status);
|
||||||
|
|
||||||
|
if (!(status & AT45_STATUS_P2_PAGE_SIZE)) {
|
||||||
|
asf->flash.read = dataflash_read_fast_at45;
|
||||||
|
asf->flash.write = dataflash_write_at45;
|
||||||
|
asf->flash.erase = dataflash_erase_at45;
|
||||||
|
page_size += 1 << (params->l2_page_size - 5);
|
||||||
|
} else {
|
||||||
|
asf->flash.read = dataflash_read_fast_p2;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DF_FAMILY_AT26F:
|
||||||
|
case DF_FAMILY_AT26DF:
|
||||||
|
asf->flash.read = dataflash_read_fast_p2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
debug("SF: Unsupported DataFlash family %u\n", family);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
asf->flash.size = page_size * params->pages_per_block
|
||||||
|
* params->blocks_per_sector
|
||||||
|
* params->nr_sectors;
|
||||||
|
|
||||||
|
debug("SF: Detected %s with page size %u, total %u bytes\n",
|
||||||
|
params->name, page_size, asf->flash.size);
|
||||||
|
|
||||||
|
return &asf->flash;
|
||||||
|
|
||||||
|
err:
|
||||||
|
free(asf);
|
||||||
|
return NULL;
|
||||||
|
}
|
162
drivers/mtd/spi/spi_flash.c
Normal file
162
drivers/mtd/spi/spi_flash.c
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* SPI flash interface
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Atmel Corporation
|
||||||
|
*/
|
||||||
|
#define DEBUG
|
||||||
|
#include <common.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <spi.h>
|
||||||
|
#include <spi_flash.h>
|
||||||
|
|
||||||
|
#include "spi_flash_internal.h"
|
||||||
|
|
||||||
|
int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len)
|
||||||
|
{
|
||||||
|
unsigned long flags = SPI_XFER_BEGIN;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
|
flags |= SPI_XFER_END;
|
||||||
|
|
||||||
|
ret = spi_xfer(spi, 8, &cmd, NULL, flags);
|
||||||
|
if (ret) {
|
||||||
|
debug("SF: Failed to send command %02x: %d\n", cmd, ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len) {
|
||||||
|
ret = spi_xfer(spi, len * 8, NULL, response, SPI_XFER_END);
|
||||||
|
if (ret)
|
||||||
|
debug("SF: Failed to read response (%zu bytes): %d\n",
|
||||||
|
len, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,
|
||||||
|
size_t cmd_len, void *data, size_t data_len)
|
||||||
|
{
|
||||||
|
unsigned long flags = SPI_XFER_BEGIN;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (data_len == 0)
|
||||||
|
flags |= SPI_XFER_END;
|
||||||
|
|
||||||
|
ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags);
|
||||||
|
if (ret) {
|
||||||
|
debug("SF: Failed to send read command (%zu bytes): %d\n",
|
||||||
|
cmd_len, ret);
|
||||||
|
} else if (data_len != 0) {
|
||||||
|
ret = spi_xfer(spi, data_len * 8, NULL, data, SPI_XFER_END);
|
||||||
|
if (ret)
|
||||||
|
debug("SF: Failed to read %zu bytes of data: %d\n",
|
||||||
|
data_len, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
|
||||||
|
const void *data, size_t data_len)
|
||||||
|
{
|
||||||
|
unsigned long flags = SPI_XFER_BEGIN;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (data_len == 0)
|
||||||
|
flags |= SPI_XFER_END;
|
||||||
|
|
||||||
|
ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags);
|
||||||
|
if (ret) {
|
||||||
|
debug("SF: Failed to send read command (%zu bytes): %d\n",
|
||||||
|
cmd_len, ret);
|
||||||
|
} else if (data_len != 0) {
|
||||||
|
ret = spi_xfer(spi, data_len * 8, data, NULL, SPI_XFER_END);
|
||||||
|
if (ret)
|
||||||
|
debug("SF: Failed to read %zu bytes of data: %d\n",
|
||||||
|
data_len, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
|
||||||
|
size_t cmd_len, void *data, size_t data_len)
|
||||||
|
{
|
||||||
|
struct spi_slave *spi = flash->spi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
spi_claim_bus(spi);
|
||||||
|
ret = spi_flash_cmd_read(spi, cmd, cmd_len, data, data_len);
|
||||||
|
spi_release_bus(spi);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
|
||||||
|
unsigned int max_hz, unsigned int spi_mode)
|
||||||
|
{
|
||||||
|
struct spi_slave *spi;
|
||||||
|
struct spi_flash *flash;
|
||||||
|
int ret;
|
||||||
|
u8 idcode[3];
|
||||||
|
|
||||||
|
spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
|
||||||
|
if (!spi) {
|
||||||
|
debug("SF: Failed to set up slave\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = spi_claim_bus(spi);
|
||||||
|
if (ret) {
|
||||||
|
debug("SF: Failed to claim SPI bus: %d\n", ret);
|
||||||
|
goto err_claim_bus;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the ID codes */
|
||||||
|
ret = spi_flash_cmd(spi, CMD_READ_ID, &idcode, sizeof(idcode));
|
||||||
|
if (ret)
|
||||||
|
goto err_read_id;
|
||||||
|
|
||||||
|
debug("SF: Got idcode %02x %02x %02x\n", idcode[0],
|
||||||
|
idcode[1], idcode[2]);
|
||||||
|
|
||||||
|
switch (idcode[0]) {
|
||||||
|
#ifdef CONFIG_SPI_FLASH_SPANSION
|
||||||
|
case 0x01:
|
||||||
|
flash = spi_flash_probe_spansion(spi, idcode);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SPI_FLASH_ATMEL
|
||||||
|
case 0x1F:
|
||||||
|
flash = spi_flash_probe_atmel(spi, idcode);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
debug("SF: Unsupported manufacturer %02X\n", idcode[0]);
|
||||||
|
flash = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!flash)
|
||||||
|
goto err_manufacturer_probe;
|
||||||
|
|
||||||
|
spi_release_bus(spi);
|
||||||
|
|
||||||
|
return flash;
|
||||||
|
|
||||||
|
err_manufacturer_probe:
|
||||||
|
err_read_id:
|
||||||
|
spi_release_bus(spi);
|
||||||
|
err_claim_bus:
|
||||||
|
spi_free_slave(spi);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_flash_free(struct spi_flash *flash)
|
||||||
|
{
|
||||||
|
spi_free_slave(flash->spi);
|
||||||
|
free(flash);
|
||||||
|
}
|
45
drivers/mtd/spi/spi_flash_internal.h
Normal file
45
drivers/mtd/spi/spi_flash_internal.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* SPI flash internal definitions
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Atmel Corporation
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Common parameters */
|
||||||
|
#define SPI_FLASH_PROG_TIMEOUT ((10 * CFG_HZ) / 1000)
|
||||||
|
#define SPI_FLASH_PAGE_ERASE_TIMEOUT ((50 * CFG_HZ) / 1000)
|
||||||
|
#define SPI_FLASH_SECTOR_ERASE_TIMEOUT (10 * CFG_HZ)
|
||||||
|
|
||||||
|
/* Common commands */
|
||||||
|
#define CMD_READ_ID 0x9f
|
||||||
|
|
||||||
|
#define CMD_READ_ARRAY_SLOW 0x03
|
||||||
|
#define CMD_READ_ARRAY_FAST 0x0b
|
||||||
|
#define CMD_READ_ARRAY_LEGACY 0xe8
|
||||||
|
|
||||||
|
/* Send a single-byte command to the device and read the response */
|
||||||
|
int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send a multi-byte command to the device and read the response. Used
|
||||||
|
* for flash array reads, etc.
|
||||||
|
*/
|
||||||
|
int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,
|
||||||
|
size_t cmd_len, void *data, size_t data_len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send a multi-byte command to the device followed by (optional)
|
||||||
|
* data. Used for programming the flash array, etc.
|
||||||
|
*/
|
||||||
|
int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
|
||||||
|
const void *data, size_t data_len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Same as spi_flash_cmd_read() except it also claims/releases the SPI
|
||||||
|
* bus. Used as common part of the ->read() operation.
|
||||||
|
*/
|
||||||
|
int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
|
||||||
|
size_t cmd_len, void *data, size_t data_len);
|
||||||
|
|
||||||
|
/* Manufacturer-specific probe functions */
|
||||||
|
struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode);
|
||||||
|
struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode);
|
|
@ -300,8 +300,10 @@ eth_init(bd_t * bd)
|
||||||
DM9000_iow(DM9000_ISR, 0x0f); /* Clear interrupt status */
|
DM9000_iow(DM9000_ISR, 0x0f); /* Clear interrupt status */
|
||||||
|
|
||||||
/* Set Node address */
|
/* Set Node address */
|
||||||
|
#ifndef CONFIG_AT91SAM9261EK
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
|
((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (is_zero_ether_addr(bd->bi_enetaddr) ||
|
if (is_zero_ether_addr(bd->bi_enetaddr) ||
|
||||||
is_multicast_ether_addr(bd->bi_enetaddr)) {
|
is_multicast_ether_addr(bd->bi_enetaddr)) {
|
||||||
|
|
|
@ -417,13 +417,15 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
|
||||||
|
|
||||||
/* choose RMII or MII mode. This depends on the board */
|
/* choose RMII or MII mode. This depends on the board */
|
||||||
#ifdef CONFIG_RMII
|
#ifdef CONFIG_RMII
|
||||||
#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260)
|
#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
|
||||||
|
defined(CONFIG_AT91SAM9263)
|
||||||
macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
|
macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
|
||||||
#else
|
#else
|
||||||
macb_writel(macb, USRIO, 0);
|
macb_writel(macb, USRIO, 0);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260)
|
#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
|
||||||
|
defined(CONFIG_AT91SAM9263)
|
||||||
macb_writel(macb, USRIO, MACB_BIT(CLKEN));
|
macb_writel(macb, USRIO, MACB_BIT(CLKEN));
|
||||||
#else
|
#else
|
||||||
macb_writel(macb, USRIO, MACB_BIT(MII));
|
macb_writel(macb, USRIO, MACB_BIT(MII));
|
||||||
|
|
|
@ -62,13 +62,6 @@
|
||||||
|
|
||||||
#define RTC_USER_RAM_BASE 0x20
|
#define RTC_USER_RAM_BASE 0x20
|
||||||
|
|
||||||
/*
|
|
||||||
* External table of chip select functions (see the appropriate board
|
|
||||||
* support for the actual definition of the table).
|
|
||||||
*/
|
|
||||||
extern spi_chipsel_type spi_chipsel[];
|
|
||||||
extern int spi_chipsel_cnt;
|
|
||||||
|
|
||||||
static unsigned int bin2bcd (unsigned int n);
|
static unsigned int bin2bcd (unsigned int n);
|
||||||
static unsigned char bcd2bin (unsigned char c);
|
static unsigned char bcd2bin (unsigned char c);
|
||||||
|
|
||||||
|
@ -305,11 +298,29 @@ void rtc_reset (void)
|
||||||
static unsigned char rtc_read (unsigned char reg);
|
static unsigned char rtc_read (unsigned char reg);
|
||||||
static void rtc_write (unsigned char reg, unsigned char val);
|
static void rtc_write (unsigned char reg, unsigned char val);
|
||||||
|
|
||||||
|
static struct spi_slave *slave;
|
||||||
|
|
||||||
/* read clock time from DS1306 and return it in *tmp */
|
/* read clock time from DS1306 and return it in *tmp */
|
||||||
int rtc_get (struct rtc_time *tmp)
|
int rtc_get (struct rtc_time *tmp)
|
||||||
{
|
{
|
||||||
unsigned char sec, min, hour, mday, wday, mon, year;
|
unsigned char sec, min, hour, mday, wday, mon, year;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assuming Vcc = 2.0V (lowest speed)
|
||||||
|
*
|
||||||
|
* REVISIT: If we add an rtc_init() function we can do this
|
||||||
|
* step just once.
|
||||||
|
*/
|
||||||
|
if (!slave) {
|
||||||
|
slave = spi_setup_slave(0, CFG_SPI_RTC_DEVID, 600000,
|
||||||
|
SPI_MODE_3 | SPI_CS_HIGH);
|
||||||
|
if (!slave)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spi_claim_bus(slave))
|
||||||
|
return;
|
||||||
|
|
||||||
sec = rtc_read (RTC_SECONDS);
|
sec = rtc_read (RTC_SECONDS);
|
||||||
min = rtc_read (RTC_MINUTES);
|
min = rtc_read (RTC_MINUTES);
|
||||||
hour = rtc_read (RTC_HOURS);
|
hour = rtc_read (RTC_HOURS);
|
||||||
|
@ -318,6 +329,8 @@ int rtc_get (struct rtc_time *tmp)
|
||||||
mon = rtc_read (RTC_MONTH);
|
mon = rtc_read (RTC_MONTH);
|
||||||
year = rtc_read (RTC_YEAR);
|
year = rtc_read (RTC_YEAR);
|
||||||
|
|
||||||
|
spi_release_bus(slave);
|
||||||
|
|
||||||
debug ("Get RTC year: %02x mon: %02x mday: %02x wday: %02x "
|
debug ("Get RTC year: %02x mon: %02x mday: %02x wday: %02x "
|
||||||
"hr: %02x min: %02x sec: %02x\n",
|
"hr: %02x min: %02x sec: %02x\n",
|
||||||
year, mon, mday, wday, hour, min, sec);
|
year, mon, mday, wday, hour, min, sec);
|
||||||
|
@ -360,6 +373,17 @@ int rtc_get (struct rtc_time *tmp)
|
||||||
/* set clock time from *tmp in DS1306 RTC */
|
/* set clock time from *tmp in DS1306 RTC */
|
||||||
void rtc_set (struct rtc_time *tmp)
|
void rtc_set (struct rtc_time *tmp)
|
||||||
{
|
{
|
||||||
|
/* Assuming Vcc = 2.0V (lowest speed) */
|
||||||
|
if (!slave) {
|
||||||
|
slave = spi_setup_slave(0, CFG_SPI_RTC_DEVID, 600000,
|
||||||
|
SPI_MODE_3 | SPI_CS_HIGH);
|
||||||
|
if (!slave)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spi_claim_bus(slave))
|
||||||
|
return;
|
||||||
|
|
||||||
debug ("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
|
debug ("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
|
||||||
tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
|
tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
|
||||||
tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
|
tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
|
||||||
|
@ -371,6 +395,8 @@ void rtc_set (struct rtc_time *tmp)
|
||||||
rtc_write (RTC_DATE_OF_MONTH, bin2bcd (tmp->tm_mday));
|
rtc_write (RTC_DATE_OF_MONTH, bin2bcd (tmp->tm_mday));
|
||||||
rtc_write (RTC_MONTH, bin2bcd (tmp->tm_mon));
|
rtc_write (RTC_MONTH, bin2bcd (tmp->tm_mon));
|
||||||
rtc_write (RTC_YEAR, bin2bcd (tmp->tm_year - 2000));
|
rtc_write (RTC_YEAR, bin2bcd (tmp->tm_year - 2000));
|
||||||
|
|
||||||
|
spi_release_bus(slave);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
@ -378,6 +404,17 @@ void rtc_set (struct rtc_time *tmp)
|
||||||
/* reset the DS1306 */
|
/* reset the DS1306 */
|
||||||
void rtc_reset (void)
|
void rtc_reset (void)
|
||||||
{
|
{
|
||||||
|
/* Assuming Vcc = 2.0V (lowest speed) */
|
||||||
|
if (!slave) {
|
||||||
|
slave = spi_setup_slave(0, CFG_SPI_RTC_DEVID, 600000,
|
||||||
|
SPI_MODE_3 | SPI_CS_HIGH);
|
||||||
|
if (!slave)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spi_claim_bus(slave))
|
||||||
|
return;
|
||||||
|
|
||||||
/* clear the control register */
|
/* clear the control register */
|
||||||
rtc_write (RTC_CONTROL, 0x00); /* 1st step: reset WP */
|
rtc_write (RTC_CONTROL, 0x00); /* 1st step: reset WP */
|
||||||
rtc_write (RTC_CONTROL, 0x00); /* 2nd step: reset 1Hz, AIE1, AIE0 */
|
rtc_write (RTC_CONTROL, 0x00); /* 2nd step: reset 1Hz, AIE1, AIE0 */
|
||||||
|
@ -391,22 +428,18 @@ void rtc_reset (void)
|
||||||
rtc_write (RTC_HOURS_ALARM1, 0x00);
|
rtc_write (RTC_HOURS_ALARM1, 0x00);
|
||||||
rtc_write (RTC_DAY_OF_WEEK_ALARM0, 0x00);
|
rtc_write (RTC_DAY_OF_WEEK_ALARM0, 0x00);
|
||||||
rtc_write (RTC_DAY_OF_WEEK_ALARM1, 0x00);
|
rtc_write (RTC_DAY_OF_WEEK_ALARM1, 0x00);
|
||||||
|
|
||||||
|
spi_release_bus(slave);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static unsigned char rtc_read (unsigned char reg)
|
static unsigned char rtc_read (unsigned char reg)
|
||||||
{
|
{
|
||||||
unsigned char dout[2]; /* SPI Output Data Bytes */
|
int ret;
|
||||||
unsigned char din[2]; /* SPI Input Data Bytes */
|
|
||||||
|
|
||||||
dout[0] = reg;
|
ret = spi_w8r8(slave, reg);
|
||||||
|
return ret < 0 ? 0 : ret;
|
||||||
if (spi_xfer (spi_chipsel[CFG_SPI_RTC_DEVID], 16, dout, din) != 0) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return din[1];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
@ -419,7 +452,7 @@ static void rtc_write (unsigned char reg, unsigned char val)
|
||||||
dout[0] = 0x80 | reg;
|
dout[0] = 0x80 | reg;
|
||||||
dout[1] = val;
|
dout[1] = val;
|
||||||
|
|
||||||
spi_xfer (spi_chipsel[CFG_SPI_RTC_DEVID], 16, dout, din);
|
spi_xfer (slave, 16, dout, din, SPI_XFER_BEGIN | SPI_XFER_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* end of code exclusion (see #ifdef CONFIG_SXNI855T above) */
|
#endif /* end of code exclusion (see #ifdef CONFIG_SXNI855T above) */
|
||||||
|
|
|
@ -24,34 +24,50 @@
|
||||||
#include <rtc.h>
|
#include <rtc.h>
|
||||||
#include <spi.h>
|
#include <spi.h>
|
||||||
|
|
||||||
|
static struct spi_slave *slave;
|
||||||
|
|
||||||
int rtc_get(struct rtc_time *rtc)
|
int rtc_get(struct rtc_time *rtc)
|
||||||
{
|
{
|
||||||
u32 day1, day2, time;
|
u32 day1, day2, time;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
int err, tim, i = 0;
|
int err, tim, i = 0;
|
||||||
|
|
||||||
spi_select(1, 0, SPI_MODE_2 | SPI_CS_HIGH);
|
if (!slave) {
|
||||||
|
/* FIXME: Verify the max SCK rate */
|
||||||
|
slave = spi_setup_slave(1, 0, 1000000,
|
||||||
|
SPI_MODE_2 | SPI_CS_HIGH);
|
||||||
|
if (!slave)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spi_claim_bus(slave))
|
||||||
|
return -1;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
reg = 0x2c000000;
|
reg = 0x2c000000;
|
||||||
err = spi_xfer(0, 32, (uchar *)®, (uchar *)&day1);
|
err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&day1,
|
||||||
|
SPI_XFER_BEGIN | SPI_XFER_END);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
reg = 0x28000000;
|
reg = 0x28000000;
|
||||||
err = spi_xfer(0, 32, (uchar *)®, (uchar *)&time);
|
err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&time,
|
||||||
|
SPI_XFER_BEGIN | SPI_XFER_END);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
reg = 0x2c000000;
|
reg = 0x2c000000;
|
||||||
err = spi_xfer(0, 32, (uchar *)®, (uchar *)&day2);
|
err = spi_xfer(slave, 32, (uchar *)®, (uchar *)&day2,
|
||||||
|
SPI_XFER_BEGIN | SPI_XFER_END);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
} while (day1 != day2 && i++ < 3);
|
} while (day1 != day2 && i++ < 3);
|
||||||
|
|
||||||
|
spi_release_bus(slave);
|
||||||
|
|
||||||
tim = day1 * 86400 + time;
|
tim = day1 * 86400 + time;
|
||||||
to_tm(tim, rtc);
|
to_tm(tim, rtc);
|
||||||
|
|
||||||
|
@ -65,16 +81,31 @@ void rtc_set(struct rtc_time *rtc)
|
||||||
{
|
{
|
||||||
u32 time, day, reg;
|
u32 time, day, reg;
|
||||||
|
|
||||||
|
if (!slave) {
|
||||||
|
/* FIXME: Verify the max SCK rate */
|
||||||
|
slave = spi_setup_slave(1, 0, 1000000,
|
||||||
|
SPI_MODE_2 | SPI_CS_HIGH);
|
||||||
|
if (!slave)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
|
time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
|
||||||
rtc->tm_hour, rtc->tm_min, rtc->tm_sec);
|
rtc->tm_hour, rtc->tm_min, rtc->tm_sec);
|
||||||
day = time / 86400;
|
day = time / 86400;
|
||||||
time %= 86400;
|
time %= 86400;
|
||||||
|
|
||||||
|
if (spi_claim_bus(slave))
|
||||||
|
return;
|
||||||
|
|
||||||
reg = 0x2c000000 | day | 0x80000000;
|
reg = 0x2c000000 | day | 0x80000000;
|
||||||
spi_xfer(0, 32, (uchar *)®, (uchar *)&day);
|
spi_xfer(slave, 32, (uchar *)®, (uchar *)&day,
|
||||||
|
SPI_XFER_BEGIN | SPI_XFER_END);
|
||||||
|
|
||||||
reg = 0x28000000 | time | 0x80000000;
|
reg = 0x28000000 | time | 0x80000000;
|
||||||
spi_xfer(0, 32, (uchar *)®, (uchar *)&time);
|
spi_xfer(slave, 32, (uchar *)®, (uchar *)&time,
|
||||||
|
SPI_XFER_BEGIN | SPI_XFER_END);
|
||||||
|
|
||||||
|
spi_release_bus(slave);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtc_reset(void)
|
void rtc_reset(void)
|
||||||
|
|
|
@ -26,6 +26,7 @@ include $(TOPDIR)/config.mk
|
||||||
LIB := $(obj)libspi.a
|
LIB := $(obj)libspi.a
|
||||||
|
|
||||||
COBJS-y += mpc8xxx_spi.o
|
COBJS-y += mpc8xxx_spi.o
|
||||||
|
COBJS-$(CONFIG_ATMEL_SPI) += atmel_spi.o
|
||||||
COBJS-$(CONFIG_MXC_SPI) += mxc_spi.o
|
COBJS-$(CONFIG_MXC_SPI) += mxc_spi.o
|
||||||
|
|
||||||
COBJS := $(COBJS-y)
|
COBJS := $(COBJS-y)
|
||||||
|
|
210
drivers/spi/atmel_spi.c
Normal file
210
drivers/spi/atmel_spi.c
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007 Atmel 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
|
||||||
|
*/
|
||||||
|
#include <common.h>
|
||||||
|
#include <spi.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#include <asm/arch/clk.h>
|
||||||
|
#include <asm/arch/memory-map.h>
|
||||||
|
|
||||||
|
#include "atmel_spi.h"
|
||||||
|
|
||||||
|
void spi_init()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
|
||||||
|
unsigned int max_hz, unsigned int mode)
|
||||||
|
{
|
||||||
|
struct atmel_spi_slave *as;
|
||||||
|
unsigned int scbr;
|
||||||
|
u32 csrx;
|
||||||
|
void *regs;
|
||||||
|
|
||||||
|
if (cs > 3 || !spi_cs_is_valid(bus, cs))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
switch (bus) {
|
||||||
|
case 0:
|
||||||
|
regs = (void *)SPI0_BASE;
|
||||||
|
break;
|
||||||
|
#ifdef SPI1_BASE
|
||||||
|
case 1:
|
||||||
|
regs = (void *)SPI1_BASE;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef SPI2_BASE
|
||||||
|
case 2:
|
||||||
|
regs = (void *)SPI2_BASE;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef SPI3_BASE
|
||||||
|
case 3:
|
||||||
|
regs = (void *)SPI3_BASE;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
scbr = (get_spi_clk_rate(bus) + max_hz - 1) / max_hz;
|
||||||
|
if (scbr > ATMEL_SPI_CSRx_SCBR_MAX)
|
||||||
|
/* Too low max SCK rate */
|
||||||
|
return NULL;
|
||||||
|
if (scbr < 1)
|
||||||
|
scbr = 1;
|
||||||
|
|
||||||
|
csrx = ATMEL_SPI_CSRx_SCBR(scbr);
|
||||||
|
csrx |= ATMEL_SPI_CSRx_BITS(ATMEL_SPI_BITS_8);
|
||||||
|
if (!(mode & SPI_CPHA))
|
||||||
|
csrx |= ATMEL_SPI_CSRx_NCPHA;
|
||||||
|
if (mode & SPI_CPOL)
|
||||||
|
csrx |= ATMEL_SPI_CSRx_CPOL;
|
||||||
|
|
||||||
|
as = malloc(sizeof(struct atmel_spi_slave));
|
||||||
|
if (!as)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
as->slave.bus = bus;
|
||||||
|
as->slave.cs = cs;
|
||||||
|
as->regs = regs;
|
||||||
|
as->mr = ATMEL_SPI_MR_MSTR | ATMEL_SPI_MR_MODFDIS
|
||||||
|
| ATMEL_SPI_MR_PCS(~(1 << cs) & 0xf);
|
||||||
|
spi_writel(as, CSR(cs), csrx);
|
||||||
|
|
||||||
|
return &as->slave;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_free_slave(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
struct atmel_spi_slave *as = to_atmel_spi(slave);
|
||||||
|
|
||||||
|
free(as);
|
||||||
|
}
|
||||||
|
|
||||||
|
int spi_claim_bus(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
struct atmel_spi_slave *as = to_atmel_spi(slave);
|
||||||
|
|
||||||
|
/* Enable the SPI hardware */
|
||||||
|
spi_writel(as, CR, ATMEL_SPI_CR_SPIEN);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Select the slave. This should set SCK to the correct
|
||||||
|
* initial state, etc.
|
||||||
|
*/
|
||||||
|
spi_writel(as, MR, as->mr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_release_bus(struct spi_slave *slave)
|
||||||
|
{
|
||||||
|
struct atmel_spi_slave *as = to_atmel_spi(slave);
|
||||||
|
|
||||||
|
/* Disable the SPI hardware */
|
||||||
|
spi_writel(as, CR, ATMEL_SPI_CR_SPIDIS);
|
||||||
|
}
|
||||||
|
|
||||||
|
int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
|
||||||
|
const void *dout, void *din, unsigned long flags)
|
||||||
|
{
|
||||||
|
struct atmel_spi_slave *as = to_atmel_spi(slave);
|
||||||
|
unsigned int len_tx;
|
||||||
|
unsigned int len_rx;
|
||||||
|
unsigned int len;
|
||||||
|
int ret;
|
||||||
|
u32 status;
|
||||||
|
const u8 *txp = dout;
|
||||||
|
u8 *rxp = din;
|
||||||
|
u8 value;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
if (bitlen == 0)
|
||||||
|
/* Finish any previously submitted transfers */
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: The controller can do non-multiple-of-8 bit
|
||||||
|
* transfers, but this driver currently doesn't support it.
|
||||||
|
*
|
||||||
|
* It's also not clear how such transfers are supposed to be
|
||||||
|
* represented as a stream of bytes...this is a limitation of
|
||||||
|
* the current SPI interface.
|
||||||
|
*/
|
||||||
|
if (bitlen % 8) {
|
||||||
|
/* Errors always terminate an ongoing transfer */
|
||||||
|
flags |= SPI_XFER_END;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = bitlen / 8;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The controller can do automatic CS control, but it is
|
||||||
|
* somewhat quirky, and it doesn't really buy us much anyway
|
||||||
|
* in the context of U-Boot.
|
||||||
|
*/
|
||||||
|
if (flags & SPI_XFER_BEGIN)
|
||||||
|
spi_cs_activate(slave);
|
||||||
|
|
||||||
|
for (len_tx = 0, len_rx = 0; len_rx < len; ) {
|
||||||
|
status = spi_readl(as, SR);
|
||||||
|
|
||||||
|
if (status & ATMEL_SPI_SR_OVRES)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (len_tx < len && (status & ATMEL_SPI_SR_TDRE)) {
|
||||||
|
if (txp)
|
||||||
|
value = *txp++;
|
||||||
|
else
|
||||||
|
value = 0;
|
||||||
|
spi_writel(as, TDR, value);
|
||||||
|
len_tx++;
|
||||||
|
}
|
||||||
|
if (status & ATMEL_SPI_SR_RDRF) {
|
||||||
|
value = spi_readl(as, RDR);
|
||||||
|
if (rxp)
|
||||||
|
*rxp++ = value;
|
||||||
|
len_rx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (flags & SPI_XFER_END) {
|
||||||
|
/*
|
||||||
|
* Wait until the transfer is completely done before
|
||||||
|
* we deactivate CS.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
status = spi_readl(as, SR);
|
||||||
|
} while (!(status & ATMEL_SPI_SR_TXEMPTY));
|
||||||
|
|
||||||
|
spi_cs_deactivate(slave);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue