Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/at91 add preliminary support for AT91SAM9260
details: https://anonhg.NetBSD.org/src/rev/b90c61f8c233
branches: trunk
changeset: 770968:b90c61f8c233
user: aymeric <aymeric%NetBSD.org@localhost>
date: Fri Nov 04 17:20:54 2011 +0000
description:
add preliminary support for AT91SAM9260
diffstat:
sys/arch/arm/at91/at91bus.c | 20 +-
sys/arch/arm/at91/at91pmcreg.h | 9 +-
sys/arch/arm/at91/at91sam9260bus.c | 161 +++++++++++++++++++
sys/arch/arm/at91/at91sam9260busvar.h | 62 +++++++
sys/arch/arm/at91/at91sam9260reg.h | 280 ++++++++++++++++++++++++++++++++++
sys/arch/arm/at91/files.at91 | 6 +-
6 files changed, 529 insertions(+), 9 deletions(-)
diffs (truncated from 659 to 300 lines):
diff -r cfc699306e6a -r b90c61f8c233 sys/arch/arm/at91/at91bus.c
--- a/sys/arch/arm/at91/at91bus.c Fri Nov 04 17:17:50 2011 +0000
+++ b/sys/arch/arm/at91/at91bus.c Fri Nov 04 17:20:54 2011 +0000
@@ -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 @@
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 @@
#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 @@
{
DBGU_CIDR_AT91SAM9260,
"AT91SAM9260"
+#ifdef AT91SAM9260
+ , &at91sam9260bus
+#endif
},
{
DBGU_CIDR_AT91SAM9260,
@@ -188,7 +196,7 @@
#endif
},
{
- DBGU_CIDR_AT91SAM9260,
+ DBGU_CIDR_AT91SAM9263,
"AT91SAM9263"
},
{
@@ -592,7 +600,7 @@
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 @@
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;
diff -r cfc699306e6a -r b90c61f8c233 sys/arch/arm/at91/at91pmcreg.h
--- a/sys/arch/arm/at91/at91pmcreg.h Fri Nov 04 17:17:50 2011 +0000
+++ b/sys/arch/arm/at91/at91pmcreg.h Fri Nov 04 17:20:54 2011 +0000
@@ -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_ */
diff -r cfc699306e6a -r b90c61f8c233 sys/arch/arm/at91/at91sam9260bus.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/at91/at91sam9260bus.c Fri Nov 04 17:20:54 2011 +0000
@@ -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);
+}
+
diff -r cfc699306e6a -r b90c61f8c233 sys/arch/arm/at91/at91sam9260busvar.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/arm/at91/at91sam9260busvar.h Fri Nov 04 17:20:54 2011 +0000
@@ -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
Home |
Main Index |
Thread Index |
Old Index