[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