* Added SetAltInterface method which allows to set an alternate interface for the device
* Added InitEndpoint and ClearEndpoint to avoid code duplication * Usual clean up git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22983 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -67,7 +67,8 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
fConfigurations = (usb_configuration_info *)malloc(
|
fConfigurations = (usb_configuration_info *)malloc(
|
||||||
fDeviceDescriptor.num_configurations * sizeof(usb_configuration_info));
|
fDeviceDescriptor.num_configurations * sizeof(usb_configuration_info));
|
||||||
if (fConfigurations == NULL) {
|
if (fConfigurations == NULL) {
|
||||||
TRACE_ERROR(("USB Device %d: out of memory during config creations!\n", fDeviceAddress));
|
TRACE_ERROR(("USB Device %d: out of memory during config creations!\n",
|
||||||
|
fDeviceAddress));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +79,8 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
&actualLength);
|
&actualLength);
|
||||||
|
|
||||||
if (status < B_OK || actualLength != sizeof(usb_configuration_descriptor)) {
|
if (status < B_OK || actualLength != sizeof(usb_configuration_descriptor)) {
|
||||||
TRACE_ERROR(("USB Device %d: error fetching configuration %ld\n", fDeviceAddress, i));
|
TRACE_ERROR(("USB Device %d: error fetching configuration %ld\n",
|
||||||
|
fDeviceAddress, i));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,11 +99,13 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
(void *)configData, configDescriptor.total_length, &actualLength);
|
(void *)configData, configDescriptor.total_length, &actualLength);
|
||||||
|
|
||||||
if (status < B_OK || actualLength != configDescriptor.total_length) {
|
if (status < B_OK || actualLength != configDescriptor.total_length) {
|
||||||
TRACE_ERROR(("USB Device %d: error fetching full configuration descriptor %ld\n", fDeviceAddress, i));
|
TRACE_ERROR(("USB Device %d: error fetching full configuration"
|
||||||
|
" descriptor %ld\n", fDeviceAddress, i));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_configuration_descriptor *configuration = (usb_configuration_descriptor *)configData;
|
usb_configuration_descriptor *configuration
|
||||||
|
= (usb_configuration_descriptor *)configData;
|
||||||
fConfigurations[i].descr = configuration;
|
fConfigurations[i].descr = configuration;
|
||||||
fConfigurations[i].interface_count = configuration->number_interfaces;
|
fConfigurations[i].interface_count = configuration->number_interfaces;
|
||||||
fConfigurations[i].interface = (usb_interface_list *)malloc(
|
fConfigurations[i].interface = (usb_interface_list *)malloc(
|
||||||
@@ -115,7 +119,8 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
switch (configData[descriptorStart + 1]) {
|
switch (configData[descriptorStart + 1]) {
|
||||||
case USB_DESCRIPTOR_INTERFACE: {
|
case USB_DESCRIPTOR_INTERFACE: {
|
||||||
TRACE(("USB Device %d: got interface descriptor\n", fDeviceAddress));
|
TRACE(("USB Device %d: got interface descriptor\n", fDeviceAddress));
|
||||||
usb_interface_descriptor *interfaceDescriptor = (usb_interface_descriptor *)&configData[descriptorStart];
|
usb_interface_descriptor *interfaceDescriptor
|
||||||
|
= (usb_interface_descriptor *)&configData[descriptorStart];
|
||||||
TRACE(("\tlength:.............%d\n", interfaceDescriptor->length));
|
TRACE(("\tlength:.............%d\n", interfaceDescriptor->length));
|
||||||
TRACE(("\tdescriptor_type:....0x%02x\n", interfaceDescriptor->descriptor_type));
|
TRACE(("\tdescriptor_type:....0x%02x\n", interfaceDescriptor->descriptor_type));
|
||||||
TRACE(("\tinterface_number:...%d\n", interfaceDescriptor->interface_number));
|
TRACE(("\tinterface_number:...%d\n", interfaceDescriptor->interface_number));
|
||||||
@@ -126,17 +131,19 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
TRACE(("\tinterface_protocol:.0x%02x\n", interfaceDescriptor->interface_protocol));
|
TRACE(("\tinterface_protocol:.0x%02x\n", interfaceDescriptor->interface_protocol));
|
||||||
TRACE(("\tinterface:..........%d\n", interfaceDescriptor->interface));
|
TRACE(("\tinterface:..........%d\n", interfaceDescriptor->interface));
|
||||||
|
|
||||||
usb_interface_list *interfaceList =
|
usb_interface_list *interfaceList
|
||||||
&fConfigurations[i].interface[interfaceDescriptor->interface_number];
|
= &fConfigurations[i].interface[interfaceDescriptor->interface_number];
|
||||||
|
|
||||||
/* allocate this alternate */
|
/* Allocate this alternate */
|
||||||
interfaceList->alt_count++;
|
interfaceList->alt_count++;
|
||||||
interfaceList->alt = (usb_interface_info *)realloc(
|
interfaceList->alt = (usb_interface_info *)realloc(
|
||||||
interfaceList->alt, interfaceList->alt_count
|
interfaceList->alt, interfaceList->alt_count
|
||||||
* sizeof(usb_interface_info));
|
* sizeof(usb_interface_info));
|
||||||
|
|
||||||
|
/* Set active interface always to the first one */
|
||||||
interfaceList->active = interfaceList->alt;
|
interfaceList->active = interfaceList->alt;
|
||||||
|
|
||||||
/* setup this alternate */
|
/* Setup this alternate */
|
||||||
usb_interface_info *interfaceInfo =
|
usb_interface_info *interfaceInfo =
|
||||||
&interfaceList->alt[interfaceList->alt_count - 1];
|
&interfaceList->alt[interfaceList->alt_count - 1];
|
||||||
interfaceInfo->descr = interfaceDescriptor;
|
interfaceInfo->descr = interfaceDescriptor;
|
||||||
@@ -145,6 +152,7 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
interfaceInfo->generic_count = 0;
|
interfaceInfo->generic_count = 0;
|
||||||
interfaceInfo->generic = NULL;
|
interfaceInfo->generic = NULL;
|
||||||
|
|
||||||
|
// TODO: Remove all Interface class related code.
|
||||||
Interface *interface = new(std::nothrow) Interface(this,
|
Interface *interface = new(std::nothrow) Interface(this,
|
||||||
interfaceDescriptor->interface_number);
|
interfaceDescriptor->interface_number);
|
||||||
interfaceInfo->handle = interface->USBID();
|
interfaceInfo->handle = interface->USBID();
|
||||||
@@ -155,7 +163,8 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
|
|
||||||
case USB_DESCRIPTOR_ENDPOINT: {
|
case USB_DESCRIPTOR_ENDPOINT: {
|
||||||
TRACE(("USB Device %d: got endpoint descriptor\n", fDeviceAddress));
|
TRACE(("USB Device %d: got endpoint descriptor\n", fDeviceAddress));
|
||||||
usb_endpoint_descriptor *endpointDescriptor = (usb_endpoint_descriptor *)&configData[descriptorStart];
|
usb_endpoint_descriptor *endpointDescriptor
|
||||||
|
= (usb_endpoint_descriptor *)&configData[descriptorStart];
|
||||||
TRACE(("\tlength:.............%d\n", endpointDescriptor->length));
|
TRACE(("\tlength:.............%d\n", endpointDescriptor->length));
|
||||||
TRACE(("\tdescriptor_type:....0x%02x\n", endpointDescriptor->descriptor_type));
|
TRACE(("\tdescriptor_type:....0x%02x\n", endpointDescriptor->descriptor_type));
|
||||||
TRACE(("\tendpoint_address:...0x%02x\n", endpointDescriptor->endpoint_address));
|
TRACE(("\tendpoint_address:...0x%02x\n", endpointDescriptor->endpoint_address));
|
||||||
@@ -183,7 +192,8 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
TRACE(("USB Device %d: got generic descriptor\n", fDeviceAddress));
|
TRACE(("USB Device %d: got generic descriptor\n", fDeviceAddress));
|
||||||
usb_generic_descriptor *genericDescriptor = (usb_generic_descriptor *)&configData[descriptorStart];
|
usb_generic_descriptor *genericDescriptor
|
||||||
|
= (usb_generic_descriptor *)&configData[descriptorStart];
|
||||||
TRACE(("\tlength:.............%d\n", genericDescriptor->length));
|
TRACE(("\tlength:.............%d\n", genericDescriptor->length));
|
||||||
TRACE(("\tdescriptor_type:....0x%02x\n", genericDescriptor->descriptor_type));
|
TRACE(("\tdescriptor_type:....0x%02x\n", genericDescriptor->descriptor_type));
|
||||||
|
|
||||||
@@ -210,7 +220,8 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc,
|
|||||||
// Set default configuration
|
// Set default configuration
|
||||||
TRACE(("USB Device %d: setting default configuration\n", fDeviceAddress));
|
TRACE(("USB Device %d: setting default configuration\n", fDeviceAddress));
|
||||||
if (SetConfigurationAt(0) < B_OK) {
|
if (SetConfigurationAt(0) < B_OK) {
|
||||||
TRACE_ERROR(("USB Device %d: failed to set default configuration\n", fDeviceAddress));
|
TRACE_ERROR(("USB Device %d: failed to set default configuration\n",
|
||||||
|
fDeviceAddress));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,11 +368,22 @@ Device::SetConfigurationAt(uint8 index)
|
|||||||
// Set current configuration
|
// Set current configuration
|
||||||
fCurrentConfiguration = &fConfigurations[index];
|
fCurrentConfiguration = &fConfigurations[index];
|
||||||
|
|
||||||
|
// Initialize all the endpoints that are now active
|
||||||
|
InitEndpoints();
|
||||||
|
|
||||||
|
// Wait some for the configuration being finished
|
||||||
|
snooze(USB_DELAY_SET_CONFIGURATION);
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Device::InitEndpoints()
|
||||||
|
{
|
||||||
int8 hubAddress = 0;
|
int8 hubAddress = 0;
|
||||||
if (Parent() && (Parent()->Type() & USB_OBJECT_HUB))
|
if (Parent() && (Parent()->Type() & USB_OBJECT_HUB))
|
||||||
hubAddress = ((Hub *)Parent())->DeviceAddress();
|
hubAddress = ((Hub *)Parent())->DeviceAddress();
|
||||||
|
|
||||||
// Initialize all the endpoints that are now active
|
|
||||||
for (size_t j = 0; j < fCurrentConfiguration->interface_count; j++) {
|
for (size_t j = 0; j < fCurrentConfiguration->interface_count; j++) {
|
||||||
usb_interface_info *interfaceInfo = fCurrentConfiguration->interface[j].active;
|
usb_interface_info *interfaceInfo = fCurrentConfiguration->interface[j].active;
|
||||||
for (size_t i = 0; i < interfaceInfo->endpoint_count; i++) {
|
for (size_t i = 0; i < interfaceInfo->endpoint_count; i++) {
|
||||||
@@ -398,13 +420,8 @@ Device::SetConfigurationAt(uint8 index)
|
|||||||
endpoint->handle = pipe->USBID();
|
endpoint->handle = pipe->USBID();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait some for the configuration being finished
|
|
||||||
snooze(USB_DELAY_SET_CONFIGURATION);
|
|
||||||
return B_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Device::Unconfigure(bool atDeviceLevel)
|
Device::Unconfigure(bool atDeviceLevel)
|
||||||
{
|
{
|
||||||
@@ -431,7 +448,16 @@ Device::Unconfigure(bool atDeviceLevel)
|
|||||||
|
|
||||||
if (!fCurrentConfiguration)
|
if (!fCurrentConfiguration)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
ClearEndpoints();
|
||||||
|
|
||||||
|
fCurrentConfiguration = NULL;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Device::ClearEndpoints()
|
||||||
|
{
|
||||||
for (size_t j = 0; j < fCurrentConfiguration->interface_count; j++) {
|
for (size_t j = 0; j < fCurrentConfiguration->interface_count; j++) {
|
||||||
usb_interface_info *interfaceInfo = fCurrentConfiguration->interface[j].active;
|
usb_interface_info *interfaceInfo = fCurrentConfiguration->interface[j].active;
|
||||||
for (size_t i = 0; i < interfaceInfo->endpoint_count; i++) {
|
for (size_t i = 0; i < interfaceInfo->endpoint_count; i++) {
|
||||||
@@ -440,12 +466,38 @@ Device::Unconfigure(bool atDeviceLevel)
|
|||||||
endpoint->handle = 0;
|
endpoint->handle = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fCurrentConfiguration = NULL;
|
|
||||||
return B_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
Device::SetAltInterface(const usb_interface_info *interface)
|
||||||
|
{
|
||||||
|
// Tell the device to set the alternate settings
|
||||||
|
status_t result = fDefaultPipe->SendRequest(
|
||||||
|
USB_REQTYPE_INTERFACE_OUT | USB_REQTYPE_STANDARD, // type
|
||||||
|
USB_REQUEST_SET_INTERFACE, // request
|
||||||
|
interface->descr->alternate_setting, // value
|
||||||
|
interface->descr->interface_number, // index
|
||||||
|
0, // length
|
||||||
|
NULL, // buffer
|
||||||
|
0, // buffer length
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (result < B_OK)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
// Update descriptor
|
||||||
|
usb_interface_list *interfaceList
|
||||||
|
= &fCurrentConfiguration->interface[interface->descr->interface_number];
|
||||||
|
interfaceList->active
|
||||||
|
= &interfaceList->alt[interface->descr->alternate_setting];
|
||||||
|
|
||||||
|
ClearEndpoints();
|
||||||
|
InitEndpoints();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
const usb_device_descriptor *
|
const usb_device_descriptor *
|
||||||
Device::DeviceDescriptor() const
|
Device::DeviceDescriptor() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ set_alt_interface(usb_device device, const usb_interface_info *interface)
|
|||||||
if (!object || (object->Type() & USB_OBJECT_DEVICE) == 0)
|
if (!object || (object->Type() & USB_OBJECT_DEVICE) == 0)
|
||||||
return B_DEV_INVALID_PIPE;
|
return B_DEV_INVALID_PIPE;
|
||||||
|
|
||||||
return B_ERROR;
|
return ((Device *)object)->SetAltInterface(interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -441,6 +441,11 @@ virtual status_t GetDescriptor(uint8 descriptorType,
|
|||||||
status_t SetConfigurationAt(uint8 index);
|
status_t SetConfigurationAt(uint8 index);
|
||||||
status_t Unconfigure(bool atDeviceLevel);
|
status_t Unconfigure(bool atDeviceLevel);
|
||||||
|
|
||||||
|
status_t SetAltInterface(const usb_interface_info *interface);
|
||||||
|
|
||||||
|
void InitEndpoints();
|
||||||
|
void ClearEndpoints();
|
||||||
|
|
||||||
virtual status_t ReportDevice(
|
virtual status_t ReportDevice(
|
||||||
usb_support_descriptor *supportDescriptors,
|
usb_support_descriptor *supportDescriptors,
|
||||||
uint32 supportDescriptorCount,
|
uint32 supportDescriptorCount,
|
||||||
|
|||||||
Reference in New Issue
Block a user