4 #include "usbdev_int.h"
9 #include "usbdev_utils.h"
12 void LIBUSB_CALL USBDevInt::CbStubIN(
struct libusb_transfer *xfr) {
14 self->CallbackIN(xfr);
17 void LIBUSB_CALL USBDevInt::CbStubOUT(
struct libusb_transfer *xfr) {
19 self->CallbackOUT(xfr);
23 int rc = dev_->ClaimInterface(interface);
25 return dev_->ErrorUSB(
"ERROR: Claiming interface", rc);
29 interface_ = interface;
32 epOut_ =
interface + 1U;
33 epIn_ = 0x80U | epOut_;
40 maxPacketSize_ = USBDevice::kDevDataMaxPacketSize;
48 int rc = dev_->ReleaseInterface(interface_);
50 std::cerr <<
"" << std::endl;
58 std::cout <<
PrefixID() <<
"waiting to close" << std::endl;
60 while (inActive_ || outActive_) {
64 std::cout <<
PrefixID() <<
" closed" << std::endl;
67 int rc = dev_->ReleaseInterface(interface_);
69 std::cerr <<
"" << std::endl;
76 int rc = dev_->ClaimInterface(interface_);
78 return dev_->ErrorUSB(
"ERROR: Claiming interface", rc);
86 void USBDevInt::DumpIntTransfer(
struct libusb_transfer *xfr)
const {
87 const void *buf =
reinterpret_cast<void *
>(xfr->buffer);
88 std::cout <<
"Buffer " << buf <<
" length " << xfr->length
89 <<
" => actual length " << xfr->actual_length << std::endl;
90 buffer_dump(stdout, xfr->buffer, xfr->actual_length);
94 bool USBDevInt::ServiceIN() {
100 uint32_t to_fetch = maxPacketSize_;
106 xfrIn_ = dev_->AllocTransfer(0U);
113 dev_->FillBulkTransfer(xfrIn_, epIn_, space, to_fetch, CbStubIN,
this,
116 dev_->FillIntTransfer(xfrIn_, epIn_, space, to_fetch, CbStubIN,
this,
120 int rc = dev_->SubmitTransfer(xfrIn_);
122 return dev_->ErrorUSB(
"ERROR: Submitting IN transfer", rc);
133 bool USBDevInt::ServiceOUT() {
137 if (num_bytes > 0U) {
140 xfrOut_ = dev_->AllocTransfer(0U);
148 dev_->FillBulkTransfer(xfrOut_, epOut_, data, num_bytes, CbStubOUT,
this,
151 dev_->FillIntTransfer(xfrOut_, epOut_, data, num_bytes, CbStubOUT,
this,
155 int rc = dev_->SubmitTransfer(xfrOut_);
157 return dev_->ErrorUSB(
"ERROR: Submitting OUT transfer", rc);
174 if (!inActive_ && !ServiceIN()) {
179 if (!outActive_ && !ServiceOUT()) {
186 void USBDevInt::CallbackIN(
struct libusb_transfer *xfr) {
187 if (xfr->status != LIBUSB_TRANSFER_COMPLETED) {
188 std::cerr <<
PrefixID() <<
" Invalid/unexpected IN transfer status "
189 << xfr->status << std::endl;
190 std::cerr <<
"length " << xfr->length <<
" actual " << xfr->actual_length
197 std::cout <<
PrefixID() <<
"CallbackIN xfr " << xfr << std::endl;
198 DumpIntTransfer(xfr);
202 uint8_t *dp = xfr->buffer;
203 int nrecvd = xfr->actual_length;
210 uint32_t dropped =
SigDetect(&sig_, dp, (uint32_t)nrecvd);
216 dropped +=
sizeof(usbdev_stream_sig_t);
221 nrecvd = ((uint32_t)nrecvd > dropped) ? ((uint32_t)nrecvd - dropped) : 0;
240 failed_ = !ServiceIN();
250 void USBDevInt::CallbackOUT(
struct libusb_transfer *xfr) {
251 if (xfr->status != LIBUSB_TRANSFER_COMPLETED) {
252 std::cerr <<
PrefixID() <<
" Invalid/unexpected OUT transfer status "
253 << xfr->status << std::endl;
254 std::cerr <<
"length " << xfr->length <<
" actual " << xfr->actual_length
261 std::cout <<
PrefixID() <<
"CallbackOUT xfr " << xfr << std::endl;
262 DumpIntTransfer(xfr);
266 assert(xfr->actual_length == xfr->length);
271 failed_ = !ServiceOUT();