4

状況は次のとおりです。USB デバイス (通信しようとしているカスタム デバイス) があり、2 つのエンドポイントがあり、1 つはデバイスへの書き込み、もう 1 つはデバイスからの読み取りです。どちらも一括転送です。すべての通信トランザクションは、(1) デバイスにコマンドを書き込む (2) 応答を読み取るという形式を取ります。実際に通信を行うために libusb (1.0 ベータではなくバージョン 0.1) を使用しています。

Windows では、すべて問題ありません。デバイスを接続し、インターフェイスを要求し、楽しく通信できます。ただし、Ubuntu (標準の Hardy デスクトップ インストール) では、デバイスに接続して書き込みを行うことはできますが、libusb から報告されたエラー「URB の送信エラー: 無効な引数」ですべての読み取り操作が失敗します (エラー コード -22)。

/var/log/messages を確認すると、読み取りが試行されたと同時にログに記録された警告メッセージが表示されます。そのバスで、それはエンドポイント 81 から読み取ろうとしています)。

だから... libusbを使用して同様の問題を見た人はいますか、それを修正する方法はありますか?

4

4 に答える 4

2

デバイス自体の記述子の構成ミスであることがわかりました。lsusb -v は、単一のアイソクロナス エンドポイント 0x81 を持つ、使用されていない追加のインターフェイスを示しました。これは一度も使用されていなかった (そして、私が見る限りテストされていなかったので、正しく定義されていない可能性が非常に高い) ため、(ファームウェアで) デバイス記述子から完全に削除しました。

そして今、私は完全に機能するデバイスを手に入れました。Linux がデバイスからの読み取りを拒否したのに、Windows は正常に動作した理由はわかりませんが、間違いなく私は野生のガチョウ追跡に送られました。

于 2008-10-13T17:42:47.307 に答える
1

libusbが機能するための適切な権限でデバイスを作成するには、udevルールをハッキングする必要がありました。そのようです:

SUBSYSTEM=="usb" ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", \
                MODE="0666" SYMLINK+="missile_launcher"

(これは、私がドライバーを書いていた USB ミサイルランチャーでした。

また、このスニペットはカーネルと競合しないようにする必要がありました。

if(LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP)
{
    // Detach kernel driver (usbhid) from device interface. (Linux hack)
    usb_detach_kernel_driver_np(launcher, 0);
    usb_detach_kernel_driver_np(launcher, 1);
}

これがあなたの問題にどのように関係しているかはわかりませんが、少なくとも 2 つの障害点が関係している可能性があります。

于 2008-10-09T16:47:41.160 に答える
1

私はかなり長い間 libusb を使用していませんでしたが、sysfs エラーは、これが libusb の問題ではなくカーネルの問題である可能性が高いことを示しているため、まずその問題を追跡することから始めます。(カーネルがデバイスと正しく通信していることを確認するまで、libusb を操作しようとしてもあまり意味がありません)。

パッチをhttp://kerneltrap.org/mailarchive/linux-usb-devel/2007/10/17/345922カーネルに適用されますか? (もしそうなら、それは問題を解決しますか?)

于 2008-10-09T00:57:37.460 に答える
0

商用ツールであるWinDriverを試すことができますが、無料の全機能評価があります(どういうわけか時間制限があります)。WinDriverで確認できます。問題が再現可能である場合は、デバイスまたはプロトコルの障害である可能性があります。決定または分析するのに十分な情報を提供していません。

于 2008-10-09T16:29:14.053 に答える