* Add a AlternateAt() method to the BUSBInterface class that can retrieve the
usb_interface_descriptor of an alternate interface without having to switch to it. * Add some reserve bytes to all classes and add some reserved virtual slots where the objects are publically constructable. * Remove the source compatibilty defines that were briding the old USB* with the new BUSB* class names. * Implement the usb_raw side of getting an alternate interface descriptor. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24842 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
d7aa5bb89c
commit
5aa70ae110
@ -11,14 +11,6 @@
|
|||||||
#include <USB_spec.h>
|
#include <USB_spec.h>
|
||||||
|
|
||||||
|
|
||||||
// Keep compatibility with original USBKit classes
|
|
||||||
#define USBRoster BUSBRoster
|
|
||||||
#define USBDevice BUSBDevice
|
|
||||||
#define USBConfiguration BUSBConfiguration
|
|
||||||
#define USBInterface BUSBInterface
|
|
||||||
#define USBEndpoint BUSBEndpoint
|
|
||||||
|
|
||||||
|
|
||||||
class BUSBRoster;
|
class BUSBRoster;
|
||||||
class BUSBDevice;
|
class BUSBDevice;
|
||||||
class BUSBConfiguration;
|
class BUSBConfiguration;
|
||||||
@ -54,7 +46,14 @@ virtual void DeviceRemoved(BUSBDevice *device) = 0;
|
|||||||
void Stop();
|
void Stop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
virtual void _ReservedUSBRoster1();
|
||||||
|
virtual void _ReservedUSBRoster2();
|
||||||
|
virtual void _ReservedUSBRoster3();
|
||||||
|
virtual void _ReservedUSBRoster4();
|
||||||
|
virtual void _ReservedUSBRoster5();
|
||||||
|
|
||||||
void *fLooper;
|
void *fLooper;
|
||||||
|
uint32 fReserved[10];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -138,6 +137,12 @@ virtual status_t InitCheck();
|
|||||||
void *data) const;
|
void *data) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
virtual void _ReservedUSBDevice1();
|
||||||
|
virtual void _ReservedUSBDevice2();
|
||||||
|
virtual void _ReservedUSBDevice3();
|
||||||
|
virtual void _ReservedUSBDevice4();
|
||||||
|
virtual void _ReservedUSBDevice5();
|
||||||
|
|
||||||
char *fPath;
|
char *fPath;
|
||||||
int fRawFD;
|
int fRawFD;
|
||||||
|
|
||||||
@ -148,6 +153,8 @@ private:
|
|||||||
mutable char *fManufacturerString;
|
mutable char *fManufacturerString;
|
||||||
mutable char *fProductString;
|
mutable char *fProductString;
|
||||||
mutable char *fSerialNumberString;
|
mutable char *fSerialNumberString;
|
||||||
|
|
||||||
|
uint32 fReserved[10];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -195,6 +202,8 @@ friend class BUSBDevice;
|
|||||||
BUSBInterface **fInterfaces;
|
BUSBInterface **fInterfaces;
|
||||||
|
|
||||||
mutable char *fConfigurationString;
|
mutable char *fConfigurationString;
|
||||||
|
|
||||||
|
uint32 fReserved[10];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -238,14 +247,26 @@ public:
|
|||||||
const BUSBEndpoint *EndpointAt(uint32 index) const;
|
const BUSBEndpoint *EndpointAt(uint32 index) const;
|
||||||
|
|
||||||
// Using CountAlternates() you can retrieve the number of alternate
|
// Using CountAlternates() you can retrieve the number of alternate
|
||||||
// interfaces at this interface index. Note that this interface itself
|
// interfaces for this interface. Note that this interface itself
|
||||||
// counts as an alternate so an alternate count of one really means
|
// counts as an alternate so an alternate count of one really means
|
||||||
// that you are currently using the sole interface present.
|
// that you are currently using the sole interface present.
|
||||||
|
// AlternateAt() returns the interface descriptor of the alternate
|
||||||
|
// interface with the specified index. Using that you can peek at the
|
||||||
|
// information contained in the descriptor without having to switch
|
||||||
|
// to this alternate interface. Note that the alternate index set in
|
||||||
|
// the interface descriptor returned is not necessarily the same index
|
||||||
|
// you used to get the descriptor. Always use the zero based index you
|
||||||
|
// used to get the information with and not the values of the returned
|
||||||
|
// descriptor as the stack will handle that translation internally.
|
||||||
|
// The interface descriptor returned was allocated by new and is yours.
|
||||||
|
// You need to delete it when you're done with it.
|
||||||
// With SetAlternate() you can switch this BUSBInterface object to the
|
// With SetAlternate() you can switch this BUSBInterface object to the
|
||||||
// alternate at the specified index. Note that all endpoints retrieved
|
// alternate interface at the specified index. Note that all endpoints
|
||||||
// through EndpointAt() will become invalid and be deleted as soon as
|
// retrieved through EndpointAt() will become invalid and will be
|
||||||
// you set an alternate.
|
// deleted as soon as you set an alternate interface (even if the
|
||||||
|
// resulting interface is the same you were using before).
|
||||||
uint32 CountAlternates() const;
|
uint32 CountAlternates() const;
|
||||||
|
usb_interface_descriptor *AlternateAt(uint32 alternateIndex);
|
||||||
status_t SetAlternate(uint32 alternateIndex);
|
status_t SetAlternate(uint32 alternateIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -264,6 +285,8 @@ friend class BUSBConfiguration;
|
|||||||
BUSBEndpoint **fEndpoints;
|
BUSBEndpoint **fEndpoints;
|
||||||
|
|
||||||
mutable char *fInterfaceString;
|
mutable char *fInterfaceString;
|
||||||
|
|
||||||
|
uint32 fReserved[10];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -331,6 +354,8 @@ friend class BUSBInterface;
|
|||||||
int fRawFD;
|
int fRawFD;
|
||||||
|
|
||||||
usb_endpoint_descriptor fDescriptor;
|
usb_endpoint_descriptor fDescriptor;
|
||||||
|
|
||||||
|
uint32 fReserved[10];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -290,6 +290,34 @@ usb_raw_ioctl(void *cookie, uint32 op, void *buffer, size_t length)
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case RAW_COMMAND_GET_ALT_INTERFACE_DESCRIPTOR: {
|
||||||
|
const usb_configuration_info *configurationInfo =
|
||||||
|
gUSBModule->get_nth_configuration(device->device,
|
||||||
|
command->alternate.config_index);
|
||||||
|
if (!configurationInfo) {
|
||||||
|
command->alternate.status = RAW_STATUS_INVALID_CONFIGURATION;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command->alternate.interface_index >= configurationInfo->interface_count) {
|
||||||
|
command->alternate.status = RAW_STATUS_INVALID_INTERFACE;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
const usb_interface_list *interfaceList =
|
||||||
|
&configurationInfo->interface[command->alternate.interface_index];
|
||||||
|
if (command->alternate.alternate_index >= interfaceList->alt_count) {
|
||||||
|
command->alternate.status = RAW_STATUS_INVALID_INTERFACE;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(command->alternate.descriptor,
|
||||||
|
&interfaceList->alt[command->alternate.alternate_index],
|
||||||
|
sizeof(usb_interface_descriptor));
|
||||||
|
command->alternate.status = RAW_STATUS_SUCCESS;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
case RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR: {
|
case RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR: {
|
||||||
const usb_configuration_info *configurationInfo =
|
const usb_configuration_info *configurationInfo =
|
||||||
gUSBModule->get_nth_configuration(device->device,
|
gUSBModule->get_nth_configuration(device->device,
|
||||||
|
@ -24,6 +24,7 @@ typedef enum {
|
|||||||
RAW_COMMAND_GET_STRING_DESCRIPTOR,
|
RAW_COMMAND_GET_STRING_DESCRIPTOR,
|
||||||
RAW_COMMAND_GET_GENERIC_DESCRIPTOR,
|
RAW_COMMAND_GET_GENERIC_DESCRIPTOR,
|
||||||
RAW_COMMAND_GET_ALT_INTERFACE_COUNT,
|
RAW_COMMAND_GET_ALT_INTERFACE_COUNT,
|
||||||
|
RAW_COMMAND_GET_ALT_INTERFACE_DESCRIPTOR,
|
||||||
|
|
||||||
RAW_COMMAND_SET_CONFIGURATION = 0x3000,
|
RAW_COMMAND_SET_CONFIGURATION = 0x3000,
|
||||||
RAW_COMMAND_SET_FEATURE,
|
RAW_COMMAND_SET_FEATURE,
|
||||||
@ -83,6 +84,7 @@ typedef union {
|
|||||||
struct {
|
struct {
|
||||||
status_t status;
|
status_t status;
|
||||||
uint32 *alternate_count;
|
uint32 *alternate_count;
|
||||||
|
usb_interface_descriptor *descriptor;
|
||||||
uint32 config_index;
|
uint32 config_index;
|
||||||
uint32 interface_index;
|
uint32 interface_index;
|
||||||
uint32 alternate_index;
|
uint32 alternate_index;
|
||||||
|
@ -157,6 +157,28 @@ BUSBInterface::CountAlternates() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
usb_interface_descriptor *
|
||||||
|
BUSBInterface::AlternateAt(uint32 alternateIndex)
|
||||||
|
{
|
||||||
|
usb_interface_descriptor *descriptor = new usb_interface_descriptor;
|
||||||
|
if (descriptor == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
raw_command command;
|
||||||
|
command.alternate.descriptor = descriptor;
|
||||||
|
command.alternate.config_index = fConfiguration->Index();
|
||||||
|
command.alternate.interface_index = fIndex;
|
||||||
|
command.alternate.alternate_index = alternateIndex;
|
||||||
|
if (ioctl(fRawFD, RAW_COMMAND_GET_ALT_INTERFACE_DESCRIPTOR, &command,
|
||||||
|
sizeof(command)) || command.alternate.status != RAW_STATUS_SUCCESS) {
|
||||||
|
delete descriptor;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BUSBInterface::SetAlternate(uint32 alternateIndex)
|
BUSBInterface::SetAlternate(uint32 alternateIndex)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user