All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/6] Updates for atevk1100 support
@ 2008-11-13 15:25 Gunnar Rangoy
  2008-11-13 15:25 ` [U-Boot] [PATCH 1/6] AVR32: Make GPIO implmentation cpu dependent Gunnar Rangoy
  0 siblings, 1 reply; 7+ messages in thread
From: Gunnar Rangoy @ 2008-11-13 15:25 UTC (permalink / raw)
  To: u-boot

These patches makes it possible to load code into external SRAM on
the atevk1100. 

Also included is a patch to use the internal flash. Before this can be
done, U-Boot must be relocated to SRAM.

The GPIO implementation is made cpu dependent due to differences between
at32uc and ap700x.


Gunnar Rangoy (6):
  AVR32: Make GPIO implmentation cpu dependent
  AVR32: Support for external SRAM on at32uc3
  AVR32: Use SRAM as main memory on the atevk1100 board
  AVR32: Enable relocation of code for at32uc3
  AVR32: Support for writing to internal flash on at32uc3
  AVR32: Set boot parameters for atevk1100

 board/atmel/atevk1100/atevk1100.c               |   65 +++++++++-----
 board/atmel/atevk1100/u-boot.lds                |    2 -
 cpu/at32uc/Makefile                             |    1 +
 cpu/at32uc/flashc.c                             |   69 ++++++++++++++-
 cpu/at32uc/flashc.h                             |   17 ++++
 cpu/at32uc/portmux-gpio.c                       |   30 -------
 cpu/at32uc/smc.c                                |   61 +++++++++++++
 cpu/at32uc/smc.h                                |  105 +++++++++++++++++++++++
 cpu/at32uc/start.S                              |   15 +---
 include/asm-avr32/arch-at32ap700x/gpio-impl.h   |   86 ++++++++++++++++++
 include/asm-avr32/arch-at32uc3a0xxx/gpio-impl.h |   62 +++++++++++++
 include/asm-avr32/arch-common/portmux-gpio.h    |   83 +-----------------
 include/asm-avr32/sram.h                        |   34 +++++++
 include/configs/atevk1100.h                     |   22 +++--
 lib_avr32/board.c                               |    5 -
 15 files changed, 490 insertions(+), 167 deletions(-)
 create mode 100644 cpu/at32uc/smc.c
 create mode 100644 cpu/at32uc/smc.h
 create mode 100644 include/asm-avr32/arch-at32ap700x/gpio-impl.h
 create mode 100644 include/asm-avr32/arch-at32uc3a0xxx/gpio-impl.h
 create mode 100644 include/asm-avr32/sram.h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 1/6] AVR32: Make GPIO implmentation cpu dependent
  2008-11-13 15:25 [U-Boot] [PATCH 0/6] Updates for atevk1100 support Gunnar Rangoy
@ 2008-11-13 15:25 ` Gunnar Rangoy
  2008-11-13 15:25   ` [U-Boot] [PATCH 2/6] AVR32: Support for external SRAM on at32uc3 Gunnar Rangoy
  0 siblings, 1 reply; 7+ messages in thread
From: Gunnar Rangoy @ 2008-11-13 15:25 UTC (permalink / raw)
  To: u-boot

There are some differences in the implementation of GPIO in the
at32uc chip compared to the ap700x series.

Signed-off-by: Gunnar Rangoy <gunnar@rangoy.com>
Signed-off-by: Paul Driveklepp <pauldriveklepp@gmail.com>
Signed-off-by: Olav Morken <olavmrk@gmail.com>
---
 cpu/at32uc/portmux-gpio.c                       |   30 --------
 include/asm-avr32/arch-at32ap700x/gpio-impl.h   |   86 +++++++++++++++++++++++
 include/asm-avr32/arch-at32uc3a0xxx/gpio-impl.h |   62 ++++++++++++++++
 include/asm-avr32/arch-common/portmux-gpio.h    |   83 +---------------------
 4 files changed, 150 insertions(+), 111 deletions(-)
 create mode 100644 include/asm-avr32/arch-at32ap700x/gpio-impl.h
 create mode 100644 include/asm-avr32/arch-at32uc3a0xxx/gpio-impl.h

diff --git a/cpu/at32uc/portmux-gpio.c b/cpu/at32uc/portmux-gpio.c
index 8ed5659..0b8bae9 100644
--- a/cpu/at32uc/portmux-gpio.c
+++ b/cpu/at32uc/portmux-gpio.c
@@ -29,26 +29,11 @@
 void portmux_select_peripheral(void *port, unsigned long pin_mask,
 		enum portmux_function func, unsigned long flags)
 {
-	/* Both pull-up and pull-down set means buskeeper */
-	if (flags & PORTMUX_PULL_DOWN)
-		gpio_writel(port, PDERS, pin_mask);
-	else
-		gpio_writel(port, PDERC, pin_mask);
 	if (flags & PORTMUX_PULL_UP)
 		gpio_writel(port, PUERS, pin_mask);
 	else
 		gpio_writel(port, PUERC, pin_mask);
 
-	/* Select drive strength */
-	if (flags & PORTMUX_DRIVE_LOW)
-		gpio_writel(port, ODCR0S, pin_mask);
-	else
-		gpio_writel(port, ODCR0C, pin_mask);
-	if (flags & PORTMUX_DRIVE_HIGH)
-		gpio_writel(port, ODCR1S, pin_mask);
-	else
-		gpio_writel(port, ODCR1C, pin_mask);
-
 	/* Select function */
 	if (func & PORTMUX_FUNC_B)
 		gpio_writel(port, PMR0S, pin_mask);
@@ -66,11 +51,6 @@ void portmux_select_peripheral(void *port, unsigned long pin_mask,
 void portmux_select_gpio(void *port, unsigned long pin_mask,
 		unsigned long flags)
 {
-	/* Both pull-up and pull-down set means buskeeper */
-	if (flags & PORTMUX_PULL_DOWN)
-		gpio_writel(port, PDERS, pin_mask);
-	else
-		gpio_writel(port, PDERC, pin_mask);
 	if (flags & PORTMUX_PULL_UP)
 		gpio_writel(port, PUERS, pin_mask);
 	else
@@ -82,16 +62,6 @@ void portmux_select_gpio(void *port, unsigned long pin_mask,
 	else
 		gpio_writel(port, ODMERC, pin_mask);
 
-	/* Select drive strength */
-	if (flags & PORTMUX_DRIVE_LOW)
-		gpio_writel(port, ODCR0S, pin_mask);
-	else
-		gpio_writel(port, ODCR0C, pin_mask);
-	if (flags & PORTMUX_DRIVE_HIGH)
-		gpio_writel(port, ODCR1S, pin_mask);
-	else
-		gpio_writel(port, ODCR1C, pin_mask);
-
 	/* Select direction and initial pin state */
 	if (flags & PORTMUX_DIR_OUTPUT) {
 		if (flags & PORTMUX_INIT_HIGH)
diff --git a/include/asm-avr32/arch-at32ap700x/gpio-impl.h b/include/asm-avr32/arch-at32ap700x/gpio-impl.h
new file mode 100644
index 0000000..8801bd0
--- /dev/null
+++ b/include/asm-avr32/arch-at32ap700x/gpio-impl.h
@@ -0,0 +1,86 @@
+#ifndef __ASM_AVR32_ARCH_GPIO_IMPL_H__
+#define __ASM_AVR32_ARCH_GPIO_IMPL_H__
+
+/* Register offsets */
+struct gpio_regs {
+	u32	GPER;
+	u32	GPERS;
+	u32	GPERC;
+	u32	GPERT;
+	u32	PMR0;
+	u32	PMR0S;
+	u32	PMR0C;
+	u32	PMR0T;
+	u32	PMR1;
+	u32	PMR1S;
+	u32	PMR1C;
+	u32	PMR1T;
+	u32	__reserved0[4];
+	u32	ODER;
+	u32	ODERS;
+	u32	ODERC;
+	u32	ODERT;
+	u32	OVR;
+	u32	OVRS;
+	u32	OVRC;
+	u32	OVRT;
+	u32	PVR;
+	u32	__reserved_PVRS;
+	u32	__reserved_PVRC;
+	u32	__reserved_PVRT;
+	u32	PUER;
+	u32	PUERS;
+	u32	PUERC;
+	u32	PUERT;
+	u32	PDER;
+	u32	PDERS;
+	u32	PDERC;
+	u32	PDERT;
+	u32	IER;
+	u32	IERS;
+	u32	IERC;
+	u32	IERT;
+	u32	IMR0;
+	u32	IMR0S;
+	u32	IMR0C;
+	u32	IMR0T;
+	u32	IMR1;
+	u32	IMR1S;
+	u32	IMR1C;
+	u32	IMR1T;
+	u32	GFER;
+	u32	GFERS;
+	u32	GFERC;
+	u32	GFERT;
+	u32	IFR;
+	u32	__reserved_IFRS;
+	u32	IFRC;
+	u32	__reserved_IFRT;
+	u32	ODMER;
+	u32	ODMERS;
+	u32	ODMERC;
+	u32	ODMERT;
+	u32	__reserved1[4];
+	u32	ODCR0;
+	u32	ODCR0S;
+	u32	ODCR0C;
+	u32	ODCR0T;
+	u32	ODCR1;
+	u32	ODCR1S;
+	u32	ODCR1C;
+	u32	ODCR1T;
+	u32	__reserved2[4];
+	u32	OSRR0;
+	u32	OSRR0S;
+	u32	OSRR0C;
+	u32	OSRR0T;
+	u32	__reserved3[8];
+	u32	STER;
+	u32	STERS;
+	u32	STERC;
+	u32	STERT;
+	u32	__reserved4[35];
+	u32	VERSION;
+};
+
+#endif /* __ASM_AVR32_ARCH_GPIO_IMPL_H__ */
diff --git a/include/asm-avr32/arch-at32uc3a0xxx/gpio-impl.h b/include/asm-avr32/arch-at32uc3a0xxx/gpio-impl.h
new file mode 100644
index 0000000..636bd19
--- /dev/null
+++ b/include/asm-avr32/arch-at32uc3a0xxx/gpio-impl.h
@@ -0,0 +1,62 @@
+#ifndef __ASM_AVR32_ARCH_GPIO_IMPL_H__
+#define __ASM_AVR32_ARCH_GPIO_IMPL_H__
+
+/* Register offsets */
+struct gpio_regs {
+	u32	GPER;
+	u32	GPERS;
+	u32	GPERC;
+	u32	GPERT;
+	u32	PMR0;
+	u32	PMR0S;
+	u32	PMR0C;
+	u32	PMR0T;
+	u32	PMR1;
+	u32	PMR1S;
+	u32	PMR1C;
+	u32	PMR1T;
+	u32	__reserved0[4];
+	u32	ODER;
+	u32	ODERS;
+	u32	ODERC;
+	u32	ODERT;
+	u32	OVR;
+	u32	OVRS;
+	u32	OVRC;
+	u32	OVRT;
+	u32	PVR;
+	u32	__reserved_PVRS;
+	u32	__reserved_PVRC;
+	u32	__reserved_PVRT;
+	u32	PUER;
+	u32	PUERS;
+	u32	PUERC;
+	u32	PUERT;
+	u32	ODMER;
+	u32	ODMERS;
+	u32	ODMERC;
+	u32	ODMERT;
+	u32	IER;
+	u32	IERS;
+	u32	IERC;
+	u32	IERT;
+	u32	IMR0;
+	u32	IMR0S;
+	u32	IMR0C;
+	u32	IMR0T;
+	u32	IMR1;
+	u32	IMR1S;
+	u32	IMR1C;
+	u32	IMR1T;
+	u32	GFER;
+	u32	GFERS;
+	u32	GFERC;
+	u32	GFERT;
+	u32	IFR;
+	u32	__reserved_IFRS;
+	u32	IFRC;
+	u32	__reserved_IFRT;
+	u32	__reserved1[8];
+};
+
+#endif /* __ASM_AVR32_ARCH_GPIO_IMPL_H__ */
diff --git a/include/asm-avr32/arch-common/portmux-gpio.h b/include/asm-avr32/arch-common/portmux-gpio.h
index 24943ec..1306cbe 100644
--- a/include/asm-avr32/arch-common/portmux-gpio.h
+++ b/include/asm-avr32/arch-common/portmux-gpio.h
@@ -24,87 +24,8 @@
 
 #include <asm/io.h>
 
-/* Register offsets */
-struct gpio_regs {
-	u32	GPER;
-	u32	GPERS;
-	u32	GPERC;
-	u32	GPERT;
-	u32	PMR0;
-	u32	PMR0S;
-	u32	PMR0C;
-	u32	PMR0T;
-	u32	PMR1;
-	u32	PMR1S;
-	u32	PMR1C;
-	u32	PMR1T;
-	u32	__reserved0[4];
-	u32	ODER;
-	u32	ODERS;
-	u32	ODERC;
-	u32	ODERT;
-	u32	OVR;
-	u32	OVRS;
-	u32	OVRC;
-	u32	OVRT;
-	u32	PVR;
-	u32	__reserved_PVRS;
-	u32	__reserved_PVRC;
-	u32	__reserved_PVRT;
-	u32	PUER;
-	u32	PUERS;
-	u32	PUERC;
-	u32	PUERT;
-	u32	PDER;
-	u32	PDERS;
-	u32	PDERC;
-	u32	PDERT;
-	u32	IER;
-	u32	IERS;
-	u32	IERC;
-	u32	IERT;
-	u32	IMR0;
-	u32	IMR0S;
-	u32	IMR0C;
-	u32	IMR0T;
-	u32	IMR1;
-	u32	IMR1S;
-	u32	IMR1C;
-	u32	IMR1T;
-	u32	GFER;
-	u32	GFERS;
-	u32	GFERC;
-	u32	GFERT;
-	u32	IFR;
-	u32	__reserved_IFRS;
-	u32	IFRC;
-	u32	__reserved_IFRT;
-	u32	ODMER;
-	u32	ODMERS;
-	u32	ODMERC;
-	u32	ODMERT;
-	u32	__reserved1[4];
-	u32	ODCR0;
-	u32	ODCR0S;
-	u32	ODCR0C;
-	u32	ODCR0T;
-	u32	ODCR1;
-	u32	ODCR1S;
-	u32	ODCR1C;
-	u32	ODCR1T;
-	u32	__reserved2[4];
-	u32	OSRR0;
-	u32	OSRR0S;
-	u32	OSRR0C;
-	u32	OSRR0T;
-	u32	__reserved3[8];
-	u32	STER;
-	u32	STERS;
-	u32	STERC;
-	u32	STERT;
-	u32	__reserved4[35];
-	u32	VERSION;
-};
+/* Register layout for this specific device */
+#include <asm/arch/gpio-impl.h>
 
 /* Register access macros */
 #define gpio_readl(port, reg)						\
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 2/6] AVR32: Support for external SRAM on at32uc3
  2008-11-13 15:25 ` [U-Boot] [PATCH 1/6] AVR32: Make GPIO implmentation cpu dependent Gunnar Rangoy
