Linuxカーネルオーディオドライバー

この記事では、I2S インターフェイスを例として、Linux カーネル オーディオに関する知識を紹介します。

1. 名詞の紹介

以下は、オーディオのデバッグで使用される一般的な略語です。

1. AEC (アコースティック エコー キャンセラー): エコー キャンセル。

2. AGC (自動ゲイン制御): 自動ゲイン補正、MIC 受信音量を調整します。

3. ALSA (Advanced Linux Sound Architecture): 高度な Linux サウンド アーキテクチャ。

4. ANS (自動ノイズ抑制): 背景ノイズ抑制 ANS は、背景の固定周波数ノイズを検出し、背景ノイズを除去します。

5. BCK (Bit Clock Line): デジタルオーディオデータの各ビットに対応するビットクロック。この規格はSCK(Serial Clock)、シリアルクロックと呼ばれています。 SCK=2×サンプリング周波数×サンプリングビット

6. DAI(デジタルオーディオインターフェース):デジタルオーディオインターフェース。

7. DAPM (ダイナミック オーディオ パワー マネージメント): ダイナミック パワー マネージメント。DAPM は、Linux ベースのモバイル デバイス上のオーディオ サブシステムを常に最小の電力消費状態で動作させることができます。

8. DRC (Dynamic Range Control): 動的圧縮、オーディオ出力を特定の範囲内で制御します。

9. EQ (イコライザー): サウンドの 1 つ以上の周波数帯域を増加または減衰することによって音色を調整するイコライザー。

注10. I2S(Inter-IC Sound):IC間でデジタルオーディオデータを伝送するためのインターフェース規格で、2つのデータ(左右チャンネル)をシリアル方式で伝送します。

11. LRCK (Left-Right Clock): フレーム クロック。左チャンネルと右チャンネルのデータを切り替えるために使用されます。0: 左チャンネル、1: 右チャンネル。この規格は、WS (World Select)、チャネル選択、または FS (Frame Sync)、フレーム同期と呼ばれ、LRCK の周波数 = サンプリング周波数です。

12. MCLK (マスタークロック): マスタークロック、通常 MCLK=256*LRCK。 I2S 標準の一部ではありませんが、主にアナログ/デジタル コンバータの内部動作を同期するために使用されます。

13. モノラル:モノラル。

14. OSS (オープン サウンド システム): オープン サウンド システム。

15. PCM (パルス符号変調): パルス符号変調、I2S は PCM のサブセットです。

16. ランプ: サウンドの急激な変化を避けるために、音量レベルを徐々に増減させ、音楽を一時停止または再開するために使用します。

17. ステレオ: 2 チャンネル

18. TDM (時分割多重): 時分割多重。 I2S は最大 2 チャネルのデータしか送信できませんが、TDM は最大 16 チャネルをサポートします。

2.I2Sインターフェース

I2S は、フィリップスによって定義されたデジタル オーディオ伝送規格であり、システム内の内部デバイス間のデジタル オーディオ データの伝送に使用されます。

I2S は、同じインターフェイス定義を持つ PCM のブランチです。 I2S のサンプリング レートは通常 44.1/48KHZ、PCM のサンプリング周波数は通常 8/16KHZ などです。

I2S インターフェイスには、SCK (ビット クロック)、LRCK (フレーム クロック)、SDI/SDO (データ) の 4 つの信号セットがあります。

I2S バス上では、マスター デバイスと送信デバイスは同時に 1 台だけ存在でき、マスター デバイスは送信デバイスまたは受信デバイスのいずれにもなりえます。一般的な I2S ブロック図は次のとおりです。

3. I2Sプロトコル

I2S インターフェイスの一般的なプロトコル モードには、I2S 通常モード、I2S 左揃えモード、I2S 右揃えモードなどがあります。

1.I2S通常モード

I2S 通常モードは、I2S 左揃えの特殊なケースであり、フィリップス モードとも呼ばれます。下の図はI2Sノーマルモードの波形です。

LRCK (i2s_LRCK_rx/i2s_LRCK_tx) 信号は、ローになると左チャネルを示し、ハイになると右チャネルを示します。

SD (i2s_sdo、i2s_sdi) 信号は MSB または LSB を最初に送信し、LRCK が変化した後の 1 SCLK クロック サイクルで最初のビットを送信します。

