Adds a HCU5 board specific cmd reghcu5 to dump about 140 internal
register which define the HW configuration. Needed for documentation
purposes and to compare different settings.

Signed-off-by: Niklaus Giger <niklaus.gi...@netstal.com>
---
 board/netstal/hcu5/Makefile      |    2 +-
 board/netstal/hcu5/cmd_reghcu5.c |  283 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 284 insertions(+), 1 deletions(-)
 create mode 100644 board/netstal/hcu5/cmd_reghcu5.c

diff --git a/board/netstal/hcu5/Makefile b/board/netstal/hcu5/Makefile
index 4456771..670b100 100644
--- a/board/netstal/hcu5/Makefile
+++ b/board/netstal/hcu5/Makefile
@@ -25,7 +25,7 @@ LIB   = $(obj)lib$(BOARD).a
 
 # NOBJS : Netstal common objects
 NOBJS  = nm_bsp.o
-COBJS  = $(BOARD).o sdram.o
+COBJS  = $(BOARD).o sdram.o cmd_reghcu5.o
 SOBJS  = init.o
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c) $(addprefix ../common/,$(NOBJS:.o=.c))
diff --git a/board/netstal/hcu5/cmd_reghcu5.c b/board/netstal/hcu5/cmd_reghcu5.c
new file mode 100644
index 0000000..ca330f7
--- /dev/null
+++ b/board/netstal/hcu5/cmd_reghcu5.c
@@ -0,0 +1,283 @@
+/*
+ *(C) Copyright 2005-2008 Netstal Maschinen AG
+ *    Bruno Hars (bruno.h...@netstal.com)
+ *
+ *    This source code is free software; you can redistribute it
+ *    and/or modify it in source code form 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
+ */
+
+/************************************************************************
+ * cmd_reghcu5.c - CPU Register Dump for HCU5 board with PPC440EPx
+ ***********************************************************************/
+
+#include <common.h>
+#include <command.h>
+#include <asm/processor.h>
+
+enum REGISTER_TYPE {
+       DCR,                    /* Directly Accessed DCR's */
+       IDCR1,                  /* Indirectly Accessed DCR to SDRAM0_CFGADDR 
and SDRAM0_CFGDATA */
+       IDCR2,                  /* Indirectly Accessed DCR to EBC0_CFGADDR and 
EBC0_CFGDATA */
+       IDCR3,                  /* Indirectly Accessed DCR to EBM0_CFGADDR and 
EBM0_CFGDATA */
+       IDCR4,                  /* Indirectly Accessed DCR to PPM0_CFGADDR and 
PPM0_CFGDATA */
+       IDCR5,                  /* Indirectly Accessed DCR to CPR0_CFGADDR and 
CPR0_CFGDATA */
+       IDCR6,                  /* Indirectly Accessed DCR to SDR0_CFGADDR and 
SDR0_CFGDATA */
+       MM                      /* Directly Accessed MMIO Register */
+};
+
+struct cpu_register {
+       char *name;
+       enum REGISTER_TYPE type;
+       unsigned long address;
+};
+
+/* PPC440EPx registers ordered for output
+ * name           type    addr            size
+ * -------------------------------------------
+ */
+const struct cpu_register ppc440epx_reg[] = {
+       {"EBC0_B0CR      ", IDCR2, PB0CR},
+       {"EBC0_B1CR      ", IDCR2, PB1CR},
+       {"EBC0_B2CR      ", IDCR2, PB2CR},
+       {"EBC0_B3CR      ", IDCR2, PB3CR},
+       {"EBC0_B4CR      ", IDCR2, PB4CR},
+       {"EBC0_B5CR      ", IDCR2, PB5CR},
+       {"EBC0_B0AP      ", IDCR2, PB0AP},
+       {"EBC0_B1AP      ", IDCR2, PB1AP},
+       {"EBC0_B2AP      ", IDCR2, PB2AP},
+       {"EBC0_B3AP      ", IDCR2, PB3AP},
+       {"EBC0_B4AP      ", IDCR2, PB4AP},
+       {"EBC0_B5AP      ", IDCR2, PB5AP},
+       {"EBC0_CFG       ", IDCR2, 0x23},
+       {"SDR0_SDSTP0    ", IDCR6, SDR0_SDSTP0},
+       {"SDR0_SDSTP1    ", IDCR6, SDR0_SDSTP1},
+       {"SDR0_SDSTP2    ", IDCR6, 0x4001},
+       {"SDR0_SDSTP3    ", IDCR6, 0x4003},
+       {"SDR0_CUST0     ", IDCR6, SDR0_CUST0},
+       {"SDR0_CUST1     ", IDCR6, SDR0_CUST1},
+       {"SDR0_EBC0      ", IDCR6, 0x0100},
+       {"SDR0_AMP0      ", IDCR6, 0x0240},
+       {"SDR0_AMP1      ", IDCR6, 0x0241},
+       {"SDR0_CP440     ", IDCR6, SDR0_CP440},
+       {"SDR0_CRYP0     ", IDCR6, 0x4500},
+       {"SDR0_DDRCFG    ", IDCR6, 0x00E0},
+       {"SDR0_EMAC0RXST ", IDCR6, 0x4301},
+       {"SDR0_EMAC0TXST ", IDCR6, 0x4302},
+       {"SDR0_MFR       ", IDCR6, SDR0_MFR},
+       {"SDR0_PCI0      ", IDCR6, SDR0_PCI0},
+       {"SDR0_PFC0      ", IDCR6, SDR0_PFC0},
+       {"SDR0_PFC1      ", IDCR6, SDR0_PFC1},
+       {"SDR0_PFC2      ", IDCR6, SDR0_PFC2},
+       {"SDR0_PFC4      ", IDCR6, SDR0_PFC4},
+       {"SDR0_UART0     ", IDCR6, SDR0_UART0},
+       {"SDR0_UART1     ", IDCR6, SDR0_UART1},
+       {"SDR0_UART2     ", IDCR6, SDR0_UART2},
+       {"SDR0_UART3     ", IDCR6, SDR0_UART3},
+       {"DDR0_02        ", IDCR1, 2},
+       {"DDR0_00        ", IDCR1, 0},
+       {"DDR0_01        ", IDCR1, 1},
+       {"DDR0_03        ", IDCR1, 3},
+       {"DDR0_04        ", IDCR1, 4},
+       {"DDR0_05        ", IDCR1, 5},
+       {"DDR0_06        ", IDCR1, 6},
+       {"DDR0_07        ", IDCR1, 7},
+       {"DDR0_08        ", IDCR1, 8},
+       {"DDR0_09        ", IDCR1, 9},
+       {"DDR0_10        ", IDCR1, 10},
+       {"DDR0_11        ", IDCR1, 11},
+       {"DDR0_12        ", IDCR1, 12},
+       {"DDR0_14        ", IDCR1, 14},
+       {"DDR0_17        ", IDCR1, 17},
+       {"DDR0_18        ", IDCR1, 18},
+       {"DDR0_19        ", IDCR1, 19},
+       {"DDR0_20        ", IDCR1, 20},
+       {"DDR0_21        ", IDCR1, 21},
+       {"DDR0_22        ", IDCR1, 22},
+       {"DDR0_23        ", IDCR1, 23},
+       {"DDR0_24        ", IDCR1, 24},
+       {"DDR0_25        ", IDCR1, 25},
+       {"DDR0_26        ", IDCR1, 26},
+       {"DDR0_27        ", IDCR1, 27},
+       {"DDR0_28        ", IDCR1, 28},
+       {"DDR0_31        ", IDCR1, 31},
+       {"DDR0_32        ", IDCR1, 32},
+       {"DDR0_33        ", IDCR1, 33},
+       {"DDR0_34        ", IDCR1, 34},
+       {"DDR0_35        ", IDCR1, 35},
+       {"DDR0_36        ", IDCR1, 36},
+       {"DDR0_37        ", IDCR1, 37},
+       {"DDR0_38        ", IDCR1, 38},
+       {"DDR0_39        ", IDCR1, 39},
+       {"DDR0_40        ", IDCR1, 40},
+       {"DDR0_41        ", IDCR1, 41},
+       {"DDR0_42        ", IDCR1, 42},
+       {"DDR0_43        ", IDCR1, 43},
+       {"DDR0_44        ", IDCR1, 44},
+       {"CPM0_ER        ", DCR, 0x0B0},
+       {"CPM1_ER        ", DCR, 0x0F0},
+       {"CPR0_ICFG      ", IDCR5, CPR0_ICFG},
+       {"CPR0_MALD      ", IDCR5, CPR0_MALD},
+       {"CPR0_OPBD0     ", IDCR5, 0x00C0},
+       {"CPR0_PERD0     ", IDCR5, 0x00E0},
+       {"CPR0_PLLC0     ", IDCR5, 0x0040},
+       {"CPR0_PLLD0     ", IDCR5, 0x0060},
+       {"CPR0_PRIMAD0   ", IDCR5, 0x0080},
+       {"CPR0_PRIMBD0   ", IDCR5, 0x00A0},
+       {"CPR0_SPCID     ", IDCR5, 0x0120},
+       {"SPI0_MODE      ", MM, 0xEF600900},
+       {"IIC0_CLKDIV    ", MM, 0xEF60070C},
+       {"PCIL0_PMM0MA   ", MM, 0xEF400004},
+       {"PCIL0_PMM1MA   ", MM, 0xEF400014},
+       {"PCIL0_PTM1LA   ", MM, 0xEF400034},
+       {"PCIL0_PTM1MS   ", MM, 0xEF400030},
+       {"PCIL0_PTM2LA   ", MM, 0xEF40003C},
+       {"PCIL0_PTM2MS   ", MM, 0xEF400038},
+       {"MAL0_CFG       ", DCR, MAL0_CFG},
+       {"ZMII0_FER      ", MM, 0xEF600D00},
+       {"ZMII0_SSR      ", MM, 0xEF600D04},
+       {"EMAC0_IPGVR    ", MM, 0xEF600E58},
+       {"EMAC0_MR1      ", MM, 0xEF600E04},
+       {"EMAC0_PTR      ", MM, 0xEF600E2C},
+       {"EMAC0_RWMR     ", MM, 0xEF600E64},
+       {"EMAC0_STACR    ", MM, 0xEF600E5C},
+       {"EMAC0_TMR0     ", MM, 0xEF600E08},
+       {"EMAC0_TMR1     ", MM, 0xEF600E0C},
+       {"EMAC0_TRTR     ", MM, 0xEF600E60},
+       {"EMAC1_MR1      ", MM, 0xEF600F04},
+       {"GPIO0_OR       ", MM, GPIO0_OR},
+       {"GPIO1_OR       ", MM, GPIO1_OR},
+       {"GPIO0_TCR      ", MM, GPIO0_TCR},
+       {"GPIO1_TCR      ", MM, GPIO1_TCR},
+       {"GPIO0_ODR      ", MM, GPIO0_ODR},
+       {"GPIO1_ODR      ", MM, GPIO1_ODR},
+       {"GPIO0_OSRL     ", MM, GPIO0_OSRL},
+       {"GPIO0_OSRH     ", MM, GPIO0_OSRH},
+       {"GPIO1_OSRL     ", MM, GPIO1_OSRL},
+       {"GPIO1_OSRH     ", MM, GPIO1_OSRH},
+       {"GPIO0_TSRL     ", MM, GPIO0_TSRL},
+       {"GPIO0_TSRH     ", MM, GPIO0_TSRH},
+       {"GPIO1_TSRL     ", MM, GPIO1_TSRL},
+       {"GPIO1_TSRH     ", MM, GPIO1_TSRH},
+       {"GPIO0_IR       ", MM, GPIO0_IR},
+       {"GPIO1_IR       ", MM, GPIO1_IR},
+       {"GPIO0_ISR1L    ", MM, GPIO0_ISR1L},
+       {"GPIO0_ISR1H    ", MM, GPIO0_ISR1H},
+       {"GPIO1_ISR1L    ", MM, GPIO1_ISR1L},
+       {"GPIO1_ISR1H    ", MM, GPIO1_ISR1H},
+       {"GPIO0_ISR2L    ", MM, GPIO0_ISR2L},
+       {"GPIO0_ISR2H    ", MM, GPIO0_ISR2H},
+       {"GPIO1_ISR2L    ", MM, GPIO1_ISR2L},
+       {"GPIO1_ISR2H    ", MM, GPIO1_ISR2H},
+       {"GPIO0_ISR3L    ", MM, GPIO0_ISR3L},
+       {"GPIO0_ISR3H    ", MM, GPIO0_ISR3H},
+       {"GPIO1_ISR3L    ", MM, GPIO1_ISR3L},
+       {"GPIO1_ISR3H    ", MM, GPIO1_ISR3H},
+       {"SDR0_USB2PHY0CR", IDCR6, SDR0_USB2PHY0CR},
+       {"SDR0_USB2H0CR  ", IDCR6, SDR0_USB2H0CR},
+       {"SDR0_USB2D0CR  ", IDCR6, SDR0_USB2D0CR},
+       {"PLB4A0_ACR     ", DCR, 0x081},
+       {"PLB4A1_ACR     ", DCR, 0x089},
+       {"PLB3A0_ACR     ", DCR, 0x077},
+       {"OPB2PLB40_BCTRL", DCR, 0x350},
+       {"P4P3BO0_CFG    ", DCR, 0x026}
+};
+
+/*
+ * CPU Register dump of PPC440EPx
+ * Output in order of struct ppc440epx_reg
+ */
+int do_reghcu5(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
+{
+       unsigned int i;
+       unsigned int n;
+       unsigned long value;
+       enum REGISTER_TYPE type;
+
+       printf
+           ("\nRegister Dump PPC440EPx for comparison with document 
A0001492\n\n");
+       n = sizeof(ppc440epx_reg) / sizeof(ppc440epx_reg[0]);
+       for (i = 0; i < n; i++) {
+               value = 0;
+               type = ppc440epx_reg[i].type;
+               switch (type) {
+               case DCR:       /* Directly Accessed DCR's */
+                       switch (ppc440epx_reg[i].address) {
+                               /* following list includes only registers 
included in struct */
+                       case 0x0b0:
+                               value = mfdcr(0x0b0);
+                               break;
+                       case 0x0f0:
+                               value = mfdcr(0x0f0);
+                               break;
+                       case 0x0180:
+                               value = mfdcr(0x0180);
+                               break;
+                       case 0x081:
+                               value = mfdcr(0x081);
+                               break;
+                       case 0x089:
+                               value = mfdcr(0x089);
+                               break;
+                       case 0x077:
+                               value = mfdcr(0x077);
+                               break;
+                       case 0x350:
+                               value = mfdcr(0x350);
+                               break;
+                       case 0x026:
+                               value = mfdcr(0x026);
+                               break;
+                       default:
+                               printf("\nERROR: unknown DCR address: 0x%lX\n",
+                                      ppc440epx_reg[i].address);
+                               break;
+                       }
+                       break;
+               case IDCR1:     /* Indirectly Accessed DCR to 
SDRAM0_CFGADDR/DDR0_CFGDATA */
+                       mtdcr(SDRAM0_CFGADDR, ppc440epx_reg[i].address);
+                       value = mfdcr(SDRAM0_CFGDATA);
+                       break;
+               case IDCR2:     /* Indirectly Accessed DCR to 
EBC0_CFGADDR/EBC0_CFGDATA */
+                       mtdcr(EBC0_CFGADDR, ppc440epx_reg[i].address);
+                       value = mfdcr(EBC0_CFGDATA);
+                       break;
+               case IDCR5:     /* Indirectly Accessed DCR to 
CPR0_CFGADDR/CPR0_CFGDATA */
+                       mtdcr(CPR0_CFGADDR, ppc440epx_reg[i].address);
+                       value = mfdcr(CPR0_CFGDATA);
+                       break;
+               case IDCR6:     /* Indirectly Accessed DCR to 
SDR0_CFGADDR/SDR0_CFGDATA */
+                       mtdcr(SDR0_CFGADDR, ppc440epx_reg[i].address);
+                       value = mfdcr(SDR0_CFGDATA);
+                       break;
+               case MM:        /* Directly Accessed MMIO Register */
+                       value =
+                           *(volatile unsigned long
+                             *)(ppc440epx_reg[i].address);
+                       break;
+               default:
+                       printf
+                           ("\nERROR: struct entry %d: unknown register 
type\n",
+                            i);
+                       break;
+               }
+               printf("0x%08lx %16s: 0x%08lx\n", ppc440epx_reg[i].address,
+                      ppc440epx_reg[i].name, value);
+       }
+       return 0;
+}
+
+/* define do_reghcu5 as u-boot command */
+U_BOOT_CMD(reghcu5, 2, 1, do_reghcu5,
+          "reghcu5 - print register information for HCU5\n",);
-- 
1.6.3.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to