No subject
Tue Jul 29 02:03:00 CEST 2008
> The patch is against u-boot commit 055b12f2ffd7c34eea7e983a0588b24f2e69e0e3
> (Date: Sun Oct 19 21:54:30 2008 +0200) but should apply to newer commits as
> well, because the code is mostly seperated.
>
> If you have any comments please email to me.
>
> Is is possible to include that patch in the new version of u-boot?
>
> Regards
>
> Jürgen Schöw
>
> --
> Dipl.-Ing. Jürgen Schöw, emlix GmbH, http://www.emlix.com, mailto:js at emlix.com
> Fon +49 551 30664-0, Fax -11, Bahnhofsallee 1b, 37081 Göttingen, Germany
> Geschäftsführung: Dr. Uwe Kracke, Dr. Cord Seele, Ust-IdNr.: DE 205 198 055
> Sitz der Gesellschaft: Göttingen, Amtsgericht Göttingen HR B 3160
>
> emlix - your embedded linux partner
to here is supposed to be after ---
> -----
>
> Signed-off-by: Jürgen Schöw <js at emlix.com>
> Signed-off-by: Sebastian Hess <sh at emlix.com>
> Signed-off-by: Matthias Mwenzel <nxp at mazzoo.de>
> Signed-off-by: Dirk Hörner <dirk.hoerner at dspg.com>
> Signed-off-by: Andreas Weißel <andreas.weissel at dspg.com>
>
and sob before
first a question
who build this board?
> Diffstat:
> MAKEALL | 1 +
> Makefile | 7 +
> board/firetux/Makefile | 62 +++
> board/firetux/config.mk | 45 ++
> board/firetux/ethernet.c | 970 +++++++++++++++++++++++++++++++++++++++++
> board/firetux/ethernet.h | 234 ++++++++++
> board/firetux/firetux.c | 554 +++++++++++++++++++++++
> board/firetux/firetux.h | 118 +++++
> board/firetux/lowlevel_init.S | 413 ++++++++++++++++++
> board/firetux/memsetup.S | 366 ++++++++++++++++
> board/firetux/nand.c | 74 ++++
> board/firetux/relocate.S | 246 +++++++++++
> board/firetux/u-boot.lds | 57 +++
> drivers/i2c/Makefile | 1 +
> drivers/i2c/pnx8181_i2c.c | 302 +++++++++++++
> include/configs/firetux.h | 455 +++++++++++++++++++
> net/bootp.c | 11 +
> net/eth.c | 7 +
> 18 files changed, 3923 insertions(+), 0 deletions(-)
>
>
> diff --git a/MAKEALL b/MAKEALL
> index 9ccb9ac..0ba8e4d 100755
> --- a/MAKEALL
> +++ b/MAKEALL
> @@ -480,6 +480,7 @@ LIST_ARM9=" \
> cp926ejs \
> cp946es \
> cp966 \
> + firetux \
> lpd7a400 \
> mx1ads \
> mx1fs2 \
> diff --git a/Makefile b/Makefile
> index 9a132f7..8c3b076 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2683,6 +2683,13 @@ voiceblue_config: unconfig
> @$(MKCONFIG) $(@:_config=) arm arm925t voiceblue
>
> #########################################################################
> +## NXP PNX8181 "firetux"
> +#########################################################################
> +
> +firetux_config:unconfig
> + @$(MKCONFIG) $(@:_config=) arm arm926ejs firetux # manufacturer SOC
^^^^^^^^^^^^^^^^^^
please remove
> +
> +#########################################################################
> ## S3C44B0 Systems
> #########################################################################
>
> diff --git a/board/firetux/Makefile b/board/firetux/Makefile
> new file mode 100644
> index 0000000..a643a5e
> --- /dev/null
> +++ b/board/firetux/Makefile
> @@ -0,0 +1,62 @@
> +# firetux makefile
> +#
> +# (C) Copyright 2007-2008, emlix GmbH, Germany
> +# Juergen Schoew <js at emlix.com>
> +#
> +# (C) Copyright 2008, DSPG Technologies GmbH, Germany
> +# (C) Copyright 2007, NXP Semiconductors Germany GmbH
> +# Matthias Wenzel, <nxp at mazzoo.de>
> +#
> +# See file CREDITS for list of people who contributed to this
> +# project.
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License as
> +# published by the Free Software Foundation; either version 2 of
> +# the License, or (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> +# MA 02111-1307 USA
> +#
> +
> +include $(TOPDIR)/config.mk
> +
> +LIB = $(obj)lib$(BOARD).a
> +
> +COBJS := firetux.o ethernet.o
> +SOBJS := lowlevel_init.o memsetup.o relocate.o
> +
> +#ifdef CONFIG_CMD_NAND
> +COBJS += nand.o
> +#endif
please use COBJS-$(CONFIG_CMD_NAND)
> +
> +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
> +OBJS := $(addprefix $(obj),$(COBJS))
> +SOBJS := $(addprefix $(obj),$(SOBJS))
> +
> +all: $(LIB)
> +
> +$(LIB): $(obj).depend $(OBJS) $(SOBJS)
> + $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
> +
> +clean:
> + rm -f $(SOBJS) $(OBJS)
> +
> +distclean: clean
> + rm -f $(LIB) core *.bak .depend
> +
> +#########################################################################
> +
> +# defines $(obj).depend target
> +include $(SRCTREE)/rules.mk
> +
> +sinclude $(obj).depend
> +
> +#########################################################################
> diff --git a/board/firetux/config.mk b/board/firetux/config.mk
> new file mode 100644
> index 0000000..bcdd671
> --- /dev/null
> +++ b/board/firetux/config.mk
> @@ -0,0 +1,45 @@
> +# firetux compiler config
> +#
> +# (C) Copyright 2007-2008, emlix GmbH, Germany
> +# Juergen Schoew <js at emlix.com>
> +#
> +# (C) Copyright 2008, DSPG Technologies GmbH, Germany
> +# (C) Copyright 2007, NXP Semiconductors Germany GmbH
> +# Matthias Wenzel, <nxp at mazzoo.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
> +#
> +
> +
> +#
> +# image should be loaded at 0x01000000
> +#
> +
> +# SDRAM
> +TEXT_BASE = 0x20780000
> +# mobile pSRAM
> +#TEXT_BASE = 0x90700000
> +
could you use a condition
> +PLATFORM_CPPFLAGS += -fPIC -fPIE -fno-jump-tables # -msingle-pic-base
> +
> +ifneq ($(OBJTREE),$(SRCTREE))
> +# We are building u-boot in a separate directory, use generated
> +# .lds script from OBJTREE directory.
> +LDSCRIPT := $(OBJTREE)/board/$(BOARDDIR)/u-boot.lds
> +endif
> diff --git a/board/firetux/ethernet.c b/board/firetux/ethernet.c
please move to drivers/net/
> new file mode 100644
> index 0000000..866d578
> --- /dev/null
> +++ b/board/firetux/ethernet.c
> @@ -0,0 +1,970 @@
> +/*
> + * pnx8181 ethernet driver (ip3912)
> + *
> + * (C) Copyright 2007-2008, emlix GmbH, Germany
> + * Juergen Schoew <js at emlix.com>
> + *
> + * (C) Copyright 2008, DSPG Technologies GmbH, Germany
> + * (C) Copyright 2007, NXP Semiconductors Germany GmbH
> + * Matthias Wenzel, <nxp at mazzoo.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <net.h>
> +#include <malloc.h>
> +
> +#include "ethernet.h"
> +#include <miiphy.h>
> +
> +extern unsigned int boardrevision;
> +uint16_t ETN1_MADR_PHY_ADDR, ETN2_MADR_PHY_ADDR;
please do not use uppercase for var name
> +
> +int firetux_miiphy_initialize(bd_t *bis);
> +int mii_discover_phy(void);
> +int mii_negotiate_phy(void);
> +
> +#define ALIGN8 static __attribute__ ((aligned(8)))
> +#define ALIGN4 static __attribute__ ((aligned(4)))
why static? it should be strange to assume it's static when we read the code
> +
please use tab instead of space
> +#define PNX8181_SCON_SYSPAD0 0xc2204034
> +#define PNX8181_SCON_SYSPAD4 0xc2204044
> +#define PNX8181_SCON_SYSMUX0 0xc220400c
> +#define PNX8181_GPIOA_PINS 0xc2104000
> +#define PNX8181_GPIOA_OR 0xc2104004
> +#define PNX8181_GPIOA_DR 0xc2104008
> +
> +/* globals */
> +/* ETN1 rx */
> +ALIGN8 rx_descriptor_t etn1_rxdescriptor[ETN_RX_DESCRIPTOR_NUMBER];
> +ALIGN8 rx_status_t etn1_rxstatus [ETN_RX_DESCRIPTOR_NUMBER];
> +
> +/* ETN1 tx */
> +ALIGN8 tx_descriptor_t etn1_txdescriptor[ETN_TX_DESCRIPTOR_NUMBER];
> +ALIGN4 tx_status_t etn1_txstatus [ETN_TX_DESCRIPTOR_NUMBER];
> +
> +/* ETN2 rx */
> +ALIGN8 rx_descriptor_t etn2_rxdescriptor[ETN_RX_DESCRIPTOR_NUMBER];
> +ALIGN8 rx_status_t etn2_rxstatus [ETN_RX_DESCRIPTOR_NUMBER];
> +
> +/* ETN2 tx */
> +ALIGN8 tx_descriptor_t etn2_txdescriptor[ETN_TX_DESCRIPTOR_NUMBER];
> +ALIGN4 tx_status_t etn2_txstatus [ETN_TX_DESCRIPTOR_NUMBER];
> +
> +
> +/* which interface to be currently work on */
> +/* default can be set by environment variable ethact */
> +static int firetux_eth = 0;
> +
> +/* in the code we use the following descriptors which are either */
> +/* set to the etn1 or the etn2 descriptors, depending on ethact */
> +ALIGN8 rx_descriptor_t *etn_rxdescriptor = etn1_rxdescriptor;
> +ALIGN8 rx_status_t *etn_rxstatus = etn1_rxstatus;
> +ALIGN8 tx_descriptor_t *etn_txdescriptor = etn1_txdescriptor;
> +ALIGN8 tx_status_t *etn_txstatus = etn1_txstatus;
> +
> +/* also the base address is switched for etn1 and etn2, */
> +/* except for the MII registers etn1_m* which are only available */
> +/* on etn1 */
please use this style of comment
/*
*
*/
> +uint32_t etn_base = ETN1;
> +/* we first try Vega Platform III-a settings */
> +uint16_t firetux_phy_addr = 0x0100;
> +
is it not better to do all of this init in an init function?
and why not use a struct to save all parameter?
> +
> +static void firetux_set_ethact(int act, int hardwarerevision)
> +{
> + switch (hardwarerevision) {
> + /* EZ_MCP, Vega_pnx8181_basestation Platform III-a */
> + case 1:
> + case 2:
> + ETN1_MADR_PHY_ADDR = 0x00000100;
> + ETN2_MADR_PHY_ADDR = 0x00000200;
please use macro instead
> + break;
> + /* Vega_pnx8181_basestation Platform III-b, III-c */
> + case 3:
> + case 4:
> + default:
> + ETN1_MADR_PHY_ADDR = 0x00001E00;
> + ETN2_MADR_PHY_ADDR = 0x00001D00;
> + break;
> + }
> + if (act) {
> + etn_rxdescriptor = etn2_rxdescriptor;
> + etn_rxstatus = etn2_rxstatus;
> + etn_txdescriptor = etn2_txdescriptor;
> + etn_txstatus = etn2_txstatus;
> + etn_base = ETN2;
> + firetux_phy_addr = (uint16_t) ETN2_MADR_PHY_ADDR;
> + } else {
> + etn_rxdescriptor = etn1_rxdescriptor;
> + etn_rxstatus = etn1_rxstatus;
> + etn_txdescriptor = etn1_txdescriptor;
> + etn_txstatus = etn1_txstatus;
> + etn_base = ETN1;
> + firetux_phy_addr = (uint16_t) ETN1_MADR_PHY_ADDR;
> + }
> +}
> +
> +static void firetux_reset_phy(int hardwareversion)
> +{
> + switch (hardwareversion) {
> + case 1:
> + case 2:
> + case 3:
please use readx and writex
it will be better to create a gpiolib support
> + /* set GPIOa12 direction to output */
> + *(vu_long *)(PNX8181_GPIOA_DR) = (((*(vu_long *)
> + (PNX8181_GPIOA_DR)) & 0xffffefff) | 0x00001000);
> + /* ETH_RESET_N */
> + *(vu_long *)(PNX8181_GPIOA_OR) = ((*(vu_long *)
> + (PNX8181_GPIOA_OR)) & 0xffffefff);
> + udelay(256000);
> + *(vu_long *)(PNX8181_GPIOA_OR) = (((*(vu_long *)
> + (PNX8181_GPIOA_OR)) & 0xffffefff) | 0x00001000);
> + udelay(100000);
why 100ms of delay?
> + break;
> + case 4:
> + *(vu_long *) (PNX8181_SCON_SYSPAD4) = (((*(vu_long *)
> + (PNX8181_SCON_SYSPAD4)) & 0xf7f5755f) | 0x080a8aa0);
> + *(vu_long *) (PNX8181_SCON_SYSMUX0) = ((*(vu_long *)
> + (PNX8181_SCON_SYSMUX0)) & 0xffffff3f);
> + /* set GPIOa3 direction to output */
> + *(vu_long *) (PNX8181_GPIOA_DR) = (((*(vu_long *)
> + (PNX8181_GPIOA_DR)) & 0xfffffff7) | 0x00000008);
> + /* ETH_RESET_N */
> + *(vu_long *) (PNX8181_GPIOA_OR) = ((*(vu_long *)
> + (PNX8181_GPIOA_OR)) & 0xfffffff7);
> + udelay(256000);
why 256ms of delay?
> + *(vu_long *) (PNX8181_GPIOA_OR) = (((*(vu_long *)
> + (PNX8181_GPIOA_OR)) & 0xfffffff7) | 0x00000008);
> + udelay(100000);
why 100ms of delay?
> + break;
> + default:
> + puts("Unknown Board, can't reset network phy\n");
> + break;
> + }
> +}
> +
> +static int firetux_eth_init_clocks(void)
> +{
> + /* first things first, release the RSTEXT signal,
> + * which keeps the PHYs in reset */
> + *(vu_long *) (WDRU + WDRUCON) |= 0x0001;
> +
> + /* init ETN clocks */
> +
> + /* set ETNREFCLK to internal CGU clock, assuming a 13.824MHz crystal */
> + /* for other xtals see NXP's validation tests,
> + * lib/tools/source/swift_tools.c */
> + *(vu_long *) CGU_PER2CON = (15<<9) | (62<<3) | 3;
please ad space between "<<"
> +
> + /* turn on PLL */
> + *(vu_long *) CGU_PER2CON |= 0x00010000;
> + /* wait for PLL lock */
> + while (!(*(vu_long *) CGU_PER2CON & 0x00020000));
> +
> + /* ungate ETN clocks */
> + *(vu_long *) CGU_PER2CON |= 0x00802000;
> +
> + return 0;
> +}
> +
> +static int firetux_eth_init_rxdescriptor(void)
> +{
> + *(vu_long *) (etn_base + ETN_RXDESCRIPTOR) = (vu_long) etn_rxdescriptor;
> + *(vu_long *) (etn_base + ETN_RXSTATUS) = (vu_long) etn_rxstatus;
> + *(vu_long *) (etn_base + ETN_RXCONSUMEINDEX) = 0x00000000;
> + *(vu_long *) (etn_base + ETN_RXDESCRIPTORNUMBER) =
> + ETN_RX_DESCRIPTOR_NUMBER - 1;
> +
> + /* allocate rx-buffers, but only once, we're called multiple times! */
> + static void *rxbuf = 0;
> + if (!rxbuf)
> + rxbuf = malloc(MAX_ETH_FRAME_SIZE * ETN_RX_DESCRIPTOR_NUMBER);
> + if (!rxbuf) {
> + puts("ERROR: couldn't allocate rx buffers!\n");
> + return -1;
> + }
> +
> + int i;
please declare var at begining
> + for (i = 0; i < ETN_RX_DESCRIPTOR_NUMBER; i++) {
> + etn_rxdescriptor[i].packet = rxbuf + i * MAX_ETH_FRAME_SIZE;
> + etn_rxdescriptor[i].control =
> + MAX_ETH_FRAME_SIZE - sizeof(vu_long);
> + etn_rxstatus[i].info = 0;
> + etn_rxstatus[i].hashCRC = 0;
> + }
> + return 0;
> +}
> +
> +static int firetux_eth_init_txdescriptor(void)
> +{
> + *(vu_long *) (etn_base + ETN_TXDESCRIPTOR) =
> + (vu_long) etn_txdescriptor;
> + *(vu_long *) (etn_base + ETN_TXSTATUS) = (vu_long) etn_txstatus;
> + *(vu_long *) (etn_base + ETN_TXPRODUCEINDEX) = 0x00000000;
> + *(vu_long *) (etn_base + ETN_TXDESCRIPTORNUMBER) =
> + ETN_TX_DESCRIPTOR_NUMBER - 1;
> +
> + int i;
> + for (i = 0; i < ETN_TX_DESCRIPTOR_NUMBER; i++) {
> + etn_txdescriptor[i].packet = 0;
> + etn_txdescriptor[i].control = 0;
> + etn_txstatus[i].info = 0;
> + }
> + return 0;
> +}
> +
> +static void PHY_write(uint16_t a, uint16_t d)
please no uppercase in function name
> +{
> + uint32_t status;
> + int i = 0;
> +
> + a &= 0x001f; /* 5 bit PHY register address */
> +
> + *(vu_long *) (ETN1 + ETN_MADR) = firetux_phy_addr | a;
> + *(vu_long *) (ETN1 + ETN_MWTD) = d;
> +
> + /* poll for done */
> + while ((status = *(vu_long *) (ETN1 + ETN_MIND)) && i < 1000000)
> + i++;
> + if (status) {
> + printf("ERROR: PHY_write(%d) = 0x%x [eth=%d, phy_addr=%x]\n",
> + a, status, firetux_eth, firetux_phy_addr);
> + } else {
> +#ifdef ET_DEBUG
> + printf("### PHY_write(%2.d, 0x%4.4x) success after %d cycles "
> + "[eth=%d, phy_addr=%x]\n", a, d, i, firetux_eth,
> + firetux_phy_addr);
please use debug()
> +#endif
> + }
> +}
> +
> +static uint16_t PHY_read(uint16_t a)
> +{
> + uint32_t status;
> + int i = 0;
> +
> + a &= 0x001f; /* 5 bit PHY register address */
> + *(vu_long *) (ETN1 + ETN_MADR) = firetux_phy_addr | a;
> + *(vu_long *) (ETN1 + ETN_MCMD) = 0x00000001;
> +
> + /* poll for done */
> + while ((status = ((*(vu_long *)
> + (ETN1 + ETN_MIND))) & 0x7) && i < 1000000)
> + i++;
> +
> + uint16_t d = *(vu_long *) (ETN1 + ETN_MRDD);
please declare var at the beggening
> +
> + if (status) {
> + printf("ERROR: PHY_read(%d) = 0x%x after %d cycles [eth=%d, "
> + "phy_addr=%x]\n", a, status, i, firetux_eth,
> + firetux_phy_addr);
> + } else {
> +#ifdef ET_DEBUG
> + printf("### PHY_read(%2.d)=0x%4.4x success after %d cycles "
> + "[eth=%d, phy_addr=%x]\n", a, d, i, firetux_eth,
> + firetux_phy_addr);
> +#endif
> + }
> +
> + *(vu_long *) (ETN1 + ETN_MCMD) = 0x00000000;
> +
> + return d;
> +}
> +
Their is too much fix to do to.
Please fix first.
Best Regards,
J.
More information about the U-Boot
mailing list