Hello,
below is a possible solution for bug #573
(http://sigrok.org/bugzilla/show_bug.cgi?id=573). With this patch, sigrok works
stable with 24M sample rate and FX2-based analyzers. I have listed other
options in comments (http://sigrok.org/bugzilla/show_bug.cgi?id=573#c6) — would
be glad to hear opinions on the subjects, since these options are all
questionable.
Regards,
Vlad Ivanov
From 0a694ce244bb7af253ff574fb79590387743bbdf Mon Sep 17 00:00:00 2001
From: Vlad Ivanov <vlad-...@ya.ru>
Date: Mon, 7 Sep 2015 21:53:23 +0300
Subject: [PATCH] Set RAW_IO WinUsb pipe flag
---
configure.ac | 3 ++
src/hardware/fx2lafw/api.c | 112 ++++++++++++++++++++++++++++++++++++++++
src/hardware/fx2lafw/protocol.h | 6 +++
3 files changed, 121 insertions(+)
diff --git a/configure.ac b/configure.ac
index aa5cdad..ea2150b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -125,6 +125,9 @@ AC_CHECK_HEADERS([sys/timerfd.h], [SR_APPEND([sr_deps_avail], [sys_timerfd_h])])
# We need to link against the Winsock2 library for SCPI over TCP.
AS_CASE([$host], [*-mingw*], [SR_EXTRA_LIBS='-lws2_32'], [SR_EXTRA_LIBS=])
+# Link against winusb for windows-specific fx2lafw features
+AS_CASE([$host], [*-mingw*], [SR_EXTRA_LIBS='-lwinusb'], [SR_EXTRA_LIBS=])
+
# libm (the standard math library) is always needed.
SR_SEARCH_LIBS([SR_EXTRA_LIBS], [pow], [m])
diff --git a/src/hardware/fx2lafw/api.c b/src/hardware/fx2lafw/api.c
index 5cb3633..7da517c 100644
--- a/src/hardware/fx2lafw/api.c
+++ b/src/hardware/fx2lafw/api.c
@@ -171,6 +171,75 @@ static const uint64_t dslogic_samplerates[] = {
SR_PRIV struct sr_dev_driver fx2lafw_driver_info;
+#ifdef _WIN32
+struct windows_usb_interface {
+ char * path;
+ void * apib;
+ int sub_api;
+ int8_t nb_endpoints;
+ uint8_t * endpoint;
+ BOOL restricted_functionality;
+};
+
+struct windows_device_priv {
+ uint8_t depth;
+ uint8_t port;
+ uint8_t active_config;
+ struct libusb_device *parent_dev;
+ void *apib;
+ char *path;
+ int sub_api;
+ struct windows_usb_interface usb_interface;
+};
+
+struct libusb_device {
+ HANDLE lock;
+ int refcnt;
+
+ void * ctx;
+
+ uint8_t bus_number;
+ uint8_t port_number;
+ struct libusb_device * parent_dev;
+ uint8_t device_address;
+ uint8_t num_configurations;
+ enum libusb_speed speed;
+
+ struct {
+ void * next;
+ void * prev;
+ } list;
+
+ unsigned long session_data;
+ struct libusb_device_descriptor device_descriptor;
+ int attached;
+
+ unsigned char os_priv[0];
+};
+
+struct libusb_device_handle {
+ HANDLE lock;
+ unsigned long claimed_interfaces;
+ struct {
+ void * next;
+ void * prev;
+ } list;
+ struct libusb_device * dev;
+ int auto_detach_kernel_driver;
+ unsigned char os_priv[0];
+};
+
+struct windows_interface_handle {
+ HANDLE dev_handle;
+ HANDLE api_handle;
+};
+
+struct windows_device_handle_priv {
+ int active_interface;
+ struct windows_interface_handle interface_handle;
+};
+#endif
+
static int init(struct sr_dev_driver *di, struct sr_context *sr_ctx)
{
return std_init(sr_ctx, di, LOG_PREFIX);
@@ -358,6 +427,45 @@ static GSList *dev_list(const struct sr_dev_driver *di)
return ((struct drv_context *)(di->context))->instances;
}
+#ifdef _WIN32
+static void dev_windows_usb_init(struct sr_usb_dev_inst *usb)
+{
+ struct windows_device_handle_priv *usb_handle_priv;
+ struct windows_device_priv *usb_device_priv;
+ struct windows_usb_interface *usb_interfaces;
+ struct windows_interface_handle *interface_handles;
+ uint8_t policy;
+ uint8_t endpoint_address;
+ int i;
+ int nb_endpoints;
+ int active_interface;
+ HANDLE winusb_handle;
+
+ policy = TRUE;
+ usb_handle_priv = (struct windows_device_handle_priv *) usb->devhdl->os_priv;
+ usb_device_priv = (struct windows_device_priv *) usb->devhdl->dev->os_priv;
+ usb_interfaces = (struct windows_usb_interface *) &usb_device_priv->usb_interface;
+ interface_handles = (struct windows_interface_handle *) &usb_handle_priv->interface_handle;
+ active_interface = usb_handle_priv->active_interface;
+ nb_endpoints = usb_interfaces[active_interface].nb_endpoints;
+
+ if (!WinUsb_Initialize(interface_handles[active_interface].dev_handle, &winusb_handle)) {
+ sr_err("Unable to obtain handle for device");
+ return;
+ }
+
+ for (i = 0; i < nb_endpoints; i++) {
+ endpoint_address = usb_interfaces[active_interface].endpoint[i];
+ if (!WinUsb_SetPipePolicy(winusb_handle, endpoint_address,
+ RAW_IO, sizeof(uint8_t), &policy)) {
+ sr_err("Failed to set RAW_IO flag for interface handle %x", winusb_handle);
+ }
+ }
+
+ WinUsb_Free(winusb_handle);
+}
+#endif
+
static int dev_open(struct sr_dev_inst *sdi)
{
struct sr_dev_driver *di = sdi->driver;
@@ -423,6 +531,10 @@ static int dev_open(struct sr_dev_inst *sdi)
return SR_ERR;
}
+#ifdef _WIN32
+ dev_windows_usb_init(usb);
+#endif
+
if (devc->dslogic) {
if (!strcmp(devc->profile->model, "DSLogic")) {
fpga_firmware = DSLOGIC_FPGA_FIRMWARE;
diff --git a/src/hardware/fx2lafw/protocol.h b/src/hardware/fx2lafw/protocol.h
index 35a52fb..7cd69bb 100644
--- a/src/hardware/fx2lafw/protocol.h
+++ b/src/hardware/fx2lafw/protocol.h
@@ -29,6 +29,12 @@
#include <libsigrok/libsigrok.h>
#include "libsigrok-internal.h"
+#ifdef _WIN32
+#include <windows.h>
+#include <winusb.h>
+#include <winusbio.h>
+#endif
+
#define LOG_PREFIX "fx2lafw"
#define USB_INTERFACE 0
--
1.9.1
------------------------------------------------------------------------------
_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel