|
|
|
|
|
|
|
|
// All USB device drivers inherit from this base class. |
|
|
// All USB device drivers inherit from this base class. |
|
|
class USBDriver : public USBHost { |
|
|
class USBDriver : public USBHost { |
|
|
public: |
|
|
public: |
|
|
operator bool() { return (device != nullptr); } |
|
|
|
|
|
uint16_t idVendor() { return (device != nullptr) ? device->idVendor : 0; } |
|
|
|
|
|
uint16_t idProduct() { return (device != nullptr) ? device->idProduct : 0; } |
|
|
|
|
|
|
|
|
|
|
|
const uint8_t *manufacturer() |
|
|
|
|
|
{ return ((device == nullptr) || (device->strbuf == nullptr)) ? nullptr : &device->strbuf->buffer[device->strbuf->iStrings[strbuf_t::STR_ID_MAN]]; } |
|
|
|
|
|
const uint8_t *product() |
|
|
|
|
|
{ return ((device == nullptr) || (device->strbuf == nullptr)) ? nullptr : &device->strbuf->buffer[device->strbuf->iStrings[strbuf_t::STR_ID_PROD]]; } |
|
|
|
|
|
const uint8_t *serialNumber() |
|
|
|
|
|
{ return ((device == nullptr) || (device->strbuf == nullptr)) ? nullptr : &device->strbuf->buffer[device->strbuf->iStrings[strbuf_t::STR_ID_SERIAL]]; } |
|
|
|
|
|
|
|
|
|
|
|
// TODO: user-level functions |
|
|
|
|
|
// check if device is bound/active/online |
|
|
|
|
|
// query vid, pid |
|
|
|
|
|
// query string: manufacturer, product, serial number |
|
|
|
|
|
|
|
|
//operator bool() { return (*(Device_t * volatile *)&device != nullptr); } |
|
|
|
|
|
operator bool() { |
|
|
|
|
|
Device_t *dev = *(Device_t * volatile *)&device; |
|
|
|
|
|
return dev != nullptr; |
|
|
|
|
|
} |
|
|
|
|
|
uint16_t idVendor() { |
|
|
|
|
|
Device_t *dev = *(Device_t * volatile *)&device; |
|
|
|
|
|
return (device != nullptr) ? device->idVendor : 0; |
|
|
|
|
|
} |
|
|
|
|
|
uint16_t idProduct() { |
|
|
|
|
|
Device_t *dev = *(Device_t * volatile *)&device; |
|
|
|
|
|
return (device != nullptr) ? device->idProduct : 0; |
|
|
|
|
|
} |
|
|
|
|
|
const uint8_t *manufacturer() { |
|
|
|
|
|
Device_t *dev = *(Device_t * volatile *)&device; |
|
|
|
|
|
if (dev == nullptr || dev->strbuf == nullptr) return nullptr; |
|
|
|
|
|
return &dev->strbuf->buffer[dev->strbuf->iStrings[strbuf_t::STR_ID_MAN]]; |
|
|
|
|
|
} |
|
|
|
|
|
const uint8_t *product() { |
|
|
|
|
|
Device_t *dev = *(Device_t * volatile *)&device; |
|
|
|
|
|
if (dev == nullptr || dev->strbuf == nullptr) return nullptr; |
|
|
|
|
|
return &dev->strbuf->buffer[dev->strbuf->iStrings[strbuf_t::STR_ID_PROD]]; |
|
|
|
|
|
} |
|
|
|
|
|
const uint8_t *serialNumber() { |
|
|
|
|
|
Device_t *dev = *(Device_t * volatile *)&device; |
|
|
|
|
|
if (dev == nullptr || dev->strbuf == nullptr) return nullptr; |
|
|
|
|
|
return &dev->strbuf->buffer[dev->strbuf->iStrings[strbuf_t::STR_ID_SERIAL]]; |
|
|
|
|
|
} |
|
|
protected: |
|
|
protected: |
|
|
USBDriver() : next(NULL), device(NULL) {} |
|
|
USBDriver() : next(NULL), device(NULL) {} |
|
|
// Check if a driver wishes to claim a device or interface or group |
|
|
// Check if a driver wishes to claim a device or interface or group |