From: "Øyvind Harboe" <[EMAIL PROTECTED]>
> I was not able to apply this patch. Please create patch
> against svn trunk and post again. Your first patch
> applied fine, so do it in the same manner.
> 
> Also add yourself to the copyright at the top of ep93xx.c

Sorry for late. I have been offlined few days.

here is a patch.
 

From: Rick Altherr <[EMAIL PROTECTED]>
> > +static void output_data(void)
> > +{
> > +   int i;
> > +   *gpio_data_register = output_value ^ INVERT_BITS;
> > +   for ( i = 0; i < 10; i++ )
> > +       ;
> > }
> >
> 
> A for loop like that can't reliably be used as a delay loop.  

 Thank you for your advice.
 I fix it.

--------
Hiroshi Ito
Media Lab. Inc.,
URL http://www.mlb.co.jp ( Sorry, Japanese only. )
TEL +81-3-5294-7255  FAX +81-3-5294-7256
Index: src/jtag/ep93xx.c
===================================================================
--- src/jtag/ep93xx.c   (revision 1214)
+++ src/jtag/ep93xx.c   (working copy)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   [EMAIL PROTECTED]                                                   *
  *                                                                         *
+ *   Copyright (C) 2008 by Hiroshi Ito                                     *
+ *   [EMAIL PROTECTED]                                                         
*
+ *                                                                         *
  *   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     *
@@ -25,6 +28,11 @@
 #include "jtag.h"
 #include "bitbang.h"
 
+/* Cable definition is *only* selectable at compile time */
+#if 1
+/* Rath's cable */
+#define INITIALIZE_G_ON_K      1
+
 #define TDO_BIT                1
 #define TDI_BIT                2
 #define TCK_BIT                4
@@ -32,12 +40,30 @@
 #define TRST_BIT       16
 #define SRST_BIT       32
 #define VCC_BIT                64
+#define RTCK_BIT       0
+#define VTREF_BIT      0
 
+#define INVERT_BITS    0
+#else
+/* ito's cable */
+#define INITIALIZE_PORTD_AS_FLOAT      1
+
+#define VCC_BIT                0
+#define TMS_BIT                1
+#define SRST_BIT       2
+#define TDI_BIT                4
+#define TDO_BIT                8
+#define TRST_BIT       16
+#define RTCK_BIT       32
+#define VTREF_BIT      64
+#define TCK_BIT                128
+#define INVERT_BITS    0/*(SRST_BIT|TRST_BIT)*/
+#endif
+
 /* system includes */
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include <time.h>
 #include <sys/mman.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -59,8 +85,6 @@
 int ep93xx_init(void);
 int ep93xx_quit(void);
 
-struct timespec ep93xx_zzzz;
-
 jtag_interface_t ep93xx_interface = 
 {
        .name = "ep93xx",
@@ -83,11 +107,40 @@
 
 int ep93xx_read(void)
 {
-       return !!(*gpio_data_register & TDO_BIT);
+       return !!((*gpio_data_register ^ INVERT_BITS ) & TDO_BIT);
 }
 
+static void output_data(void)
+{
+       *gpio_data_register = output_value ^ INVERT_BITS;
+}
+
+#if RTCK_BIT > 0
+static void ep93xx_wait_rtck(int tck)
+{
+       int timeout = 4096;
+       u8 bits = (*gpio_data_register ^ INVERT_BITS);
+       if ( tck ) tck = RTCK_BIT;
+#if VTREF_BIT > 0
+       if (((*gpio_data_register ^ INVERT_BITS ) & VTREF_BIT) ) {
+           /* target power is not up */
+           return;
+       }
+#endif
+       while (((*gpio_data_register ^ INVERT_BITS) & RTCK_BIT) != tck ) {
+           if ( --timeout <= 0 ) {
+               LOG_ERROR("ep93xx_wait_rtck timed out while waiting for end of 
scan(0x%04X).",
+                         *gpio_data_register );
+               break;
+           }
+       }
+}
+#endif
+
 void ep93xx_write(int tck, int tms, int tdi)
 {
+       int i = jtag_speed;
+
        if (tck)
                output_value |= TCK_BIT;
        else
@@ -103,8 +156,15 @@
        else
                output_value &= ~TDI_BIT;
 
-       *gpio_data_register = output_value;
-       nanosleep(&ep93xx_zzzz, NULL);
+       do {
+           output_data();
+       } while (i-- > 0)
+             ;
+
+#if RTCK_BIT > 0
+       if ( jtag_speed == 0 )
+           ep93xx_wait_rtck(tck);
+#endif
 }
 
 /* (1) assert or (0) deassert reset lines */
@@ -120,8 +180,7 @@
        else if (srst == 1)
                output_value &= ~SRST_BIT;
        
-       *gpio_data_register = output_value;
-       nanosleep(&ep93xx_zzzz, NULL);
+       output_data();
 }
 
 int ep93xx_speed(int speed)
