3

xcodeとI/Okitフレームワークへの露出は最小限です。USBプローバーのUSBデバイスのデバイス記述子と構成記述子を見てきました。ここに画像の説明を入力してください

I / Oキットフレームワークを使用してxcodeプログラムを作成しました。これは、そのデバイスの製品IDとベンダーIDを入力として指定すると、出力としてusbデバイス名を提供します。

/*Take the vendor and product id from console*/

printf("\nEnter the vendor id : ");
scanf("%lx",&usbVendor);

printf("\nEnter the product id :");
scanf("%lx",&usbProduct);


/* Set up a matching dictionary for the class */
matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
if (matchingDict == NULL)
{
    return -1; // fail
}
// Create a CFNumber for the idVendor and set the value in the dictionary
numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &usbVendor);
CFDictionarySetValue(matchingDict, 
                     CFSTR(kUSBVendorID), 
                     numberRef);
CFRelease(numberRef);

// Create a CFNumber for the idProduct and set the value in the dictionary
numberRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &usbProduct);
CFDictionarySetValue(matchingDict, 
                     CFSTR(kUSBProductID), 
                     numberRef);
CFRelease(numberRef);
numberRef = NULL;

/*Get an iterator.*/
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
{
    return -1;// fail
}

/* iterate */
while ((device = IOIteratorNext(iter)))
{
    /*Display the device names */

    io_name_t       deviceName;
    kr = IORegistryEntryGetName(device, deviceName);
    if (KERN_SUCCESS != kr) {
        deviceName[0] = '\0';
    }


    printf("\ndeviceName:%s",deviceName);

    /*Free the reference taken before continuing to the next item */
    IOObjectRelease(device);
}

/*Release the iterator */
IOObjectRelease(iter);
return 0;

}

これを変更する必要があります。これにより、usbデバイスのベンダーと製品IDを指定すると、デバイス記述子と構成記述子(USBプローバーに表示)が出力として取得されます。

ここで例を挙げましたが、コードは変更できますが、出力は記述子(少なくともデバイス記述子)である必要があります。

前もって感謝します...

4

4 に答える 4

6

USBProberのソースコードは、自分で理解するのではなく、ダウンロードする必要があると思います。

USBProber uに存在するすべての情報は、ソースコードを分析することで遅かれ早かれ取得される可能性があります。

USBProberを含むIOUSBFamilyのソースコードをダウンロードするためのリンクは次のとおりです。 http://opensource.apple.com/tarballs/IOUSBFamily/

于 2011-10-19T17:53:08.067 に答える
2

構成記述子を取得するには、次のようなコードを使用できます。

IOUSBDeviceInterface650** dev = ...;
IOUSBConfigurationDescriptor* configDesc = nullptr;

// Get the configuration descriptor for the first configuration (configuration 0).
kern_return_t kr = (*dev)->GetConfigurationDescriptorPtr(dev, 0, &configDesc);
if (kr != kIOReturnSuccess)
    return an_error;

// Now use configDesc->...

残念ながら、デバイス記述子を取得する関数はないようです。その一部を取得するための関数があります。

kr = (*dev)->GetDeviceClass(dev, &desc.bDeviceClass);
kr = (*dev)->GetDeviceSubClass(dev, &desc.bDeviceSubClass);
kr = (*dev)->GetDeviceProtocol(dev, &desc.bDeviceProtocol);
kr = (*dev)->GetDeviceVendor(dev, &desc.idVendor);
kr = (*dev)->GetDeviceProduct(dev, &desc.idProduct);
kr = (*dev)->GetDeviceReleaseNumber(dev, &desc.bcdDevice);
kr = (*dev)->GetNumberOfConfigurations(dev, &desc.bNumConfigurations);

しかし、、、、、、またはを取得iManufacturerする方法がわかりません。iProductiSerialbMaxPacketSize0bcdUSB

これを回避する方法があります-組み込み関数を使用する代わりに、制御転送を使用してデバイス記述子(および必要に応じて構成記述子)を手動で取得するための制御要求を実行できます。

USB 2.0仕様では、これを行う方法について説明しています。基本的にあなた:

  1. 、、、、、を使用して制御転送をbmRequestType = Device | Standard | In実行bRequest = USB_GET_DESCRIPTOR_REQUESTします。記述子が2より長いため失敗しますが、その長さを含む記述子ヘッダーが取得されます。wValue = (USB_DEVICE_DESCRIPTOR_TYPE << 8)wIndex = 0wLength = 2

  2. その要求を繰り返しますが、正しい長さで行ってください。

  3. 構成記述子の場合、長さ.の3番目の要求を実行しますwTotalLength

記述子のサイズが事前にわかっているので、1つ少ないリクエストでそれを行うことができますが、非常に一般的な方法でラップできるので、そのようにするのが好きですgetDescriptor()

理論的には、次のように簡単に行うことができます。

IOUSBDeviceDescriptor devDesc;

IOUSBDevRequest request;
request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
request.bRequest = kUSBRqGetDescriptor;
request.wValue = kUSBDeviceDesc << 8;
request.wIndex = 0;
request.wLength = sizeof(devDesc); // 18
request.pData = &devDesc;
request.wLenDone = 0;

kern_return_t kr = (*dev)->DeviceRequest(dev, &request);

しかし、何らかの理由でそれは私にkIOUSBPipeStalledエラーを与えています。理由はわかりません。

編集:私は忘れました<< 8。今では動作します。:-)

于 2017-05-26T13:02:11.633 に答える
0

ヘッダーIOKit/usb/USBSpec.hには、さまざまな記述子内の値に対応するプロパティキーの文書化されたリストがあります。それらをIORegistryEntrySearchCFProperty(または同様の関数で)使用して、記述子値を取得できます。このように、からのデバイス要求は必要ありませんIOUSBDeviceInterface。これは、次の理由で有利です。

  • ドキュメント(コメント)には、すべてのデバイスリクエストに開いたUSBデバイスが必要であり、すべてのデバイスに対してそれを行う権限がない可能性があると記載されています(少なくとも記述子リクエストについては、ドキュメントが間違っている可能性がありますが、それとそれを保証するものではありませんとにかくそれに従う方が良いようです)
  • デバイスリクエストは不確定な時間ブロックされる可能性があります
  • メーカー、製品、およびシリアル番号の文字列(デバイス記述子によって参照されますが、技術的にはその一部ではありません)は、このリクエストでは取得されません
于 2019-08-30T16:24:25.943 に答える
-1

デバイス記述子と構成記述子を取得するために、IOUSBDeviceInterfaceクラスの関数を使用できます

リンク:http ://developer.apple.com/library/mac/#documentation/Darwin/Reference/IOKit/IOUSBLib_h/Classes/IOUSBDeviceInterface/index.html#//apple_ref/doc/com/intfm/IOUSBDeviceInterface/

インターフェイス記述子とエンドポイント記述子を取得するには、IOUSBInterfaceInterfaceクラスの関数を使用できます

リンク:http ://developer.apple.com/library/mac/#documentation/Darwin/Reference/IOKit/IOUSBLib_h/Classes/IOUSBInterfaceInterface/

于 2011-10-13T09:11:50.797 に答える