Ubuntuでカスタムカーネルをコンパイルしていますが、カーネルがファームウェアを探す場所を認識していないように見えるという問題が発生しています。Ubuntu 8.04では、ファームウェアはドライバーモジュールと同じようにカーネルバージョンに関連付けられています。たとえば、kernel 2.6.24-24-genericは、カーネルモジュールを次の場所に格納します。
/lib/modules/2.6.24-24-generic
およびそのファームウェア:
/lib/firmware/2.6.24-24-generic
「代替ビルド方法:昔ながらのDebianWay」に従って2.6.24-24-genericUbuntuカーネルをコンパイルすると、適切なモジュールディレクトリが取得され、Intelワイヤレスカード(ipw2200)などのファームウェアを必要とするデバイスを除くすべてのデバイスが機能します。モジュール)。
カーネルログは、たとえば、ipw2200がファームウェアをロードしようとすると、ファームウェアのロードを制御しているカーネルサブシステムがファームウェアを見つけられないことを示しています。
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
errno-base.hは、これを次のように定義しています。
#define ENOENT 2 /* No such file or directory */
(ENOENTを返す関数は、その前にマイナスを置きます。)
カーネルの名前が2.6.24-24-genericディレクトリを指すシンボリックリンクを/lib/firmwareに作成しようとしましたが、同じエラーが発生しました。このファームウェアは非GPLであり、Intelによって提供され、Ubuntuによってパックされています。特定のカーネルバージョンと実際に結びついているとは思いません。cmp
は、さまざまなディレクトリのバージョンが同一であることを示しています。
では、カーネルはどのようにしてファームウェアを探す場所を知るのでしょうか?
アップデート
私が抱えている問題に対するこの解決策を見つけましたが、Ubuntuが排除され/etc/hotplug.d
、ファームウェアがに保存されなくなったため、機能しなくなりました/usr/lib/hotplug/firmware
。
Update2
さらにいくつかの調査により、さらにいくつかの答えが見つかりました。のバージョン92まではudev
、プログラムfirmware_helper
はファームウェアがロードされる方法でした。93以降、udev
このプログラムは、私が知る限り同じ機能を提供するfirmware.shという名前のスクリプトに置き換えられました。これらは両方とも、ファームウェアパスをにハードコードします/lib/firmware
。Ubuntuはまだ/lib/udev/firmware_helper
バイナリを使用しているようです。
ファームウェアファイルの名前は、パスに連結されてファームウェアのロードに使用されるfirmware_helper
環境変数で渡されます。$FIRMWARE
/lib/firmware
ファームウェアをロードする実際の要求は、システムコールを介してドライバー(私の場合はipw2200)によって行われます。
request_firmware(..., "ipw2200-bss.fw", ...);
これで、ドライバーが環境変数を呼び出して確認する間のどこかでrequest_firmware
、カーネルパッケージ名がファームウェア名の前に追加されます。firmware_helper
$FIRMWARE
それで、誰がそれをしているのですか?