SD 信号幅の範囲は 16 ~ 32 ビットです。

2. I2S 左揃えモード

下図はI2S左揃えモードの波形です。

LRCK (i2s_LRCK_rx/i2s_LRCK_tx) 信号は、High になると左チャネルを示し、Low になると右チャネルを示します。

SD (i2s_sdo、i2s_sdi) 信号は MSB または LSB を最初に送信し、LRCK の変化と同時に最初のビットを送信します。

SD 信号幅の範囲は 16 ~ 32 ビットです。

3. I2S 右揃えモード

下図はI2S右寄せモードの波形です。

LRCK (i2s_LRCK_rx/i2s_LRCK_tx) 信号は、High になると左チャネルを示し、Low になると右チャネルを示します。

SD (i2s_sdo、i2s_sdi) 信号は、I2S の通常モードまたは左詰めモードとは異なり、MSB または LSB を最初に送信し、そのデータは LRCK 信号のエッジの最後のビットに揃えられます。

SD 信号幅の範囲は 16 ~ 32 ビットです。

その他のプロトコル形式には、PCM Early モード、PCM Late1 モード、PCM Late2 モードなどがあります。

4. ALSA フレームワーク

Linux カーネル 2.6 以降、ALSA は OSS に取って代わり、Linux カーネル オーディオ サブシステムの一部になりました。

ALSA システムには次のものが含まれます。

1. alsa-driver: alsa システムドライバー。

2. alsa-lib: alsa ライブラリ、ユーザー空間呼び出し、およびカーネル空間相互作用。

3. alsa-utils: コマンドラインツール。

4、alsa-plugin:alsa插件。

5. alsa-tools: alsa ツール。

ALSA フレームワークは次のもので構成されます。

alsa-driver の関連機能は次のとおりです (rockchip 4a ボードを例にします)。

1. コーデック: コーデックの初期化機能、制御インターフェイス、レジスタ キャッシュ、コントロール、DAPM コンポーネント、オーディオ ルーティング、バイアス電圧設定機能、その他の説明情報を含む、オーディオ チップの共通部分。

Rockchip 4A シングルボード、コーデックは ES8316 チップを使用、このチップの dts 構成は次のとおりです。

2. コーデック DAI: クロック構成、フォーマット構成、機能の説明などを含む、コーデックに関するオーディオ インターフェイス ドライバーの説明。

コーデック DAI 関連の実装は次のとおりです。

3. CPU DAI: SoC の I2S および PCM バス コントローラーを指します。I2S tx FIFO からコーデックへのオーディオ データの転送を担当します。

RK3399 CPU DAI の dts 関連の構成は次のとおりです。

4. DAI リンク: オーディオ データ リンク。リンクで使用されるコーデック、codec_dai、cpu_dai、およびプラットフォームを指定します。

Linux 4.4 カーネルは、サウンド カードを作成する 2 つの方法をサポートしています: 1 つは一般的なシンプル カード フレームワークで、もう 1 つは従来のカスタム マシン ドライバーの作成です。

シンプル カードはシンプルで汎用性の高いマシン ドライバーです。シンプル カード フレームワークでニーズを満たすのに十分な場合は、最初にシンプル カード フレームワークを選択できます。

DAI Link の dts 関連の設定は次のとおりです。

DAI リンクの関連実装は次のとおりです。

5. DAPM: 動的電源管理は、対応する改良された kcontrol フレームワークに基づいており、対応する電源管理メカニズムを追加します。ウィジェットは DAPM の基本単位です。

コーデック (es8316) での kcontrol、dapm ウィジェット、および dapm ルートの関連実装は次のとおりです。

6. DMA: dma バッファ内のオーディオ データを I2S tx FIFO に転送します。

5. デバッグコマンド

ALSA は Linux がオーディオを処理するための基本的なインターフェイスですが、ALSA は基本的なインターフェイスのみを提供しており、操作は比較的複雑です。通常の状況では、付属の utils ツール セットを直接使用できます。utils ツール セットはいくつかのカプセル化された機能モジュールですコマンドを直接使用することができ、ユーザーは関連するコマンドとパラメータを入力するだけでオーディオ操作機能を実現できます。

1. サウンドカード情報を確認する

