* Copyright 2007-2008, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _USBKIT_H
#define _USBKIT_H
#include <SupportDefs.h>
#include <USB_spec.h>
#include <USB_isochronous.h>
class BUSBRoster;
class BUSBDevice;
class BUSBConfiguration;
class BUSBInterface;
class BUSBEndpoint;
removed from the USB bus.
You subclass the roster and implement the pure virtual DeviceAdded() and
DeviceRemoved() hooks. */
class BUSBRoster {
public:
BUSBRoster();
virtual ~BUSBRoster();
virtual status_t DeviceAdded(BUSBDevice *device) = 0;
virtual void DeviceRemoved(BUSBDevice *device) = 0;
void Start();
void Stop();
private:
virtual void _ReservedUSBRoster1();
virtual void _ReservedUSBRoster2();
virtual void _ReservedUSBRoster3();
virtual void _ReservedUSBRoster4();
virtual void _ReservedUSBRoster5();
void * fLooper;
uint32 fReserved[10];
};
it through the BUSBRoster or by creating one yourself and setting it to
a valid raw usb device (with a path of "/dev/bus/usb/x").
The device class provides direct accessors for descriptor fields as well
as convenience functions to directly get string representations of fields.
The BUSBDevice also provides access for the BUSBConfiguration objects of
a device. These objects and all of their child objects depend on the
parent device and will be deleted as soon as the device object is
destroyed. */
class BUSBDevice {
public:
BUSBDevice(const char *path = NULL);
virtual ~BUSBDevice();
virtual status_t InitCheck();
status_t SetTo(const char *path);
void Unset();
const char * Location() const;
bool IsHub() const;
uint16 USBVersion() const;
uint8 Class() const;
uint8 Subclass() const;
uint8 Protocol() const;
uint8 MaxEndpoint0PacketSize() const;
uint16 VendorID() const;
uint16 ProductID() const;
uint16 Version() const;
const char * ManufacturerString() const;
const char * ProductString() const;
const char * SerialNumberString() const;
const usb_device_descriptor *
Descriptor() const;
size_t GetStringDescriptor(uint32 index,
usb_string_descriptor *descriptor,
size_t length) const;
char * DecodeStringDescriptor(uint32 index) const;
size_t GetDescriptor(uint8 type, uint8 index,
uint16 languageID, void *data,
size_t length) const;
uint32 CountConfigurations() const;
const BUSBConfiguration * ConfigurationAt(uint32 index) const;
const BUSBConfiguration * ActiveConfiguration() const;
status_t SetConfiguration(
const BUSBConfiguration *configuration);
ssize_t ControlTransfer(uint8 requestType,
uint8 request, uint16 value,
uint16 index, uint16 length,
void *data) const;
private:
virtual void _ReservedUSBDevice1();
virtual void _ReservedUSBDevice2();
virtual void _ReservedUSBDevice3();
virtual void _ReservedUSBDevice4();
virtual void _ReservedUSBDevice5();
char * fPath;
int fRawFD;
usb_device_descriptor fDescriptor;
BUSBConfiguration ** fConfigurations;
uint32 fActiveConfiguration;
mutable char * fManufacturerString;
mutable char * fProductString;
mutable char * fSerialNumberString;
uint32 fReserved[10];
};
configurations a device might have. A valid object can only be gotten
through the ConfigurationAt() or ActiveConfiguration() methods of a
BUSBDevice.
The BUSBConfiguration provides further access into the configuration by
providing CountInterfaces() and InterfaceAt() to retrieve BUSBInterface
objects. */
class BUSBConfiguration {
public:
uint32 Index() const;
const BUSBDevice * Device() const;
const char * ConfigurationString() const;
const usb_configuration_descriptor *
Descriptor() const;
uint32 CountInterfaces() const;
const BUSBInterface * InterfaceAt(uint32 index) const;
private:
friend class BUSBDevice;
BUSBConfiguration(BUSBDevice *device,
uint32 index, int rawFD);
~BUSBConfiguration();
BUSBDevice * fDevice;
uint32 fIndex;
int fRawFD;
usb_configuration_descriptor fDescriptor;
BUSBInterface ** fInterfaces;
mutable char * fConfigurationString;
uint32 fReserved[10];
};
an underleying USB interface. Most importantly though it can be used to
iterate over and retrieve BUSBEndpoint objects that can be used to
transfer data over the bus. */
class BUSBInterface {
public:
uint32 Index() const;
uint32 AlternateIndex() const;
const BUSBConfiguration * Configuration() const;
const BUSBDevice * Device() const;
uint8 Class() const;
uint8 Subclass() const;
uint8 Protocol() const;
const char * InterfaceString() const;
const usb_interface_descriptor *
Descriptor() const;
status_t OtherDescriptorAt(uint32 index,
usb_descriptor *descriptor,
size_t length) const;
uint32 CountEndpoints() const;
const BUSBEndpoint * EndpointAt(uint32 index) const;
uint32 CountAlternates() const;
uint32 ActiveAlternateIndex() const;
const BUSBInterface * AlternateAt(uint32 alternateIndex) const;
status_t SetAlternate(uint32 alternateIndex);
private:
friend class BUSBConfiguration;
BUSBInterface(BUSBConfiguration *config,
uint32 index, uint32 alternate,
int rawFD);
~BUSBInterface();
void _UpdateDescriptorAndEndpoints();
BUSBConfiguration * fConfiguration;
uint32 fIndex;
uint32 fAlternate;
int fRawFD;
usb_interface_descriptor fDescriptor;
BUSBEndpoint ** fEndpoints;
mutable uint32 fAlternateCount;
mutable BUSBInterface ** fAlternates;
mutable char * fInterfaceString;
uint32 fReserved[10];
};
receive data. It also allows to query endpoint characteristics like
endpoint type or direction. */
class BUSBEndpoint {
public:
uint32 Index() const;
const BUSBInterface * Interface() const;
const BUSBConfiguration * Configuration() const;
const BUSBDevice * Device() const;
bool IsBulk() const;
bool IsInterrupt() const;
bool IsIsochronous() const;
bool IsControl() const;
bool IsInput() const;
bool IsOutput() const;
uint16 MaxPacketSize() const;
uint8 Interval() const;
const usb_endpoint_descriptor *
Descriptor() const;
ssize_t ControlTransfer(uint8 requestType,
uint8 request, uint16 value,
uint16 index, uint16 length,
void *data) const;
ssize_t InterruptTransfer(void *data,
size_t length) const;
ssize_t BulkTransfer(void *data,
size_t length) const;
ssize_t IsochronousTransfer(void *data,
size_t length,
usb_iso_packet_descriptor *packetDescriptors,
uint32 packetCount) const;
bool IsStalled() const;
status_t ClearStall() const;
private:
friend class BUSBInterface;
BUSBEndpoint(BUSBInterface *interface,
uint32 index, int rawFD);
~BUSBEndpoint();
BUSBInterface * fInterface;
uint32 fIndex;
int fRawFD;
usb_endpoint_descriptor fDescriptor;
uint32 fReserved[10];
};
#endif