* Calmed down debug output a bit
* Removed all friends in the USB stack classes (as they are not needed) * Added max packet size to the pipe and respect it on transfers * Use pipes with the same speed as the device Device descriptors can now also be retrieved from full speed devices and devices with a packet size of more than 8 bytes. The devices are also correctly initialized to their default configuration. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17639 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
f4ccbdaa3a
commit
b7a062b5ad
@ -34,9 +34,10 @@ BusManager::BusManager()
|
|||||||
fDeviceMap[i] = false;
|
fDeviceMap[i] = false;
|
||||||
|
|
||||||
// Set up the default pipes
|
// Set up the default pipes
|
||||||
fDefaultPipe = new ControlPipe(this, 0, Pipe::Default, Pipe::NormalSpeed, 0);
|
fDefaultPipe = new ControlPipe(this, 0, Pipe::Default, Pipe::NormalSpeed,
|
||||||
|
0, 8);
|
||||||
fDefaultPipeLowSpeed = new ControlPipe(this, 0, Pipe::Default,
|
fDefaultPipeLowSpeed = new ControlPipe(this, 0, Pipe::Default,
|
||||||
Pipe::LowSpeed, 0);
|
Pipe::LowSpeed, 0, 8);
|
||||||
|
|
||||||
fExploreThread = -1;
|
fExploreThread = -1;
|
||||||
fInitOK = true;
|
fInitOK = true;
|
||||||
@ -69,8 +70,8 @@ BusManager::ExploreThread(void *data)
|
|||||||
if (!rootHub)
|
if (!rootHub)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
|
snooze(3000000);
|
||||||
while (true) {
|
while (true) {
|
||||||
//snooze(5000000);
|
|
||||||
rootHub->Explore();
|
rootHub->Explore();
|
||||||
snooze(1000000);
|
snooze(1000000);
|
||||||
}
|
}
|
||||||
@ -91,8 +92,10 @@ BusManager::AllocateNewDevice(Device *parent, bool lowSpeed)
|
|||||||
|
|
||||||
TRACE(("usb BusManager::AllocateNewDevice(): setting device address to %d\n", deviceNum));
|
TRACE(("usb BusManager::AllocateNewDevice(): setting device address to %d\n", deviceNum));
|
||||||
|
|
||||||
|
ControlPipe *defaultPipe = (lowSpeed ? fDefaultPipeLowSpeed : fDefaultPipe);
|
||||||
|
|
||||||
// Set the address of the device USB 1.1 spec p202
|
// Set the address of the device USB 1.1 spec p202
|
||||||
status_t result = fDefaultPipeLowSpeed->SendRequest(
|
status_t result = defaultPipe->SendRequest(
|
||||||
USB_REQTYPE_DEVICE_OUT | USB_REQTYPE_STANDARD, // type
|
USB_REQTYPE_DEVICE_OUT | USB_REQTYPE_STANDARD, // type
|
||||||
USB_REQUEST_SET_ADDRESS, // request
|
USB_REQUEST_SET_ADDRESS, // request
|
||||||
deviceNum, // value
|
deviceNum, // value
|
||||||
@ -111,7 +114,8 @@ BusManager::AllocateNewDevice(Device *parent, bool lowSpeed)
|
|||||||
snooze(10000);
|
snooze(10000);
|
||||||
|
|
||||||
// Create a temporary pipe with the new address
|
// Create a temporary pipe with the new address
|
||||||
ControlPipe pipe(this, deviceNum, Pipe::Default, Pipe::LowSpeed, 0);
|
ControlPipe pipe(this, deviceNum, Pipe::Default,
|
||||||
|
lowSpeed ? Pipe::LowSpeed : Pipe::NormalSpeed, 0, 8);
|
||||||
|
|
||||||
// Get the device descriptor
|
// Get the device descriptor
|
||||||
// Just retrieve the first 8 bytes of the descriptor -> minimum supported
|
// Just retrieve the first 8 bytes of the descriptor -> minimum supported
|
||||||
@ -136,6 +140,15 @@ BusManager::AllocateNewDevice(Device *parent, bool lowSpeed)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE(("short device descriptor for device %d:\n", deviceDescriptor));
|
||||||
|
TRACE(("\tlength:..............%d\n", deviceDescriptor.length));
|
||||||
|
TRACE(("\tdescriptor_type:.....0x%04x\n", deviceDescriptor.descriptor_type));
|
||||||
|
TRACE(("\tusb_version:.........0x%04x\n", deviceDescriptor.usb_version));
|
||||||
|
TRACE(("\tdevice_class:........0x%02x\n", deviceDescriptor.device_class));
|
||||||
|
TRACE(("\tdevice_subclass:.....0x%02x\n", deviceDescriptor.device_subclass));
|
||||||
|
TRACE(("\tdevice_protocol:.....0x%02x\n", deviceDescriptor.device_protocol));
|
||||||
|
TRACE(("\tmax_packet_size_0:...%d\n", deviceDescriptor.max_packet_size_0));
|
||||||
|
|
||||||
// Create a new instance based on the type (Hub or Device)
|
// Create a new instance based on the type (Hub or Device)
|
||||||
if (deviceDescriptor.device_class == 0x09) {
|
if (deviceDescriptor.device_class == 0x09) {
|
||||||
TRACE(("usb BusManager::AllocateNewDevice(): creating new hub\n"));
|
TRACE(("usb BusManager::AllocateNewDevice(): creating new hub\n"));
|
||||||
|
@ -40,7 +40,7 @@ Device::Device(BusManager *bus, Device *parent, usb_device_descriptor &desc,
|
|||||||
fDeviceDescriptor = desc;
|
fDeviceDescriptor = desc;
|
||||||
fMaxPacketIn[0] = fMaxPacketOut[0] = fDeviceDescriptor.max_packet_size_0;
|
fMaxPacketIn[0] = fMaxPacketOut[0] = fDeviceDescriptor.max_packet_size_0;
|
||||||
fDefaultPipe = new ControlPipe(this, Pipe::Default,
|
fDefaultPipe = new ControlPipe(this, Pipe::Default,
|
||||||
lowSpeed ? Pipe::LowSpeed : Pipe::NormalSpeed, 0);
|
lowSpeed ? Pipe::LowSpeed : Pipe::NormalSpeed, 0, fMaxPacketIn[0]);
|
||||||
|
|
||||||
// Get the device descriptor
|
// Get the device descriptor
|
||||||
// We already have a part of it, but we want it all
|
// We already have a part of it, but we want it all
|
||||||
@ -52,9 +52,21 @@ Device::Device(BusManager *bus, Device *parent, usb_device_descriptor &desc,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(("USB Device %d: Vendor id: 0x%04x, Product id: 0x%04x, Device version: 0x%04x\n",
|
TRACE(("full device descriptor for device %d:\n", fDeviceAddress));
|
||||||
fDeviceAddress, fDeviceDescriptor.vendor_id,
|
TRACE(("\tlength:..............%d\n", fDeviceDescriptor.length));
|
||||||
fDeviceDescriptor.product_id, fDeviceDescriptor.device_version));
|
TRACE(("\tdescriptor_type:.....0x%04x\n", fDeviceDescriptor.descriptor_type));
|
||||||
|
TRACE(("\tusb_version:.........0x%04x\n", fDeviceDescriptor.usb_version));
|
||||||
|
TRACE(("\tdevice_class:........0x%02x\n", fDeviceDescriptor.device_class));
|
||||||
|
TRACE(("\tdevice_subclass:.....0x%02x\n", fDeviceDescriptor.device_subclass));
|
||||||
|
TRACE(("\tdevice_protocol:.....0x%02x\n", fDeviceDescriptor.device_protocol));
|
||||||
|
TRACE(("\tmax_packet_size_0:...%d\n", fDeviceDescriptor.max_packet_size_0));
|
||||||
|
TRACE(("\tvendor_id:...........0x%04x\n", fDeviceDescriptor.vendor_id));
|
||||||
|
TRACE(("\tproduct_id:..........0x%04x\n", fDeviceDescriptor.product_id));
|
||||||
|
TRACE(("\tdevice_version:......0x%04x\n", fDeviceDescriptor.device_version));
|
||||||
|
TRACE(("\tmanufacturer:........0x%04x\n", fDeviceDescriptor.manufacturer));
|
||||||
|
TRACE(("\tproduct:.............0x%02x\n", fDeviceDescriptor.product));
|
||||||
|
TRACE(("\tserial_number:.......0x%02x\n", fDeviceDescriptor.serial_number));
|
||||||
|
TRACE(("\tnum_configurations:..%d\n", fDeviceDescriptor.num_configurations));
|
||||||
|
|
||||||
// Get the configurations
|
// Get the configurations
|
||||||
fConfigurations = (usb_configuration_descriptor *)malloc(fDeviceDescriptor.num_configurations
|
fConfigurations = (usb_configuration_descriptor *)malloc(fDeviceDescriptor.num_configurations
|
||||||
|
@ -9,11 +9,13 @@
|
|||||||
#include "usb_p.h"
|
#include "usb_p.h"
|
||||||
|
|
||||||
|
|
||||||
Pipe::Pipe(Device *device, pipeDirection &direction, uint8 &endpointAddress)
|
Pipe::Pipe(Device *device, pipeDirection direction, uint8 endpointAddress,
|
||||||
|
uint32 maxPacketSize)
|
||||||
{
|
{
|
||||||
fDirection = direction;
|
fDirection = direction;
|
||||||
fDevice = device;
|
fDevice = device;
|
||||||
fEndpoint = endpointAddress;
|
fEndpoint = endpointAddress;
|
||||||
|
fMaxPacketSize = maxPacketSize;
|
||||||
|
|
||||||
fBus = NULL;
|
fBus = NULL;
|
||||||
if (fDevice)
|
if (fDevice)
|
||||||
@ -42,16 +44,17 @@ Pipe::DeviceAddress()
|
|||||||
|
|
||||||
|
|
||||||
ControlPipe::ControlPipe(Device *device, pipeDirection direction,
|
ControlPipe::ControlPipe(Device *device, pipeDirection direction,
|
||||||
pipeSpeed speed, uint8 endpointAddress)
|
pipeSpeed speed, uint8 endpointAddress, uint32 maxPacketSize)
|
||||||
: Pipe(device, direction, endpointAddress)
|
: Pipe(device, direction, endpointAddress, maxPacketSize)
|
||||||
{
|
{
|
||||||
fSpeed = speed;
|
fSpeed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ControlPipe::ControlPipe(BusManager *bus, int8 deviceAddress,
|
ControlPipe::ControlPipe(BusManager *bus, int8 deviceAddress,
|
||||||
pipeDirection direction, pipeSpeed speed, uint8 endpointAddress)
|
pipeDirection direction, pipeSpeed speed, uint8 endpointAddress,
|
||||||
: Pipe(NULL, direction, endpointAddress)
|
uint32 maxPacketSize)
|
||||||
|
: Pipe(NULL, direction, endpointAddress, maxPacketSize)
|
||||||
{
|
{
|
||||||
fBus = bus;
|
fBus = bus;
|
||||||
fDeviceAddress = deviceAddress;
|
fDeviceAddress = deviceAddress;
|
||||||
|
@ -84,8 +84,6 @@ virtual bool IsHub() { return false; };
|
|||||||
status_t SetConfiguration(uint8 value);
|
status_t SetConfiguration(uint8 value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class Pipe;
|
|
||||||
|
|
||||||
usb_device_descriptor fDeviceDescriptor;
|
usb_device_descriptor fDeviceDescriptor;
|
||||||
usb_configuration_descriptor *fConfigurations;
|
usb_configuration_descriptor *fConfigurations;
|
||||||
usb_configuration_descriptor *fCurrentConfiguration;
|
usb_configuration_descriptor *fCurrentConfiguration;
|
||||||
@ -95,8 +93,8 @@ friend class Pipe;
|
|||||||
BusManager *fBus;
|
BusManager *fBus;
|
||||||
Device *fParent;
|
Device *fParent;
|
||||||
int8 fDeviceAddress;
|
int8 fDeviceAddress;
|
||||||
uint8 fMaxPacketIn[16];
|
uint32 fMaxPacketIn[16];
|
||||||
uint8 fMaxPacketOut[16];
|
uint32 fMaxPacketOut[16];
|
||||||
sem_id fLock;
|
sem_id fLock;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -151,9 +149,6 @@ protected:
|
|||||||
bool fInitOK;
|
bool fInitOK;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class Device;
|
|
||||||
friend class ControlPipe;
|
|
||||||
|
|
||||||
static int32 ExploreThread(void *data);
|
static int32 ExploreThread(void *data);
|
||||||
|
|
||||||
sem_id fLock;
|
sem_id fLock;
|
||||||
@ -176,8 +171,9 @@ enum pipeSpeed { LowSpeed, NormalSpeed };
|
|||||||
enum pipeType { Control, Bulk, Isochronous, Interrupt, Invalid };
|
enum pipeType { Control, Bulk, Isochronous, Interrupt, Invalid };
|
||||||
|
|
||||||
Pipe(Device *device,
|
Pipe(Device *device,
|
||||||
pipeDirection &direction,
|
pipeDirection direction,
|
||||||
uint8 &endpointAddress);
|
uint8 endpointAddress,
|
||||||
|
uint32 maxPacketSize);
|
||||||
virtual ~Pipe();
|
virtual ~Pipe();
|
||||||
|
|
||||||
virtual int8 DeviceAddress();
|
virtual int8 DeviceAddress();
|
||||||
@ -185,14 +181,14 @@ virtual pipeType Type() { return Invalid; };
|
|||||||
virtual pipeSpeed Speed() { return LowSpeed; };
|
virtual pipeSpeed Speed() { return LowSpeed; };
|
||||||
//Provide a default: should never be called
|
//Provide a default: should never be called
|
||||||
virtual int8 EndpointAddress() { return fEndpoint; };
|
virtual int8 EndpointAddress() { return fEndpoint; };
|
||||||
|
virtual uint32 MaxPacketSize() { return fMaxPacketSize; };
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class Transfer;
|
|
||||||
|
|
||||||
Device *fDevice;
|
Device *fDevice;
|
||||||
BusManager *fBus;
|
BusManager *fBus;
|
||||||
pipeDirection fDirection;
|
pipeDirection fDirection;
|
||||||
uint8 fEndpoint;
|
uint8 fEndpoint;
|
||||||
|
uint32 fMaxPacketSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -201,14 +197,16 @@ public:
|
|||||||
ControlPipe(Device *device,
|
ControlPipe(Device *device,
|
||||||
pipeDirection direction,
|
pipeDirection direction,
|
||||||
pipeSpeed speed,
|
pipeSpeed speed,
|
||||||
uint8 endpointAddress);
|
uint8 endpointAddress,
|
||||||
|
uint32 maxPacketSize);
|
||||||
|
|
||||||
// Constructor for default control pipe
|
// Constructor for default control pipe
|
||||||
ControlPipe(BusManager *bus,
|
ControlPipe(BusManager *bus,
|
||||||
int8 deviceAddress,
|
int8 deviceAddress,
|
||||||
pipeDirection direction,
|
pipeDirection direction,
|
||||||
pipeSpeed speed,
|
pipeSpeed speed,
|
||||||
uint8 endpointAddress);
|
uint8 endpointAddress,
|
||||||
|
uint32 maxPacketSize);
|
||||||
|
|
||||||
virtual int8 DeviceAddress();
|
virtual int8 DeviceAddress();
|
||||||
virtual pipeType Type() { return Control; };
|
virtual pipeType Type() { return Control; };
|
||||||
|
@ -346,7 +346,7 @@ Queue::AddRequest(Transfer *transfer, bigtime_t timeout)
|
|||||||
statusDescriptor->link_log = 0;
|
statusDescriptor->link_log = 0;
|
||||||
|
|
||||||
if (transfer->Buffer() && transfer->BufferLength() > 0) {
|
if (transfer->Buffer() && transfer->BufferLength() > 0) {
|
||||||
int32 packetSize = 8;
|
int32 packetSize = pipe->MaxPacketSize();
|
||||||
int32 bufferLength = transfer->BufferLength();
|
int32 bufferLength = transfer->BufferLength();
|
||||||
int32 descriptorCount = (bufferLength + packetSize - 1) / packetSize;
|
int32 descriptorCount = (bufferLength + packetSize - 1) / packetSize;
|
||||||
|
|
||||||
@ -617,7 +617,7 @@ UHCI::Start()
|
|||||||
status_t
|
status_t
|
||||||
UHCI::SubmitTransfer(Transfer *transfer, bigtime_t timeout)
|
UHCI::SubmitTransfer(Transfer *transfer, bigtime_t timeout)
|
||||||
{
|
{
|
||||||
TRACE(("usb_uhci: submit packet called\n"));
|
//TRACE(("usb_uhci: submit packet called\n"));
|
||||||
|
|
||||||
// Short circuit the root hub
|
// Short circuit the root hub
|
||||||
if (transfer->TransferPipe()->DeviceAddress() == fRootHubAddress)
|
if (transfer->TransferPipe()->DeviceAddress() == fRootHubAddress)
|
||||||
@ -662,7 +662,7 @@ UHCI::PortStatus(int32 index)
|
|||||||
if (index > 1)
|
if (index > 1)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
TRACE(("usb_uhci: read port status of port: %d\n", index));
|
//TRACE(("usb_uhci: read port status of port: %d\n", index));
|
||||||
return ReadReg16(UHCI_PORTSC1 + index * 2);
|
return ReadReg16(UHCI_PORTSC1 + index * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include <PCI.h>
|
#include <PCI.h>
|
||||||
|
|
||||||
|
|
||||||
#define TRACE_UHCI_ROOT_HUB
|
//#define TRACE_UHCI_ROOT_HUB
|
||||||
#ifdef TRACE_UHCI_ROOT_HUB
|
#ifdef TRACE_UHCI_ROOT_HUB
|
||||||
#define TRACE(x) dprintf x
|
#define TRACE(x) dprintf x
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user