
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@enterasys.com.
- Keith Outwater, keith_outwater@mvis.com.
- (C) Copyright 2010
- Andre Schwarz, Matrix Vision GmbH, andre.schwarz@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@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@denx.de.
- (C) Copyright 2004
- Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
- (C) Copyright 2005-2010
- Andre Schwarz, Matrix Vision GmbH, andre.schwarz@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