@ 2008-11-13 15:25   ` Gunnar Rangoy
  2008-11-13 15:25     ` [U-Boot] [PATCH 3/6] AVR32: Use SRAM as main memory on the atevk1100 board Gunnar Rangoy
  0 siblings, 1 reply; 7+ messages in thread
From: Gunnar Rangoy @ 2008-11-13 15:25 UTC (permalink / raw)
  To: u-boot

This patch adds support for external SRAM connected to the EBI bus
on the at32uc3a0xxx.

Signed-off-by: Gunnar Rangoy <gunnar@rangoy.com>
Signed-off-by: Paul Driveklepp <pauldriveklepp@gmail.com>
Signed-off-by: Olav Morken <olavmrk@gmail.com>
---
 cpu/at32uc/Makefile      |    1 +
 cpu/at32uc/smc.c         |   61 ++++++++++++++++++++++++++
 cpu/at32uc/smc.h         |  105 ++++++++++++++++++++++++++++++++++++++++++++++
 include/asm-avr32/sram.h |   34 +++++++++++++++
 4 files changed, 201 insertions(+), 0 deletions(-)
 create mode 100644 cpu/at32uc/smc.c
 create mode 100644 cpu/at32uc/smc.h
 create mode 100644 include/asm-avr32/sram.h

