1
// -*- C++;indent-tabs-mode: t; tab-width: 4; c-basic-offset: 4; -*-
5
* Copyright (C) 2003 Brad Hards <bradh@frogmouth.net>
7
* This library is covered by the LGPL, read LICENSE for details.
14
//remove after debugging
26
void Busses::rescan(void)
29
struct usb_device *dev;
32
Configuration *this_Configuration;
33
Interface *this_Interface;
34
AltSetting *this_AltSetting;
35
Endpoint *this_Endpoint;
41
for (bus = usb_get_busses(); bus; bus = bus->next) {
42
std::string dirName(bus->dirname);
45
this_Bus->setDirectoryName(dirName);
48
for (dev = bus->devices; dev; dev = dev->next) {
49
std::string buf, fileName(dev->filename);
50
usb_dev_handle *dev_handle;
53
this_Device = new Device;
54
this_Device->setFileName(fileName);
55
this_Device->setDescriptor(dev->descriptor);
57
dev_handle = usb_open(dev);
60
this_Device->setDevHandle(dev_handle);
62
if (dev->descriptor.iManufacturer) {
63
ret = this_Device->string(buf, dev->descriptor.iManufacturer);
65
this_Device->setVendor(buf);
68
if (dev->descriptor.iProduct) {
69
ret = this_Device->string(buf, dev->descriptor.iProduct);
71
this_Device->setProduct(buf);
74
if (dev->descriptor.iSerialNumber) {
75
ret = this_Device->string(buf, dev->descriptor.iSerialNumber);
77
this_Device->setSerialNumber(buf);
81
this_Bus->push_back(this_Device);
83
for (i = 0; i < this_Device->numConfigurations(); i++) {
84
this_Configuration = new Configuration;
85
this_Configuration->setDescriptor(dev->config[i]);
86
this_Device->push_back(this_Configuration);
88
for (j = 0; j < this_Configuration->numInterfaces(); j ++) {
89
this_Interface = new Interface;
90
this_Interface->setNumAltSettings(dev->config[i].interface[j].num_altsetting);
91
this_Interface->setParent(this_Device);
92
this_Interface->setInterfaceNumber(j);
93
this_Configuration->push_back(this_Interface);
95
for (k = 0; k < this_Interface->numAltSettings(); k ++) {
96
this_AltSetting = new AltSetting;
97
this_AltSetting->setDescriptor(dev->config[i].interface[j].altsetting[k]);
98
this_Interface->push_back(this_AltSetting);
100
for (l = 0; l < this_AltSetting->numEndpoints(); l++) {
101
this_Endpoint = new Endpoint;
102
this_Endpoint->setDescriptor(dev->config[i].interface[j].altsetting[k].endpoint[l]);
103
this_Endpoint->setParent(this_Device);
104
this_AltSetting->push_back(this_Endpoint);
113
std::list<Device *> Busses::match(u_int8_t class_code)
115
std::list<Device *> match_list;
117
std::list<USB::Bus *>::const_iterator biter;
119
for (biter = begin(); biter != end(); biter++) {
121
std::list<USB::Device *>::const_iterator diter;
124
for (diter = bus->begin(); diter != bus->end(); diter++) {
126
if (device->devClass() == class_code)
127
match_list.push_back(device);
133
std::list<Device *> Busses::match(DeviceIDList devList)
135
std::list<Device *> match_list;
137
std::list<USB::Bus *>::const_iterator biter;
139
for (biter = begin(); biter != end(); biter++) {
141
std::list<USB::Device *>::const_iterator diter;
144
for (diter = bus->begin(); diter != bus->end(); diter++) {
145
DeviceIDList::iterator it;
149
for (it = devList.begin(); it != devList.end(); it++) {
150
if (device->idVendor() == (*it).vendor() &&
151
device->idProduct() == (*it).product())
152
match_list.push_back(device);
159
std::string Bus::directoryName(void)
161
return m_directoryName;
164
void Bus::setDirectoryName(std::string directoryName)
166
m_directoryName = directoryName;
169
Device::~Device(void)
174
std::string Device::fileName(void)
179
int Device::string(std::string &buf, int index, u_int16_t langID)
185
/* we want the first lang ID available, so find out what it is */
186
retval = usb_get_string(m_handle, 0, 0, tmpBuff, sizeof(tmpBuff));
190
if (retval < 4 || tmpBuff[1] != USB_DT_STRING)
193
langID = tmpBuff[2] | (tmpBuff[3] << 8);
196
retval = usb_get_string(m_handle, index, langID, tmpBuff, sizeof(tmpBuff));
201
if (tmpBuff[1] != USB_DT_STRING)
204
if (tmpBuff[0] > retval)
207
/* FIXME: Handle unicode? */
210
std::string.setUnicode((unsigned char *)&tmpBuff[2], tmpBuff[0] / 2 - 1);
216
struct usb_dev_handle *Device::handle(void)
221
#ifdef USE_UNTESTED_LIBUSBPP_METHODS
222
int Device::reset(void)
224
return usb_reset(handle());
227
int Device::setConfiguration(int configurationNumber)
229
return usb_set_configuration(handle(), configurationNumber);
231
#endif /* USE_UNTESTED_LIBUSBPP_METHODS */
233
u_int16_t Device::idVendor(void)
235
return m_descriptor.idVendor;
238
u_int16_t Device::idProduct(void)
240
return m_descriptor.idProduct;
243
u_int16_t Device::idRevision(void)
245
return m_descriptor.bcdDevice;
248
u_int8_t Device::devClass(void)
250
return m_descriptor.bDeviceClass;
253
u_int8_t Device::devSubClass(void)
255
return m_descriptor.bDeviceSubClass;
258
u_int8_t Device::devProtocol(void)
260
return m_descriptor.bDeviceProtocol;
263
std::string Device::Vendor(void)
268
std::string Device::Product(void)
273
std::string Device::SerialNumber(void)
275
return m_SerialNumber;
278
void Device::setVendor(std::string vendor)
283
void Device::setDevHandle(struct usb_dev_handle *device)
288
void Device::setProduct(std::string product)
293
void Device::setSerialNumber(std::string serialnumber)
295
m_SerialNumber = serialnumber;
298
u_int8_t Device::numConfigurations(void)
300
return m_descriptor.bNumConfigurations;
303
void Device::setFileName(std::string fileName)
305
m_fileName = fileName;
308
void Device::setDescriptor(struct usb_device_descriptor descriptor)
310
m_descriptor = descriptor;
313
Configuration *Device::firstConfiguration(void)
319
Configuration *Device::nextConfiguration(void)
327
Configuration *Device::lastConfiguration(void)
332
int Device::controlTransfer(u_int8_t requestType, u_int8_t request,
333
u_int16_t value, u_int16_t index, u_int16_t length,
334
unsigned char *payload, int timeout)
336
return usb_control_msg(m_handle, requestType, request, value, index, (char *)payload, length, timeout);
339
u_int8_t Configuration::numInterfaces(void)
341
return m_NumInterfaces;
344
void Configuration::setDescriptor(struct usb_config_descriptor descriptor)
346
m_Length = descriptor.bLength;
347
m_DescriptorType = descriptor.bDescriptorType;
348
m_TotalLength = descriptor.wTotalLength;
349
m_NumInterfaces = descriptor.bNumInterfaces;
350
m_ConfigurationValue = descriptor.bConfigurationValue;
351
m_Configuration = descriptor.iConfiguration;
352
m_Attributes = descriptor.bmAttributes;
353
m_MaxPower = descriptor.MaxPower;
356
void Configuration::dumpDescriptor(void)
358
printf(" wTotalLength: %d\n", m_TotalLength);
359
printf(" bNumInterfaces: %d\n", m_NumInterfaces);
360
printf(" bConfigurationValue: %d\n", m_ConfigurationValue);
361
printf(" iConfiguration: %d\n", m_Configuration);
362
printf(" bmAttributes: %02xh\n", m_Attributes);
363
printf(" MaxPower: %d\n", m_MaxPower);
366
Interface *Configuration::firstInterface(void)
372
Interface *Configuration::nextInterface(void)
380
Interface *Configuration::lastInterface(void)
385
#ifdef LIBUSB_HAS_GET_DRIVER_NP
386
int Interface::driverName(std::string &driver)
391
retval = usb_get_driver_np(m_parent->handle(), m_interfaceNumber, tmpString, sizeof(tmpString));
393
std::string buf(tmpString);
401
#ifdef USE_UNTESTED_LIBUSBPP_METHODS
402
int Interface::claim(void)
404
return usb_claim_interface(m_parent->handle(), m_interfaceNumber);
407
int Interface::release(void)
409
return usb_claim_interface(m_parent->handle(), m_interfaceNumber);
412
int Interface::setAltSetting(int altSettingNumber)
414
return usb_set_altinterface(m_parent->handle(), altSettingNumber);
416
#endif /* USE_UNTESTED_LIBUSBPP_METHODS */
418
u_int8_t Interface::numAltSettings(void)
420
return m_numAltSettings;
423
void Interface::setNumAltSettings(u_int8_t num_altsetting)
425
m_numAltSettings = num_altsetting;
428
void Interface::setInterfaceNumber(int interfaceNumber)
430
m_interfaceNumber = interfaceNumber;
433
void Interface::setParent(Device *parent)
438
AltSetting *Interface::firstAltSetting(void)
444
AltSetting *Interface::nextAltSetting(void)
452
AltSetting *Interface::lastAltSetting(void)
457
void AltSetting::setDescriptor(struct usb_interface_descriptor descriptor)
459
m_Length = descriptor.bLength;
460
m_DescriptorType = descriptor.bDescriptorType;
461
m_InterfaceNumber = descriptor.bInterfaceNumber;
462
m_AlternateSetting = descriptor.bAlternateSetting;
463
m_NumEndpoints = descriptor.bNumEndpoints;
464
m_InterfaceClass = descriptor.bInterfaceClass;
465
m_InterfaceSubClass = descriptor.bInterfaceSubClass;
466
m_InterfaceProtocol = descriptor.bInterfaceProtocol;
467
m_Interface = descriptor.iInterface;
470
void AltSetting::dumpDescriptor(void)
472
printf(" bInterfaceNumber: %d\n", m_InterfaceNumber);
473
printf(" bAlternateSetting: %d\n", m_AlternateSetting);
474
printf(" bNumEndpoints: %d\n", m_NumEndpoints);
475
printf(" bInterfaceClass: %d\n", m_InterfaceClass);
476
printf(" bInterfaceSubClass: %d\n", m_InterfaceSubClass);
477
printf(" bInterfaceProtocol: %d\n", m_InterfaceProtocol);
478
printf(" iInterface: %d\n", m_Interface);
481
Endpoint *AltSetting::firstEndpoint(void)
487
Endpoint *AltSetting::nextEndpoint(void)
495
Endpoint *AltSetting::lastEndpoint(void)
500
u_int8_t AltSetting::numEndpoints(void)
502
return m_NumEndpoints;
505
void Endpoint::setDescriptor(struct usb_endpoint_descriptor descriptor)
507
m_EndpointAddress = descriptor.bEndpointAddress;
508
m_Attributes = descriptor.bmAttributes;
509
m_MaxPacketSize = descriptor.wMaxPacketSize;
510
m_Interval = descriptor.bInterval;
511
m_Refresh = descriptor.bRefresh;
512
m_SynchAddress = descriptor.bSynchAddress;
515
void Endpoint::setParent(Device *parent)
520
#ifdef USE_UNTESTED_LIBUSBPP_METHODS
521
int Endpoint::bulkWrite(unsigned char *message, int timeout)
523
return usb_bulk_write(m_parent->handle(), m_EndpointAddress, message.data(),
524
message.size(), timeout);
527
int Endpoint::bulkRead(int length, unsigned char *message, int timeout)
532
buf = (char *)malloc(length);
533
res = usb_bulk_read(m_parent->handle(), m_EndpointAddress, buf, length, timeout);
536
message.resize(length);
537
message.duplicate(buf, res);
543
int Endpoint::reset(void)
545
return usb_resetep(m_parent->handle(), m_EndpointAddress);
548
int Endpoint::clearHalt(void)
550
return usb_clear_halt(m_parent->handle(), m_EndpointAddress);
553
#endif /* USE_UNTESTED_LIBUSBPP_METHODS */
555
void Endpoint::dumpDescriptor(void)
557
printf(" bEndpointAddress: %02xh\n", m_EndpointAddress);
558
printf(" bmAttributes: %02xh\n", m_Attributes);
559
printf(" wMaxPacketSize: %d\n", m_MaxPacketSize);
560
printf(" bInterval: %d\n", m_Interval);
561
printf(" bRefresh: %d\n", m_Refresh);
562
printf(" bSynchAddress: %d\n", m_SynchAddress);
565
DeviceID::DeviceID(u_int16_t vendor, u_int16_t product)
571
u_int16_t DeviceID::vendor(void)
576
u_int16_t DeviceID::product(void)