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

Reply via email to