root@xiaotianbsp:~# cat /proc/asound/cards
 0 [rockchipes8316c]:rockchip_es8316 - ロックチップ、es8316-コーデック
                      ロックチップ、 es8316-codec
 1 [HDMICODEC ]: HDMI-CODEC - HDMI-CODEC
                      HDMI-CODEC
root@xiaotianbsp:~ # ls -l /dev/snd/
total 0
drwxr-xr-x 2 root root 80 8月 16 日 14:43 バイパス
crw-rw----+ 1 ルート オーディオ 116、2 8 月 16 日 14:43 controlC0
crw-rw----+ 1 ルート オーディオ 116、5 8 月 16 日14:43 controlC1
crw-rw----+ 1 ルート オーディオ 116、4 8 月 16 日 14:43 pcmC0D0c
crw-rw----+ 1 ルート オーディオ 116、3 8 月 16 日 14:43 pcmC0D0p
crw-rw----+ 1 ルート オーディオ 116、6 8 月 16 日 14:43 pcmC1D0p
 crw-rw----+ 1 ルート オーディオ 116、1 8 月 16 日 14:43 seq
crw-rw----+ 1 ルート オーディオ 116、33 8 月 16 日 14:43 timer< /span>

controlCx: 登録されたサウンド カードを管理し、既存のサウンド カードをクエリするための柔軟な方法を提供する制御インターフェイス。

pcmCxDxc: PCM インターフェース、録音機器に対応。

pcmCxDxp: 再生デバイスに対応する PCM インターフェイス。

タイマー: サウンド同期イベントをサポートし、サウンド カードにタイマーを提供します。

seq: シーケンサー インターフェイス。オリジナルの MIDI インターフェイスよりも高度な、MIDI プログラミングとサウンド同期のための高レベルのインターフェイスです。

2. サウンドカードの収集と再生 PCM 情報を確認します。

root@xiaotianbsp:~# cat /proc/asound/pcm
00-00: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 : : 再生 1 : キャプチャ 1 a>
01-00: ff8a0000.i2s-i2s-hifi i2s-hifi-0 : : 再生 1

3. ALSA ドライバーのバージョンを確認する

root@xiaotianbsp:~# cat /proc/asound/version
Advanced Linux サウンド アーキテクチャ ドライバ バージョン k4.4.154-90-rockchip-ga14f6502e045.

4. サウンドカード0の情報を確認する

root@xiaotianbsp:~# cat /proc/asound/card0/pcm0p/sub0/status
終了

5. レジスタの表示

## regmap 名
root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/name
es8316< /span>
0c: 0000000008: 00033f3f04: 0000000f00: 0000000froot@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/registers## rk3399 i2s0制御制器寄存器 rockchip-i2sroot@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/name
14: 01f0000018: XXXXXXXX1c: 0000000020: XXXXXXXX28: 00000000 ## es8316 寄存器ルート@xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/registers00: c001: f302: 0803: 2004: 1105: 0006: 1107: 0008: 0009: 040a : 0c0b: 0c0c: ff0d: 3f0e: ff 0f: ff10: 1111: fc12: 2818:0017:0016:0015:3314:0013:00








































6.時計を確認する

## 取样率44.1KHZ,mclk = 256 * サンプル = 256*44.1*1000 = 11289600 HZ
root@xiaotianbsp:~# cat /sys/kernel/debug/clk /clk_summary | grep i2s0
          clk_i2s0_div 1 1 800000000 0 0
             clk_i2s0_frac 1 1 11289600 0 0
                clk_i2s0_mux 1 1 11289600 0 0
                hclk_i2s0 1 2 100000000 0 0                   clk_i2s0 1 2 11289600 0 0

7. amixerコマンド

root@xiaotianbsp:~# amixer -h
使用法: amixer <options> [コマンド]
利用可能なオプション:  -h,--help このヘルプ  -c,--card N カードを選択します  -D,--device N デバイスを選択します、デフォルト 'default'  - d,--debug デバッグ モード  -n,--nocheck 範囲チェックを実行しません  -v,--version このプログラムのバージョンを表示します  cget cID 1 つのコントロールのコントロール内容を取得  cset cID P 1 つのコントロールのコントロール内容を設定  content すべてのコントロールのコンテンツを表示する指定されたカードについて  コントロール 指定されたカードのすべてのコントロールを表示する  sget sID 1 つのミキサーのコンテンツを取得する シンプルなコントロール  sset sID P 1 つのミキサー シンプル の内容を設定しますcontrol  scontents すべてのミキサー シンプル コントロールの内容を表示します (デフォルト コマンド)  scontrols すべてのミキサー シンプル コントロールを表示します使用可能なコマンド:  -M,--mapped-volume マップされたボリュームを使用します  -R,--raw-volume 生の値を使用します(デフォルト)  -s,--stdin 標準入力からコマンドを順番に読み取って実行します  -a,--abstract L select抽象化レベル (なしまたは基本)  -i,--inactive 非アクティブなコントロールも表示します  -q,--quit 静かにしてください






















