ウェブカメラ複合ガジェットをカーネル 2.6.37 から 2.6.32 に移植しようとしています。他のドライバーと、このバージョン用にのみコンパイルされる SDK に依存しているため、これについては選択の余地がありません。
私の考えは、イーサネット ガジェットの機能を若干の変更を加えて模倣し、少なくとも適切に読み込まれるように高速に動作させてから、ビデオ ストリーミング機能の開発に時間を費やすというものでした。
-1 デバイスのリソースがビジー状態のため、新しいドライバーを insmod できないため、すぐに行き詰まってしまいました。
私は 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 は、両方とも定義されている、composite_bind または webcam_bind のいずれかにマップされるはずです。残念ながら、どちらの関数の printk も dmesg に表示されないため、ここで何かが欠けていると思われます。
usb_gadget_register_driver
g_webcam.mod.c には表示されるので、どこかにマップされていることはわかりますが、その場所がどこなのかわかりません。