This set of patches will build UrJTAG and gdbproxy with libftdi-1.0 and libusb-1.0. In tree libftdi-1.0 will always be used. The asynchronous mode is enabled in libftdi-1.0. Testing on my ThinkPad T61 with gnICE+ USB JTAG cable shows improvement of memory read performance of gdbproxy from 10.3KB/s to 110.2KB/s.

The bad side is libusb-1.0 windows port is still under development. I already tested it. The status seems OK on Windows. Hope it will be more matured when we are going to roll out the next Blackfin toolchain several month later.

Committed without testing. Let me see what I will be told next morning.


Jie
Index: BuildToolChain
===================================================================
--- BuildToolChain	(revision 3893)
+++ BuildToolChain	(working copy)
@@ -847,7 +847,7 @@
 fi
 
 printf "Path to libftdi             "
-DIR_LIBFTDI_SOURCE=$DIR_SOURCE/libftdi
+DIR_LIBFTDI_SOURCE=$DIR_SOURCE/libftdi-1.0
 echo $DIR_LIBFTDI_SOURCE
 if [ ! -d $DIR_LIBFTDI_SOURCE ] ; then
     echo "Can't find libftdi source at $DIR_LIBFTDI_SOURCE"
@@ -2227,8 +2227,8 @@
     if ! resume_check jtag-tools ; then
 
     ### libftdi
-    if ( check_lib usb && ! check_lib ftdi ) 2>/dev/null ; then
-    DIR_LIBFTDI_BUILD=$DIR_BUILD/libftdi
+    if ( check_lib usb-1.0 ) 2>/dev/null ; then
+    DIR_LIBFTDI_BUILD=$DIR_BUILD/libftdi-1.0
 
     change_dir $DIR_LIBFTDI_SOURCE
 
@@ -2239,7 +2239,7 @@
 
     echo_date "Configuring libftdi"
     run_cmd $DIR_LIBFTDI_SOURCE/configure --prefix="$DIR_LIBFTDI_BUILD/destdir" \
-        $BUILD_TARGET $HOST_TARGET --disable-shared --enable-static --disable-libftdipp --disable-python-binding
+        $BUILD_TARGET $HOST_TARGET --disable-shared --enable-static --disable-libftdipp --disable-python-binding --with-async-mode
 
     echo_date "Building libftdi"
     run_cmd $MAKE SUBDIRS=src
@@ -2266,7 +2266,7 @@
 
     echo_date "Configuring urjtag"
     run_cmd $DIR_URJTAG_SOURCE/configure --prefix=/ $BUILD_TARGET $HOST_TARGET \
-        --disable-shared --enable-static --enable-relocatable
+        --disable-shared --enable-static --enable-relocatable --with-libusb=1.0
 
     echo_date "Building urjtag"
     run_cmd $MAKE
	* Makefile.in: Regenerate.
	* config.h.in: Regenerate.
	* configure: Regenerate.
	* configure.in: Don't check libusb.
	* gnulib/lib/Makefile.in: Regenerate.


Index: configure.in
===================================================================
--- configure.in	(revision 3866)
+++ configure.in	(working copy)
@@ -113,14 +113,14 @@
     ], [-lcurses])
 ])
 PKG_CHECK_MODULES(LIBFTDI, libftdi, [LIBS="$LIBS $LIBFTDI_LIBS" CFLAGS="$CFLAGS $LIBFTDI_CFLAGS"], [:;])
-PKG_CHECK_MODULES(LIBUSB, libusb, [LIBS="$LIBS $LIBUSB_LIBS" CFLAGS="$CFLAGS $LIBUSB_CFLAGS"], [
-  AC_PATH_TOOL(LIBUSB_CONFIG, libusb-config, no)
-  AS_IF([test "x$LIBUSB_CONFIG" != "xno"], [
-    LIBS="$LIBS `$LIBUSB_CONFIG --libs`"
-  ],[
-    AC_CHECK_LIB(usb, usb_get_busses)
-  ])
-])
+dnl PKG_CHECK_MODULES(LIBUSB, libusb, [LIBS="$LIBS $LIBUSB_LIBS" CFLAGS="$CFLAGS $LIBUSB_CFLAGS"], [
+dnl   AC_PATH_TOOL(LIBUSB_CONFIG, libusb-config, no)
+dnl   AS_IF([test "x$LIBUSB_CONFIG" != "xno"], [
+dnl     LIBS="$LIBS `$LIBUSB_CONFIG --libs`"
+dnl   ],[
+dnl     AC_CHECK_LIB(usb, usb_get_busses)
+dnl   ])
+dnl ])
 AC_CHECK_LIB(intl, libintl_gettext)
 
 

  * src/tap/usbconn/libftdx.h (URJ_USBCONN_FTDI_MAXRECV): Define
    to be (63 * 64) if HAVE_LIBFTDI_ASYNC_MODE defined.
  * src/tap/usbconn/libftdi.c (usbconn_ftdi_flush): Use async
    mode libftdi if HAVE_LIBFTDI_ASYNC_MODE defined.
  * configure.ac: Check libusb-1.0 and libftdi async mode.