@@ -136,6 +195,8 @@
        return ERROR_OK;
 }
 
+#ifdef INITIALIZE_G_ON_K
+/* set a keypad interface as a GPIO PORT C and PORT D. */
 static int set_gonk_mode(void)
 {
        void *syscon;
@@ -156,16 +217,16 @@
 
        return ERROR_OK;
 }
+#endif
 
 int ep93xx_init(void)
 {
+#ifdef INITIALIZE_G_ON_K
        int ret;
+#endif
 
        bitbang_interface = &ep93xx_bitbang;    
 
-       ep93xx_zzzz.tv_sec = 0;
-       ep93xx_zzzz.tv_nsec = 10000000;
-
        dev_mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
        if (dev_mem_fd < 0) {
                perror("open");
@@ -180,12 +241,14 @@
                return ERROR_JTAG_INIT_FAILED;
        }
 
+#ifdef INITIALIZE_G_ON_K
        ret = set_gonk_mode();
        if (ret != ERROR_OK) {
                munmap(gpio_controller, 4096);
                close(dev_mem_fd);
                return ret;
        }
+#endif
 
 #if 0
        /* Use GPIO port A.  */
@@ -206,20 +269,23 @@
        gpio_data_direction_register = gpio_controller + 0x1c;
 #endif
 
+#ifdef INITIALIZE_PORTD_AS_FLOAT
+       /* unused pins are set to input(port D).  */
+       gpio_data_direction_register = gpio_controller + 0x1c;
+       *gpio_data_direction_register = 0;
+#endif
+
        /* Use GPIO port C.  */
        gpio_data_register = gpio_controller + 0x08;
        gpio_data_direction_register = gpio_controller + 0x18;
 
-       LOG_INFO("gpio_data_register      = %p\n", gpio_data_register);
-       LOG_INFO("gpio_data_direction_reg = %p\n", 
gpio_data_direction_register); 
        /*
         * Configure bit 0 (TDO) as an input, and bits 1-5 (TDI, TCK
         * TMS, TRST, SRST) as outputs.  Drive TDI and TCK low, and
         * TMS/TRST/SRST high.
         */
        output_value = TMS_BIT | TRST_BIT | SRST_BIT | VCC_BIT;
-       *gpio_data_register = output_value;
-       nanosleep(&ep93xx_zzzz, NULL);
+       output_data();
 
        /*
         * Configure the direction register.  1 = output, 0 = input.
@@ -227,12 +293,17 @@
        *gpio_data_direction_register =
                TDI_BIT | TCK_BIT | TMS_BIT | TRST_BIT | SRST_BIT | VCC_BIT;
 
-       nanosleep(&ep93xx_zzzz, NULL);
+#if VTREF_BIT > 0
+       if (((*gpio_data_register ^ INVERT_BITS ) & VTREF_BIT) ) {
+           LOG_INFO("target power is off (%X)", *gpio_data_register);
+       }
+#endif
        return ERROR_OK;
 }
 
 int ep93xx_quit(void)
 {
+       *gpio_data_direction_register = 0;
 
        return ERROR_OK;
 }
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to