Hello! I'm trying to get data (like audio) stream from custom vendor usb device with bulk endpoint. When I use AsyncIO in cycle some data was lost. And I saw that AsyncIOBundled can help me with this issue.
I've trying to use it:
Create memory buffers
for (int i = 0; i < DEFAULT_BUF_NUMBER; i++) {
kern_return_t ret = IOBufferMemoryDescriptor::Create(
kIOMemoryDirectionInOut,
DEFAULT_BUF_LENGTH,
0,
&ivars->buffers[i]
);
}
Create MemoryDescriptorRing and set MemoryDescriptor for each index
kern_return_t MyDriver::SetupRingBuffer(IOMemoryDescriptor** memoryDescriptors, uint16_t length)
{
kern_return_t ret = kIOReturnSuccess;
ret = ivars->inPipe->CreateMemoryDescriptorRing(length);
if (ret != kIOReturnSuccess) {
IOLog("CreateMemoryDescriptorRing failed %s", StringFromReturn(ret));
return ret;
}
for (int i = 0; i < length; i++) {
ret = ivars->inPipe->SetMemoryDescriptor(memoryDescriptors[i], i);
if (ret != kIOReturnSuccess) {
IOLog("SetMemoryDescriptor failed %s", StringFromReturn(ret));
break;
}
}
return ret;
}
Create completion
Run AsyncIOBundled for only 1 index
ret = ivars->inPipe->AsyncIOBundled(
i,
1,
&transferAccepted,
(const unsigned int *)&ivars->dataBufferLengthArray,
DEFAULT_BUF_NUMBER,
ivars->readBundledCompletion,
0
);
In completion i'm always get the error 0xe0005000 (UNDEFINED)
But if I use AsyncIO with same buffer - it's success.
What am I doing wrong? There are no differences btw AsyncIOBundled and AsyncIO requests in wireshark
Post
Replies
Boosts
Views
Activity
Hey!
I'am trying to write my own driver for usb serial device. I'am trying to subclass from IOUserUSBSerial
#include <DriverKit/IOService.iig>
#include <USBSerialDriverKit/IOUserUSBSerial.iig>
class NewDriver: public IOUserUSBSerial
{
public:
virtual kern_return_t
Start(IOService * provider) override;
};
but get a lot of errors such as
"IOUserUSBSerial::handleRxPacket(unsigned char*&, unsigned int&)", referenced from:
vtable for NewDriver in NewDriver.iig.o
"IOUserUSBSerial::handleInterruptPacket(unsigned char const*, unsigned int)", referenced from:
vtable for NewDriver in NewDriver.iig.o
"IOUserUSBSerial::free()", referenced from:
vtable for NewDriver in NewDriver.iig.o
"IOUserUSBSerial::init()", referenced from:
vtable for NewDriver in NewDriver.iig.o
"IOUserUSBSerial::initWith(IOBufferMemoryDescriptor*)", referenced from:
vtable for NewDriver in NewDriver.iig.o
"IOUserUSBSerial::_Dispatch(IOUserUSBSerial*, IORPC)", referenced from:
NewDriver::Start_Impl(IOService*) in NewDriver-e6d71af2158103084ce0c1eba7c6088d.o
NewDriver::_Dispatch(NewDriver*, IORPC) in NewDriver.iig.o
"vtable for IOUserSerial", referenced from:
IOUserSerial::IOUserSerial() in NewDriver.iig.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for IOUserUSBSerial", referenced from:
IOUserUSBSerial::IOUserUSBSerial() in NewDriver.iig.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"non-virtual thunk to IOUserUSBSerial::free()", referenced from:
vtable for NewDriver in NewDriver.iig.o
"non-virtual thunk to IOUserUSBSerial::init()", referenced from:
vtable for NewDriver in NewDriver.iig.o
"non-virtual thunk to IOUserUSBSerial::initWith(IOBufferMemoryDescriptor*)", referenced from:
vtable for NewDriver in NewDriver.iig.o
"non-virtual thunk to IOUserUSBSerial::handleRxPacket(unsigned char*&, unsigned int&)", referenced from:
vtable for NewDriver in NewDriver.iig.o
"non-virtual thunk to IOUserUSBSerial::handleInterruptPacket(unsigned char const*, unsigned int)", referenced from:
vtable for NewDriver in NewDriver.iig.o
ld: symbol(s) not found for architecture x86_64
If I making any implementations of this methods errors staying on. What Im doing wrong? Is there anywhere examples for USBSerialDriverKit? Didn't find anything on github
Is something changed in request form for multicast permission? When I try to enter request page https://developer.apple.com/contact/request/networking-multicast I've get "Sorry, you cannot view this page." I am a developer account owner, all agreements is accepted. How can I request this permission for my app for now?