diff --git a/cpu/at32uc/Makefile b/cpu/at32uc/Makefile
index cab9bdc..6714d14 100644
--- a/cpu/at32uc/Makefile
+++ b/cpu/at32uc/Makefile
@@ -36,6 +36,7 @@ COBJS-y			+= cache.o
 COBJS-y			+= interrupts.o
 COBJS-$(CONFIG_PORTMUX_GPIO) += portmux-gpio.o
 COBJS-y			+= flashc.o
+COBJS-y			+= smc.o
 
 SRCS	:= $(START-y:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
diff --git a/cpu/at32uc/smc.c b/cpu/at32uc/smc.c
new file mode 100644
index 0000000..f4bb9fb
--- /dev/null
+++ b/cpu/at32uc/smc.c
@@ -0,0 +1,61 @@
+#include <common.h>
+#include <asm/sram.h>
+#include "smc.h"
+
+unsigned long sram_init(const struct sram_config *config)
+{
+	u32 cfgreg;
+	u32 dbw;
+	u32 sram_size;
+
+	cfgreg = SMC_BF(NWE_SETUP, config->nwe_setup)
+		|SMC_BF(NRD_SETUP, config->nrd_setup)
+		|SMC_BF(NCS_WR_SETUP, config->ncs_wr_setup)
+		|SMC_BF(NCS_RD_SETUP, config->ncs_rd_setup);
+	smc_writel(config->chip_select, SETUP, cfgreg);
+
+	cfgreg = SMC_BF(NWE_PULSE, config->nwe_pulse)
+		|SMC_BF(NRD_PULSE, config->nrd_pulse)
+		|SMC_BF(NCS_WR_PULSE, config->ncs_wr_pulse)
+		|SMC_BF(NCS_RD_PULSE, config->ncs_rd_pulse);
+	smc_writel(config->chip_select, PULSE, cfgreg);
+
+	cfgreg = SMC_BF(NWE_CYCLE, config->nwe_cycle)
+		|SMC_BF(NRD_CYCLE, config->nrd_cycle);
+	smc_writel(config->chip_select, CYCLE, cfgreg);
+
+	switch (config->data_bits) {
+	case 8:
+		dbw=0;
+		break;
+	case 16:
+		dbw=1;
+		break;
+	case 32:
+		dbw=2;
+		break;
+	default:
+		panic("Invalid number of databits for SRAM");
+
+	}
+	cfgreg = SMC_BF(READ_MODE, config->read_mode)
+		|SMC_BF(WRITE_MODE, config->write_mode)
+		|SMC_BF(EXNW_MODE, config->exnw_mode)
+		|SMC_BF(BAT, config->bat)
+		|SMC_BF(DBW, dbw)
+		|SMC_BF(TDF_CYCLES, config->tdf_cycles)
+		|SMC_BF(TDF_MODE, config->tdf_mode)
+		|SMC_BF(PMEN, config->pmen)
+		|SMC_BF(PS, config->ps);
+
+
+
+
+	smc_writel(config->chip_select, MODE, cfgreg);
+	sram_size= (1<<config->address_bits) * (config->data_bits/8);
+
+
+	return sram_size;
+}
+
+
diff --git a/cpu/at32uc/smc.h b/cpu/at32uc/smc.h
new file mode 100644
index 0000000..ea4d399
--- /dev/null
+++ b/cpu/at32uc/smc.h
@@ -0,0 +1,105 @@
+/*
+ * Register definitions for Static Memory Controller
+ */
+#ifndef __CPU_AT32UC3_SMC_H__
+#define __CPU_AT32UC3_SMC_H__
+
+#include <asm/arch/memory-map.h>
+#include <asm/io.h>
+
+/* SMC register offsets */
+#define SMC_SETUP(x)				0x0000+(x)*0x10
+#define SMC_PULSE(x)				0x0004+(x)*0x10
+#define SMC_CYCLE(x)				0x0008+(x)*0x10
+#define SMC_MODE(x)				0x000c+(x)*0x10
+
+/* Bitfields in SETUP0..3 */
+#define SMC_NWE_SETUP_OFFSET			0
+#define SMC_NWE_SETUP_SIZE			6
+#define SMC_NCS_WR_SETUP_OFFSET			8
+#define SMC_NCS_WR_SETUP_SIZE			6
+#define SMC_NRD_SETUP_OFFSET			16
+#define SMC_NRD_SETUP_SIZE			6
+#define SMC_NCS_RD_SETUP_OFFSET			24
+#define SMC_NCS_RD_SETUP_SIZE			6
+
+/* Bitfields in PULSE0..3 */
+#define SMC_NWE_PULSE_OFFSET			0
+#define SMC_NWE_PULSE_SIZE			7
+#define SMC_NCS_WR_PULSE_OFFSET			8
+#define SMC_NCS_WR_PULSE_SIZE			7
+#define SMC_NRD_PULSE_OFFSET			16
+#define SMC_NRD_PULSE_SIZE			7
+#define SMC_NCS_RD_PULSE_OFFSET			24
+#define SMC_NCS_RD_PULSE_SIZE			7
+
+/* Bitfields in CYCLE0..3 */
+#define SMC_NWE_CYCLE_OFFSET			0
+#define SMC_NWE_CYCLE_SIZE			9
+#define SMC_NRD_CYCLE_OFFSET			16
+#define SMC_NRD_CYCLE_SIZE			9
+
+/* Bitfields in MODE0..3 */
+#define SMC_READ_MODE_OFFSET			0
+#define SMC_READ_MODE_SIZE			1
+#define SMC_WRITE_MODE_OFFSET			1
+#define SMC_WRITE_MODE_SIZE			1
+#define SMC_EXNW_MODE_OFFSET			4
+#define SMC_EXNW_MODE_SIZE			2
+#define SMC_BAT_OFFSET				8
+#define SMC_BAT_SIZE				1
+#define SMC_DBW_OFFSET				12
+#define SMC_DBW_SIZE				2
+#define SMC_TDF_CYCLES_OFFSET			16
+#define SMC_TDF_CYCLES_SIZE			4
+#define SMC_TDF_MODE_OFFSET			20
+#define SMC_TDF_MODE_SIZE			1
+#define SMC_PMEN_OFFSET				24
+#define SMC_PMEN_SIZE				1
+#define SMC_PS_OFFSET				28
+#define SMC_PS_SIZE				2
+
+/* Constants for READ_MODE */
+#define SMC_READ_MODE_NCS_CONTROLLED		0
+#define SMC_READ_MODE_NRD_CONTROLLED		1
+
+/* Constants for WRITE_MODE */
+#define SMC_WRITE_MODE_NCS_CONTROLLED		0
+#define SMC_WRITE_MODE_NWE_CONTROLLED		1
+
+/* Constants for EXNW_MODE */
+#define SMC_EXNW_MODE_DISABLED			0
+#define SMC_EXNW_MODE_RESERVED			1
+#define SMC_EXNW_MODE_FROZEN			2
+#define SMC_EXNW_MODE_READY			3
+
+/* Constants for BAT */
+#define SMC_BAT_BYTE_SELECT			0
+#define SMC_BAT_BYTE_WRITE			1
+
+/* Constants for DBW */
+#define SMC_DBW_8_BITS				0
+#define SMC_DBW_16_BITS				1
+#define SMC_DBW_32_BITS				2
+
+/* Bit manipulation macros */
+#define SMC_BIT(name)						\
+	(1 << SMC_##name##_OFFSET)
+#define SMC_BF(name,value)					\
+	(((value) & ((1 << SMC_##name##_SIZE) - 1))		\
+	 << SMC_##name##_OFFSET)
+#define SMC_BFEXT(name,value)					\
+	(((value) >> SMC_##name##_OFFSET)			\
+	 & ((1 << SMC_##name##_SIZE) - 1))
+#define SMC_BFINS(name,value,old)\
+	(((old) & ~(((1 << SMC_##name##_SIZE) - 1)		\
+		    << SMC_##name##_OFFSET))			\
+	 | SMC_BF(name,value))
+
+/* Register access macros */
+#define smc_readl(cs,reg)					\
+	readl((void *)SMC_BASE + SMC_##reg(cs))
+#define smc_writel(cs,reg,value)				\
+	writel((value), (void *)SMC_BASE + SMC_##reg(cs))
+
+#endif /* __CPU_AT32UC3_SMC_H__ */
diff --git a/include/asm-avr32/sram.h b/include/asm-avr32/sram.h
new file mode 100644
index 0000000..3306d0b
--- /dev/null
+++ b/include/asm-avr32/sram.h
@@ -0,0 +1,34 @@
+#ifndef __ASM_AVR32_SRAM_H
+#define __ASM_AVR32_SRAM_H
+#include <asm/types.h>
+
+struct sram_config {
+	/* Number of data bits. */
+	u8 data_bits;
+
+	/* Chip select */
+	u8 chip_select;
+
+	/* Number of address bits */
+	u8 address_bits;
+
+	/* nwe/nrd waveforms */
+	u8 nwe_setup, nwe_pulse, nwe_hold;
+	u8 nrd_setup, nrd_pulse, nrd_hold;
+
+	/* ncs waveforms */
+	u8 ncs_wr_setup, ncs_wr_pulse, ncs_wr_hold;
+	u8 ncs_rd_setup, ncs_rd_pulse, ncs_rd_hold;
+
+	/* Cycle length */
+	u16 nwe_cycle, nrd_cycle;
+
+	/* mode */
+	u8 read_mode, write_mode, exnw_mode;
+	u8 bat, dbw, tdf_cycles, tdf_mode, pmen, ps;
+};
+
+
+unsigned long sram_init(const struct sram_config *config);
+
+#endif /* __ASM_AVR32_SRAM_H */
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 3/6] AVR32: Use SRAM as main memory on the atevk1100 board
  2008-11-13 15:25   ` [U-Boot] [PATCH 2/6] AVR32: Support for external SRAM on at32uc3 Gunnar Rangoy
@ 2008-11-13 15:25     ` Gunnar Rangoy
  2008-11-13 15:25       ` [U-Boot] [PATCH 4/6] AVR32: Enable relocation of code for at32uc3 Gunnar Rangoy
  0 siblings, 1 reply; 7+ messages in thread
From: Gunnar Rangoy @ 2008-11-13 15:25 UTC (permalink / raw)
  To: u-boot

This patch makes u-boot use SRAM instead of SDRAM as main memory.
This is done due to a bug in the current revsions of the
at32uc3a0xxx series microcontrollers, which makes it unreliable to
run code from SDRAM.

Signed-off-by: Gunnar Rangoy <gunnar@rangoy.com>
Signed-off-by: Paul Driveklepp <pauldriveklepp@gmail.com>
Signed-off-by: Olav Morken <olavmrk@gmail.com>
---
 board/atmel/atevk1100/atevk1100.c |   65 ++++++++++++++++++++++++------------
 include/configs/atevk1100.h       |   12 ++++---
 2 files changed, 50 insertions(+), 27 deletions(-)

diff --git a/board/atmel/atevk1100/atevk1100.c b/board/atmel/atevk1100/atevk1100.c
index 105e5c9..a85337e 100644
--- a/board/atmel/atevk1100/atevk1100.c
+++ b/board/atmel/atevk1100/atevk1100.c
@@ -22,30 +22,51 @@
 #include <common.h>
 
 #include <asm/io.h>
-#include <asm/sdram.h>
+#include <asm/sram.h>
 #include <asm/arch/clk.h>
 #include <asm/arch/hmatrix.h>
 #include <asm/arch/portmux.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct sdram_config sdram_config = {
-	/* MT48LC16M16A2-7E (32 MB) */
-	.data_bits	= SDRAM_DATA_16BIT,
-	.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,
-};
+static const struct sram_config sram_config = {
+	/* 2x16MBit, CY7C1069AV33-10ZXC */
+	.data_bits	= 16,
+	.address_bits	= 21,
+	.ncs_rd_setup	= 0,
+	.ncs_wr_setup 	= 0,
+	.nwe_setup	= 0,
+	.nrd_setup	= 0,
+	/*
+	 * These settings works when running at 33Mhz,
+	 * but fails at 54MHz
+	 */
+
+	/*
+	.ncs_wr_pulse 	= 1,
+	.ncs_rd_pulse	= 1,
+	.nwe_pulse	= 1,
+	.nrd_pulse	= 1,
+	.nwe_cycle	= 2,
+	.nrd_cycle	= 2,
+	*/
+	.ncs_wr_pulse 	= 2,
+	.ncs_rd_pulse	= 2,
+	.nwe_pulse	= 2,
+	.nrd_pulse	= 2,
+	.nwe_cycle	= 3,
+	.nrd_cycle	= 3,
+	.chip_select	= 2,
+	.read_mode	= 1,
+	.write_mode	= 1,
+	.exnw_mode	= 0,
+	.bat		= 1,
+	.tdf_cycles	= 0,
+	.tdf_mode	= 0,
+	.pmen		= 0,
+	.ps		= 1,
 
+};
 int board_early_init_f(void)
 {
 	/* Enable SDRAM in the EBI mux according to AP7000 datasheet */
@@ -65,14 +86,14 @@ phys_size_t initdram(int board_type)
 {
 	unsigned long expected_size;
 	unsigned long actual_size;
-	void *sdram_base;
+	void *sram_base;
 
-	sdram_base = map_physmem(EBI_SDRAM_BASE, EBI_SDRAM_SIZE, MAP_NOCACHE);
+	sram_base = map_physmem(EBI_SRAM_CS2_BASE, EBI_SRAM_CS2_SIZE, MAP_NOCACHE);
 
-	expected_size = sdram_init(sdram_base, &sdram_config);
-	actual_size = get_ram_size(sdram_base, expected_size);
+	expected_size = sram_init(&sram_config);
+	actual_size = get_ram_size(sram_base, expected_size);
 
-	unmap_physmem(sdram_base, EBI_SDRAM_SIZE);
+	unmap_physmem(sram_base, EBI_SRAM_CS2_SIZE);
 
 	if (expected_size != actual_size)
 		printf("Warning: Only %lu of %lu MiB SDRAM is working\n",
diff --git a/include/configs/atevk1100.h b/include/configs/atevk1100.h
index db5af37..166027a 100644
--- a/include/configs/atevk1100.h
+++ b/include/configs/atevk1100.h
@@ -148,7 +148,8 @@
 #define CONFIG_ATMEL_SPI		1
 #define CONFIG_PORTMUX_GPIO		1
 #define CFG_NR_PIOS			5
-#define CFG_SDRAMC			1
+#define CFG_SDRAMC			0
+#define CFG_SMC				1
 
 #define CFG_DCACHE_LINESZ		32
 #define CFG_ICACHE_LINESZ		32
@@ -165,7 +166,8 @@
 
 #define CFG_INTRAM_BASE			INTERNAL_SRAM_BASE
 #define CFG_INTRAM_SIZE			INTERNAL_SRAM_SIZE
-#define CFG_SDRAM_BASE			EBI_SDRAM_BASE
+/* Not really SDRAM, maybe change to SRAM? */
+#define CFG_SDRAM_BASE			EBI_SRAM_CS2_BASE
 
 #define CONFIG_ENV_IS_IN_FLASH		1
 #define CONFIG_ENV_SIZE			65536
@@ -176,8 +178,8 @@
 #define CFG_MALLOC_LEN			(256*1024)
 #define CFG_DMA_ALLOC_LEN		(16384)
 
-/* Allow 4MB for the kernel run-time image */
-#define CFG_LOAD_ADDR			(EBI_SDRAM_BASE + 0x00400000)
+/* Allow 3MB(TODO:update) for the kernel run-time image */
+#define CFG_LOAD_ADDR			(CFG_SDRAM_BASE + 0x00270000)
 #define CFG_BOOTPARAMS_LEN		(16 * 1024)
 
 /* Other configuration settings that shouldn't have to change all that often */
@@ -187,7 +189,7 @@
 #define CFG_PBSIZE			(CFG_CBSIZE + sizeof(CFG_PROMPT) + 16)
 #define CFG_LONGHELP			1
 
-#define CFG_MEMTEST_START		EBI_SDRAM_BASE
+#define CFG_MEMTEST_START		CFG_SDRAM_BASE
 #define CFG_MEMTEST_END			(CFG_MEMTEST_START + 0x700000)
 #define CFG_BAUDRATE_TABLE { 115200, 38400, 19200, 9600, 2400 }
 
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 4/6] AVR32: Enable relocation of code for at32uc3
  2008-11-13 15:25     ` [U-Boot] [PATCH 3/6] AVR32: Use SRAM as main memory on the atevk1100 board Gunnar Rangoy
@ 2008-11-13 15:25       ` Gunnar Rangoy
  2008-11-13 15:25         ` [U-Boot] [PATCH 5/6] AVR32: Support for writing to internal flash on at32uc3 Gunnar Rangoy
  0 siblings, 1 reply; 7+ messages in thread
From: Gunnar Rangoy @ 2008-11-13 15:25 UTC (permalink / raw)
  To: u-boot

Since we now have working SRAM, we can relocate the code to SRAM.

Signed-off-by: Gunnar Rangoy <gunnar@rangoy.com>
Signed-off-by: Paul Driveklepp <pauldriveklepp@gmail.com>
Signed-off-by: Olav Morken <olavmrk@gmail.com>
---
 board/atmel/atevk1100/u-boot.lds |    2 --
 cpu/at32uc/start.S               |   15 +--------------
 lib_avr32/board.c                |    5 -----
 3 files changed, 1 insertions(+), 21 deletions(-)

diff --git a/board/atmel/atevk1100/u-boot.lds b/board/atmel/atevk1100/u-boot.lds
index 3c20979..1c09641 100644
--- a/board/atmel/atevk1100/u-boot.lds
+++ b/board/atmel/atevk1100/u-boot.lds
@@ -40,8 +40,6 @@ SECTIONS
 		*(.rodata.*)
 	}
 
-	_end_noreloc = .;
-
 	. = ALIGN(8);
 	_data = .;
 	.data : {
diff --git a/cpu/at32uc/start.S b/cpu/at32uc/start.S
index e1d44cb..a8798af 100644
--- a/cpu/at32uc/start.S
+++ b/cpu/at32uc/start.S
@@ -216,44 +216,31 @@ relocate_code:
 	brgt	1b
 
 	/* jump to RAM */
-	/* we don't want to run from sdram.
 	sub	r0, pc, . - in_ram
 	add	pc, r0, lr
-	*/
 
 	.align	2
 in_ram:
 	/* find the new GOT and relocate it */
 	lddpc	r6, got_init_reloc
 3:	rsub	r6, pc
-	add	r6, lr
 	mov	r8, r6
 	lda.w	r9, _egot
 	lda.w	r10, _got
 	sub	r9, r10
 
-	lda.w	r1, _end_noreloc
-
 1:	ld.w	r0, r8[0]
-	/* Check if the symbol points to the text-section, and
-	 * skip relocation if they do.
-	 */
-	cp.w	r0, r1
-	brlt	2f
-
 	add	r0, lr
 	st.w	r8, r0
-2:
+
 	sub	r8, -4
 	sub	r9, 4
 	brgt	1b
 
 	/* Move the exception handlers */
-	/* We don't want to run from sdram.
 	mfsr	r2, SYSREG_EVBA
 	add	r2, lr
 	mtsr	SYSREG_EVBA, r2
-	*/
 
 	/* Do the rest of the initialization sequence */
 	call	board_init_r
diff --git a/lib_avr32/board.c b/lib_avr32/board.c
index 6afa8bd..216ff74 100644
--- a/lib_avr32/board.c
+++ b/lib_avr32/board.c
@@ -294,13 +294,8 @@ void board_init_r(gd_t *new_gd, ulong dest_addr)
 	     cmdtp !=  &__u_boot_cmd_end; cmdtp++) {
 		unsigned long addr;
 
-		/* We don't relocate code in the at32uc3a0xxx cpu yet due to
-		 * SDRAM bug. See errata 41.4.6.1.
-		 */
-#ifndef CONFIG_AT32UC
 		addr = (unsigned long)cmdtp->cmd + gd->reloc_off;
 		cmdtp->cmd = (typeof(cmdtp->cmd))addr;
-#endif
 
 		addr = (unsigned long)cmdtp->name + gd->reloc_off;
 		cmdtp->name = (typeof(cmdtp->name))addr;
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 5/6] AVR32: Support for writing to internal flash on at32uc3
  2008-11-13 15:25       ` [U-Boot] [PATCH 4/6] AVR32: Enable relocation of code for at32uc3 Gunnar Rangoy
@ 2008-11-13 15:25         ` Gunnar Rangoy
  2008-11-13 15:25           ` [U-Boot] [PATCH 6/6] AVR32: Set boot parameters for atevk1100 Gunnar Rangoy
  0 siblings, 1 reply; 7+ messages in thread
From: Gunnar Rangoy @ 2008-11-13 15:25 UTC (permalink / raw)
  To: u-boot

This patch enables writing (the environment) to the internal flash in
the microcontroller.

Signed-off-by: Gunnar Rangoy <gunnar@rangoy.com>
Signed-off-by: Paul Driveklepp <pauldriveklepp@gmail.com>
Signed-off-by: Olav Morken <olavmrk@gmail.com>
---
 cpu/at32uc/flashc.c         |   69 +++++++++++++++++++++++++++++++++++++++++--
 cpu/at32uc/flashc.h         |   17 ++++++++++
 include/configs/atevk1100.h |    2 +-
 3 files changed, 84 insertions(+), 4 deletions(-)

diff --git a/cpu/at32uc/flashc.c b/cpu/at32uc/flashc.c
index f33a4bb..e626e1f 100644
--- a/cpu/at32uc/flashc.c
+++ b/cpu/at32uc/flashc.c
@@ -45,6 +45,7 @@ unsigned long flash_init(void)
 {
 	unsigned long fsz;
 	unsigned long size;
+	unsigned int i;
 
 	fsz = FLASHC_BFEXT(FSZ, flashc_readl(FSR));
 
@@ -55,6 +56,10 @@ unsigned long flash_init(void)
 	/* Currently, all interflash have pages which are 128 words. */
 	flash_info[0].sector_count = size / (128*4);
 
+	for(i=0; i<flash_info[0].sector_count; i++){
+		flash_info[0].start[i] = i*128*4 + CFG_FLASH_BASE;
+	}
+
 	return size;
 }
 
@@ -62,19 +67,77 @@ void flash_print_info(flash_info_t *info)
 {
 	printf("Flash: Vendor ID: 0x%02lx, Product ID: 0x%02lx\n",
 	       info->flash_id >> 16, info->flash_id & 0xffff);
-	printf("Size: %ld MB in %d sectors\n",
+	printf("Size: %ld kB in %d sectors\n",
 	       info->size >> 10, info->sector_count);
 }
 
+static void flash_wait_ready(void)
+{
+	while(! flashc_readl(FSR) & FLASHC_BIT(FRDY) );
+}
+
 int flash_erase(flash_info_t *info, int s_first, int s_last)
 {
-	/* TODO */
+	int page;
+
+	for(page=s_first;page<s_last; page++){
+		flash_wait_ready();
+		flashc_writel(
+			FCMD,FLASHC_BF(CMD, FLASHC_EP)
+			|FLASHC_BF(PAGEN, page)
+			|FLASHC_BF(KEY, 0xa5));
+	}
 	return ERR_OK;
 }
 
+static void write_flash_page(unsigned int pagen, const u32 *data)
+{
+	unsigned int i;
+	u32 *dst;
+
+	dst = (u32 *) CFG_FLASH_BASE;
+
+	/* clear page buffer */
+	flash_wait_ready();
+	flashc_writel(FCMD,
+		FLASHC_BF(CMD, FLASHC_CPB) |
+		FLASHC_BF(KEY, 0xa5));
+
+	/* fill page buffer*/
+	flash_wait_ready();
+	for(i=0; i<128; i++){
+		dst[i]=data[i];
+	}
+
+	/* issue write command */
+	flashc_writel(FCMD,
+		FLASHC_BF(CMD, FLASHC_WP)|
+		FLASHC_BF(PAGEN, pagen)|
+		FLASHC_BF(KEY, 0xa5));
+}
+
 int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong count)
 {
-	/* TODO */
+	unsigned int i;
+
+	if (addr % (4*128)) {
+		printf("flash: write_buff(): ERROR, addr(0x%08lx) not "
+			"on page boundary", addr);
+		return ERR_ALIGN;
+	}
+	if (count % (4*128)) {
+		printf("flash: write_buff(): ERROR, count(0x%lu) not "
+			"a multiple of pagesize", count);
+		return ERR_ALIGN;
+	}
+
+	for (i = 0; i < count; i += 128*4) {
+		unsigned int pagen;
+		pagen = (addr-CFG_FLASH_BASE+i) / (128*4);
+		write_flash_page(pagen, (u32*) (src+i));
+	}
+
+
 	return ERR_OK;
 }
 
diff --git a/cpu/at32uc/flashc.h b/cpu/at32uc/flashc.h
index 23618bc..3e97781 100644
--- a/cpu/at32uc/flashc.h
+++ b/cpu/at32uc/flashc.h
@@ -43,6 +43,23 @@
 #define FLASHC_LOCK_OFFSET			16
 #define FLASHC_LOCK_SIZE			16
 
+#define FLASHC_NOP 	0 /*No operation*/
+#define FLASHC_WP 	1 /*Write Page*/
+#define FLASHC_EP	2 /*Erase Page*/
+#define FLASHC_CPB 	3 /*Clear Page Buffer*/
+#define FLASHC_LP 	4 /*Lock region containing given Page*/
+#define FLASHC_UP 	5 /*Unlock region containing given Page*/
+#define FLASHC_EA 	6 /*Erase All*/
+#define FLASHC_WGPB	7 /*Write General-Purpose Fuse Bit*/
+#define FLASHC_EGPB 	8 /*Erase General-Purpose Fuse Bit*/
+#define FLASHC_SSB 	9 /*Set Security Bit*/
+#define FLASHC_PGPFB 	10 /*Program GP Fuse Byte*/
+#define FLASHC_EAGPF 	11 /*Erase All GPFuses*/
+#define FLASHC_QPR 	12 /*Quick Page Read*/
+#define FLASHC_WUP	13 /*Write User Page*/
+#define FLASHC_EUP	14 /*Erase User Page*/
+#define FLASHC_QPRUP 	15 /*Quick Page Read User Page*/
+
 
 /* Bit manipulation macros */
 #define FLASHC_BIT(name)					\
diff --git a/include/configs/atevk1100.h b/include/configs/atevk1100.h
index 166027a..776a3a1 100644
--- a/include/configs/atevk1100.h
+++ b/include/configs/atevk1100.h
@@ -160,7 +160,7 @@
 #define CFG_FLASH_BASE			0x80000000
 #define CFG_FLASH_SIZE			0x80000
 #define CFG_MAX_FLASH_BANKS		1
-#define CFG_MAX_FLASH_SECT		135
+#define CFG_MAX_FLASH_SECT		1024
 
 #define CFG_MONITOR_BASE		CFG_FLASH_BASE
 
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 6/6] AVR32: Set boot parameters for atevk1100
  2008-11-13 15:25         ` [U-Boot] [PATCH 5/6] AVR32: Support for writing to internal flash on at32uc3 Gunnar Rangoy
@ 2008-11-13 15:25           ` Gunnar Rangoy
  0 siblings, 0 replies; 7+ messages in thread
From: Gunnar Rangoy @ 2008-11-13 15:25 UTC (permalink / raw)
  To: u-boot

This patch sets resonable boot parameters for the atevk1100.
(Load kernel via tftp/dhcp and use nfs rootfs.)

Signed-off-by: Gunnar Rangoy <gunnar@rangoy.com>
Signed-off-by: Paul Driveklepp <pauldriveklepp@gmail.com>
Signed-off-by: Olav Morken <olavmrk@gmail.com>
---
 include/configs/atevk1100.h |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/configs/atevk1100.h b/include/configs/atevk1100.h
index 776a3a1..2a9d91b 100644
--- a/include/configs/atevk1100.h
+++ b/include/configs/atevk1100.h
@@ -95,17 +95,17 @@
 
 #define CONFIG_BAUDRATE			9600
 #define CONFIG_BOOTARGS							\
-	"console=ttyS0 root=/dev/mmcblk0p1 fbmem=600k rootwait=1"
+	"console=ttyS0 ip=dhcp root=/dev/nfs rootwait=1"
 
 #define CONFIG_BOOTCOMMAND						\
-	"fsload; bootm $(fileaddr)"
+	"dhcp; bootm $(fileaddr)"
 
 /*
  * Only interrupt autoboot if <space> is pressed. Otherwise, garbage
  * data on the serial line may interrupt the boot sequence.
  */
-#define CONFIG_BOOTDELAY		-1
-#define CONFIG_AUTOBOOT			0
+#define CONFIG_BOOTDELAY		1
+#define CONFIG_AUTOBOOT			1
 #define CONFIG_AUTOBOOT_KEYED		1
 #define CONFIG_AUTOBOOT_PROMPT		\
 	"Press SPACE to abort autoboot in %d seconds\n", bootdelay
-- 
1.5.6.3

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2008-11-13 15:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-13 15:25 [U-Boot] [PATCH 0/6] Updates for atevk1100 support Gunnar Rangoy
2008-11-13 15:25 ` [U-Boot] [PATCH 1/6] AVR32: Make GPIO implmentation cpu dependent Gunnar Rangoy
2008-11-13 15:25   ` [U-Boot] [PATCH 2/6] AVR32: Support for external SRAM on at32uc3 Gunnar Rangoy
2008-11-13 15:25     ` [U-Boot] [PATCH 3/6] AVR32: Use SRAM as main memory on the atevk1100 board Gunnar Rangoy
2008-11-13 15:25       ` [U-Boot] [PATCH 4/6] AVR32: Enable relocation of code for at32uc3 Gunnar Rangoy
2008-11-13 15:25         ` [U-Boot] [PATCH 5/6] AVR32: Support for writing to internal flash on at32uc3 Gunnar Rangoy
2008-11-13 15:25           ` [U-Boot] [PATCH 6/6] AVR32: Set boot parameters for atevk1100 Gunnar Rangoy

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.