ecosboard: delete bit-rotted eCos code
[fw/openocd] / src / jtag / zy1000 / jtag_minidriver.h
index 5fafd9ec004831685c7057af1401d71fe0df4092..ac6da53632445745590855dc57c4d197bfb04423 100644 (file)
-/***************************************************************************\r
- *   Copyright (C) 2007-2008 by Øyvind Harboe                              *\r
- *                                                                         *\r
- *   This program is free software; you can redistribute it and/or modify  *\r
- *   it under the terms of the GNU General Public License as published by  *\r
- *   the Free Software Foundation; either version 2 of the License, or     *\r
- *   (at your option) any later version.                                   *\r
- *                                                                         *\r
- *   This program is distributed in the hope that it will be useful,       *\r
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
- *   GNU General Public License for more details.                          *\r
- *                                                                         *\r
- *   You should have received a copy of the GNU General Public License     *\r
- *   along with this program; if not, write to the                         *\r
- *   Free Software Foundation, Inc.,                                       *\r
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
- ***************************************************************************/\r
-\r
-#include <cyg/hal/hal_io.h>             // low level i/o\r
-\r
-//#define VERBOSE(a) a\r
-#define VERBOSE(a)\r
-\r
-/* used to test manual mode */\r
-#define TEST_MANUAL() 0\r
-\r
-#if 0\r
-int  diag_printf( const char *fmt, ... );\r
-#define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b); diag_printf("poke 0x%08x,0x%08x\n", a, b)\r
-#define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b); diag_printf("peek 0x%08x=0x%08x\n", a, b)\r
-#else\r
-#define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b)\r
-#define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b)\r
-#endif\r
-\r
-// FIFO empty?\r
-static __inline__ void waitIdle(void)\r
-{\r
-       cyg_uint32 empty;\r
-       do\r
-       {\r
-               ZY1000_PEEK(ZY1000_JTAG_BASE+0x10, empty);\r
-       } while ((empty & 0x100)==0);\r
-}\r
-\r
-static __inline__ void waitQueue(void)\r
-{\r
-//     waitIdle();\r
-}\r
-\r
-static void sampleShiftRegister(void)\r
-{\r
-#if 0\r
-       cyg_uint32 dummy;\r
-       waitIdle();\r
-       ZY1000_PEEK(ZY1000_JTAG_BASE+0xc, dummy);\r
-#endif\r
-}\r
-\r
-/* -O3 will inline this for us */\r
-static void setCurrentState(enum tap_state state)\r
-{\r
-       cyg_uint32 a;\r
-       a=state;\r
-       int repeat=0;\r
-       if (state==TAP_RESET)\r
-       {\r
-               // The FPGA nor we know the current state of the CPU TAP\r
-               // controller. This will move it to TAP for sure.\r
-               //\r
-               // 5 should be enough here, 7 is what OpenOCD uses\r
-               repeat=7;\r
-       }\r
-       waitQueue();\r
-       sampleShiftRegister();\r
-       ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (repeat<<8)|(a<<4)|a);\r
-\r
-}\r
-\r
-/*\r
- * Enter state and cause repeat transitions *out* of that state. So if the endState!=state, then\r
- * the transition from state to endState counts as a transition out of state.\r
- */\r
-static __inline__ void shiftValueInner(const enum tap_state state, const enum tap_state endState, int repeat, cyg_uint32 value)\r
-{\r
-       cyg_uint32 a,b;\r
-       a=state;\r
-       b=endState;\r
-       waitQueue();\r
-       sampleShiftRegister();\r
-       ZY1000_POKE(ZY1000_JTAG_BASE+0xc, value);\r
-#if 1\r
-#if TEST_MANUAL()\r
-       if ((state==TAP_DRSHIFT)&&(endState!=TAP_DRSHIFT))\r
-       {\r
-               int i;\r
-               setCurrentState(state);\r
-               for (i=0; i<repeat; i++)\r
-               {\r
-                       int tms;\r
-                       tms=0;\r
-                       if ((i==repeat-1)&&(state!=endState))\r
-                       {\r
-                               tms=1;\r
-                       }\r
-                       /* shift out value */\r
-                       waitIdle();\r
-                       ZY1000_POKE(ZY1000_JTAG_BASE+0x28, (((value>>i)&1)<<1)|tms);\r
-               }\r
-               waitIdle();\r
-               ZY1000_POKE(ZY1000_JTAG_BASE+0x28, 0);\r
-               waitIdle();\r
-               //ZY1000_POKE(ZY1000_JTAG_BASE+0x20, TAP_DRSHIFT); // set this state and things break => expected\r
-               ZY1000_POKE(ZY1000_JTAG_BASE+0x20, TAP_DRPAUSE); // set this and things will work => expected. Not setting this is not sufficient to make things break.\r
-               setCurrentState(endState);\r
-       } else\r
-       {\r
-               ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (repeat<<8)|(a<<4)|b);\r
-       }\r
-#else\r
-       /* fast version */\r
-       ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (repeat<<8)|(a<<4)|b);\r
-#endif\r
-#else\r
-       /* maximum debug version */\r
-       if ((repeat>0)&&((state==TAP_DRSHIFT)||(state==TAP_SI)))\r
-       {\r
-               int i;\r
-               /* sample shift register for every bit. */\r
-               for (i=0; i<repeat-1; i++)\r
-               {\r
-                       sampleShiftRegister();\r
-                       ZY1000_POKE(ZY1000_JTAG_BASE+0xc, value>>i);\r
-                       ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (1<<8)|(a<<4)|a);\r
-               }\r
-               sampleShiftRegister();\r
-               ZY1000_POKE(ZY1000_JTAG_BASE+0xc, value>>(repeat-1));\r
-               ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (1<<8)|(a<<4)|b);\r
-       } else\r
-       {\r
-               sampleShiftRegister();\r
-               ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (repeat<<8)|(a<<4)|b);\r
-       }\r
-       sampleShiftRegister();\r
-#endif\r
-}\r
-\r
-\r
-\r
-static __inline__ void interface_jtag_add_dr_out_core(jtag_tap_t *target_tap,\r
-               int num_fields,\r
-               const int *num_bits,\r
-               const u32 *value,\r
-               enum tap_state end_state)\r
-{\r
-       enum tap_state pause_state = TAP_DRSHIFT;\r
-\r
-       jtag_tap_t *tap, *nextTap;\r
-       for(tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap=nextTap)\r
-       {\r
-               nextTap=jtag_tap_next_enabled(tap);\r
-               if (nextTap==NULL)\r
-               {\r
-                       pause_state = end_state;\r
-               }\r
-               if (tap == target_tap)\r
-               {\r
-                       int j;\r
-                       for (j=0; j<(num_fields-1); j++)\r
-                       {\r
-                               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[j], value[j]);\r
-                       }\r
-                       shiftValueInner(TAP_DRSHIFT, pause_state, num_bits[j], value[j]);\r
-               } else\r
-               {\r
-                       /* program the scan field to 1 bit length, and ignore it's value */\r
-                       shiftValueInner(TAP_DRSHIFT, pause_state, 1, 0);\r
-               }\r
-       }\r
-}\r
-\r
-static __inline__ void interface_jtag_add_dr_out(jtag_tap_t *target_tap,\r
-               int num_fields,\r
-               const int *num_bits,\r
-               const u32 *value,\r
-               enum tap_state end_state)\r
-{\r
-\r
-       int singletap=(jtag_tap_next_enabled(jtag_tap_next_enabled(NULL))==NULL);\r
-       if ((singletap)&&(num_fields==3))\r
-       {\r
-               /* used by embeddedice_write_reg_inner() */\r
-               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[0], value[0]);\r
-               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[1], value[1]);\r
-               shiftValueInner(TAP_DRSHIFT, end_state, num_bits[2], value[2]);\r
-       } else if ((singletap)&&(num_fields==2))\r
-       {\r
-               /* used by arm7 code */\r
-               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[0], value[0]);\r
-               shiftValueInner(TAP_DRSHIFT, end_state, num_bits[1], value[1]);\r
-       } else\r
-       {\r
-               interface_jtag_add_dr_out_core(target_tap, num_fields, num_bits, value, end_state);\r
-       }\r
-}\r
-\r
-#define interface_jtag_add_callback(callback, in) callback(in)\r
-\r
-#define interface_jtag_add_callback4(callback, in, data1, data2, data3) jtag_set_error(callback(in, data1, data2, data3))\r
+/***************************************************************************
+ *   Copyright (C) 2007-2010 by Øyvind Harboe                              *
+ *                                                                         *
+ *   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.             *
+ ***************************************************************************/
+
+/* used to test manual mode */
+#define TEST_MANUAL() 0
+#define VERBOSE(a)
+
+#if BUILD_ZY1000_MASTER
+
+#define ZY1000_PEEK(a, b) do {b = *((volatile uint32_t *)(a)); } while (0)
+#define ZY1000_POKE(a, b) do {*((volatile uint32_t *)(a)) = b; } while (0)
+extern volatile void *zy1000_jtag_master;
+#define ZY1000_JTAG_BASE ((unsigned long)zy1000_jtag_master)
+
+#else
+
+/* redirect this to TCP/IP */
+#define ZY1000_JTAG_BASE 0
+extern void zy1000_tcpout(uint32_t address, uint32_t data);
+extern uint32_t zy1000_tcpin(uint32_t address);
+#define ZY1000_PEEK(a, b) b = zy1000_tcpin(a)
+#define ZY1000_POKE(a, b) zy1000_tcpout(a, b)
+
+#endif
+
+#if BUILD_ZY1000_MASTER
+/* FIFO empty? */
+static inline void waitIdle(void)
+{
+       uint32_t empty;
+       do {
+               ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, empty);
+       } while ((empty & 0x100) == 0);
+}
+
+static inline void zy1000_flush_readqueue(void)
+{
+       /* Not used w/hardware fifo */
+}
+static inline void zy1000_flush_callbackqueue(void)
+{
+       /* Not used w/hardware fifo */
+}
+#else
+extern void waitIdle(void);
+void zy1000_flush_readqueue(void);
+void zy1000_flush_callbackqueue(void);
+void zy1000_jtag_add_callback4(jtag_callback_t callback,
+               jtag_callback_data_t data0,
+               jtag_callback_data_t data1,
+               jtag_callback_data_t data2,
+               jtag_callback_data_t data3);
+void zy1000_jtag_add_callback(jtag_callback1_t callback, jtag_callback_data_t data0);
+#endif
+
+static inline void waitQueue(void)
+{
+/*     waitIdle(); */
+}
+
+static inline void sampleShiftRegister(void)
+{
+#if 0
+       uint32_t dummy;
+       waitIdle();
+       ZY1000_PEEK(ZY1000_JTAG_BASE + 0xc, dummy);
+#endif
+}
+
+static inline void setCurrentState(enum tap_state state)
+{
+       uint32_t a;
+       a = state;
+       int repeat = 0;
+       if (state == TAP_RESET) {
+               /* The FPGA nor we know the current state of the CPU TAP */
+               /* controller. This will move it to TAP for sure. */
+               /*  */
+               /* 5 should be enough here, 7 is what OpenOCD uses */
+               repeat = 7;
+       }
+       waitQueue();
+       sampleShiftRegister();
+       ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | a);
+
+}
+
+/*
+ * Enter state and cause repeat transitions *out* of that state. So if the endState != state, then
+ * the transition from state to endState counts as a transition out of state.
+ */
+static inline void shiftValueInner(const enum tap_state state,
+       const enum tap_state endState,
+       int repeat,
+       uint32_t value)
+{
+       uint32_t a, b;
+       a = state;
+       b = endState;
+       waitQueue();
+       sampleShiftRegister();
+       ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value);
+#if 1
+#if TEST_MANUAL()
+       if ((state == TAP_DRSHIFT) && (endState != TAP_DRSHIFT)) {
+               int i;
+               setCurrentState(state);
+               for (i = 0; i < repeat; i++) {
+                       int tms;
+                       tms = 0;
+                       if ((i == repeat-1) && (state != endState))
+                               tms = 1;
+                                       /* shift out value */
+                       waitIdle();
+                       ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, (((value >> i)&1) << 1) | tms);
+               }
+               waitIdle();
+               ZY1000_POKE(ZY1000_JTAG_BASE + 0x28, 0);
+               waitIdle();
+               /* ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRSHIFT); // set this state and things
+                * break => expected */
+               ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_DRPAUSE);      /* set this and things will
+                                                                        * work => expected. Not
+                                                                        * setting this is not
+                                                                        * sufficient to make things
+                                                                        * break. */
+               setCurrentState(endState);
+       } else
+               ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b);
+
+#else
+       /* fast version */
+       ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b);
+#endif
+#else
+       /* maximum debug version */
+       if ((repeat > 0) && ((state == TAP_DRSHIFT) || (state == TAP_SI))) {
+               int i;
+               /* sample shift register for every bit. */
+               for (i = 0; i < repeat-1; i++) {
+                       sampleShiftRegister();
+                       ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value >> i);
+                       ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 8) | (a << 4) | a);
+               }
+               sampleShiftRegister();
+               ZY1000_POKE(ZY1000_JTAG_BASE + 0xc, value >> (repeat-1));
+               ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (1 << 8) | (a << 4) | b);
+       } else {
+               sampleShiftRegister();
+               ZY1000_POKE(ZY1000_JTAG_BASE + 0x8, (repeat << 8) | (a << 4) | b);
+       }
+       sampleShiftRegister();
+#endif
+}
+
+static inline void interface_jtag_add_dr_out_core(struct jtag_tap *target_tap,
+       int num_fields,
+       const int *num_bits,
+       const uint32_t *value,
+       enum tap_state end_state)
+{
+       enum tap_state pause_state = TAP_DRSHIFT;
+
+       struct jtag_tap *tap, *nextTap;
+       for (tap = jtag_tap_next_enabled(NULL); tap != NULL; tap = nextTap) {
+               nextTap = jtag_tap_next_enabled(tap);
+               if (nextTap == NULL)
+                       pause_state = end_state;
+               if (tap == target_tap) {
+                       int j;
+                       for (j = 0; j < (num_fields-1); j++)
+                               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[j], value[j]);
+                       shiftValueInner(TAP_DRSHIFT, pause_state, num_bits[j], value[j]);
+               } else {
+                       /* program the scan field to 1 bit length, and ignore it's value */
+                       shiftValueInner(TAP_DRSHIFT, pause_state, 1, 0);
+               }
+       }
+}
+
+static inline void interface_jtag_add_dr_out(struct jtag_tap *target_tap,
+       int num_fields,
+       const int *num_bits,
+       const uint32_t *value,
+       enum tap_state end_state)
+{
+
+       int singletap = (jtag_tap_next_enabled(jtag_tap_next_enabled(NULL)) == NULL);
+       if ((singletap) && (num_fields == 3)) {
+               /* used by embeddedice_write_reg_inner() */
+               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[0], value[0]);
+               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[1], value[1]);
+               shiftValueInner(TAP_DRSHIFT, end_state, num_bits[2], value[2]);
+       } else if ((singletap) && (num_fields == 2)) {
+               /* used by arm7 code */
+               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, num_bits[0], value[0]);
+               shiftValueInner(TAP_DRSHIFT, end_state, num_bits[1], value[1]);
+       } else
+               interface_jtag_add_dr_out_core(target_tap, num_fields, num_bits, value, end_state);
+}
+
+#if BUILD_ZY1000_MASTER
+#define interface_jtag_add_callback(callback, in) callback(in)
+#define interface_jtag_add_callback4(callback, in, data1, data2, \
+               data3) jtag_set_error(callback(in, data1, data2, data3))
+#else
+#define interface_jtag_add_callback(callback, in) zy1000_jtag_add_callback(callback, in)
+#define interface_jtag_add_callback4(callback, in, data1, data2, data3) zy1000_jtag_add_callback4( \
+       callback, \
+       in, \
+       data1, \
+       data2, \
+       data3)
+#endif