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