Home | History | Annotate | Download | only in os
      1 /*
      2  * Haiku Backend for libusb
      3  * Copyright  2014 Akshay Jaggi <akshay1994.leo (at) gmail.com>
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Lesser General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2.1 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Lesser General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Lesser General Public
     16  * License along with this library; if not, write to the Free Software
     17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 #include <List.h>
     21 #include <Locker.h>
     22 #include <Autolock.h>
     23 #include <USBKit.h>
     24 #include <map>
     25 #include "libusbi.h"
     26 #include "haiku_usb_raw.h"
     27 
     28 using namespace std;
     29 
     30 class USBDevice;
     31 class USBDeviceHandle;
     32 class USBTransfer;
     33 
     34 class USBDevice {
     35 public:
     36 						USBDevice(const char *);
     37 	virtual					~USBDevice();
     38 	const char*				Location() const;
     39 	uint8					CountConfigurations() const;
     40 	const usb_device_descriptor*		Descriptor() const;
     41 	const usb_configuration_descriptor*	ConfigurationDescriptor(uint32) const;
     42 	const usb_configuration_descriptor*	ActiveConfiguration() const;
     43 	uint8					EndpointToIndex(uint8) const;
     44 	uint8					EndpointToInterface(uint8) const;
     45 	int					ClaimInterface(int);
     46 	int					ReleaseInterface(int);
     47 	int					CheckInterfacesFree(int);
     48 	int					SetActiveConfiguration(int);
     49 	int					ActiveConfigurationIndex() const;
     50 	bool					InitCheck();
     51 private:
     52 	int					Initialise();
     53 	unsigned int				fClaimedInterfaces;	// Max Interfaces can be 32. Using a bitmask
     54 	usb_device_descriptor			fDeviceDescriptor;
     55 	unsigned char**				fConfigurationDescriptors;
     56 	int					fActiveConfiguration;
     57 	char*					fPath;
     58 	map<uint8,uint8>			fConfigToIndex;
     59 	map<uint8,uint8>*			fEndpointToIndex;
     60 	map<uint8,uint8>*			fEndpointToInterface;
     61 	bool					fInitCheck;
     62 };
     63 
     64 class USBDeviceHandle {
     65 public:
     66 				USBDeviceHandle(USBDevice *dev);
     67 	virtual			~USBDeviceHandle();
     68 	int			ClaimInterface(int);
     69 	int			ReleaseInterface(int);
     70 	int			SetConfiguration(int);
     71 	int			SetAltSetting(int, int);
     72 	status_t		SubmitTransfer(struct usbi_transfer *);
     73 	status_t		CancelTransfer(USBTransfer *);
     74 	bool			InitCheck();
     75 private:
     76 	int			fRawFD;
     77 	static status_t		TransfersThread(void *);
     78 	void			TransfersWorker();
     79 	USBDevice*		fUSBDevice;
     80 	unsigned int		fClaimedInterfaces;
     81 	BList			fTransfers;
     82 	BLocker			fTransfersLock;
     83 	sem_id			fTransfersSem;
     84 	thread_id		fTransfersThread;
     85 	bool			fInitCheck;
     86 };
     87 
     88 class USBTransfer {
     89 public:
     90 					USBTransfer(struct usbi_transfer *, USBDevice *);
     91 	virtual				~USBTransfer();
     92 	void				Do(int);
     93 	struct usbi_transfer*		UsbiTransfer();
     94 	void				SetCancelled();
     95 	bool				IsCancelled();
     96 private:
     97 	struct usbi_transfer*		fUsbiTransfer;
     98 	struct libusb_transfer*		fLibusbTransfer;
     99 	USBDevice*			fUSBDevice;
    100 	BLocker				fStatusLock;
    101 	bool				fCancelled;
    102 };
    103 
    104 class USBRoster {
    105 public:
    106 			USBRoster();
    107 	virtual		~USBRoster();
    108 	int		Start();
    109 	void		Stop();
    110 private:
    111 	void*		fLooper;
    112 };
    113