mirror of
				https://github.com/RangeNetworks/openbts.git
				synced 2025-11-04 05:43:14 +00:00 
			
		
		
		
	git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@6168 19bc5d8c-e614-43d4-8b26-e1612bc8e597
		
			
				
	
	
		
			137 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef _FUSB_H_
 | 
						|
#define _FUSB_H_
 | 
						|
 | 
						|
//#include "libusb_types.h"
 | 
						|
#include <list>
 | 
						|
#include <libusb-1.0/libusb.h>
 | 
						|
#include "Logger.h"
 | 
						|
 | 
						|
struct libusb_device;
 | 
						|
struct libusb_device_handle;
 | 
						|
struct libusb_device_descriptor;
 | 
						|
 | 
						|
struct  libusb_transfer;
 | 
						|
struct 	libusb_context;
 | 
						|
class   fusb_ephandle;
 | 
						|
 | 
						|
/*!
 | 
						|
 * \brief abstract usb device handle
 | 
						|
 */
 | 
						|
class fusb_devhandle {
 | 
						|
 | 
						|
private:
 | 
						|
  std::list<libusb_transfer*>    d_pending_rqsts;
 | 
						|
  libusb_context                *d_ctx;
 | 
						|
 | 
						|
  void pending_add (struct libusb_transfer *lut);
 | 
						|
  struct libusb_transfer * pending_get ();
 | 
						|
 | 
						|
  bool d_teardown;
 | 
						|
 | 
						|
public:
 | 
						|
  fusb_devhandle (libusb_device_handle *udh, libusb_context *ctx);
 | 
						|
  ~fusb_devhandle ();
 | 
						|
 | 
						|
  fusb_ephandle *make_ephandle (int endpoint, bool input_p,
 | 
						|
                                        int block_size = 0, int nblocks = 0);
 | 
						|
  bool _submit_lut (libusb_transfer *);
 | 
						|
  bool _reap (bool ok_to_block_p);
 | 
						|
 | 
						|
  bool pending_remove (struct libusb_transfer *lut);
 | 
						|
  inline bool _teardown() { return d_teardown; }
 | 
						|
 | 
						|
protected:
 | 
						|
  libusb_device_handle		*d_udh;
 | 
						|
 | 
						|
public:
 | 
						|
  fusb_devhandle (libusb_device_handle *udh) {d_udh = udh;}
 | 
						|
  libusb_device_handle *get_usb_dev_handle () const { return d_udh; }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/*!
 | 
						|
 * \brief abstract usb end point handle
 | 
						|
 */
 | 
						|
class fusb_ephandle {
 | 
						|
private:
 | 
						|
 | 
						|
  // NOT IMPLEMENTED
 | 
						|
  fusb_ephandle (const fusb_ephandle &rhs);	        // no copy constructor
 | 
						|
  fusb_ephandle &operator= (const fusb_ephandle &rhs);  // no assignment operator
 | 
						|
 | 
						|
 | 
						|
private:
 | 
						|
  fusb_devhandle         *d_devhandle;
 | 
						|
  std::list<libusb_transfer*>     d_free_list;
 | 
						|
  std::list<libusb_transfer*>     d_completed_list;
 | 
						|
  libusb_transfer                *d_write_work_in_progress;
 | 
						|
  unsigned char                  *d_write_buffer;
 | 
						|
  libusb_transfer                *d_read_work_in_progress;
 | 
						|
  unsigned char                  *d_read_buffer;
 | 
						|
  unsigned char                  *d_read_buffer_end;
 | 
						|
 | 
						|
  libusb_transfer *get_write_work_in_progress ();
 | 
						|
  void reap_complete_writes ();
 | 
						|
  bool reload_read_buffer ();
 | 
						|
  bool submit_lut (libusb_transfer *lut);
 | 
						|
 | 
						|
 | 
						|
protected:
 | 
						|
  int				d_endpoint;
 | 
						|
  bool				d_input_p;
 | 
						|
  int				d_block_size;
 | 
						|
  int				d_nblocks;
 | 
						|
  bool				d_started;
 | 
						|
 | 
						|
public:
 | 
						|
  fusb_ephandle (fusb_devhandle *dh, int endpoint, bool input_p,
 | 
						|
                         int block_size = 0, int nblocks = 0);
 | 
						|
  ~fusb_ephandle();
 | 
						|
 | 
						|
  bool start ();        //!< begin streaming i/o
 | 
						|
 | 
						|
  int write (const void *buffer, int nbytes);
 | 
						|
 | 
						|
  int read (void *buffer, int nbytes);
 | 
						|
 | 
						|
  void free_list_add (struct libusb_transfer *lut);
 | 
						|
  void completed_list_add (struct libusb_transfer *lut);
 | 
						|
  struct libusb_transfer *free_list_get ();
 | 
						|
  struct libusb_transfer *completed_list_get ();
 | 
						|
 | 
						|
  // accessor to work from callback context
 | 
						|
  fusb_devhandle* get_fusb_devhandle () const {
 | 
						|
    return d_devhandle;
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
public:
 | 
						|
  fusb_ephandle (int endpoint, bool input_p,
 | 
						|
		 int block_size = 0, int nblocks = 0);
 | 
						|
 | 
						|
  int block_size () { return d_block_size; };
 | 
						|
};
 | 
						|
 | 
						|
static const int MAX_BLOCK_SIZE = 16 * 1024;            // hard limit
 | 
						|
static const int DEFAULT_BLOCK_SIZE =   4 * 1024;
 | 
						|
static const int DEFAULT_BUFFER_SIZE = 4 * (1L << 20);     // 1 MB
 | 
						|
 | 
						|
/*!
 | 
						|
 * \brief factory for creating concrete instances of the appropriate subtype.
 | 
						|
 */
 | 
						|
class fusb {
 | 
						|
public:
 | 
						|
  static fusb_devhandle *make_devhandle (libusb_device_handle *udh,
 | 
						|
                                         libusb_context *ctx = 0) 
 | 
						|
  { return new fusb_devhandle (udh,ctx);}
 | 
						|
 | 
						|
  static int max_block_size () { return MAX_BLOCK_SIZE;}
 | 
						|
 | 
						|
  static int default_block_size () { return DEFAULT_BLOCK_SIZE;}
 | 
						|
 | 
						|
  static int default_buffer_size () { return DEFAULT_BUFFER_SIZE;}
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
#endif /* _FUSB_H_ */
 |