Set svn:eol-style native on ZY1000 minidriver header file.
authorzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 17 Jun 2009 01:59:59 +0000 (01:59 +0000)
committerzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 17 Jun 2009 01:59:59 +0000 (01:59 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@2261 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/zy1000/jtag_minidriver.h

index 5fafd9ec004831685c7057af1401d71fe0df4092..357dbf3577d6d44e8a6e02d3a96e260907883cb5 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-2008 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.             *
+ ***************************************************************************/
+
+#include <cyg/hal/hal_io.h>             // low level i/o
+
+//#define VERBOSE(a) a
+#define VERBOSE(a)
+
+/* used to test manual mode */
+#define TEST_MANUAL() 0
+
+#if 0
+int  diag_printf( const char *fmt, ... );
+#define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b); diag_printf("poke 0x%08x,0x%08x\n", a, b)
+#define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b); diag_printf("peek 0x%08x=0x%08x\n", a, b)
+#else
+#define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b)
+#define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b)
+#endif
+
+// FIFO empty?
+static __inline__ void waitIdle(void)
+{
+       cyg_uint32 empty;
+       do
+       {
+               ZY1000_PEEK(ZY1000_JTAG_BASE+0x10, empty);
+       } while ((empty & 0x100)==0);
+}
+
+static __inline__ void waitQueue(void)
+{
+//     waitIdle();
+}
+
+static void sampleShiftRegister(void)
+{
+#if 0
+       cyg_uint32 dummy;
+       waitIdle();
+       ZY1000_PEEK(ZY1000_JTAG_BASE+0xc, dummy);
+#endif
+}
+
+/* -O3 will inline this for us */
+static void setCurrentState(enum tap_state state)
+{
+       cyg_uint32 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, cyg_uint32 value)
+{
+       cyg_uint32 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(jtag_tap_t *target_tap,
+               int num_fields,
+               const int *num_bits,
+               const u32 *value,
+               enum tap_state end_state)
+{
+       enum tap_state pause_state = TAP_DRSHIFT;
+
+       jtag_tap_t *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(jtag_tap_t *target_tap,
+               int num_fields,
+               const int *num_bits,
+               const u32 *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);
+       }
+}
+
+#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))