Browse Source

ft232r: Use lowlevel interface for ft232r_open

Luke Dashjr 12 years ago
parent
commit
4fd9beaebe
3 changed files with 29 additions and 28 deletions
  1. 16 4
      driver-x6500.c
  2. 10 20
      ft232r.c
  3. 3 4
      ft232r.h

+ 16 - 4
driver-x6500.c

@@ -28,6 +28,7 @@
 #include "miner.h"
 #include "miner.h"
 #include "fpgautils.h"
 #include "fpgautils.h"
 #include "ft232r.h"
 #include "ft232r.h"
+#include "lowlevel.h"
 
 
 #define X6500_USB_PRODUCT "X6500 FPGA Miner"
 #define X6500_USB_PRODUCT "X6500 FPGA Miner"
 #define X6500_BITSTREAM_FILENAME "fpgaminer_x6500-overclocker-0402.bit"
 #define X6500_BITSTREAM_FILENAME "fpgaminer_x6500-overclocker-0402.bit"
@@ -124,8 +125,18 @@ uint32_t x6500_get_register(struct jtag_port *jp, uint8_t addr)
 	return bits2int(buf, 32);
 	return bits2int(buf, 32);
 }
 }
 
 
-static bool x6500_foundusb(libusb_device *dev, const char *product, const char *serial)
+static bool x6500_foundlowl(struct lowlevel_device_info * const info)
 {
 {
+	const char * const product = info->product;
+	const char * const serial = info->serial;
+	if (info->lowl != &lowl_ft232r)
+	{
+		applog(LOG_WARNING, "%s: Matched \"%s\" serial \"%s\", but lowlevel driver is not ft232r!",
+		       __func__, product, serial);
+		return false;
+	}
+	
+	libusb_device * const dev = info->lowl_data;
 	if (bfg_claim_libusb(&x6500_api, true, dev))
 	if (bfg_claim_libusb(&x6500_api, true, dev))
 		return false;
 		return false;
 	
 	
@@ -139,7 +150,7 @@ static bool x6500_foundusb(libusb_device *dev, const char *product, const char *
 	x6500->procs = 2;
 	x6500->procs = 2;
 	x6500->name = strdup(product);
 	x6500->name = strdup(product);
 	x6500->cutofftemp = 85;
 	x6500->cutofftemp = 85;
-	x6500->device_data = dev;
+	x6500->device_data = info;
 	cgpu_copy_libusb_strings(x6500, dev);
 	cgpu_copy_libusb_strings(x6500, dev);
 
 
 	return add_cgpu(x6500);
 	return add_cgpu(x6500);
@@ -147,12 +158,12 @@ static bool x6500_foundusb(libusb_device *dev, const char *product, const char *
 
 
 static bool x6500_detect_one(const char *serial)
 static bool x6500_detect_one(const char *serial)
 {
 {
-	return ft232r_detect(X6500_USB_PRODUCT, serial, x6500_foundusb);
+	return lowlevel_detect_serial(x6500_foundlowl, serial);
 }
 }
 
 
 static int x6500_detect_auto()
 static int x6500_detect_auto()
 {
 {
-	return ft232r_detect(X6500_USB_PRODUCT, NULL, x6500_foundusb);
+	return lowlevel_detect(x6500_foundlowl, X6500_USB_PRODUCT);
 }
 }
 
 
 static void x6500_detect()
 static void x6500_detect()
@@ -168,6 +179,7 @@ static bool x6500_prepare(struct thr_info *thr)
 		return true;
 		return true;
 	
 	
 	struct ft232r_device_handle *ftdi = ft232r_open(x6500->device_data);
 	struct ft232r_device_handle *ftdi = ft232r_open(x6500->device_data);
+	lowlevel_devinfo_free(x6500->device_data);
 	x6500->device_ft232r = NULL;
 	x6500->device_ft232r = NULL;
 	if (!ftdi)
 	if (!ftdi)
 		return false;
 		return false;

+ 10 - 20
ft232r.c

@@ -33,7 +33,9 @@
 static
 static
 void ft232r_devinfo_free(struct lowlevel_device_info * const info)
 void ft232r_devinfo_free(struct lowlevel_device_info * const info)
 {
 {
-	libusb_unref_device(info->lowl_data);
+	libusb_device * const dev = info->lowl_data;
+	if (dev)
+		libusb_unref_device(dev);
 }
 }
 
 
 static
 static
@@ -117,24 +119,6 @@ struct lowlevel_device_info *ft232r_devinfo_scan()
 	return devinfo_list;
 	return devinfo_list;
 }
 }
 
 
-static foundusb_func_t _wrapper_cb;
-static
-bool _wrapper(struct lowlevel_device_info *info)
-{
-	if (info->lowl != &lowl_ft232r)
-		return false;
-	return _wrapper_cb(info->lowl_data, info->product, info->serial);
-}
-
-int ft232r_detect(const char *product_needle, const char *serial, foundusb_func_t cb)
-{
-	_wrapper_cb = cb;
-	if (serial)
-		return lowlevel_detect_serial(_wrapper, serial);
-	else
-		return lowlevel_detect(_wrapper, product_needle);
-}
-
 #define FTDI_REQTYPE  (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE)
 #define FTDI_REQTYPE  (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE)
 #define FTDI_REQTYPE_IN   (FTDI_REQTYPE | LIBUSB_ENDPOINT_IN)
 #define FTDI_REQTYPE_IN   (FTDI_REQTYPE | LIBUSB_ENDPOINT_IN)
 #define FTDI_REQTYPE_OUT  (FTDI_REQTYPE | LIBUSB_ENDPOINT_OUT)
 #define FTDI_REQTYPE_OUT  (FTDI_REQTYPE | LIBUSB_ENDPOINT_OUT)
@@ -161,8 +145,14 @@ struct ft232r_device_handle {
 	uint16_t obufsz;
 	uint16_t obufsz;
 };
 };
 
 
-struct ft232r_device_handle *ft232r_open(libusb_device *dev)
+struct ft232r_device_handle *ft232r_open(struct lowlevel_device_info *info)
 {
 {
+	libusb_device * const dev = info->lowl_data;
+	info->lowl_data = NULL;
+	
+	if (!dev)
+		return NULL;
+	
 	// FIXME: Cleanup on errors
 	// FIXME: Cleanup on errors
 	libusb_device_handle *devh;
 	libusb_device_handle *devh;
 	struct ft232r_device_handle *ftdi;
 	struct ft232r_device_handle *ftdi;

+ 3 - 4
ft232r.h

@@ -15,6 +15,8 @@
 
 
 #include <libusb.h>
 #include <libusb.h>
 
 
+#include "lowlevel.h"
+
 enum ft232r_reset_purge {
 enum ft232r_reset_purge {
 	FTDI_PURGE_RX   = 1,
 	FTDI_PURGE_RX   = 1,
 	FTDI_PURGE_TX   = 2,
 	FTDI_PURGE_TX   = 2,
@@ -23,10 +25,7 @@ enum ft232r_reset_purge {
 
 
 struct ft232r_device_handle;
 struct ft232r_device_handle;
 
 
-typedef bool(*foundusb_func_t)(libusb_device *, const char *product, const char *serial);
-
-extern int ft232r_detect(const char *product_needle, const char *serial, foundusb_func_t);
-extern struct ft232r_device_handle *ft232r_open(libusb_device *);
+extern struct ft232r_device_handle *ft232r_open(struct lowlevel_device_info *);
 extern void ft232r_close(struct ft232r_device_handle *);
 extern void ft232r_close(struct ft232r_device_handle *);
 extern bool ft232r_purge_buffers(struct ft232r_device_handle *, enum ft232r_reset_purge);
 extern bool ft232r_purge_buffers(struct ft232r_device_handle *, enum ft232r_reset_purge);
 extern bool ft232r_set_bitmode(struct ft232r_device_handle *, uint8_t mask, uint8_t mode);
 extern bool ft232r_set_bitmode(struct ft232r_device_handle *, uint8_t mask, uint8_t mode);