Index: src/tap/usbconn/libftdx.h
===================================================================
--- src/tap/usbconn/libftdx.h	(revision 1768)
+++ src/tap/usbconn/libftdx.h	(working copy)
@@ -30,7 +30,11 @@
    Larger values might speed up comm, but there's an upper limit
    when too many bytes are sent and the underlying libftdi or libftd2xx
    don't fetch the returned data in time -> deadlock */
+#ifdef HAVE_LIBFTDI_ASYNC_MODE
+#define URJ_USBCONN_FTDI_MAXRECV   (63 * 64)
+#else
 #define URJ_USBCONN_FTDI_MAXRECV   ( 4 * 64)
+#endif
 #define URJ_USBCONN_FTD2XX_MAXRECV (63 * 64)
 #define URJ_USBCONN_FTDX_MAXRECV   (URJ_USBCONN_FTD2XX_MAXRECV < URJ_USBCONN_FTDI_MAXRECV ? URJ_USBCONN_FTD2XX_MAXRECV : URJ_USBCONN_FTDI_MAXRECV)
 
Index: src/tap/usbconn/libftdi.c
===================================================================
--- src/tap/usbconn/libftdi.c	(revision 1768)
+++ src/tap/usbconn/libftdi.c	(working copy)
@@ -68,6 +68,9 @@ usbconn_ftdi_flush (ftdi_param_t *p)
 {
     int xferred;
     int recvd = 0;
+#ifdef HAVE_LIBFTDI_ASYNC_MODE
+    struct ftdi_transfer_control *tc;
+#endif
 
     if (!p->fc)
         return -1;
@@ -75,6 +78,7 @@ usbconn_ftdi_flush (ftdi_param_t *p)
     if (p->send_buffered == 0)
         return 0;
 
+#ifndef HAVE_LIBFTDI_ASYNC_MODE
     if ((xferred = ftdi_write_data (p->fc, p->send_buf, p->send_buffered)) < 0)
         urj_error_set (URJ_ERROR_FTD, _("ftdi_write_data() failed: %s"),
                        ftdi_get_error_string (p->fc));
@@ -87,6 +91,7 @@ usbconn_ftdi_flush (ftdi_param_t *p)
     }
 
     p->send_buffered = 0;
+#endif
 
     /* now read all scheduled receive bytes */
     if (p->to_recv)
@@ -106,6 +111,30 @@ usbconn_ftdi_flush (ftdi_param_t *p)
             return -1;
         }
 