7.1 カード0のコンテンツを表示する

root@xiaotianbsp:~# amixer -c 0 内容
numid=16,iface=MIXER,name='ADC ダブル FS モード' 
  ; type=BOOLEAN,access=rw------,values=1
  :values=off
numid=14,iface=MIXER,name=& #39;ADC ソフト ランプ'
  ; type=BOOLEAN,access=rw------,values=1
  :values=on
numid=13,iface=MIXER,name=& #39;ADC キャプチャ ボリューム'
  ; type=INTEGER、access=rw---R--、values=1、min=0、max=192、step=0
  : value=192
  | dBscale-min=-96.00dB、step=0.50dB、mute=1
numid=15、iface=MIXER、name='キャプチャ極性'
  ; type=ENUMERATED、access=rw------、values=1、items=2
  ;アイテム #0 「通常」
  ;アイテム #1 '反転'
  : 値=0

7.2 特定の numid コマンドの表示と設定

## 查看
root@xiaotianbsp:~# amixer -c 0 cget numid=16
numid=16,iface=MIXER,name= 「ADC ダブル FS モード」
  ; type=BOOLEAN,access=rw------,values=1
  :values=off
## 配置root@xiaotianbsp:~# amixer -c 0 cset numid=16 onnumid=16,iface=MIXER,name='ADC ダブル FS モード'   ; type=BOOLEAN、access=rw------、values=1  : value=on  




8. デバイス名

root@xiaotianbsp:~# aplay -l
**** 再生ハードウェア デバイスのリスト ****
カード 0: Rockchipes8316c [ Rockchip,es8316-codec]、デバイス 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 []
  サブデバイス: 1/1
  サブデバイス #0: サブデバイス#0
カード 1: HDMICODEC [HDMI-CODEC]、デバイス 0: ff8a0000.i2s-i2s-hifi i2s-hifi-0 []
  サブデバイス: 1 /1
  サブデバイス #0: サブデバイス #0
root@linaro-alip:~# arecord -l
*** * CAPTURE ハードウェア デバイスのリスト ****
カード 0: Rockchipes8316c [rockchip,es8316-codec]、デバイス 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 [] 
  サブデバイス: 1/1
  サブデバイス #0: サブデバイス #0

9、放音

aplay -D hw:0,0 -r 44100 -c 2 -f s16_le play.wav

10. 録音

arecord -D hw:0,0 -r 16000 -c 1 -f s16_le レコード.wav

-D: 再生デバイス、aplay -l または arecord -l でリストされたデバイス名

-r: サンプリングレート

-c: オーディオ ファイル チャンネル

-f: サンプリング形式。一般的に使用される形式は S16_LE、S24_LE、S32_LE、cd (無視できます)

tinymix、tinypcminfo、tinyplay、tinycap などの tinyalsa コマンドの使用法も参照できます。

11.mp3をwavに変換

ラメ test.mp3 test.wav --decode
SenseTime 創設者、Tang Xiaoou 氏が 55 歳で死去 2023 年、PHP は停滞 Wi-Fi 7 が完全に利用可能になる2024 年初頭にデビュー、Wi-Fi 6 の 5 倍高速 Hongmeng システムが独立しつつあり、多くの大学が「Hongmeng クラス」を設立 Zhihui Jun の新興企業が借り換え、金額は 6 億元を超え、事前評価額は 35 億元 Quark Browser PC 版が内部テストを開始 AI コード アシスタントは人気があり、プログラミング言語のランキングはすべてです できることは何もありません Mate 60 Pro の 5G モデムと無線周波数技術ははるかに先を行っています MariaDB が SkySQL を分割し、確立されました独立した企業として<​​/span> Xiaomi、Yu Chengdong 氏の Huawei からの「キールピボット」盗作声明に対応
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4702401/blog/10322015