[U-Boot] [PATCH] MPC5200: Add initial support for Matrix Vision mvSMR board
Detlev Zundel
dzu at denx.de
Wed Mar 24 10:00:34 CET 2010
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 at 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
More information about the U-Boot
mailing list