5

私は現在、CでLinuxカーネルモジュールを作成中です。このモジュールは、USBライト用の非常に基本的なドライバーを提供します(デバイスは3つの色付きLEDで構成されています)。ドライバーを問題なくロードおよびアンロードし、デバイス(、、など)を作成することができまし/dev/wn0/dev/wn1。ただし、デバイスに書き込もうとするとエラーが発生し続けます。

$ echo "1" >/dev/wn0
bash: echo: write error: Broken pipe

モジュールのコード全体はここにあります。ただし、興味深い部分はwn_set_color()関数です。

/* Create the data buffer to be sent to the device. */
u8 buf[8] = {
    red, green, blue, 0, 0, 0, 0x1F, 0x05
};

/* Send the data to the device. */
return usb_control_msg(udev,
                       usb_sndctrlpipe(udev, 0),
                       0, 0, 0, 0,
                       buf, 8, 0);

何らかの理由で-32、データをデバイスに送信する代わりに戻ります。

私はLinuxカーネルプログラミングにまったく慣れていないので、ばかげたことをしている可能性があります。これに少しでも光を当てることができれば、大いにありがたいです。


編集:ここにいくつかの詳細情報があります:

  • lsusb -v出力はこちら

  • クラスのbDescriptorTypeメンバーには、usb_endpoint_descriptorデバイスによって公開される単一のエンドポイントの「5」が含まれます(-または16進数)bEndpointAddress1290x81

  • これは、デバイスに送信された制御URBの1つのスクリーングラブです。

4

2 に答える 2

4

usb_control_msg()最終的にはに呼び出しますusb_submit_urb()Documentation / usb / error-codes.txtファイルには、この関数が返す可能性のあるエラーが記述されています。

-EPIPE          The pipe type specified in the URB doesn't match the
                endpoint's actual type.

usb_submit_urb()成功した場合usb_control_msg()は、値を返しurb->statusます。これは下にリストされていますEPIPE

-EPIPE (**)             Endpoint stalled.  For non-control endpoints,
                        reset this status with usb_clear_halt().

(**) This is also one of several codes that different kinds of host
controller use to indicate a transfer has failed because of device
disconnect.  In the interval before the hub driver starts disconnect
processing, devices may receive such fault reports for every request.

カーネルログのメッセージを確認しましたか?

于 2013-01-14T06:10:41.730 に答える
2

私はそれがあなたの電話に関係していると感じていますusb_sndctrlpipe。この関数の定義は次のとおりですunsigned int usb_sndctrlpipe(struct usb_device *dev, unsigned int endpoint)

デバイスポインターを適切に渡しているようですが0、コントロールエンドポイントの値を渡しますが、これはエンドポイントのアドレスではありません。最初にエンドポイントの 16 進値で定数を定義し、それを呼び出しに渡すことをお勧めします。

しかし、あなたにはもっと大きな問題があると思います。

lsusb を見ると、エンドポイントは実際には制御エンドポイントではなく、割り込みエンドポイントのようです。これにより、通信するために呼び出す必要がある関数が変更されます。たとえば、代わりにパイプを生成し (lsusb にリストされている IN エンドポイントであるため)、 の代わりに別の関数を使用するusb_sndctrlpipe必要があります。残念ながら、私が収集できることから、割り込み urbs を自動的に構築するために使用できる関数はないように思われるため、 http://www.makelinux.net/ldd3/のセクション 13.3.2.1 で説明されているように、urb 構造体を作成する必要があります。 chp-13-sect-3 . さらに悪いニュースは、(何かが欠けていない限り)唯一のエンドポイントが割り込みINであるように見えるためです。usb_rcvintpipe(struct usb_device *dev, unsigned int endpoint)usb_control_msgエンドポイントでは、デバイスからの割り込みしか受信できず、デバイスに何も送信できないように見えます。USB経由でランプの色を変更することは、デバイスでサポートされている機能であることを確かに知っていますか?

詳細については、次の URL を参照してください。

于 2013-12-13T11:13:34.683 に答える