Compare commits

3 Commits

Author SHA1 Message Date
3652705784 usb 2024-01-17 18:39:53 +03:00
851f101470 usb 2024-01-17 18:38:40 +03:00
6b87536d8d usb fix 2024-01-17 18:32:06 +03:00
2 changed files with 54 additions and 59 deletions

View File

@@ -58,17 +58,18 @@
#define PIUSB_H
#include "piiodevice.h"
#include "pip_usb_export.h"
struct usb_dev_handle;
class PIP_EXPORT PIUSB: public PIIODevice {
class PIP_USB_EXPORT PIUSB: public PIIODevice {
PIIODEVICE(PIUSB, "usb");
public:
explicit PIUSB(ushort vid = 0, ushort pid = 0);
virtual ~PIUSB();
struct PIP_EXPORT Endpoint {
struct PIP_USB_EXPORT Endpoint {
Endpoint(uchar a = 0, uchar at = 0, ushort mps = 0) {
address = a;
attributes = at;
@@ -106,52 +107,41 @@ public:
ushort max_packet_size;
Direction direction;
TransferType transfer_type;
SynchronisationType synchronisation_type;
UsageType usage_type;
SynchronisationType synchronisation_type = NoSynchonisation;
UsageType usage_type = DataEndpoint;
};
struct PIP_EXPORT Interface {
Interface() { index = value_to_select = class_code = subclass_code = protocol_code = 0; }
uchar index;
uchar value_to_select;
ushort class_code;
ushort subclass_code;
ushort protocol_code;
struct PIP_USB_EXPORT Interface {
uchar index = 0;
uchar value_to_select = 0;
ushort class_code = 0;
ushort subclass_code = 0;
ushort protocol_code = 0;
PIVector<PIUSB::Endpoint> endpoints;
};
struct PIP_EXPORT Configuration {
Configuration() {
index = value_to_select = attributes = max_power = 0;
self_powered = remote_wakeup = false;
}
uchar index;
uchar value_to_select;
uchar attributes;
ushort max_power; // mA
bool self_powered;
bool remote_wakeup;
struct PIP_USB_EXPORT Configuration {
uchar index = 0;
uchar value_to_select = 0;
uchar attributes = 0;
ushort max_power = 0; // mA
bool self_powered = false;
bool remote_wakeup = false;
PIVector<PIUSB::Interface> interfaces;
};
struct PIP_EXPORT Descriptor {
Descriptor() {
usb_spec_number = 0;
device_class = device_subclass = device_protocol = max_packet_size = 0;
id_vendor = id_product = id_device_release = 0;
index_manufacturer = index_product = index_serial = 0;
}
ushort usb_spec_number;
uchar device_class;
uchar device_subclass;
uchar device_protocol;
uchar max_packet_size;
ushort id_vendor;
ushort id_product;
ushort id_device_release;
uchar index_manufacturer;
uchar index_product;
uchar index_serial;
struct PIP_USB_EXPORT Descriptor {
ushort usb_spec_number = 0;
uchar device_class = 0;
uchar device_subclass = 0;
uchar device_protocol = 0;
uchar max_packet_size = 0;
ushort id_vendor = 0;
ushort id_product = 0;
ushort id_device_release = 0;
uchar index_manufacturer = 0;
uchar index_product = 0;
uchar index_serial = 0;
PIVector<PIUSB::Configuration> configurations;
};
@@ -173,14 +163,8 @@ public:
PIVector<PIUSB::Endpoint> endpointsWrite();
PIUSB::Endpoint getEndpointByAddress(uchar address);
void setVendorID(ushort vid) {
vid_ = vid;
setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, '0') + ':' + PIString::fromNumber(pid_, 16).expandLeftTo(4, '0'));
}
void setProductID(ushort pid) {
pid_ = pid;
setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, '0') + ':' + PIString::fromNumber(pid_, 16).expandLeftTo(4, '0'));
}
void setVendorID(ushort vid);
void setProductID(ushort pid);
bool setConfiguration(uchar value);
bool setInterface(uchar value);
@@ -216,6 +200,7 @@ protected:
usb_dev_handle * hdev;
};
PIP_EXPORT PICout operator<<(PICout s, const PIUSB::Endpoint & v);
PIP_USB_EXPORT PICout operator<<(PICout s, const PIUSB::Endpoint & v);
#endif // PIUSB_H
#endif

View File

@@ -40,7 +40,7 @@ PIUSB::PIUSB(ushort vid, ushort pid): PIIODevice("", ReadWrite) {
hdev = 0;
timeout_r = timeout_w = 0;
interface_claimed = -1;
setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, "0") + ":" + PIString::fromNumber(pid_, 16).expandLeftTo(4, "0"));
setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, '0') + ":" + PIString::fromNumber(pid_, 16).expandLeftTo(4, '0'));
setDeviceNumber(1);
setTimeoutRead(1000);
setTimeoutWrite(1000);
@@ -53,10 +53,8 @@ PIUSB::~PIUSB() {
}
void PIUSB::Endpoint::parse() {
synchronisation_type = NoSynchonisation;
usage_type = DataEndpoint;
direction = (Direction)((address >> 7) & 1);
transfer_type = (TransferType)(attributes & 3);
direction = (Direction)((address >> 7) & 1);
transfer_type = (TransferType)(attributes & 3);
if (transfer_type == Isochronous) {
synchronisation_type = (SynchronisationType)((attributes >> 2) & 3);
usage_type = (UsageType)((attributes >> 4) & 3);
@@ -71,6 +69,18 @@ PIUSB::Endpoint PIUSB::getEndpointByAddress(uchar address) {
}
void PIUSB::setVendorID(ushort vid) {
vid_ = vid;
setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, '0') + ':' + PIString::fromNumber(pid_, 16).expandLeftTo(4, '0'));
}
void PIUSB::setProductID(ushort pid) {
pid_ = pid;
setPath(PIString::fromNumber(vid_, 16).expandLeftTo(4, '0') + ':' + PIString::fromNumber(pid_, 16).expandLeftTo(4, '0'));
}
PIVector<PIUSB::Endpoint> PIUSB::endpointsRead() {
PIVector<Endpoint> ret;
piForeachC(Endpoint & i, eps)
@@ -325,7 +335,7 @@ ssize_t PIUSB::readDevice(void * read_to, ssize_t max_size) {
#ifdef PIP_USB
if (isClosed() || ep_read.isNull()) return -1;
ssize_t ret = -1;
reading_now = true;
// reading_now = true;
switch (ep_read.transfer_type) {
case Endpoint::Bulk:
/*piCoutObj << "bulk read" << max_size;*/
@@ -333,7 +343,7 @@ ssize_t PIUSB::readDevice(void * read_to, ssize_t max_size) {
case Endpoint::Interrupt: ret = usb_interrupt_read(hdev, ep_read.address, (char *)read_to, max_size, timeout_r);
default: break;
}
reading_now = false;
// reading_now = false;
return ret;
#else
return -1;
@@ -431,8 +441,8 @@ PICout operator<<(PICout s, const PIUSB::Endpoint & v) {
PIString PIUSB::constructFullPathDevice() const {
PIString ret;
ret << PIString::fromNumber(vendorID(), 16).toLowerCase() << ":" << PIString::fromNumber(productID(), 16).toLowerCase() << ":"
<< deviceNumber() << ":" << endpointRead().address << ":" << endpointWrite().address;
ret = PIString::fromNumber(vendorID(), 16).toLowerCase() + ":" + PIString::fromNumber(productID(), 16).toLowerCase() + ":" +
deviceNumber() + ":" + endpointRead().address + ":" + endpointWrite().address;
return ret;
}