デバイスドライバとは!Hardware を駆動させるプログラムである。
というのはまぁ常識なんですが、性格には Hardware を駆動させるプログラム、すなわちHWのレジスタを直接操作するコード郡と、Kernel の UpperLayer からデータや制御コードを受け取ることが重要です。というか、UpperLayer からあれこれもらわないと、ドライバだけ存在してもなーんも意味がありません。
オーディオデバイスのドライバーは、UserLand からの音声データを Kernel に中継してもらって、受け取らないといけないわけです。
でだ、ドライバは 「わっちは、オーディオデータ受け取れるですぜ、だんな」 と宣言してオーディオドライバとして動くわけですよ。ドライバの Attach 関連の処理って、config_found() を使うんですが、こいつはまぁ関数ポインタ使いまくりなので、追いかけるのが大変。
ちうわけで、オーディオドライバーの Attach 関連で分かってることをつれずれと。
まず、ドライバがオーディオに Attach する API が audio_attach_mi()
プロトタイプはこんなの
device_t audio_attach_mi(const struct audio_hw_if *, void *, device_t);
構造体 audio_hw_if が特徴ですな。ここから、Attach 処理の実体 audioattach() までの呼び出しがこんな感じ
device_t audio_attach_mi(const struct audio_hw_if *, void *, device_t);
device_t config_found(device_t, void *, cfprint_t);
device_t config_attach_loc(device_t, cfdata_t, const int *, void *, cfprint_t);
void audioattach(device_t, device_t, void *);
先ほどの audio_hw_if は、audioattach() 関数内で hwp = sa->hwif として、hwp 変数に受け渡される。
Attach 処理がうまくいかないときは、この hwp を追いかけるといいようだ。
コメントする