Module Name: src
Committed By: aymeric
Date: Fri Nov 4 17:20:54 UTC 2011
Modified Files:
src/sys/arch/arm/at91: at91bus.c at91pmcreg.h files.at91
Added Files:
src/sys/arch/arm/at91: at91sam9260bus.c at91sam9260busvar.h
at91sam9260reg.h
Log Message:
add preliminary support for AT91SAM9260
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/at91/at91bus.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/at91/at91pmcreg.h \
src/sys/arch/arm/at91/files.at91
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/at91/at91sam9260bus.c \
src/sys/arch/arm/at91/at91sam9260busvar.h \
src/sys/arch/arm/at91/at91sam9260reg.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/at91/at91bus.c
diff -u src/sys/arch/arm/at91/at91bus.c:1.11 src/sys/arch/arm/at91/at91bus.c:1.12
--- src/sys/arch/arm/at91/at91bus.c:1.11 Fri Jul 1 19:31:16 2011
+++ src/sys/arch/arm/at91/at91bus.c Fri Nov 4 17:20:54 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: at91bus.c,v 1.11 2011/07/01 19:31:16 dyoung Exp $ */
+/* $NetBSD: at91bus.c,v 1.12 2011/11/04 17:20:54 aymeric Exp $ */
/*
* Copyright (c) 2007 Embedtronics Oy
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: at91bus.c,v 1.11 2011/07/01 19:31:16 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: at91bus.c,v 1.12 2011/11/04 17:20:54 aymeric Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -149,7 +149,8 @@ static int at91bus_submatch(device_t, cf
const int *, void *);
-CFATTACH_DECL(at91bus, sizeof(struct at91bus_softc), at91bus_match, at91bus_attach, NULL, NULL);
+CFATTACH_DECL_NEW(at91bus, sizeof(struct at91bus_softc),
+ at91bus_match, at91bus_attach, NULL, NULL);
struct at91bus_clocks at91bus_clocks = {0};
struct at91bus_softc *at91bus_sc = NULL;
@@ -160,6 +161,10 @@ struct at91bus_softc *at91bus_sc = NULL;
#include <arm/at91/at91rm9200busvar.h>
#endif
+#ifdef AT91SAM9260
+#include <arm/at91/at91sam9260busvar.h>
+#endif
+
#ifdef AT91SAM9261
#include <arm/at91/at91sam9261busvar.h>
#endif
@@ -179,6 +184,9 @@ static const struct {
{
DBGU_CIDR_AT91SAM9260,
"AT91SAM9260"
+#ifdef AT91SAM9260
+ , &at91sam9260bus
+#endif
},
{
DBGU_CIDR_AT91SAM9260,
@@ -188,7 +196,7 @@ static const struct {
#endif
},
{
- DBGU_CIDR_AT91SAM9260,
+ DBGU_CIDR_AT91SAM9263,
"AT91SAM9263"
},
{
@@ -592,7 +600,7 @@ at91bus_found(device_t self, bus_addr_t
locs[AT91BUSCF_ADDR] = addr;
locs[AT91BUSCF_PID] = pid;
- sc = (struct at91bus_softc*) self;
+ sc = device_private(self);
sa.sa_iot = sc->sc_iot;
sa.sa_dmat = sc->sc_dmat;
sa.sa_addr = addr;
@@ -611,7 +619,7 @@ at91bus_attach(device_t parent, device_t
if (at91_chip_ndx < 0)
panic("%s: at91bus_init() has not been called!", __FUNCTION__);
- sc = (struct at91bus_softc*) self;
+ sc = device_private(self);
/* initialize bus space and bus dma things... */
sc->sc_iot = &at91_bs_tag;
Index: src/sys/arch/arm/at91/at91pmcreg.h
diff -u src/sys/arch/arm/at91/at91pmcreg.h:1.2 src/sys/arch/arm/at91/at91pmcreg.h:1.3
--- src/sys/arch/arm/at91/at91pmcreg.h:1.2 Thu Jul 3 01:15:38 2008
+++ src/sys/arch/arm/at91/at91pmcreg.h Fri Nov 4 17:20:54 2011
@@ -1,4 +1,4 @@
-/* $Id: at91pmcreg.h,v 1.2 2008/07/03 01:15:38 matt Exp $ */
+/* $Id: at91pmcreg.h,v 1.3 2011/11/04 17:20:54 aymeric Exp $ */
#ifndef _AT91PMCREG_H_
#define _AT91PMCREG_H_ 1
@@ -24,12 +24,15 @@
#define PMC_IDR 0x64U /* 64: Interrupt Disable Reg */
#define PMC_SR 0x68U /* 68: Status Register */
#define PMC_IMR 0x6CU /* 6C: Interrupt Mask Reg */
+#define PMC_PLLICPR 0x80U /* 80: PLL Charge Pump Current Reg */
/* System Clock Enable Register bits: */
#define PMC_SCSR_PCK3 0x0800U
#define PMC_SCSR_PCK2 0x0400U
#define PMC_SCSR_PCK1 0x0200U
#define PMC_SCSR_PCK0 0x0100U
+#define PMC_SCSR_SAM_UDP 0x0080U
+#define PMC_SCSR_SAM_UHP 0x0040U
#define PMC_SCSR_UHP 0x0010U /* 1 = Enable USB Host Port clks */
#define PMC_SCSR_MCKUDP 0x0004U /* 1 = enable Master Clock dis */
#define PMC_SCSR_UDP 0x0002U /* 1 = enable USB Device Port clk */
@@ -113,6 +116,10 @@
#define PMC_SR_LOCKA 0x0002U
#define PMC_SR_MOSCS 0x0001U
+/* PLL Charge Pump Current Reg bits: */
+#define PMC_PLLICPR_ICPPLLA 0x00000001U
+#define PMC_PLLICPR_ICPPLLB 0x00010000U
+
#define PMCREG(offset) *((volatile uint32_t*)(0xfffffc00UL + (offset)))
#endif /* !_AT91PMCREG_H_ */
Index: src/sys/arch/arm/at91/files.at91
diff -u src/sys/arch/arm/at91/files.at91:1.2 src/sys/arch/arm/at91/files.at91:1.3
--- src/sys/arch/arm/at91/files.at91:1.2 Thu Jul 3 01:15:39 2008
+++ src/sys/arch/arm/at91/files.at91 Fri Nov 4 17:20:54 2011
@@ -1,9 +1,10 @@
-# $Id: files.at91,v 1.2 2008/07/03 01:15:39 matt Exp $
+# $Id: files.at91,v 1.3 2011/11/04 17:20:54 aymeric Exp $
#
# Configuration info for AT91 based CPUs
#
defflag opt_at91types.h AT91RM9200
+defflag opt_at91types.h AT91SAM9260
defflag opt_at91types.h AT91SAM9261
file arch/arm/arm32/irq_dispatch.S
@@ -22,6 +23,7 @@ file arch/arm/at91/at91bus.c at91bus ne
# chips:
file arch/arm/at91/at91rm9200bus.c at91rm9200
+file arch/arm/at91/at91sam9260bus.c at91sam9260
file arch/arm/at91/at91sam9261bus.c at91sam9261
# AT91 Advanced Interrupt controller:
@@ -45,7 +47,7 @@ attach at91tctmr at at91bus
file arch/arm/at91/at91tctmr.c at91tctmr needs-flag
# AT91 Power Management Controller
-file arch/arm/at91/at91pmc.c at91rm9200 | at91sam9261
+file arch/arm/at91/at91pmc.c at91rm9200 | at91sam9260 | at91sam9261
# AT91 serial port
device at91usart: tty
Added files:
Index: src/sys/arch/arm/at91/at91sam9260bus.c
diff -u /dev/null src/sys/arch/arm/at91/at91sam9260bus.c:1.1
--- /dev/null Fri Nov 4 17:20:54 2011
+++ src/sys/arch/arm/at91/at91sam9260bus.c Fri Nov 4 17:20:54 2011
@@ -0,0 +1,161 @@
+/* $NetBSD: at91sam9260bus.c,v 1.1 2011/11/04 17:20:54 aymeric Exp $ */
+/*
+ * Copied from at91sam9261bus.c
+ * Adaptation to AT91SAM9260 by Aymeric Vincent is in the public domain.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: at91sam9260bus.c,v 1.1 2011/11/04 17:20:54 aymeric Exp $");
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/time.h>
+#include <sys/device.h>
+#include <uvm/uvm_extern.h>
+
+#include <arm/at91/at91sam9260busvar.h>
+
+const struct at91bus_machdep at91sam9260bus = {
+ at91sam9260bus_init,
+ at91sam9260bus_attach_cn,
+ at91sam9260bus_devmap,
+
+ /* clocking support: */
+ at91sam9260bus_peripheral_clock,
+
+ /* PIO support: */
+ at91sam9260bus_pio_port,
+ at91sam9260bus_gpio_mask,
+
+ /* interrupt handling support: */
+ at91sam9260bus_intr_init,
+ at91sam9260bus_intr_establish,
+ at91sam9260bus_intr_disestablish,
+ at91sam9260bus_intr_poll,
+ at91sam9260bus_intr_dispatch,
+
+ /* configuration */
+ at91sam9260bus_peripheral_name,
+ at91sam9260bus_search_peripherals
+};
+
+void at91sam9260bus_init(struct at91bus_clocks *clocks) {
+ pmap_devmap_register(at91_devmap());
+ at91pmc_get_clocks(clocks);
+}
+
+const struct pmap_devmap *at91sam9260bus_devmap(void) {
+ static const struct pmap_devmap devmap[] = {
+ {
+ AT91SAM9260_APB_VBASE,
+ AT91SAM9260_APB_HWBASE,
+ AT91SAM9260_APB_SIZE,
+ VM_PROT_READ | VM_PROT_WRITE,
+ PTE_NOCACHE
+ },
+
+ {
+ 0, 0, 0, 0, 0
+ }
+ };
+
+ return devmap;
+}
+
+void at91sam9260bus_peripheral_clock(int pid, int enable) {
+ switch (pid) {
+ case PID_UHP:
+ if (enable)
+ PMCREG(PMC_SCER) = PMC_SCSR_SAM_UHP;
+ else
+ PMCREG(PMC_SCDR) = PMC_SCSR_SAM_UHP;
+ break;
+ }
+ at91pmc_peripheral_clock(pid, enable);
+}
+
+at91pio_port at91sam9260bus_pio_port(int pid) {
+ switch (pid) {
+ case PID_PIOA: return AT91_PIOA;
+ case PID_PIOB: return AT91_PIOB;
+ case PID_PIOC: return AT91_PIOC;
+ default: panic("%s: pid %d not valid", __FUNCTION__, pid);
+ }
+
+}
+
+uint32_t at91sam9260bus_gpio_mask(int pid) {
+ return 0xFFFFFFFFUL;
+}
+
+const char *at91sam9260bus_peripheral_name(int pid) {
+ switch (pid) {
+ case PID_FIQ: return "FIQ";
+ case PID_SYSIRQ:return "SYS";
+ case PID_PIOA: return "PIOA";
+ case PID_PIOB: return "PIOB";
+ case PID_PIOC: return "PIOC";
+ case PID_US0: return "USART0";
+ case PID_US1: return "USART1";
+ case PID_US2: return "USART2";
+ case PID_MCI: return "MCI";
+ case PID_UDP: return "UDP";
+ case PID_TWI: return "TWI";
+ case PID_SPI0: return "SPI0";
+ case PID_SPI1: return "SPI1";
+ case PID_SSC: return "SSC";
+ case PID_TC0: return "TC0";
+ case PID_TC1: return "TC1";
+ case PID_TC2: return "TC2";
+ case PID_UHP: return "UHP";
+ case PID_EMAC: return "EMAC";
+ case PID_US3: return "USART3";
+ case PID_US4: return "USART4";
+ case PID_US5: return "USART5";
+ case PID_TC3: return "TC3";
+ case PID_TC4: return "TC4";
+ case PID_TC5: return "TC5";
+ case PID_IRQ0: return "IRQ0";
+ case PID_IRQ1: return "IRQ1";
+ case PID_IRQ2: return "IRQ2";
+ default: panic("%s: invalid pid %d", __FUNCTION__, pid);
+ }
+}
+
+void at91sam9260bus_search_peripherals(device_t self,
+ device_t found_func(device_t, bus_addr_t, int)) {
+ static const struct {
+ bus_addr_t addr;
+ int pid;
+ } table[] = {
+ {AT91SAM9260_PMC_BASE, -1},
+ {AT91SAM9260_AIC_BASE, -1},
+ {AT91SAM9260_PIT_BASE, PID_SYSIRQ},
+ {AT91SAM9260_TC0_BASE, PID_TC0},
+ {AT91SAM9260_TC1_BASE, PID_TC1},
+ {AT91SAM9260_TC2_BASE, PID_TC2},
+ {AT91SAM9260_DBGU_BASE, PID_SYSIRQ},
+ {AT91SAM9260_PIOA_BASE, PID_PIOA},
+ {AT91SAM9260_PIOB_BASE, PID_PIOB},
+ {AT91SAM9260_PIOC_BASE, PID_PIOC},
+ {AT91SAM9260_USART0_BASE, PID_US0},
+ {AT91SAM9260_USART1_BASE, PID_US1},
+ {AT91SAM9260_USART2_BASE, PID_US2},
+ {AT91SAM9260_SSC_BASE, PID_SSC},
+// {AT91SAM9260_EMAC_BASE, PID_EMAC},
+ {AT91SAM9260_TWI_BASE, PID_TWI},
+ {AT91SAM9260_SPI0_BASE, PID_SPI0},
+ {AT91SAM9260_SPI1_BASE, PID_SPI1},
+ {AT91SAM9260_UHP_BASE, PID_UHP},
+ {AT91SAM9260_UDP_BASE, PID_UDP},
+ {AT91SAM9260_MCI_BASE, PID_MCI},
+ {0, 0}
+ };
+ int i;
+
+ for (i = 0; table[i].addr; i++)
+ found_func(self, table[i].addr, table[i].pid);
+}
+
Index: src/sys/arch/arm/at91/at91sam9260busvar.h
diff -u /dev/null src/sys/arch/arm/at91/at91sam9260busvar.h:1.1
--- /dev/null Fri Nov 4 17:20:54 2011
+++ src/sys/arch/arm/at91/at91sam9260busvar.h Fri Nov 4 17:20:54 2011
@@ -0,0 +1,62 @@
+/* $NetBSD: at91sam9260busvar.h,v 1.1 2011/11/04 17:20:54 aymeric Exp $ */
+
+/*
+ * Copyright (c) 2007 Embedtronics Oy
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ICHIRO FUKUHARA ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL ICHIRO FUKUHARA OR THE VOICES IN HIS HEAD BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/* Adaptation to AT91SAM9260 by Aymeric Vincent is in the public domain */
+
+#ifndef _AT91SAM9260BUSVAR_H_
+#define _AT91SAM9260BUSVAR_H_
+
+#include <arm/at91/at91busvar.h>
+#include <arm/at91/at91pmcvar.h>
+#include <arm/at91/at91aicvar.h>
+#include <arm/at91/at91dbguvar.h>
+#include <arm/at91/at91sam9260reg.h>
+
+#include "at91dbgu.h"
+
+void at91sam9260bus_init(struct at91bus_clocks *);
+#if NAT91DBGU > 0
+#define at91sam9260bus_attach_cn at91dbgu_attach_cn
+#else
+void at91sam9260bus_attach_cn(bus_space_tag_t iot, int ospeed, int cflag);
+#endif
+const struct pmap_devmap *at91sam9260bus_devmap(void);
+void at91sam9260bus_peripheral_clock(int pid, int enable);
+at91pio_port at91sam9260bus_pio_port(int pid);
+uint32_t at91sam9260bus_gpio_mask(int pid);
+#define at91sam9260bus_intr_init at91aic_init
+#define at91sam9260bus_intr_establish at91aic_intr_establish
+#define at91sam9260bus_intr_disestablish at91aic_intr_disestablish
+#define at91sam9260bus_intr_poll at91aic_intr_poll
+#define at91sam9260bus_intr_dispatch at91aic_intr_dispatch
+const char *at91sam9260bus_peripheral_name(int pid);
+void at91sam9260bus_search_peripherals(device_t self,
+ device_t (*found_func)(device_t, bus_addr_t, int));
+
+extern const struct at91bus_machdep at91sam9260bus;
+
+#endif // _AT91SAM9260BUSVAR_H_
Index: src/sys/arch/arm/at91/at91sam9260reg.h
diff -u /dev/null src/sys/arch/arm/at91/at91sam9260reg.h:1.1
--- /dev/null Fri Nov 4 17:20:54 2011
+++ src/sys/arch/arm/at91/at91sam9260reg.h Fri Nov 4 17:20:54 2011
@@ -0,0 +1,280 @@
+/* $NetBSD: at91sam9260reg.h,v 1.1 2011/11/04 17:20:54 aymeric Exp $ */
+
+/*
+ * Copyright (c) 2007 Embedtronics Oy
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ICHIRO FUKUHARA ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL ICHIRO FUKUHARA OR THE VOICES IN HIS HEAD BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/* Adaptation to AT91SAM9260 by Aymeric Vincent is in the public domain */
+
+#ifndef _AT91SAM9260REG_H_
+#define _AT91SAM9260REG_H_
+
+#include <arm/at91/at91reg.h>
+
+/*
+ * Physical memory map for the AT91SAM9260
+ */
+
+/*
+ * ffff ffff ---------------------------
+ * System Controller
+ * ffff c000 ---------------------------
+ * Peripherals
+ * fffa 0000 ---------------------------
+ * (not used)
+ * 9000 0000 ---------------------------
+ * EBI Chip Select 7
+ * 8000 0000 ---------------------------
+ * EBI Chip Select 6 / CF logic
+ * 7000 0000 ---------------------------
+ * EBI Chip Select 5 / CF logic
+ * 6000 0000 ---------------------------
+ * EBI Chip Select 4 / CF logic
+ * 5000 0000 ---------------------------
+ * EBI Chip Select 3 / NANDFlash
+ * 4000 0000 ---------------------------
+ * EBI Chip Select 2
+ * 3000 0000 ---------------------------
+ * EBI Chip Select 1 / SDRAM
+ * 2000 0000 ---------------------------
+ * EBI Chip Select 0 / BFC
+ * 1000 0000 ---------------------------
+ * Reserved
+ * 0070 0000 ---------------------------
+ * LCD User Interface
+ * 0060 0000 ---------------------------
+ * UHP User Interface
+ * 0050 0000 ---------------------------
+ * Reserved
+ * 0040 0000 ---------------------------
+ * SRAM
+ * 0030 0000 ---------------------------
+ * DTCM
+ * 0020 0000 ---------------------------
+ * ITCM
+ * 0010 0000 ---------------------------
+ * Boot memory
+ * 0000 0000 ---------------------------
+ */
+
+
+/*
+ * Virtual memory map for the AT91SAM9260 integrated devices
+ *
+ * Some device registers are statically mapped on upper address region.
+ * because we have to access them before bus_space is initialized.
+ * Most devices are dynamicaly mapped by bus_space_map(). In this case,
+ * the actual mapped (virtual) address are not cared by device drivers.
+ */
+
+/*
+ * FFFF FFFF ---------------------------
+ * APB bus (1 MB)
+ * FFF0 0000 ---------------------------
+ * (not used)
+ * E000 0000 ---------------------------
+ * Kernel text and data
+ * C000 0000 ---------------------------
+ * (not used)
+ * 0000 0000 ---------------------------
+ *
+ */
+
+#define AT91SAM9260_BOOTMEM_BASE 0x00000000U
+#define AT91SAM9260_BOOTMEM_SIZE 0x00100000U
+
+#define AT91SAM9260_ROM_BASE 0x00100000U
+#define AT91SAM9260_ROM_SIZE 0x00008000U
+
+#define AT91SAM9260_SRAM0_BASE 0x00200000U
+#define AT91SAM9260_SRAM0_SIZE 0x00001000U
+
+#define AT91SAM9260_SRAM1_BASE 0x00300000U
+#define AT91SAM9260_SRAM1_SIZE 0x00001000U
+
+#define AT91SAM9260_UHP_BASE 0x00500000U
+#define AT91SAM9260_UHP_SIZE 0x00004000U
+
+#define AT91SAM9260_CS0_BASE 0x10000000U
+#define AT91SAM9260_CS0_SIZE 0x10000000U
+
+#define AT91SAM9260_CS1_BASE 0x20000000U
+#define AT91SAM9260_CS1_SIZE 0x10000000U
+
+#define AT91SAM9260_SDRAM_BASE AT91SAM9260_CS1_BASE
+
+#define AT91SAM9260_CS2_BASE 0x30000000U
+#define AT91SAM9260_CS2_SIZE 0x10000000U
+
+#define AT91SAM9260_CS3_BASE 0x40000000U
+#define AT91SAM9260_CS3_SIZE 0x10000000U
+
+#define AT91SAM9260_CS4_BASE 0x50000000U
+#define AT91SAM9260_CS4_SIZE 0x10000000U
+
+#define AT91SAM9260_CS5_BASE 0x60000000U
+#define AT91SAM9260_CS5_SIZE 0x10000000U
+
+#define AT91SAM9260_CS6_BASE 0x70000000U
+#define AT91SAM9260_CS6_SIZE 0x10000000U
+
+#define AT91SAM9260_CS7_BASE 0x80000000U
+#define AT91SAM9260_CS7_SIZE 0x10000000U
+
+/* Virtual address for I/O space */
+#define AT91SAM9260_APB_VBASE 0xfff00000U
+#define AT91SAM9260_APB_HWBASE 0xfff00000U
+#define AT91SAM9260_APB_SIZE 0x00100000U
+
+/* Peripherals: */
+#include <arm/at91/at91pdcreg.h>
+
+#define AT91SAM9260_TC0_BASE 0xFFFA0000U
+#define AT91SAM9260_TC1_BASE 0xFFFA0040U
+#define AT91SAM9260_TC2_BASE 0xFFFA0080U
+#define AT91SAM9260_TCB012_BASE 0xFFFA00C0U
+#define AT91SAM9260_TC_SIZE 0x4000U
+//#include <arm/at91/at91tcreg.h>
+
+#define AT91SAM9260_UDP_BASE 0xFFFA4000U
+#define AT91SAM9260_UDP_SIZE 0x4000U
+//#include <arm/at91/at91udpreg.h>
+
+#define AT91SAM9260_MCI_BASE 0xFFFA8000U
+
+#define AT91SAM9260_TWI_BASE 0xFFFAC000U
+#include <arm/at91/at91twireg.h>
+
+#define AT91SAM9260_USART0_BASE 0xFFFB0000U
+#define AT91SAM9260_USART1_BASE 0xFFFB4000U
+#define AT91SAM9260_USART2_BASE 0xFFFB8000U
+#define AT91SAM9260_USART_SIZE 0x4000U
+#include <arm/at91/at91usartreg.h>
+
+#define AT91SAM9260_SSC_BASE 0xFFFBC000U
+#define AT91SAM9260_SSC_SIZE 0x4000U
+//#include <arm/at91/at91sscreg.h>
+
+#define AT91SAM9260_EMAC_BASE 0xFFFC4000U
+#define AT91SAM9260_EMAC_SIZE 0x4000U
+#include <arm/at91/at91emacreg.h>
+
+#define AT91SAM9260_SPI0_BASE 0xFFFC8000U
+#define AT91SAM9260_SPI1_BASE 0xFFFCC000U
+#define AT91SAM9260_SPI_SIZE 0x4000U
+#include <arm/at91/at91spireg.h>
+
+/* system controller: */
+#define AT91SAM9260_SDRAMC_BASE 0xFFFFEA00U
+#define AT91SAM9260_SDRAMC_SIZE 0x200U
+
+#define AT91SAM9260_SMC_BASE 0xFFFFEC00U
+#define AT91SAM9260_SMC_SIZE 0x200U
+
+#define AT91SAM9260_MATRIX_BASE 0xFFFFEE00U
+#define AT91SAM9216_MATRIX_SIZE 0x200U
+
+#define AT91SAM9260_AIC_BASE 0xFFFFF000U
+#define AT91SAM9260_AIC_SIZE 0x200U
+#include <arm/at91/at91aicreg.h>
+
+#define AT91SAM9260_DBGU_BASE 0xFFFFF200U
+#define AT91SAM9260_DBGU_SIZE 0x200U
+#include <arm/at91/at91dbgureg.h>
+
+#define AT91SAM9260_PIOA_BASE 0xFFFFF400U
+#define AT91SAM9260_PIOB_BASE 0xFFFFF600U
+#define AT91SAM9260_PIOC_BASE 0xFFFFF800U
+#define AT91SAM9260_PIO_SIZE 0x200U
+#define AT91_PIO_SIZE AT91SAM9260_PIO_SIZE // for generic AT91 code
+#include <arm/at91/at91pioreg.h>
+
+#define PIOA_READ(_reg) *((volatile uint32_t *)(AT91SAM9260_PIOA_BASE + (_reg)))
+#define PIOA_WRITE(_reg, _val) do {*((volatile uint32_t *)(AT91SAM9260_PIOA_BASE + (_reg))) = (_val);} while (0)
+#define PIOB_READ(_reg) *((volatile uint32_t *)(AT91SAM9260_PIOB_BASE + (_reg)))
+#define PIOB_WRITE(_reg, _val) do {*((volatile uint32_t *)(AT91SAM9260_PIOB_BASE + (_reg))) = (_val);} while (0)
+#define PIOC_READ(_reg) *((volatile uint32_t *)(AT91SAM9260_PIOC_BASE + (_reg)))
+#define PIOC_WRITE(_reg, _val) do {*((volatile uint32_t *)(AT91SAM9260_PIOC_BASE + (_reg))) = (_val);} while (0)
+
+#define AT91SAM9260_PMC_BASE 0xFFFFFC00U
+#define AT91SAM9260_PMC_SIZE 0x100U
+#include <arm/at91/at91pmcreg.h>
+
+#define AT91SAM9260_RSTC_BASE 0xFFFFFD00U
+#define AT91SAM9260_RSTC_SIZE 0x10U
+
+#define AT91SAM9260_SHDWC_BASE 0xFFFFFD10U
+#define AT91SAM9260_SHDWC_SIZE 0x10U
+
+#define AT91SAM9260_RTT_BASE 0xFFFFFD20U
+#define AT91SAM9260_RTT_SIZE 0x10U
+
+#define AT91SAM9260_PIT_BASE 0xFFFFFD30U
+#define AT91SAM9260_PIT_SIZE 0x10U
+
+#define AT91SAM9260_WDT_BASE 0xFFFFFD40U
+#define AT91SAM9260_WDT_SIZE 0x10U
+
+#define AT91SAM9260_GPBR_BASE 0xFFFFFD50U
+#define AT91SAM9260_GPBR_SIZE 0x10U
+
+
+// peripheral identifiers:
+/* peripheral identifiers: */
+enum {
+ PID_FIQ = 0, /* 0 */
+ PID_SYSIRQ, /* 1 */
+ PID_PIOA, /* 2 */
+ PID_PIOB, /* 3 */
+ PID_PIOC, /* 4 */
+ PID_ADC, /* 5 */
+ PID_US0, /* 6 */
+ PID_US1, /* 7 */
+ PID_US2, /* 8 */
+ PID_MCI, /* 9 */
+ PID_UDP, /* 10 */
+ PID_TWI, /* 11 */
+ PID_SPI0, /* 12 */
+ PID_SPI1, /* 13 */
+ PID_SSC, /* 14 */
+
+
+ PID_TC0 = 17, /* 17 */
+ PID_TC1, /* 18 */
+ PID_TC2, /* 19 */
+ PID_UHP, /* 20 */
+ PID_EMAC, /* 21 */
+ PID_ISI, /* 22 */
+ PID_US3, /* 23 */
+ PID_US4, /* 24 */
+ PID_US5, /* 25 */
+ PID_TC3, /* 26 */
+ PID_TC4, /* 27 */
+ PID_TC5, /* 28 */
+ PID_IRQ0, /* 29 */
+ PID_IRQ1, /* 30 */
+ PID_IRQ2, /* 31 */
+};
+
+#endif /* _AT91SAM9260REG_H_ */