+#ifdef HAVE_LIBFTDI_ASYNC_MODE
+        if ((tc = ftdi_read_data_submit (p->fc,
+                                         &(p->recv_buf[p->recv_write_idx]),
+                                         p->to_recv)) == NULL)
+            urj_error_set (URJ_ERROR_FTD,
+                           _("Error from ftdi_read_data_submit(): %s"),
+                           ftdi_get_error_string (p->fc));
+    }
+
+    if ((xferred = ftdi_write_data (p->fc, p->send_buf, p->send_buffered)) < 0)
+        perror (ftdi_get_error_string (p->fc));
+
+    if (xferred < p->send_buffered)
+    {
+        urj_error_set (URJ_ERROR_FTD, _("Written fewer bytes than requested."));
+        return -1;
+    }
+
+    p->send_buffered = 0;
+
+    if (p->to_recv)
+    {
+        recvd = ftdi_transfer_data_done (tc);
+#else
         while (recvd == 0)
             if ((recvd = ftdi_read_data (p->fc,
                                          &(p->recv_buf[p->recv_write_idx]),
@@ -113,6 +142,7 @@ usbconn_ftdi_flush (ftdi_param_t *p)
                 urj_error_set (URJ_ERROR_FTD,
                                _("Error from ftdi_read_data(): %s"),
                                ftdi_get_error_string (p->fc));
+#endif
 
         if (recvd < p->to_recv)
             urj_log (URJ_LOG_LEVEL_NORMAL,
Index: configure.ac
===================================================================
--- configure.ac	(revision 1768)
+++ configure.ac	(working copy)
@@ -150,7 +150,7 @@ AC_ARG_WITH([libusb],
     [with_libusb=check])
 
 HAVELIBUSB=no
-AS_IF([test "x$with_libusb" != xno], [
+AS_IF([test "x$with_libusb" != xno -a "x$with_libusb" != x1.0], [
   save_LIBS=$LIBS
   save_CPPFLAGS=$CPPFLAGS
   PKG_CHECK_MODULES(LIBUSB, libusb, [:;], [dnl
@@ -161,7 +161,7 @@ AS_IF([test "x$with_libusb" != xno], [
         LIBUSB_CFLAGS="-I$with_libusb/include"
         ;;
       *)
-        LIBUSB_LIBS="-Lwith_libusb -lusb"
+        LIBUSB_LIBS="-L$with_libusb -lusb"
         LIBUSB_CFLAGS="-I$with_libusb"
         ;;
       esac
@@ -187,6 +187,31 @@ AS_IF([test "x$with_libusb" != xno], [
 AM_CONDITIONAL(HAVE_LIBUSB, [test "x$HAVELIBUSB" = "xyes"])
 
 
+dnl check for libusb-1.0
+
+HAVELIBUSB1=no
+AS_IF([test "x$with_libusb" != xno -a "x$with_libusb" != x0.1 -a "x$HAVELIBUSB" != "xyes"], [
+  save_LIBS=$LIBS
+  save_CPPFLAGS=$CPPFLAGS
+  PKG_CHECK_MODULES(LIBUSB1, libusb-1.0, have_libusb1=yes, have_libusb1=no)
+  AS_IF([test "$have_libusb1" = "yes"],[
+    LIBUSB_CFLAGS="$CFLAGS $LIBUSB1_CFLAGS"
+    LIBUSB_LIBS="$USB_LIBS $LIBUSB1_LIBS"
+  ],)
+  LIBS="$LIBS $LIBUSB1_LIBS"
+  CPPFLAGS="$CPPFLAGS $LIBUSB1_CFLAGS"
+  AC_CHECK_FUNC([libusb_get_device_list], [
+    AC_DEFINE(HAVE_LIBUSB1, 1, [Define if you have libusb-1.0])
+    HAVELIBUSB1=yes
+  ],[
+    AC_MSG_WARN([*** libusb-1.0 not detected. No support for async mode for FTDI cables.])
+    LIBS=$save_LIBS
+    CPPFLAGS=$save_CPPFLAGS
+  ])
+],)
+AM_CONDITIONAL(HAVE_LIBUSB1, [test "x$HAVELIBUSB1" = "xyes"])
+
+
 dnl Use FTDI library?
 
 AC_ARG_WITH([libftdi],
@@ -220,8 +245,20 @@ AS_IF([test "x$with_libftdi" != xno], [
     LIBS=$save_LIBS
     CPPFLAGS=$save_CPPFLAGS
   ])
+  AC_CHECK_FUNC([ftdi_read_data_submit], [
+    AS_IF([test "x$HAVELIBUSB" = "xyes"], [
+      AC_MSG_ERROR([this libftdi cannot be used with libusb-0.1, libusb-1.0 is needed])
+    ],)
+    AC_DEFINE(HAVE_LIBFTDI_ASYNC_MODE, 1, [Define if libftdi support async mode])
+    HAVELIBFTDI_ASYNCMODE=yes
+  ], [
+    AS_IF([test "x$HAVELIBUSB1" = "xyes"], [
+      AC_MSG_ERROR([this libftdi cannot be used with libusb-1.0, libusb-0.1 is needed])
+    ],)
+  ])
 ],)
 AM_CONDITIONAL(HAVE_LIBFTDI, [test "x$HAVELIBFTDI" = "xyes"])
+AM_CONDITIONAL(HAVE_LIBFTDI_ASYNC_MODE, [test "x$HAVELIBFTDI_ASYNCMODE" = "xyes"])
 
 
 dnl Use FTDI ftd2xx library?
@@ -682,6 +719,20 @@ AC_OUTPUT
 dnl
 dnl Configuration summary
 dnl
+AS_IF([test "x$HAVELIBUSB" = "xyes"], [
+  FLAG_HAVELIBUSB=0.1
+], [
+  AS_IF([test "x$HAVELIBUSB1" = "xyes"], [
+    FLAG_HAVELIBUSB=1.0
+  ],[
+    FLAG_HAVELIBUSB=no
+  ])
+])
+AS_IF([test "x$HAVELIBFTDI_ASYNCMODE" = "xyes"], [
+  FLAG_HAVELIBFTDI_ASYNCMODE="(have async mode)"
+],[
+  FLAG_HAVELIBFTDI_ASYNCMODE="(no async mode)"
+])
 AC_DEFUN([MAKE_YESNO_VAR],[dnl
   AS_IF([test ${$1:-$2} != $2], [dnl
      FLAG_$1=yes
@@ -690,7 +741,6 @@ AC_DEFUN([MAKE_YESNO_VAR],[dnl
   ])
 ])
 MAKE_YESNO_VAR([HAVELIBFTDI], [no])
-MAKE_YESNO_VAR([HAVELIBUSB], [no])
 MAKE_YESNO_VAR([HAVELIBFTD2XX], [no])
 MAKE_YESNO_VAR([HAVE_INPOUTXX], [no])
 MAKE_YESNO_VAR([svf], [false])
@@ -700,7 +750,7 @@ AC_MSG_NOTICE([
 jtag is now configured for
 
   Detected libusb      : $FLAG_HAVELIBUSB
-  Detected libftdi     : $FLAG_HAVELIBFTDI
+  Detected libftdi     : $FLAG_HAVELIBFTDI $FLAG_HAVELIBFTDI_ASYNCMODE
   Detected libftd2xx   : $FLAG_HAVELIBFTD2XX
   Detected inpout32    : $FLAG_HAVE_INPOUTXX
   Build SVF player     : $FLAG_svf
_______________________________________________
Toolchain-devel mailing list
Toolchain-devel@blackfin.uclinux.org
https://blackfin.uclinux.org/mailman/listinfo/toolchain-devel

Reply via email to