2016-04-11 6 views
0

私はtinymixユーティリティを使用してカーネル空間の代わりに、ユーザ空間からtinymixコントロールを設定するには、カーネルからサウンドカードのノード/dev/snd/controlC0にアクセスしたい運動をしています。今私はtinymixユーティリティの流れから、実行の開始時に、内部でカーネルのsnd_ctl_open()関数を呼び出すユーザ空間からmixer_open()関数を呼び出すことがわかりました。私はカーネルから同じことをしなければなりません。同じ機能を呼び出す必要があります。私が直面している問題は、機能snd_ctl_open()が引数を持っていることですstruct inode *inode, struct file *file。だから私のモジュールのノードのinode情報をどのように入手できますか?カーネルからユーザー空間で作成されたノードにアクセスする方法は?

ファイルmixer.cexternal/tinyalsa/mixer.cでAndroidのAOSPコードの中に配置されます。 snd_ctl_open()は、Linuxカーネルのsound/core/control.cにあります。

私が言及した上で作業を行うことができますビルドカーネルAPI filp_open()の1が見つかりましたが、ファイルシステムのみマウントした後、それを使用することができます。私は、ファイルシステムがマウントされる前にノードをオープンしたい。要するに

、私の目標は、私は、ファイルシステムをマウントする前にカーネルからデバイスノードにアクセスしたり、開くことができる方法を理解することです。

+0

このインタフェースは、カーネル空間から使用されるものではありません。なぜあなたはtinymixをカーネルに移動させる必要があると思いますか? –

+0

返事をありがとう、私の目標は、カーネルからパンダボードのオーディオを有効にすることです。オーディオを有効にするには、モジュールからのサウンドパスを有効にするために、いくつかのミキサー設定を設定する必要があります。ここでミキサーの設定をするには、カーネルからデバイスノード/ dev/snd/controlC0にアクセスする必要があります。もう1つのことは、私はカーネルからtinymix自体を使いたくないということです。自分のモジュールでtinymixによって実行されたタスクを複製したいだけです。 – Hemant

+0

マシンドライバでこれを行うことができないのはなぜですか? –

答えて

0

返信いただきありがとうございます。

私は、デバイスノード/dev/controlC0だけでなく、カーネルモジュールからミキサー制御設定を設定することが可能にアクセスできるようにしています。私は以下の承認に従った。

  1. sound/core/sound.cで定義されている一つのグローバル構造「static struct snd_minor *snd_minors[SNDRV_OS_MINORS]」があります。この構造は、すべてのサウンドデバイスのマイナー番号に関する情報を持っています。
  2. デバイスのマイナー番号からデバイスノードとファイルポインタ構造を見つける方法が見つかりました。だから私がやったことは、すべてのデバイスを順番に繰り返して、SNDRV_DEVICE_TYPE_CONTROL(サウンドコントロールデバイス)デバイスタイプをチェックする私のドライバから関数find_control_device()を呼び出すことです。関数find_control_device()は、制御装置のマイナー番号を返します。
  3. デバイスのマイナー番号から、デバイスノードとファイル構造情報を取得できます。
  4. 上記の情報が得られたら、私はsnd_ctl_open()と呼んで、操作のためのデバイスノードを開きます。
  5. ユーザ空間アプリケーションは、IOCTLを使用してカーネル空間と対話します。 tinymixのミキサー設定を設定するには、snd_ctl_ioctl()関数を呼び出します。だから私は内部的にsnd_ctl_ioctl()を呼び出し、ミキサーの制御値を設定する一つのラッパー関数を作った。

私はすぐにドライバが必要なtinymixコントロールが要件ごとに設定され得ているカーネルツリーに登録につれてdriver.Soでmodule_init機能部内のすべての上記の手順を行っています。

私はIOCTLの引数を操作するためAOSPコードツリーからtinymix.cのコードを参照しています。

おかげで、

Hemant

関連する問題