From: Remco Poelstra <remco.poelstra@duran-audio.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/2] LPC2468 example board
Date: Wed, 18 Mar 2009 15:56:49 +0100 [thread overview]
Message-ID: <49C10BB1.1040006@duran-audio.com> (raw)
In-Reply-To: <20090318135854.0ED0A832E8B7@gemini.denx.de>
Example board for LPC2468 support
Signed-off-by: Remco Poelstra <remco.poelstra+u-boot@duran-audio.com>
---
diff -upNr u-boot-orig/board/LPC2468/config.mk u-boot/board/LPC2468/config.mk
--- u-boot-orig/board/LPC2468/config.mk 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/config.mk 2009-03-18 09:30:20.000000000 +0100
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2000
+# Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+# Marius Groeger <mgroeger@sysgo.de>
+#
+# (C) Copyright 2000
+# Wolfgang Denk, DENX Software Engineering, wd at 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
+#
+
+#address where u-boot will be relocated
+TEXT_BASE = 0xA1f80000
diff -upNr u-boot-orig/board/LPC2468/eth.c u-boot/board/LPC2468/eth.c
--- u-boot-orig/board/LPC2468/eth.c 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/eth.c 2009-03-18 15:33:31.000000000 +0100
@@ -0,0 +1,694 @@
+/*
+ * (C) Copyright 2009 Duran Audio B.V. <www.duran-audio.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
+ *
+ * 18-03-2009 Updated for U-boot 2009.3 by Remco Poelstra <remco.poelstra+u-boot@duran-audio.com>
+ * Based on sample code from NXP
+ */
+
+#include <config.h>
+#include <common.h>
+#include <net.h>
+#include <asm/arch/hardware.h>
+
+/******************************************************************************
+ * Typedefs and defines
+ *****************************************************************************/
+#define MAX_PHY_INIT_RETRY 10
+
+/* EMAC MODULE ID */
+#define OLD_EMAC_MODULE_ID ((0x3902 << 16) | 0x2000)
+
+/* MAC registers and parameters */
+#define PCONP_EMAC_CLOCK 0x40000000
+
+#define SPEED_100 1
+#define SPEED_10 0
+#define FULL_DUPLEX 1
+#define HALF_DUPLEX 0
+
+#define EMAC_RAM_ADDR 0x7FE00000
+#define EMAC_RAM_SIZE 0x00004000
+
+//#define EMAC_TX_DESCRIPTOR_COUNT 0x0010
+//#define EMAC_RX_DESCRIPTOR_COUNT 0x0010
+
+#define EMAC_TX_DESCRIPTOR_COUNT 5
+#define EMAC_RX_DESCRIPTOR_COUNT 4
+
+/*
+ * (Rx|Tx)Descriptor ::
+ * [4] packet - base address of the buffer containing the data
+ * [4] control - control information
+ */
+#define TX_DESCRIPTOR_SIZE (EMAC_TX_DESCRIPTOR_COUNT * 8)
+#define RX_DESCRIPTOR_SIZE (EMAC_RX_DESCRIPTOR_COUNT * 8)
+
+/*
+ * TxStatus ::
+ * [4] status
+ */
+#define TX_STATUS_SIZE (EMAC_TX_DESCRIPTOR_COUNT * 4)
+
+/*
+ * RxStatus ::
+ * [4] status - receive status flags
+ * [4] statusHashCRC - concat of dest addr hash CRC and src addr CRC
+ */
+#define RX_STATUS_SIZE (EMAC_RX_DESCRIPTOR_COUNT * 8)
+
+#define TOTAL_DESCRIPTOR_SIZE (TX_DESCRIPTOR_SIZE + RX_DESCRIPTOR_SIZE + TX_STATUS_SIZE + RX_STATUS_SIZE)
+
+/* descriptors are placed@the end of the emac address space */
+#define EMAC_DESCRIPTOR_ADDR (EMAC_RAM_ADDR + EMAC_RAM_SIZE - TOTAL_DESCRIPTOR_SIZE)
+
+#define TX_DESCRIPTOR_ADDR EMAC_DESCRIPTOR_ADDR
+#define TX_STATUS_ADDR (EMAC_DESCRIPTOR_ADDR + TX_DESCRIPTOR_SIZE)
+#define RX_DESCRIPTOR_ADDR (TX_STATUS_ADDR + TX_STATUS_SIZE)
+#define RX_STATUS_ADDR (RX_DESCRIPTOR_ADDR + RX_DESCRIPTOR_SIZE)
+
+#define EMAC_DMA_ADDR EMAC_RAM_ADDR
+#define EMAC_DMA_SIZE EMAC_RAM_ADDR + EMAC_RAM_END - TOTAL_DESCRIPTOR_SIZE
+
+#define EMAC_BLOCK_SIZE 0x600
+#define EMAC_TX_BLOCK_NUM 5
+#define EMAC_RX_BLOCK_NUM 5
+#define TOTAL_EMAC_BLOCK_NUM 10
+
+#define EMAC_BUFFER_SIZE (EMAC_BLOCK_SIZE * (EMAC_TX_BLOCK_NUM + EMAC_RX_BLOCK_NUM ))
+#define EMAC_TX_BUFFER_ADDR EMAC_RAM_ADDR
+#define EMAC_RX_BUFFER_ADDR (EMAC_RAM_ADDR + EMAC_BLOCK_SIZE * EMAC_TX_BLOCK_NUM)
+
+/* EMAC Descriptor TX and RX Control fields */
+#define EMAC_TX_DESC_INT 0x80000000
+#define EMAC_TX_DESC_LAST 0x40000000
+#define EMAC_TX_DESC_CRC 0x20000000
+#define EMAC_TX_DESC_PAD 0x10000000
+#define EMAC_TX_DESC_HUGE 0x08000000
+#define EMAC_TX_DESC_OVERRIDE 0x04000000
+
+#define EMAC_RX_DESC_INT 0x80000000
+
+/* EMAC Descriptor status related definition */
+#define TX_DESC_STATUS_ERR 0x80000000
+#define TX_DESC_STATUS_NODESC 0x40000000
+#define TX_DESC_STATUS_UNDERRUN 0x20000000
+#define TX_DESC_STATUS_LCOL 0x10000000
+#define TX_DESC_STATUS_ECOL 0x08000000
+#define TX_DESC_STATUS_EDEFER 0x04000000
+#define TX_DESC_STATUS_DEFER 0x02000000
+#define TX_DESC_STATUS_COLCNT 0x01E00000 /* four bits, it's a mask, not exact count */
+
+#define RX_DESC_STATUS_ERR 0x80000000
+#define RX_DESC_STATUS_LAST 0x40000000
+#define RX_DESC_STATUS_NODESC 0x20000000
+#define RX_DESC_STATUS_OVERRUN 0x10000000
+#define RX_DESC_STATUS_ALGNERR 0x08000000
+#define RX_DESC_STATUS_RNGERR 0x04000000
+#define RX_DESC_STATUS_LENERR 0x02000000
+#define RX_DESC_STATUS_SYMERR 0x01000000
+#define RX_DESC_STATUS_CRCERR 0x00800000
+#define RX_DESC_STATUS_BCAST 0x00400000
+#define RX_DESC_STATUS_MCAST 0x00200000
+#define RX_DESC_STATUS_FAILFLT 0x00100000
+#define RX_DESC_STATUS_VLAN 0x00080000
+#define RX_DESC_STATUS_CTLFRAM 0x00040000
+
+#define DESC_SIZE_MASK 0x000007FF /* 11 bits for both TX and RX */
+
+/* EMAC interrupt controller related definition */
+#define EMAC_INT_RXOVERRUN 0x01 << 0
+#define EMAC_INT_RXERROR 0x01 << 1
+#define EMAC_INT_RXFINISHED 0x01 << 2
+#define EMAC_INT_RXDONE 0x01 << 3
+#define EMAC_INT_TXUNDERRUN 0x01 << 4
+#define EMAC_INT_TXERROR 0x01 << 5
+#define EMAC_INT_TXFINISHED 0x01 << 6
+#define EMAC_INT_TXDONE 0x01 << 7
+#define EMAC_INT_SOFTINT 0x01 << 12
+#define EMAC_INT_WOL 0x01 << 13
+
+/* Micrel KSZ8001 PHY related registers */
+
+/* PHY_ADDR, by default, AD0 has pull-up, AD1~4 have pull-downs,
+so, the default address is 0x0001 */
+//#define PHY_ADDR (0x0000 << 8) /* in MAC_MADR, bit 8~12 */
+
+static volatile int phyAddr = 0x1000;
+#define NATIONAL_PHY 0
+#define MICREL_PHY 1
+static volatile int phyType = MICREL_PHY;
+
+#define PHY_BMCR 0x0000
+#define PHY_BMSR 0x0001
+#define PHY_PHYIDR1 0x0002
+#define PHY_PHYIDR2 0x0003
+#define PHY_ANAR 0x0004
+#define PHY_ANLPAR 0x0005
+#define PHY_ANLPARNP 0x0005
+#define PHY_ANER 0x0006
+#define PHY_ANNPTR 0x0007
+
+/* BMCR setting */
+#define BMCR_RESET 0x8000
+#define BMCR_LOOPBACK 0x4000
+#define BMCR_SPEED_100 0x2000
+#define BMCR_AN 0x1000
+#define BMCR_POWERDOWN 0x0800
+#define BMCR_ISOLATE 0x0400
+#define BMCR_RE_AN 0x0200
+#define BMCR_DUPLEX 0x0100
+
+/* BMSR setting */
+#define BMSR_100BE_T4 0x8000
+#define BMSR_100TX_FULL 0x4000
+#define BMSR_100TX_HALF 0x2000
+#define BMSR_10BE_FULL 0x1000
+#define BMSR_10BE_HALF 0x0800
+#define BMSR_AUTO_DONE 0x0020
+#define BMSR_REMOTE_FAULT 0x0010
+#define BMSR_NO_AUTO 0x0008
+#define BMSR_LINK_ESTABLISHED 0x0004
+
+#define MII_BMSR_TIMEOUT 0x1000000
+
+#define CMD_RX_ENABLE 0x01
+#define CMD_TX_ENABLE 0x02
+#define CMD_PASS_RX_FILTER 0x80
+
+#ifndef IRQ_EXT3
+#define IRQ_EXT3 LPC2294_INTERRUPT_EINT3
+#endif
+
+#define m_nic_bfs(reg, data) reg |= (data)
+#define m_nic_bfc(reg, data) reg &= ~(data)
+
+#define printk printf
+
+#define m_nic_read(reg) (*(volatile unsigned long *)(reg))
+#define m_nic_write(reg, data) ((*(volatile unsigned long *)(reg)) = (volatile unsigned long)(data))
+
+/******************************************************************************
+ * Local variables
+ *****************************************************************************/
+
+//static struct eth_device _dev_emac;
+static volatile u32 emacDuplex;
+static volatile u32 emacSpeed;
+static unsigned char macAddr[6];
+static int opened = 0;
+
+/******************************************************************************
+ * Local functions
+ *****************************************************************************/
+
+static void writePhy(u32 phyReg, u32 phyData)
+{
+
+ // write command
+ MAC_MCMD = 0x0000;
+
+ // [12:8] == PHY addr, [4:0]=0x00(BMCR) register addr
+ MAC_MADR = (phyAddr | phyReg);
+ MAC_MWTD = phyData;
+ while (MAC_MIND != 0) ;
+}
+
+static u32 readPhy(u32 phyReg)
+{
+
+ // read command
+ MAC_MCMD = 0x0001;
+
+ // [12:8] == PHY addr, [4:0]=0x00(BMCR) register addr
+ MAC_MADR = (phyAddr | phyReg);
+
+ while (MAC_MIND != 0) ;
+
+ MAC_MCMD = 0x0000;
+
+ return MAC_MRDD;
+}
+
+static int emac_start_xmit(volatile void *buf, int length)
+{
+
+ u32 txProduceIndex = 0;
+ u32 txConsumeIndex = 0;
+ u8 *pData = 0;
+ u32 len = length; //skb->len;
+ u32 sendLen = 0;
+ u32 *tx_desc_addr = NULL;
+
+ txProduceIndex = MAC_TXPRODUCEINDEX;
+ txConsumeIndex = MAC_TXCONSUMEINDEX;
+
+// printf("emac_start_xmit: pIdx = %d, cIdx=%d\n",
+// txProduceIndex, txConsumeIndex);
+
+ if (txConsumeIndex != txProduceIndex) {
+ // TODO why return here? This just means that the transmit array isn't empty
+ printk("emac: emac_tx transmit array isn't empty\n");
+ return -1;
+ }
+
+ if (txProduceIndex == EMAC_TX_DESCRIPTOR_COUNT) {
+ // should never happen
+ // TODO remove
+ printk("emac: emac_tx produce index == count\n");
+ }
+
+ if (len > 0) {
+ pData = (u8 *) EMAC_TX_BUFFER_ADDR;
+ memcpy(pData, (void *)buf, length);
+
+ do {
+ tx_desc_addr =
+ (u32 *) (TX_DESCRIPTOR_ADDR + txProduceIndex * 8);
+
+ sendLen = len;
+ if (sendLen > EMAC_BLOCK_SIZE) {
+ sendLen = EMAC_BLOCK_SIZE;
+ } else {
+ // last fragment
+ sendLen |= EMAC_TX_DESC_LAST;
+ }
+
+ m_nic_write(tx_desc_addr, (u32) pData);
+ tx_desc_addr++;
+ m_nic_write(tx_desc_addr,
+ (u32) (EMAC_TX_DESC_INT | (sendLen - 1)));
+
+ txProduceIndex++;
+ if (txProduceIndex == EMAC_TX_DESCRIPTOR_COUNT) {
+ txProduceIndex = 0;
+ }
+
+ MAC_TXPRODUCEINDEX = txProduceIndex;
+
+ len -= (sendLen & ~EMAC_TX_DESC_LAST);
+ pData += (sendLen & ~EMAC_TX_DESC_LAST);
+ } while (len > 0);
+ }
+
+ return 0;
+}
+
+static void emac_rx(void)
+{
+ u32 rxProduceIndex = 0;
+ u32 rxConsumeIndex = 0;
+ u32 *rxStatusAddr = 0;
+ u32 recvSize = 0;
+ u32 *recvAddr = 0;
+
+ /* the input parameter, EMCBuf, needs to be word aligned */
+
+ rxProduceIndex = MAC_RXPRODUCEINDEX;
+ rxConsumeIndex = MAC_RXCONSUMEINDEX;
+
+ // consume the received packets
+ while (rxConsumeIndex != rxProduceIndex) {
+
+ rxStatusAddr = (u32 *) (RX_STATUS_ADDR + rxConsumeIndex * 8);
+
+ recvSize = m_nic_read(rxStatusAddr);
+
+ if ((recvSize & RX_DESC_STATUS_LAST) == 0) {
+ // TODO: could this occur when EMAC_BLOCK_SIZE == 0x0600?
+ printk("emac_rx: NOT LAST fragment\n");
+ }
+
+ recvSize = (recvSize & DESC_SIZE_MASK) + 1;
+
+ recvAddr = (u32 *) (RX_DESCRIPTOR_ADDR + rxConsumeIndex * 8);
+
+ // TODO: allocate buffer?
+ NetReceive((uchar *) (m_nic_read(recvAddr) /*inBuf */ ),
+ recvSize);
+
+ rxConsumeIndex++;
+ if (rxConsumeIndex == EMAC_RX_DESCRIPTOR_COUNT) {
+ rxConsumeIndex = 0;
+ }
+
+ MAC_RXCONSUMEINDEX = rxConsumeIndex;
+
+ }
+
+}
+
+static void emac_interrupt(void)
+{
+ //struct net_device *dev = dev_id;
+// struct eth_device* dev = &_dev_emac;
+
+ volatile u32 regValue = 0;
+
+ regValue = MAC_INTSTATUS;
+
+ do {
+ if (regValue == 0) {
+ break;
+ }
+
+ if (regValue & EMAC_INT_RXOVERRUN) {
+ MAC_INTCLEAR = EMAC_INT_RXOVERRUN;
+ printk("rxOverrun\n");
+ break;
+ }
+
+ if (regValue & EMAC_INT_RXERROR) {
+ MAC_INTCLEAR = EMAC_INT_RXERROR;
+
+/*
+ {
+ u32 rxConsumeIndex = m_nic_read(EMAC_RXCONSUMEINDEX);
+ u32* rxStatusAddr = (tU32*)(RX_STATUS_ADDR + rxConsumeIndex * 8);
+ u32 val = m_nic_read(rxStatusAddr);
+
+ printf("val = %x\n", val);
+ }
+*/
+
+ //break;
+ }
+
+ if (regValue & EMAC_INT_RXFINISHED) {
+ MAC_INTCLEAR = EMAC_INT_RXFINISHED;
+ }
+
+ if (regValue & EMAC_INT_RXDONE) {
+ MAC_INTCLEAR = EMAC_INT_RXDONE;
+ emac_rx();
+ }
+
+ if (regValue & EMAC_INT_TXUNDERRUN) {
+ printf("TX underrun\n");
+ MAC_INTCLEAR = EMAC_INT_TXUNDERRUN;
+ break;
+ }
+
+ if (regValue & EMAC_INT_TXERROR) {
+ printf("TX err\n");
+ MAC_INTCLEAR = EMAC_INT_TXERROR;
+
+ break;
+ }
+
+ if (regValue & EMAC_INT_TXFINISHED) {
+ MAC_INTCLEAR = EMAC_INT_TXFINISHED;
+ }
+
+ if (regValue & EMAC_INT_TXDONE) {
+ MAC_INTCLEAR = EMAC_INT_TXDONE;
+ }
+
+ } while (0);
+}
+
+static int emac_open(void)
+{
+
+ opened = 1;
+
+ // enable Rx & Tx
+ m_nic_bfs(MAC_COMMAND, CMD_RX_ENABLE);
+ m_nic_bfs(MAC_COMMAND, CMD_TX_ENABLE);
+ m_nic_bfs(MAC_COMMAND, CMD_PASS_RX_FILTER);
+ m_nic_bfs(MAC_MAC1, 0x01);
+
+ return 0;
+}
+
+//static int emac_close(struct net_device *dev)
+static void emac_close(void)
+{
+ opened = 0;
+
+ // disable Rx6 Tx
+ m_nic_bfc(MAC_COMMAND, CMD_RX_ENABLE);
+ m_nic_bfc(MAC_COMMAND, CMD_TX_ENABLE);
+ m_nic_bfc(MAC_MAC1, 0x01);
+}
+
+static int phyInit(void)
+{
+ int i = 0;
+ u32 regValue = 0;
+ u32 timeout = 0;
+
+ MAC_MCFG = 0x801C; /* host clock divided by 28, no suppress preamble, no scan increment */
+ for (i = 0; i < 0x40; i++)
+ asm volatile (" nop");
+
+ // MII Mgmt. Divided by 28.
+ MAC_MCFG = 0x001C;
+ MAC_MCMD = 0;
+
+ for (i = 0; i < 0x100; i++)
+ asm volatile (" nop");
+
+ /*Reset the PHY */
+ writePhy(PHY_BMCR, BMCR_RESET);
+ udelay(100);
+
+ timeout = MII_BMSR_TIMEOUT * 4;
+ while (timeout != 0) {
+ regValue = readPhy(PHY_BMCR);
+ if ((regValue & BMCR_RESET) == 0x0000) {
+ // reset bit has been cleared
+ break;
+ }
+ timeout--;
+ }
+
+ if (timeout == 0) {
+ printk(" Error: phyInit failed to reset PHY\n");
+ return -1;
+ }
+ // check PHY IDs.
+ phyAddr = 0x1000;
+
+// writePhy(PHY_BMCR,BMCR_POWERDOWN);
+// printf("BMCR: %x\n",readPhy(PHY_BMCR));
+ return 0;
+}
+
+static void emacTxDescriptorInit(void)
+{
+ int i = 0;
+ u32 *txDescAddr = NULL;
+ u32 *txStatusAddr = NULL;
+
+ // base address of tx descriptor array
+ MAC_TXDESCRIPTOR = TX_DESCRIPTOR_ADDR;
+
+ // base address of tx status
+ MAC_TXSTATUS = TX_STATUS_ADDR;
+
+ // number of tx descriptors
+ MAC_TXDESCRIPTORNUM = EMAC_TX_DESCRIPTOR_COUNT - 1;
+
+ for (i = 0; i < EMAC_TX_DESCRIPTOR_COUNT; i++) {
+ txDescAddr = (u32 *) (TX_DESCRIPTOR_ADDR + i * 8);
+ m_nic_write(txDescAddr,
+ (EMAC_TX_BUFFER_ADDR + i * EMAC_BLOCK_SIZE));
+
+ // control field in descriptor
+ txDescAddr++;
+ m_nic_write(txDescAddr,
+ (EMAC_TX_DESC_INT | (EMAC_BLOCK_SIZE - 1)));
+ }
+
+ for (i = 0; i < EMAC_TX_DESCRIPTOR_COUNT; i++) {
+
+ txStatusAddr = (u32 *) (TX_STATUS_ADDR + i * 4);
+
+ // set status info to 0
+ m_nic_write(txStatusAddr, 0);
+ }
+
+ MAC_TXPRODUCEINDEX = 0;
+}
+
+static void emacRxDescriptorInit(void)
+{
+ int i;
+ u32 *rxDescAddr = NULL;
+ u32 *rxStatusAddr = NULL;
+
+ // base address of rx descriptor array
+ MAC_RXDESCRIPTOR = RX_DESCRIPTOR_ADDR;
+
+ // base address of rx status
+ MAC_RXSTATUS = RX_STATUS_ADDR;
+
+ // number of rx descriptors
+ MAC_RXDESCRIPTORNUM = EMAC_RX_DESCRIPTOR_COUNT - 1;
+
+ for (i = 0; i < EMAC_RX_DESCRIPTOR_COUNT; i++) {
+ rxDescAddr = (u32 *) (RX_DESCRIPTOR_ADDR + i * 8);
+ m_nic_write(rxDescAddr,
+ (EMAC_RX_BUFFER_ADDR + i * EMAC_BLOCK_SIZE));
+ rxDescAddr++;
+ m_nic_write(rxDescAddr,
+ (EMAC_RX_DESC_INT |
+ ((EMAC_BLOCK_SIZE - 1) & DESC_SIZE_MASK)));
+ }
+
+ for (i = 0; i < EMAC_RX_DESCRIPTOR_COUNT; i++) {
+ // RX status, two words, status info. and status hash CRC.
+ rxStatusAddr = (u32 *) (RX_STATUS_ADDR + i * 8);
+ m_nic_write(rxStatusAddr, 0);
+ rxStatusAddr++;
+ m_nic_write(rxStatusAddr, 0);
+ }
+
+ MAC_RXCONSUMEINDEX = 0;
+}
+
+static int emacInit(void)
+{
+ int i = 0;
+
+ // turn on the ethernet MAC clock in PCONP, bit 30
+ m_nic_bfs(PCONP, PCONP_EMAC_CLOCK);
+
+ /*------------------------------------------------------------------------------
+ * write to PINSEL2/3 to select the PHY functions on P1[17:0]
+ *-----------------------------------------------------------------------------*/
+ /* documentation needs to be updated */
+ PINSEL2 = 0x55555555; /* selects P1[0,1,4,8,9,10,14,15] */
+ PINSEL3 = 0x00000005; /* selects P1[17:16] */
+
+ // reset MAC modules, tx, mcs_tx, rx, mcs_rx, simulation and soft reset
+ MAC_MAC1 = 0xCF00;
+
+ // reset datapaths and host registers
+ MAC_COMMAND = 0x0038;
+
+ // short delay after reset
+ for (i = 0; i < 0x40; i++)
+ asm volatile (" nop");
+
+ //Remove reset conditions
+ MAC_MAC1 = 0x0;
+
+ // disable Tx
+ m_nic_bfc(MAC_COMMAND, CMD_TX_ENABLE);
+ // disable Rx
+ m_nic_bfc(MAC_COMMAND, CMD_RX_ENABLE);
+
+ // initialize MAC2 to default value
+ // TODO don't thinkt this is necessary?? m_nic_write(EMAC_MAC2, 0x0);
+ MAC_MAC2 = 0x030;
+ // non back-to-back Inter-Packet-Gap register
+ // The manual recommends the value 0x12
+ MAC_IPGR = 0x12;
+
+ // collision window/retry register. Using recommended value from manual.
+ MAC_CLRT = 0x370F;
+
+ // intialize PHY. emacSpeed and emacDuplex will be set in phyInit
+ if (phyInit() < 0)
+ return -1;
+
+ // write the mac address
+ MAC_SA0 = (macAddr[5] << 8 | macAddr[4]);
+ MAC_SA1 = (macAddr[3] << 8 | macAddr[2]);
+ MAC_SA2 = (macAddr[1] << 8 | macAddr[0]);
+
+ printk("emac: MAC address = %2x:%2x:%2x:%2x:%2x:%2x\n", macAddr[0],
+ macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
+
+ emacTxDescriptorInit();
+ emacRxDescriptorInit();
+
+ // pass all receive frames
+ m_nic_bfs(MAC_MAC1, 0x002);
+
+ // set up the Rx filter
+ // [0]-AllUnicast, [1]-AllBroadCast, [2]-AllMulticast, [3]-UnicastHash
+ // [4]-MulticastHash, [5]-Perfect, [12]-MagicPacketEnWoL, [13]-RxFilterEnWoL
+// MAC_RXFILTERCTRL=0x0022;
+ MAC_RXFILTERCTRL = 0x003F; //Pass everything
+
+ // clear all interrupts
+ MAC_INTCLEAR = 0xFFFF;
+
+ // TODO the irq is installed here in sample code !!
+
+ // enable interrupts (not SoftInt and WoL)
+ MAC_INTENABLE = 0x00FF;
+
+ return 0;
+}
+
+/* ##############################
+ * u-boot interface
+ * ##############################
+ */
+static int eth_initialized = 0;
+/*-----------------------------------------------------------------------------
+ * Returns 0 when failes otherwise 1
+ */
+int eth_init(bd_t * bis)
+{
+ int ret;
+
+ if (!eth_initialized) {
+ if (!eth_getenv_enetaddr("ethaddr", macAddr)) {
+ printf("Failed to get MAC address from environment\n");
+ return 1;
+ }
+
+ ret = emacInit();
+ if (ret != 0) {
+ return ret;
+ }
+
+ eth_initialized = 1;
+ }
+
+ emac_open();
+
+ return 0;
+}
+
+int eth_send(volatile void *packet, int length)
+{
+ emac_start_xmit(packet, length);
+
+ return 0;
+}
+
+/*-----------------------------------------------------------------------------
+ * Check for received packets. Call NetReceive for each packet. The return
+ * value is ignored by the caller.
+ */
+int eth_rx(void)
+{
+ emac_interrupt();
+
+ return 0;
+}
+
+void eth_halt(void)
+{
+ emac_close();
+}
diff -upNr u-boot-orig/board/LPC2468/flash.c u-boot/board/LPC2468/flash.c
--- u-boot-orig/board/LPC2468/flash.c 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/flash.c 2009-03-18 15:32:37.000000000 +0100
@@ -0,0 +1,253 @@
+/*
+ * (C) Copyright 2006 Embedded Artists AB <www.embeddedartists.com>
+ *
+ * (C) Copyright 2009 Duran Audio B.V. <www.duran-audio.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
+ *
+ * 18-03-2009 Updated for U-boot 2009.3 by Remco Poelstra <remco.poelstra+u-boot@duran-audio.com>
+ */
+
+#include <common.h>
+#include <asm/arch/hardware.h>
+
+#define SST_BASEADDR 0x80000000
+#define SST_ADDR1 ((volatile ushort*)(SST_BASEADDR + (0x5555<<1)))
+#define SST_ADDR2 ((volatile ushort*)(SST_BASEADDR + (0x2AAA<<1)))
+
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
+
+extern void iap_entry(unsigned long *command, unsigned long *result);
+
+extern int lpc24xx_copy_buffer_to_flash(flash_info_t *, ulong);
+extern int lpc24xx_flash_erase(flash_info_t *, int, int);
+extern int lpc24xx_write_buff(flash_info_t *, uchar *, ulong, ulong);
+
+/*-----------------------------------------------------------------------
+ *
+ */
+
+void write_word_sst(ulong addr, ushort data)
+{
+ ushort tmp;
+
+ *SST_ADDR1 = 0x00AA;
+ *SST_ADDR2 = 0x0055;
+ *SST_ADDR1 = 0x00A0;
+ *((volatile ushort *)addr) = data;
+ /* do data polling */
+ do {
+ tmp = *((volatile ushort *)addr);
+ } while (tmp != data);
+}
+
+/*-----------------------------------------------------------------------
+ */
+
+ulong flash_init(void)
+{
+ int j, k;
+ ulong size = 0;
+ ulong flashbase = 0;
+
+ flash_info[0].flash_id = (PHILIPS_LPC2468 & FLASH_VENDMASK);
+ flash_info[0].size = 0x007D000; /* 512 - 12 KB */
+ flash_info[0].sector_count = 27;
+ memset(flash_info[0].protect, 0, 27);
+ flashbase = 0x00000000;
+ for (j = 0, k = 0; j < 8; j++, k++) {
+ flash_info[0].start[k] = flashbase;
+ flashbase += 0x00001000;
+ }
+ for (j = 0; j < 14; j++, k++) {
+ flash_info[0].start[k] = flashbase;
+ flashbase += 0x00008000;
+ }
+ for (j = 0; j < 5; j++, k++) {
+ flash_info[0].start[k] = flashbase;
+ flashbase += 0x00001000;
+ }
+ size += flash_info[0].size;
+
+ flash_info[1].flash_id = (SST_MANUFACT & FLASH_VENDMASK);
+ flash_info[1].size = 0x00400000; /* 4 MB */
+ flash_info[1].sector_count = 1024;
+ memset(flash_info[1].protect, 0, 1024);
+ flashbase = SST_BASEADDR;
+ for (j = 0; j < 1024; j++) {
+ flash_info[1].start[j] = flashbase;
+ flashbase += 0x1000; /* 4 KB sectors */
+ }
+ size += flash_info[1].size;
+
+ /* Protect monitor and environment sectors */
+ flash_protect(FLAG_PROTECT_SET,
+ 0x0, 0x0 + monitor_flash_len - 1, &flash_info[0]);
+
+#ifdef CFG_ENV_IS_IN_FLASH
+ flash_protect(FLAG_PROTECT_SET,
+ CONFIG_ENV_ADDR,
+ CONFIG_ENV_ADDR + CONFIG_ENV_SIZE - 1, &flash_info[0]);
+#endif
+
+ return size;
+}
+
+/*-----------------------------------------------------------------------
+ */
+void flash_print_info(flash_info_t * info)
+{
+ int i;
+ int erased = 0;
+ unsigned long j;
+ unsigned long count;
+ unsigned char *p;
+
+ switch (info->flash_id & FLASH_VENDMASK) {
+ case (SST_MANUFACT & FLASH_VENDMASK):
+ printf("SST: ");
+ break;
+ case (PHILIPS_LPC2468 & FLASH_VENDMASK):
+ printf("Philips: ");
+ break;
+ default:
+ printf("Unknown Vendor ");
+ break;
+ }
+
+ printf(" Size: %ld KB in %d Sectors\n",
+ info->size >> 10, info->sector_count);
+
+ printf(" Sector Start Addresses:");
+ for (i = 0; i < info->sector_count; i++) {
+ if ((i % 5) == 0) {
+ printf("\n ");
+ }
+ if (i < (info->sector_count - 1)) {
+ count = info->start[i + 1] - info->start[i];
+ } else {
+ count = info->start[0] + info->size - info->start[i];
+ }
+ p = (unsigned char *)(info->start[i]);
+ erased = 1;
+ for (j = 0; j < count; j++) {
+ if (*p != 0xFF) {
+ erased = 0;
+ break;
+ }
+ p++;
+ }
+ printf(" %08lX%s%s", info->start[i],
+ info->protect[i] ? " RO" : " ", erased ? " E" : " ");
+ }
+ printf("\n");
+}
+
+int flash_erase_sst(flash_info_t * info, int s_first, int s_last)
+{
+ int i;
+
+ for (i = s_first; i <= s_last; i++) {
+ *SST_ADDR1 = 0x00AA;
+ *SST_ADDR2 = 0x0055;
+ *SST_ADDR1 = 0x0080;
+ *SST_ADDR1 = 0x00AA;
+ *SST_ADDR2 = 0x0055;
+ *((volatile ushort *)(info->start[i])) = 0x0030;
+ /* wait for erase to finish */
+ udelay(25000);
+ }
+
+ return ERR_OK;
+}
+
+int flash_erase(flash_info_t * info, int s_first, int s_last)
+{
+ switch (info->flash_id & FLASH_VENDMASK) {
+ case (SST_MANUFACT & FLASH_VENDMASK):
+ return flash_erase_sst(info, s_first, s_last);
+ case (PHILIPS_LPC2468 & FLASH_VENDMASK):
+ return lpc24xx_flash_erase(info, s_first, s_last);
+ default:
+ return ERR_PROTECTED;
+ }
+ return ERR_PROTECTED;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash.
+ *
+ * cnt is in bytes
+ */
+
+int write_buff_sst(flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+ ushort tmp;
+ ulong i;
+ uchar *src_org;
+ uchar *dst_org;
+ ulong cnt_org = cnt;
+ int ret = ERR_OK;
+
+ src_org = src;
+ dst_org = (uchar *) addr;
+
+ if (addr & 1) { /* if odd address */
+ tmp = *((uchar *) (addr - 1)); /* little endian */
+ tmp |= (*src << 8);
+ write_word_sst(addr - 1, tmp);
+ addr += 1;
+ cnt -= 1;
+ src++;
+ }
+ while (cnt > 1) {
+ tmp = ((*(src + 1)) << 8) + (*src); /* little endian */
+ write_word_sst(addr, tmp);
+ addr += 2;
+ src += 2;
+ cnt -= 2;
+ }
+ if (cnt > 0) {
+ tmp = (*((uchar *) (addr + 1))) << 8;
+ tmp |= *src;
+ write_word_sst(addr, tmp);
+ }
+
+ for (i = 0; i < cnt_org; i++) {
+ if (*dst_org != *src_org) {
+ printf("Write failed. Byte %lX differs\n", i);
+ ret = ERR_PROG_ERROR;
+ break;
+ }
+ dst_org++;
+ src_org++;
+ }
+
+ return ret;
+}
+
+int write_buff(flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+ switch (info->flash_id & FLASH_VENDMASK) {
+ case (SST_MANUFACT & FLASH_VENDMASK):
+ return write_buff_sst(info, src, addr, cnt);
+ case (PHILIPS_LPC2468 & FLASH_VENDMASK):
+ return lpc24xx_write_buff(info, src, addr, cnt);
+ default:
+ return ERR_PROG_ERROR;
+ }
+ return ERR_PROG_ERROR;
+}
diff -upNr u-boot-orig/board/LPC2468/lowlevel_init.c u-boot/board/LPC2468/lowlevel_init.c
--- u-boot-orig/board/LPC2468/lowlevel_init.c 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/lowlevel_init.c 2009-03-18 15:35:21.000000000 +0100
@@ -0,0 +1,436 @@
+/*
+ * (C) Copyright 2006-2007 Embedded Artists AB <www.embeddedartists.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 <config.h>
+#include <version.h>
+#include <exports.h>
+#include <asm/arch/hardware.h>
+#include <asm/hardware.h>
+
+/******************************************************************************
+ * Defines, macros, and typedefs
+ *****************************************************************************/
+
+#define USE_USB 1
+
+#define PLL_MValue (CONFIG_PLL_MVALUE-1)
+#define PLL_NValue (CONFIG_PLL_NVALUE-1)
+#define CCLKDivValue (CONFIG_PLL_CLKDIV-1)
+#define USBCLKDivValue (CONFIG_PLL_USBCLKDIV-1)
+
+#define Fcco ((2*CONFIG_PLL_MVALUE*CONFIG_FOSC) / CONFIG_PLL_NVALUE)
+#define Fcclk (Fcco / CONFIG_PLL_CLKDIV)
+#define Fpclk (Fcclk / CONFIG_FPCLK_DIV)
+#define MAM_SETTING 1 /* 0=disabled,
+ 1=partly enabled (enabled for code prefetch, but not for data),
+ 2=fully enabled */
+#define MEM_MAP 2 /* When executing from RAM, MAM_MAP should always be 2 */
+#define SDRAM_BASE_ADDR 0xA0000000
+#define m_reg_write(reg,data) ((*(volatile unsigned long *)(reg)) = (volatile unsigned long)(data))
+/*****************************************************************************
+ *
+ * Description:
+ * Delay execution by a specified number of milliseconds by using
+ * timer #1. A polled implementation.
+ *
+ * Params:
+ * [in] delayInMs - the number of milliseconds to delay.
+ *
+ ****************************************************************************/
+void delayMs(unsigned short delayInMs)
+{
+ /*
+ * setup timer #1 for delay
+ */
+ T1TCR = 0x02; //stop and reset timer
+ T1PR = 0x00; //set prescaler to zero
+ T1MR0 = delayInMs * (Fpclk / 1000);
+
+ T1IR = 0xff; //reset all interrrupt flags
+ T1MCR = 0x04; //stop timer on match
+ T1TCR = 0x01; //start timer
+
+ //wait until delay time has elapsed
+ while (T1TCR & 0x01)
+ ;
+
+}
+
+/******************************************************************************
+** Function name: GPIOinit
+**
+** Descriptions: Sets all GPIO ports to a known state
+** parameters: None
+** Returned value: None
+**
+******************************************************************************/
+static void GPIOinit(void)
+{
+ PINSEL0 = 0;
+ PINSEL1 = 0;
+ PINSEL2 = 0;
+ PINSEL3 = 0;
+ PINSEL4 = 0;
+ PINSEL5 = 0;
+ PINSEL6 = 0;
+ PINSEL7 = 0;
+ PINSEL8 = 0;
+ PINSEL9 = 0;
+ PINSEL10 = 0;
+
+ IODIR0 = 0;
+ IODIR1 = 0;
+ IOSET0 = 0xffffffff;
+ IOSET1 = 0xffffffff;
+
+ FIO0DIR = 0;
+ FIO1DIR = 0;
+ FIO2DIR = 0;
+ FIO3DIR = 0;
+ FIO4DIR = 0;
+
+ FIO0SET = 0xffffffff;
+ FIO1SET = 0xffffffff;
+ FIO2SET = 0xffffffff;
+ FIO3SET = 0x0;
+ FIO4SET = 0xffffffff;
+}
+
+/******************************************************************************
+** Function name: VICinit
+**
+** Descriptions: Initialize the VIC to a known state
+** parameters: None
+** Returned value: None
+**
+******************************************************************************/
+static void VICinit(void)
+{
+ //initialize VIC
+ VICIntEnClr = 0xFFFFFFFF; /* Disable ALL interrupts */
+
+ VICProtection = 0; /* Setup interrupt controller */
+ VICVectAddr = 0;
+ VICIntSelect = 0;
+
+ VICVectAddr0 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr1 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr2 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr3 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr4 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr5 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr6 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr7 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr8 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr9 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr10 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr11 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr12 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr13 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr14 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr15 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr16 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr17 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr18 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr19 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr20 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr21 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr22 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr23 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr24 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr25 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr26 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr27 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr28 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr29 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr30 = (unsigned int)0; /* Set the vector address */
+ VICVectAddr31 = (unsigned int)0; /* Set the vector address */
+
+ VICVectCntl0 = (unsigned int)0xf;
+ VICVectCntl1 = (unsigned int)0xf;
+ VICVectCntl2 = (unsigned int)0xf;
+ VICVectCntl3 = (unsigned int)0xf;
+ VICVectCntl4 = (unsigned int)0xf;
+ VICVectCntl5 = (unsigned int)0xf;
+ VICVectCntl6 = (unsigned int)0xf;
+ VICVectCntl7 = (unsigned int)0xf;
+ VICVectCntl8 = (unsigned int)0xf;
+ VICVectCntl9 = (unsigned int)0xf;
+ VICVectCntl10 = (unsigned int)0xf;
+ VICVectCntl11 = (unsigned int)0xf;
+ VICVectCntl12 = (unsigned int)0xf;
+ VICVectCntl13 = (unsigned int)0xf;
+ VICVectCntl14 = (unsigned int)0xf;
+ VICVectCntl15 = (unsigned int)0xf;
+ VICVectCntl16 = (unsigned int)0xf;
+ VICVectCntl17 = (unsigned int)0xf;
+ VICVectCntl18 = (unsigned int)0xf;
+ VICVectCntl19 = (unsigned int)0xf;
+ VICVectCntl20 = (unsigned int)0xf;
+ VICVectCntl21 = (unsigned int)0xf;
+ VICVectCntl22 = (unsigned int)0xf;
+ VICVectCntl23 = (unsigned int)0xf;
+ VICVectCntl24 = (unsigned int)0xf;
+ VICVectCntl25 = (unsigned int)0xf;
+ VICVectCntl26 = (unsigned int)0xf;
+ VICVectCntl27 = (unsigned int)0xf;
+ VICVectCntl28 = (unsigned int)0xf;
+ VICVectCntl29 = (unsigned int)0xf;
+ VICVectCntl30 = (unsigned int)0xf;
+ VICVectCntl31 = (unsigned int)0xf;
+}
+
+/******************************************************************************
+** Function name: ConfigurePLL
+**
+** Descriptions: Configure the PLL
+** parameters: None
+** Returned value: None
+**
+******************************************************************************/
+void ConfigurePLL(void)
+{
+
+ volatile unsigned long MValue;
+ volatile unsigned long NValue;
+
+ if (PLLSTAT & (1 << 25))
+ {
+
+ PLLCON = 1; /* Enable PLL, disconnected */
+
+ PLLFEED = 0xaa;
+
+ PLLFEED = 0x55;
+
+ }
+
+ PLLCON = 0; /* Disable PLL, disconnected */
+ PLLFEED = 0xaa;
+ PLLFEED = 0x55;
+ SCS |= 0x20; /* Enable main OSC */
+
+ while (!(SCS & 0x40)) ; /* Wait until main OSC is usable */
+
+ CLKSRCSEL = 0x1; /* select main OSC, 12MHz, as the PLL clock source */
+ PLLCFG = PLL_MValue | (PLL_NValue << 16);
+ PLLFEED = 0xaa;
+ PLLFEED = 0x55;
+ PLLCON = 1; /* Enable PLL, disconnected */
+ PLLFEED = 0xaa;
+ PLLFEED = 0x55;
+ CCLKCFG = CCLKDivValue; /* Set clock divider */
+
+#if USE_USB
+ USBCLKCFG = USBCLKDivValue; /* usbclk = 288 MHz/6 = 48 MHz */
+
+#endif /*
+ */
+
+ while (((PLLSTAT & (1 << 26)) == 0)) ; /* Check lock bit status */
+
+ MValue = PLLSTAT & 0x00007FFF;
+ NValue = (PLLSTAT & 0x00FF0000) >> 16;
+
+ while ((MValue != PLL_MValue) && (NValue != PLL_NValue)) ;
+
+ PLLCON = 3; /* enable and connect */
+ PLLFEED = 0xaa;
+ PLLFEED = 0x55;
+
+ while (((PLLSTAT & (1 << 25)) == 0)) ; /* Check connect bit status */
+
+}
+
+/******************************************************************************
+** Function name: ConfigureEMC
+**
+** Descriptions: Configure EMC for external SDRAM, NAND and NOR FLASH
+** parameters: None
+** Returned value: None
+**
+******************************************************************************/
+void ConfigureEMC(void)
+{
+
+ volatile unsigned int i, dummy = dummy;
+
+ EMC_CTRL = 0x00000001;
+ PCONP |= 0x00000800; /* Turn on EMC PCLK */
+
+ // CS2 & CS3 not used PINSEL4 = 0x50000000;
+ PINSEL5 = 0x05050555;
+ PINSEL6 = 0x55555555;
+ PINSEL8 = 0x55555555;
+ PINSEL9 = 0x50555555;
+
+ //all registers...
+ EMC_DYN_RP = 2; //>20ns = 2 clk
+ EMC_DYN_RAS = 3; //>45ns = 3 clk
+ EMC_DYN_SREX = 7; //>80-100ns = 6 clk
+ EMC_DYN_APR = 2; //
+ EMC_DYN_DAL = 5; //2 clk
+ EMC_DYN_WR = 1; //2 clk
+ EMC_DYN_RC = 5; //>65ns = 4 clk
+ EMC_DYN_RFC = 5; //>80-100ns = 6 clk
+ EMC_DYN_XSR = 7; //>80-100ns = 6 clk
+ EMC_DYN_RRD = 1; //>15ns = 1-2 clk
+ EMC_DYN_MRD = 2; //2 clk
+ EMC_DYN_RD_CFG = 1; //or 1,2,3
+
+ //
+ EMC_DYN_RASCAS0 = 0x00000303;
+
+ //
+ EMC_DYN_CFG0 = 0x00000680;
+
+ //wait 100mS
+ delayMs(100);
+
+ //Send command: NOP
+ EMC_DYN_CTRL = 0x00000183;
+
+ //wait 200mS
+ delayMs(200);
+
+ //Send command: PRECHARGE-ALL, shortest possible refresh period
+ EMC_DYN_CTRL = 0x00000103;
+
+ EMC_DYN_RFSH = 0x00000002;
+
+ //wait 128 ABH clock cycles
+ for (i = 0; i < 0x40; i++)
+ asm volatile (" nop");
+
+ //Set correct refresh period
+ EMC_DYN_RFSH = 28;
+
+ //Send command: MODE
+ EMC_DYN_CTRL = 0x00000083;
+
+ //Set mode register in SDRAM
+ dummy = *((volatile unsigned int *)(SDRAM_BASE_ADDR | (0x33 << 12)));
+
+ //Send command: NORMAL
+ EMC_DYN_CTRL = 0x00000000;
+
+ //Enable buffer
+ EMC_DYN_CFG0 |= 0x00080000;
+
+ //initial system delay
+ delayMs(1);
+
+ EMC_STA_WAITWEN0 = 0x2;
+ EMC_STA_WAITOEN0 = 0x2;
+ EMC_STA_WAITRD0 = 0x1f;
+ EMC_STA_WAITPAGE0 = 0x1f;
+ EMC_STA_WAITWR0 = 0x1f;
+ EMC_STA_WAITTURN0 = 0xf;
+ EMC_STA_CFG0 = 0x00000081;
+ EMC_STA_WAITWEN1 = 0x2;
+ EMC_STA_WAITOEN1 = 0x2;
+ EMC_STA_WAITRD1 = 0x8;
+ EMC_STA_WAITPAGE1 = 0x1f;
+ EMC_STA_WAITWR1 = 0x8;
+ EMC_STA_WAITTURN1 = 0xf;
+ EMC_STA_CFG1 = 0x00000080;
+}
+
+/*****************************************************************************
+ *
+ * Description:
+ * Initialize system functions and GPIO
+ *
+ ****************************************************************************/
+void lowlevel_init(void)
+{
+
+ /********************************************************************************************
+ * Remap vectors for RAM execution
+ ********************************************************************************************/
+ MEMMAP = 1;
+
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
+ /* move vectors to beginning of SRAM */
+ asm volatile (" mov r2, #0x40000000 \n"
+ " mov r0, #0x00000000 \n"
+ " ldmneia r0!, {r3-r10} \n"
+ " stmneia r2!, {r3-r10} \n"
+ " ldmneia r0, {r3-r9} \n"
+ " stmneia r2, {r3-r9} \n":::
+ "r0", "r2", "r3", "r4", "r5", "r6", "r7",
+ "r8", "r9", "r10");
+#else
+ /* move vectors to beginning of SRAM */
+ asm volatile (" mov r2, #0x40000000 \n"
+ " mov r0, #0xa1000000 \n"
+ " ldmneia r0!, {r3-r10} \n"
+ " stmneia r2!, {r3-r10} \n"
+ " ldmneia r0, {r3-r9} \n"
+ " stmneia r2, {r3-r9} \n":::
+ "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
+ "r10");
+#endif
+
+ //initialize the exception vector mapping
+ MEMMAP = MEM_MAP;
+
+#if USE_USB
+ PCONP |= 0x80000000; /* Turn On USB PCLK */
+
+#endif
+ ConfigurePLL();
+
+ /* Set system timers for each component */
+#if (Fpclk / (Fcclk / 4)) == 1
+ PCLKSEL0 = 0x00000000; /* PCLK is 1/4 CCLK */
+ PCLKSEL1 = 0x00000000;
+#endif
+#if (Fpclk / (Fcclk / 4)) == 2
+ PCLKSEL0 = 0xAAAAAAAA; /* PCLK is 1/2 CCLK */
+ PCLKSEL1 = 0xAAAAAAAA;
+
+#endif
+#if (Fpclk / (Fcclk / 4)) == 4
+ PCLKSEL0 = 0x55555555; /* PCLK is the same as CCLK */
+ PCLKSEL1 = 0x55555555;
+#endif
+ /* Set memory accelerater module */
+ MAMCR = 0;
+
+ MAMTIM = 4;
+
+// MAMCR = 2;
+ //Init GPIO
+ GPIOinit();
+
+ //initialize VIC
+ VICinit();
+
+ //short delay
+ delayMs(10);
+
+ /********************************************************************************************
+ * Initialize external memory interface (EMC)
+ ********************************************************************************************/
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
+ ConfigureEMC();
+#endif /*
+ */
+}
diff -upNr u-boot-orig/board/LPC2468/LPC2468.c u-boot/board/LPC2468/LPC2468.c
--- u-boot-orig/board/LPC2468/LPC2468.c 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/LPC2468.c 2009-03-18 13:25:15.000000000 +0100
@@ -0,0 +1,66 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2005 Rowel Atienza <rowel@diwalabs.com>
+ * Armadillo board HT1070
+ *
+ * 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 <clps7111.h>
+
+/* ------------------------------------------------------------------------- */
+
+
+/*
+ * Miscelaneous platform dependent initialisations
+ */
+
+int board_init (void)
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ /* arch number MACH_TYPE_ARMADILLO - not official*/
+ gd->bd->bi_arch_number = 1339;
+
+ /* location of boot parameters */
+ gd->bd->bi_boot_params = 0xA0000100;
+
+ return 0;
+}
+
+int print_cpuinfo(void)
+{
+ printf("CPU: LPC2468 (ARM7tdmi-s from NXP)\n"
+ " running at 57.6 MHz (12 MHz crystal)\n");
+ return 0;
+}
+
+int dram_init (void)
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
+ gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
+
+ return (0);
+}
diff -upNr u-boot-orig/board/LPC2468/Makefile u-boot/board/LPC2468/Makefile
--- u-boot-orig/board/LPC2468/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/Makefile 2009-03-18 09:30:20.000000000 +0100
@@ -0,0 +1,55 @@
+
+#######################################################################
+#
+# Copyright (C) 2000, 2001, 2002, 2003
+# The LEOX team <team@leox.org>, http://www.leox.org
+#
+# (C) Copyright 2006
+# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+#
+# LEOX.org is about the development of free hardware and software resources
+# for system on chip.
+#
+# Description: U-Boot port on the LEOX's ELPT860 CPU board
+# ~~~~~~~~~~~
+#
+#######################################################################
+#
+# 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 eth.o nand.o flash.o lowlevel_init.o
+
+SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS := $(addprefix $(obj),$(COBJS))
+SOBJS := $(addprefix $(obj),$(SOBJS))
+
+$(LIB): $(obj).depend $(OBJS) $(SOBJS)
+ $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff -upNr u-boot-orig/board/LPC2468/nand.c u-boot/board/LPC2468/nand.c
--- u-boot-orig/board/LPC2468/nand.c 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/nand.c 2009-03-18 13:38:15.000000000 +0100
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2009 Duran Audio B.V. <www.duran-audio.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
+ *
+ * 18-03-2009 Updated for U-boot 2009.3 by Remco Poelstra <remco.poelstra+u-boot@duran-audio.com>
+ */
+
+#include <common.h>
+#include <nand.h>
+#include <asm/io.h>
+
+/*
+ * CLE at A20
+ * ALE at A19
+ */
+#define MASK_CLE (1l<<20)
+#define MASK_ALE (1l<<19)
+
+static void cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
+{
+ struct nand_chip *this = mtd->priv;
+
+ ulong IO_ADDR_W = (ulong) this->IO_ADDR_W;
+
+ if (ctrl & NAND_CTRL_CHANGE) {
+ IO_ADDR_W &= ~(MASK_ALE | MASK_CLE);
+ if (ctrl & NAND_CLE)
+ IO_ADDR_W |= MASK_CLE;
+ if (ctrl & NAND_ALE)
+ IO_ADDR_W |= MASK_ALE;
+ this->IO_ADDR_W = (void *)IO_ADDR_W;
+ }
+
+ if (cmd != NAND_CMD_NONE)
+ writeb(cmd, this->IO_ADDR_W);
+}
+
+int board_nand_init(struct nand_chip *nand)
+{
+ /* IO_ADDR_R and IO_ADDR_W set by nand-driver using CFG_NAND_BASE */
+ nand->dev_ready = 0;
+ nand->cmd_ctrl = cmd_ctrl;
+ nand->ecc.mode = NAND_ECC_SOFT;
+ nand->chip_delay = 25; /* us */
+ nand->options = NAND_SAMSUNG_LP_OPTIONS;
+
+ return 0;
+}
diff -upNr u-boot-orig/board/LPC2468/u-boot.lds u-boot/board/LPC2468/u-boot.lds
--- u-boot-orig/board/LPC2468/u-boot.lds 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/board/LPC2468/u-boot.lds 2009-03-18 09:30:20.000000000 +0100
@@ -0,0 +1,55 @@
+/*
+ * (C) Copyright 2000
+ * Wolfgang Denk, DENX Software Engineering, wd at 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_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+ . = 0x00000000;
+
+ . = ALIGN(4);
+ .text :
+ {
+ cpu/arm720t/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 = .;
+}
diff -upNr u-boot-orig/include/configs/LPC2468.h u-boot/include/configs/LPC2468.h
--- u-boot-orig/include/configs/LPC2468.h 1970-01-01 01:00:00.000000000 +0100
+++ u-boot/include/configs/LPC2468.h 2009-03-18 10:34:25.000000000 +0100
@@ -0,0 +1,213 @@
+/*
+ * (C) Copyright 2008
+ * Embedded Artists AB, Sweden <www.EmbeddedArtists.com>
+ *
+ * Configuation settings for the LPC2468 OEM Board, 16 bit databus.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_LPC2468
+
+/*
+ * If we are developing, we might want to start armboot from ram
+ * so we MUST NOT initialize critical regs like mem-timing ...
+ */
+#if 0
+#define CONFIG_INIT_CRITICAL /* undef for developing */
+#endif
+
+#undef CONFIG_SKIP_LOWLEVEL_INIT
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_ARM7 1 /* This is a ARM7 CPU */
+#define CONFIG_ARM_THUMB 1 /* this is an ARM720TDMI */
+#undef CONFIG_ARM7_REVD /* disable ARM720 REV.D Workarounds */
+
+/* Clock settings */
+
+/* Crystal frequency */
+#define CONFIG_FOSC 12000000
+
+/*
+ * Fcco = 2*M*Fosc / N
+ *
+ * Fcco = 288000000 -> M = 12, N = 1
+ *
+ * PLLCFG (MSEL) = (M-1)
+ * PLLCFG (NSEL) = (N-1)
+ */
+#define CONFIG_PLL_MVALUE 12
+#define CONFIG_PLL_NVALUE 1
+
+/*
+ * Fcclk = Fcco / CLKDIV
+ * CLKDIV must be an even number
+ *
+ * CCLKCFG = CLKDIV-1 (odd number must be written to register)
+ * CLKDIV = 4 -> Fcclk = 72 MHz (if Fcco = 288 MHz)
+ * CLKDIV = 6 -> Fcclk = 48 MHz (if Fcco = 288 MHz)
+ */
+#define CONFIG_PLL_CLKDIV 4
+
+/*
+ * The USB clock must be 48 MHz
+ * Fusb = Fcco / USBCLKDIV
+ * USBCLKCFG = (USBCLKDIV-1)
+ */
+#define CONFIG_PLL_USBCLKDIV 6
+
+/*
+ * Periperhal clock divider, i.e. Fpclk = Fcclk / divider
+ * Valid values are 1, 2, or 4
+ */
+#define CONFIG_FPCLK_DIV 1
+
+#define CONFIG_USE_IRQ /* use irq for mci interface */
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 128*1024)
+#define CONFIG_SYS_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
+
+/*
+ * Hardware drivers
+ */
+
+/*
+ * select serial console configuration
+ */
+#define CONFIG_SERIAL1 1 /* we use Serial line 1 */
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+#define CONFIG_BAUDRATE 115200
+
+#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAULT|CONFIG_BOOTP_BOOTFILESIZE)
+
+#include <config_cmd_default.h>
+#undef CONFIG_CMD_NFS
+#undef CONFIG_CMD_FPGA
+#undef CONFIG_CMD_BOOTD
+#define CONFIG_CMD_NAND
+
+#define CONFIG_BOOTARGS "root=/dev/ram initrd=0xa1800000,4000k console=ttyS0,115200N8"
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CFG_LONGHELP /* undef to save memory */
+#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16) /* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
+#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_MEMTEST_START 0xA0000000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END 0xA1F80000 /* 31.5 MB in DRAM, U-boot is relocated after this location */
+#define CONFIG_SYS_ALT_MEMTEST
+
+#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */
+
+#define CONFIG_SYS_LOAD_ADDR 0xA0008000 /* default load address for kernel img is here*/
+
+
+#define CLK_FCCO ((2*CONFIG_PLL_MVALUE*CONFIG_FOSC) / CONFIG_PLL_NVALUE)
+
+#define CFG_SYS_CLK_FREQ (CLK_FCCO / CONFIG_PLL_CLKDIV)/* Hz */
+#define CONFIG_SYS_HZ 200000 /* decrementer freq in Hz */
+
+ /* valid baudrates */
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
+
+/*-----------------------------------------------------------------------
+ * Stack sizes
+ *
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE (128*1024) /* regular stack */
+#ifdef CONFIG_USE_IRQ
+#define CONFIG_STACKSIZE_IRQ (8*1024) /* IRQ stack */
+#define CONFIG_STACKSIZE_FIQ (8*1024) /* FIQ stack */
+#endif
+
+/*-----------------------------------------------------------------------
+ * Physical Memory Map
+ */
+#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
+#define PHYS_SDRAM_1 0xA0000000 /* SDRAM Bank #1 */
+#define PHYS_SDRAM_1_SIZE 0x02000000 /* 32 MB SDRAM */
+
+#define PHYS_FLASH_1 0x80000000 /* Flash Bank #1 */
+#define PHYS_FLASH_SIZE 0x00400000 /* 4 MB */
+
+#define CFG_FLASH_BASE PHYS_FLASH_1
+
+/*-----------------------------------------------------------------------
+ * FLASH and environment organization
+ */
+#define CONFIG_SYS_MAX_FLASH_BANKS 2 /* max number of memory banks */
+#define CONFIG_SYS_MAX_FLASH_SECT 1024 /* max number of sectors on one chip */
+
+/* timeout values are in ticks */
+#define CFG_FLASH_ERASE_TOUT (2*CFG_HZ) /* Timeout for Flash Erase */
+#define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout for Flash Write */
+
+/*
+ * Linux tags
+ */
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+
+/*
+ * NAND Flash
+ */
+#define CONFIG_SYS_MAX_NAND_DEVICE 1
+#define NAND_MAX_CHIPS 1
+#define CONFIG_SYS_NAND_BASE 0x81000000
+
+
+/*
+ * Default environment settings
+ */
+#define CONFIG_EXTRA_ENV_SETTINGS \
+ "ipaddr=192.168.3.2" \
+ "netmask=255.255.255.0" \
+ "serverip=192.168.3.1" \
+ "ethaddr=00:1a:f1:00:00:00"
+
+/*
+ * Control where environment is stored
+ */
+#define CONFIG_ENV_IS_IN_FLASH 1
+#define CONFIG_ENV_ADDR (0x0 + 0x7C000) /* Addr of Environment Sector */
+#define CONFIG_ENV_SIZE 0x1000 /* Total Size of Environment Sector(4k) */
+
+/* Monitor Command Prompt */
+#define CONFIG_SYS_PROMPT "LPC2468 # "
+
+#endif /* __CONFIG_H */
diff -upNr u-boot-orig/MAKEALL u-boot/MAKEALL
--- u-boot-orig/MAKEALL 2009-03-18 00:42:12.000000000 +0100
+++ u-boot/MAKEALL 2009-03-18 13:51:02.000000000 +0100
@@ -481,6 +481,7 @@ LIST_ARM7=" \
impa7 \
integratorap \
lpc2292sodimm \
+ LPC2468 \
modnet50 \
SMN42 \
"
diff -upNr u-boot-orig/Makefile u-boot/Makefile
--- u-boot-orig/Makefile 2009-03-18 00:42:12.000000000 +0100
+++ u-boot/Makefile 2009-03-18 09:29:58.000000000 +0100
@@ -2899,6 +2899,9 @@ B2_config : unconfig
## ARM720T Systems
#########################################################################
+LPC2468_config: unconfig
+ @$(MKCONFIG) $(@:_config=) arm arm720t LPC2468 NULL lpc24xx
+
armadillo_config: unconfig
@$(MKCONFIG) $(@:_config=) arm arm720t armadillo
next prev parent reply other threads:[~2009-03-18 14:56 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-18 13:13 [U-Boot] [PATCH 1/1] LPC2468 support Remco Poelstra
2009-03-18 13:58 ` Wolfgang Denk
2009-03-18 14:54 ` [U-Boot] [PATCH 1/2] " Remco Poelstra
2009-03-18 16:46 ` Wolfgang Denk
2009-03-19 15:06 ` Remco Poelstra
2009-03-19 21:22 ` Wolfgang Denk
2009-03-24 11:05 ` Remco Poelstra
2009-03-24 22:33 ` Wolfgang Denk
2009-03-25 8:29 ` Remco Poelstra
2009-03-25 9:47 ` Wolfgang Denk
2009-03-25 10:06 ` Remco Poelstra
2009-03-25 21:51 ` Jean-Christophe PLAGNIOL-VILLARD
2009-03-26 9:03 ` Remco Poelstra
2009-04-24 11:57 ` Remco Poelstra
2009-04-24 12:55 ` Wolfgang Denk
2009-04-28 9:14 ` Remco Poelstra
2009-04-28 16:43 ` Ben Warren
2009-04-24 21:58 ` Jean-Christophe PLAGNIOL-VILLARD
2009-04-24 22:14 ` Wolfgang Denk
2009-04-25 12:47 ` Jean-Christophe PLAGNIOL-VILLARD
2009-04-27 7:27 ` Stefan Roese
2009-04-27 23:20 ` Wolfgang Denk
2009-04-28 6:27 ` Stefan Roese
2009-04-28 6:46 ` Wolfgang Denk
2009-04-28 7:08 ` Stefan Roese
2009-03-25 21:43 ` Jean-Christophe PLAGNIOL-VILLARD
2009-03-26 9:10 ` Remco Poelstra
2009-03-26 9:27 ` Remco Poelstra
2009-03-18 14:56 ` Remco Poelstra [this message]
2009-03-25 22:01 ` [U-Boot] [PATCH 2/2] LPC2468 example board Jean-Christophe PLAGNIOL-VILLARD
2009-03-26 9:11 ` Remco Poelstra
2009-04-28 13:54 ` Remco Poelstra
2009-07-17 22:18 ` Wolfgang Denk
2009-07-18 16:16 ` Jean-Christophe PLAGNIOL-VILLARD
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=49C10BB1.1040006@duran-audio.com \
--to=remco.poelstra@duran-audio.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.