Webカメラ複合ガジェットをカーネル2.6.37から2.6.32に移植しようとしています。私はこのバージョン用にコンパイルされた他のドライバとSDKに依存しているので、これには選択肢はありません。
私の考えは、イーサネットガジェットの機能をエミュレートし、わずかな変更を加えてすばやく機能し、少なくとも正しく読み込んだ後、ビデオストリーミング機能に時間を費やすことでした。
-1 デバイスリソースが使用中で、新しいドライバを修正できないため、問題が早く発生しました。
私はもっと深く掘り下げて、何が起こっているのかを調べるためにprintkを使ってみました。
主な初期化は次のとおりです。
module_init(webcam_init)
webcam_init()
usb_composite_register(&webcam_driver)
usb_gadget_register_driver(&composite_driver)
これらの関数は次のように定義されます。
static struct usb_composite_driver webcam_driver = {
.name = "g_webcam",
.dev = &webcam_device_descriptor,
.strings = webcam_device_strings,
.bind = webcam_bind,
.unbind = webcam_unbind,
};
static int __init
webcam_init(void)
{
return usb_composite_register(&webcam_driver);
}
int __init usb_composite_register(struct usb_composite_driver *driver)
{
if (!driver || !driver->dev || !driver->bind || composite)
return -EINVAL;
if (!driver->name)
driver->name = "composite";
composite_driver.function = (char *) driver->name;
composite_driver.driver.name = driver->name;
composite = driver;
return usb_gadget_register_driver(&composite_driver);
}
usb_gadget_register_driver のマニュアルページはこれを示しています
ガジェットドライバのモジュール初期化関数でこの関数を呼び出して、ドライバの基本的なUSBコントローラドライバ情報を通知します。この登録呼び出しが返される前に、ドライバのバインディング関数が呼び出され、それをガジェットにバインドします。バインドされた関数はinitセクションに配置されると予想されます。この関数は、スリープモードが可能なコンテキストで呼び出される必要があります。
usb_gadget_register_driverがcomplex_bindまたはwebcam_bindにマッピングされると予想しましたが、両方が定義されました。残念ながら、これら2つの関数のprintksはdmesgにまったく表示されないので、ここに何かが欠けているようです。
usb_gadget_register_driver
g_webcam.mod.cに表示され、どこかにマップされていることをお知らせしますが、その場所に行くことはできません!