割り込み EP に AsyncIO を使用してリクエストを送信しようとしています。このリクエストでは、action-> GetReference() を使用して完了 (CompleteAsyncIO) が呼び出されます。Ivars 構造を取得しました。USB デバイスから受信した割り込み完了データを期待していましたが、残念ながら関連データが表示されません。Wireshark でデバッグしようとした受信データは 16 バイトで、CompleteAsyncIO actualbytes も 16 バイトです。
IOMemoryBufferDescriptor を使用してデバイスから受信した割り込みデータを取得する正しい方法は何ですか?
OSAction CompleteAsyncIO の作成
ret = OSAction::Create(this,
Data_interruptComplete_ID,
IOUSBHostPipe_CompleteAsyncIO_ID,
sizeof(IntActRef),
&ivars->interruptComplete);
USB 割り込み EP の IOMemoryBufferDescriptor 割り当て:
IOBufferMemoryDescriptor* fCommPipeMDP;
ivars->fCommPipeMDP->Create(kIOMemoryDirectionIn,
ivars->fcomBuffSize,
0,
&ivars->fCommPipeMDP);
ivars->fCommPipeMDP->SetLength(ivars->fcomBuffSize);
ivars->fCommPipeMDP->GetAddressRange(&aRange);
ivars->fCommPipeBuffer = (uint8_t*)&aRange.address;
AsyncIO 要求を送信して EP に割り込みます
ret = ivars->fCommPipe->AsyncIO(ivars->fCommPipeMDP,
ivars->fcomBuffSize,
ivars->interruptComplete,
0);
フレームワークによって呼び出される CompleteAsyncIO
void
IMPL (ClassData,interruptComplete)
{
struct interruptActionRef *actionref = (struct interruptActionRef*)action->GetReference();
Data_IVars * livars = actionref->interruptactionref;
for(tmp = 0; tmp < actualByteCount; tmp++)
os_log(OS_LOG_DEFAULT, "%x",livars->fCommPipeBuffer[tmp]);
//TRYING PRINT DATA RECEIVED FROM USB DEVICE IN INTERRUPT COMPLETION(CompleteAsyncIO)
//UNFORTUNATELY DATA IS NOT MATCHING
}
AsyncIO を使用して送信した IOBufferMemoryDescriptor を使用して、割り込み完了のために USB デバイスから受信した実際のデータを取得するにはどうすればよいですか? アドレスを現在のプロセスのアドレス空間にマップする必要がありますか?
実際のデータ長のみが一致するUSBフィルターを備えたwiresharkを見ています。
Wireshark ログ a1 20 00 00 01 00 02 00 03 00 00 00 00 00 00 00 (16 バイト データ) "3029","32.105745","64.16.4","host","USB","40"," URB_INTERRUPT in (送信済み)" "3030","32.169565","64.16.4","host","USB","56","URB_INTERRUPT in (完了)"
0000 01 01 28 01 10 00 00 00 00 00 00 00 00 00 00 00 ..(.............
0010 31 d8 05 00 00 00 00 00 00 00 40 14 02 10 84 03 1.........@.....
0020 ff 02 01 00 04 10 3e 63 a1 20 00 00 01 00 02 00 ......>c. ......
0030 03 00 00 00 00 00 00 00