From: Detlev Zundel <dzu@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] MPC5200: Add initial support for Matrix Vision mvSMR board
Date: Wed, 24 Mar 2010 10:00:34 +0100 [thread overview]
Message-ID: <m2sk7qp00d.fsf@ohwell.denx.de> (raw)
In-Reply-To: <1269365470-1911-1-git-send-email-andre.schwarz@matrix-vision.de> (Andre Schwarz's message of "Tue, 23 Mar 2010 18:31:10 +0100")
Hi Andre,
just a few obligatory remarks...
> Add initial support for Matrix Vision mvSMR board based on MPC5200B.
>
> Signed-off-by: Andre Schwarz <andre.schwarz@matrix-vision.de>
> ---
> CREDITS | 2 +-
> MAINTAINERS | 1 +
> MAKEALL | 1 +
> Makefile | 5 +
> board/matrix_vision/mvsmr/Makefile | 51 ++++++
> board/matrix_vision/mvsmr/autoscript | 43 +++++
> board/matrix_vision/mvsmr/config.mk | 31 ++++
> board/matrix_vision/mvsmr/fpga.c | 151 +++++++++++++++++
> board/matrix_vision/mvsmr/fpga.h | 32 ++++
> board/matrix_vision/mvsmr/mvsmr.c | 276 +++++++++++++++++++++++++++++++
> board/matrix_vision/mvsmr/mvsmr.h | 43 +++++
> board/matrix_vision/mvsmr/u-boot.lds | 138 ++++++++++++++++
> doc/README.mvsmr | 55 +++++++
> include/configs/MVSMR.h | 295 ++++++++++++++++++++++++++++++++++
> 14 files changed, 1123 insertions(+), 1 deletions(-)
> create mode 100644 board/matrix_vision/mvsmr/Makefile
> create mode 100644 board/matrix_vision/mvsmr/autoscript
> create mode 100644 board/matrix_vision/mvsmr/config.mk
> create mode 100644 board/matrix_vision/mvsmr/fpga.c
> create mode 100644 board/matrix_vision/mvsmr/fpga.h
> create mode 100644 board/matrix_vision/mvsmr/mvsmr.c
> create mode 100644 board/matrix_vision/mvsmr/mvsmr.h
> create mode 100644 board/matrix_vision/mvsmr/u-boot.lds
> create mode 100644 doc/README.mvsmr
> create mode 100644 include/configs/MVSMR.h
>
[...]
> diff --git a/board/matrix_vision/mvsmr/fpga.c b/board/matrix_vision/mvsmr/fpga.c
> new file mode 100644
> index 0000000..3fe55f2
> --- /dev/null
> +++ b/board/matrix_vision/mvsmr/fpga.c
> @@ -0,0 +1,151 @@
> +/*
> + * (C) Copyright 2002
> + * Rich Ireland, Enterasys Networks, rireland at enterasys.com.
> + * Keith Outwater, keith_outwater at mvis.com.
> + *
> + * (C) Copyright 2010
> + * Andre Schwarz, Matrix Vision GmbH, andre.schwarz at matrix-vision.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 <spartan3.h>
> +#include <command.h>
> +#include "fpga.h"
> +#include "mvsmr.h"
> +
> +#ifdef FPGA_DEBUG
> +#define fpga_debug(fmt, args...) printf("%s: "fmt, __func__, ##args)
> +#else
> +#define fpga_debug(fmt, args...)
> +#endif
Do you really insist on yet another debug macro? I know it includes the
function, but is it really worth it?
> +
> +
> +Xilinx_Spartan3_Slave_Serial_fns fpga_fns = {
> + fpga_pre_config_fn,
> + fpga_pgm_fn,
> + fpga_clk_fn,
> + fpga_init_fn,
> + fpga_done_fn,
> + fpga_wr_fn,
> + 0
> +};
> +
> +Xilinx_desc spartan3 = {
> + Xilinx_Spartan2,
> + slave_serial,
> + XILINX_XC3S200_SIZE,
> + (void *) &fpga_fns,
> + 0,
> +};
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int mvsmr_init_fpga(void)
> +{
> + fpga_debug("Initialize FPGA interface\n");
> + fpga_init();
> + fpga_add(fpga_xilinx, &spartan3);
> +
> + return 1;
> +}
> +
> +int fpga_init_fn(int cookie)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> +
> + fpga_debug("INIT check ... ");
> + if (gpio->simple_ival & FPGA_CONFIG) {
Use accessor functions.
> + fpga_debug("high");
> + return 0;
> + } else {
> + fpga_debug("low");
> + return 1;
> + }
> +}
> +
> +int fpga_done_fn(int cookie)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> + int result = 0;
> +
> + udelay(10);
> + fpga_debug("CONF_DONE check ... ");
> + if (gpio->simple_ival & FPGA_DONE) {
Accessors.
> + fpga_debug("high\n");
> + result = 1;
> + } else
> + fpga_debug("low\n");
> +
> + return result;
> +}
> +
> +int fpga_pgm_fn(int assert, int flush, int cookie)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> +
> + fpga_debug("SET prog : %s\n", assert ? "low" : "high");
> + if (!assert)
> + gpio->sint_dvo |= FPGA_STATUS;
> + else
> + gpio->sint_dvo &= ~FPGA_STATUS;
Accessors.
> +
> + return assert;
> +}
> +
> +int fpga_clk_fn(int assert_clk, int flush, int cookie)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> + u32 dvo = gpio->simple_dvo;
> +
> + fpga_debug("CLOCK %s\n", assert_clk ? "high" : "low");
> + if (assert_clk)
> + dvo |= FPGA_CCLK;
> + else
> + dvo &= ~FPGA_CCLK;
> +
> + if (flush)
> + gpio->simple_dvo = dvo;
Again.
> +
> + return assert_clk;
> +}
> +
> +int fpga_wr_fn(int assert_write, int flush, int cookie)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> +
> + debug("SET data : %d\n", assert_write ? 1 : 0);
> + if (assert_write)
> + gpio->simple_dvo |= FPGA_DIN;
> + else
> + gpio->simple_dvo &= ~FPGA_DIN;
Again.
> +
> + return assert_write;
> +}
> +
> +int fpga_pre_config_fn(int cookie)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> +
> + gpio->sint_dvo |= FPGA_STATUS;
And once more.
> +
> + return 0;
> +}
> diff --git a/board/matrix_vision/mvsmr/fpga.h b/board/matrix_vision/mvsmr/fpga.h
> new file mode 100644
> index 0000000..ee690e6
> --- /dev/null
> +++ b/board/matrix_vision/mvsmr/fpga.h
> @@ -0,0 +1,32 @@
> +/*
> + * (C) Copyright 2008
> + * Andre Schwarz, Matrix Vision GmbH, andre.schwarz at matrix-vision.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
> + *
> + */
> +
> +extern int mvsmr_init_fpga(void);
> +
> +extern int fpga_pgm_fn(int assert_pgm, int flush, int cookie);
> +extern int fpga_init_fn(int cookie);
> +extern int fpga_clk_fn(int assert_clk, int flush, int cookie);
> +extern int fpga_wr_fn(int assert_write, int flush, int cookie);
> +extern int fpga_done_fn(int cookie);
> +extern int fpga_pre_config_fn(int cookie);
> diff --git a/board/matrix_vision/mvsmr/mvsmr.c b/board/matrix_vision/mvsmr/mvsmr.c
> new file mode 100644
> index 0000000..e588ed9
> --- /dev/null
> +++ b/board/matrix_vision/mvsmr/mvsmr.c
> @@ -0,0 +1,276 @@
> +/*
> + * (C) Copyright 2003
> + * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> + *
> + * (C) Copyright 2004
> + * Mark Jonas, Freescale Semiconductor, mark.jonas at motorola.com.
> + *
> + * (C) Copyright 2005-2010
> + * Andre Schwarz, Matrix Vision GmbH, andre.schwarz at matrix-vision.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 <mpc5xxx.h>
> +#include <malloc.h>
> +#include <pci.h>
> +#include <i2c.h>
> +#include <fpga.h>
> +#include <environment.h>
> +#include <netdev.h>
> +#include <asm/io.h>
> +#include "fpga.h"
> +#include "mvsmr.h"
> +#include "../common/mv_common.h"
> +
> +#define SDRAM_DDR 1
> +#define SDRAM_MODE 0x018D0000
> +#define SDRAM_EMODE 0x40090000
> +#define SDRAM_CONTROL 0x715f0f00
> +#define SDRAM_CONFIG1 0xd3722930
> +#define SDRAM_CONFIG2 0x46770000
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static void sdram_start(int hi_addr)
> +{
> + long hi_bit = hi_addr ? 0x01000000 : 0;
> +
> + /* unlock mode register */
> + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000000 |
> + hi_bit);
> +
> + /* precharge all banks */
> + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000002 |
> + hi_bit);
> +
> + /* set mode register: extended mode */
> + *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_EMODE;
> + __asm__ volatile ("sync");
Mixing accessors and direct pointer accesses? Please update all to
using the accessors.
> +
> + /* set mode register: reset DLL */
> + *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000;
> + __asm__ volatile ("sync");
Dito.
> +
> + /* precharge all banks */
> + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000002 |
> + hi_bit);
> +
> + /* auto refresh */
> + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000004 |
> + hi_bit);
> +
> + /* set mode register */
> + out_be32((u32 *)MPC5XXX_SDRAM_MODE, SDRAM_MODE);
> +
> + /* normal operation */
> + out_be32((u32 *)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | hi_bit);
> +}
> +
> +phys_addr_t initdram(int board_type)
> +{
> + ulong dramsize = 0;
> + ulong test1,
> + test2;
> +
> + /* setup SDRAM chip selects */
> + out_be32((u32 *)MPC5XXX_SDRAM_CS0CFG, 0x0000001e);
> +
> + /* setup config registers */
> + out_be32((u32 *)MPC5XXX_SDRAM_CONFIG1, SDRAM_CONFIG1);
> + out_be32((u32 *)MPC5XXX_SDRAM_CONFIG2, SDRAM_CONFIG2);
> +
> + /* find RAM size using SDRAM CS0 only */
> + sdram_start(0);
> + test1 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000);
> + sdram_start(1);
> + test2 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000);
> + if (test1 > test2) {
> + sdram_start(0);
> + dramsize = test1;
> + } else
> + dramsize = test2;
> +
> + if (dramsize < (1 << 20))
> + dramsize = 0;
> +
> + if (dramsize > 0)
> + out_be32((u32 *)MPC5XXX_SDRAM_CS0CFG, 0x13 +
> + __builtin_ffs(dramsize >> 20) - 1);
> + else
> + out_be32((u32 *)MPC5XXX_SDRAM_CS0CFG, 0);
> +
> + return dramsize;
> +}
> +
> +void mvsmr_init_gpio(void)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> + struct mpc5xxx_gpt_0_7 *timers = (struct mpc5xxx_gpt_0_7 *)MPC5XXX_GPT;
> +
> + printf("Ports : 0x%08x\n", gpio->port_config);
> + printf("PORCFG: 0x%08x\n", in_be32((unsigned *)MPC5XXX_CDM_PORCFG));
> +
> + out_be32(&gpio->simple_ddr, SIMPLE_DDR);
> + out_be32(&gpio->simple_dvo, SIMPLE_DVO);
> + out_be32(&gpio->simple_ode, SIMPLE_ODE);
> + out_be32(&gpio->simple_gpioe, SIMPLE_GPIOEN);
> +
> + out_8(&gpio->sint_ode, SINT_ODE);
> + out_8(&gpio->sint_ddr, SINT_DDR);
> + out_8(&gpio->sint_dvo, SINT_DVO);
> + out_8(&gpio->sint_inten, SINT_INTEN);
> + out_be16(&gpio->sint_itype, SINT_ITYPE);
> + out_8(&gpio->sint_gpioe, SINT_GPIOEN);
> +
> + out_8((u8 *)MPC5XXX_WU_GPIO_ODE, WKUP_ODE);
> + out_8((u8 *)MPC5XXX_WU_GPIO_DIR, WKUP_DIR);
> + out_8((u8 *)MPC5XXX_WU_GPIO_DATA_O, WKUP_DO);
> + out_8((u8 *)MPC5XXX_WU_GPIO_ENABLE, WKUP_EN);
Actually we have a "struct mpc5xxx_wu_gpio", so please use it.
> +
> + out_be32(&timers->gpt0.emsr, 0x00000234); /* OD output high */
> + out_be32(&timers->gpt1.emsr, 0x00000234);
> + out_be32(&timers->gpt2.emsr, 0x00000234);
> + out_be32(&timers->gpt3.emsr, 0x00000234);
> + out_be32(&timers->gpt4.emsr, 0x00000234);
> + out_be32(&timers->gpt5.emsr, 0x00000234);
> + out_be32(&timers->gpt6.emsr, 0x00000024); /* push-pull output low */
> + out_be32(&timers->gpt7.emsr, 0x00000024);
> +
> + printf("simple_gpioe: 0x%08x\n", gpio->simple_gpioe);
> + printf("sint_gpioe : 0x%08x\n", gpio->sint_gpioe);
> +}
> +
> +int misc_init_r(void)
> +{
> + char *s = getenv("reset_env");
> +
> + if (s) {
> + printf(" === FACTORY RESET ===\n");
> + mv_reset_environment();
> + saveenv();
> + }
> +
> + return -1;
> +}
> +
> +void mvsmr_get_dbg_present(void)
> +{
> + struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio *)MPC5XXX_GPIO;
> + struct mpc5xxx_psc *psc = (struct mpc5xxx_psc *)MPC5XXX_PSC1;
> +
> + if (gpio->simple_ival & COP_PRESENT) {
Good ol' accessors.
> + setenv("dbg_present", "no\0");
> + setenv("bootstopkey", "abcdefghijklmnopqrstuvwxyz\0");
> + } else {
> + setenv("dbg_present", "yes\0");
> + setenv("bootstopkey", "s\0");
> + psc->command |= PSC_RX_ENABLE;
Again.
> + }
> +}
> +
> +void mvsmr_get_service_mode(void)
> +{
> + struct mpc5xxx_wu_gpio *wu_gpio =
> + (struct mpc5xxx_wu_gpio *)MPC5XXX_WU_GPIO;
> +
> + if (wu_gpio->ival & SERVICE_MODE)
And again.
> + setenv("servicemode", "no\0");
> + else
> + setenv("servicemode", "yes\0");
> +}
> +
> +int mvsmr_get_mac(void)
> +{
> + char *data, *mac;
> + struct mpc5xxx_wu_gpio *wu_gpio =
> + (struct mpc5xxx_wu_gpio *)MPC5XXX_WU_GPIO;
Aha, so you _did_ find it before ;)
> +
> + if (wu_gpio->ival & LAN_PRSNT) {
Accessors
> + setenv("lan_present", "no\0");
> + return -1;
> + } else
> + setenv("lan_present", "yes\0");
> +
> + data = malloc(10);
> + mac = malloc(32);
> + memset(data, 0, sizeof(data));
> + memset(mac, 0, sizeof(mac));
> +
> + i2c_read(0x50, 0, 1, (unsigned char *)data, 6);
> +
> + sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x",
> + data[0], data[1], data[2], data[3], data[4], data[5]);
> + setenv("ethaddr", mac);
> + free(data);
> + free(mac);
> +
> + return 0;
> +}
> +
> +int checkboard(void)
> +{
> + mvsmr_init_gpio();
> + printf("Board: Matrix Vision mvSMR\n");
> +
> + return 0;
> +}
> +
> +void flash_preinit(void)
> +{
> + /*
> + * Now, when we are in RAM, enable flash write
> + * access for detection process.
> + * Note that CS_BOOT cannot be cleared when
> + * executing in flash.
> + */
> + clrbits_be32((u32 *)MPC5XXX_BOOTCS_CFG, 0x1);
> +}
> +
> +void flash_afterinit(ulong size)
> +{
> + out_be32((u32 *)MPC5XXX_BOOTCS_START,
> + START_REG(CONFIG_SYS_BOOTCS_START | size));
> + out_be32((u32 *)MPC5XXX_CS0_START,
> + START_REG(CONFIG_SYS_BOOTCS_START | size));
> + out_be32((u32 *)MPC5XXX_BOOTCS_STOP,
> + STOP_REG(CONFIG_SYS_BOOTCS_START | size, size));
> + out_be32((u32 *)MPC5XXX_CS0_STOP,
> + STOP_REG(CONFIG_SYS_BOOTCS_START | size, size));
> +}
> +
> +struct pci_controller hose;
> +
> +void pci_init_board(void)
> +{
> + mvsmr_get_dbg_present();
> + mvsmr_get_service_mode();
> + mvsmr_init_fpga();
> + mv_load_fpga();
> + pci_mpc5xxx_init(&hose);
> +}
> +
> +int board_eth_init(bd_t *bis)
> +{
> + if (!mvsmr_get_mac())
> + return cpu_eth_init(bis);
> +
> + return pci_eth_init(bis);
> +}
[...]
Cheers
Detlev
--
Markov does it in chains.
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: dzu at denx.de
next prev parent reply other threads:[~2010-03-24 9:00 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-23 17:31 [U-Boot] [PATCH] MPC5200: Add initial support for Matrix Vision mvSMR board Andre Schwarz
2010-03-24 9:00 ` Detlev Zundel [this message]
2010-03-24 9:17 ` Andre Schwarz
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=m2sk7qp00d.fsf@ohwell.denx.de \
--to=dzu@denx.de \
--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.