Linux-Kernel-Audiotreiber

In diesem Artikel wird die I2S-Schnittstelle als Beispiel verwendet, um Kenntnisse im Zusammenhang mit Linux-Kernel-Audio einzuführen.

1. Einführung in Substantive

Im Folgenden finden Sie gebräuchliche Abkürzungen, die beim Audio-Debugging verwendet werden.

1. AEC (Acoustic Echo Cancellor): Echounterdrückung.

2. AGC (Automatic Gain Control): automatische Verstärkungskompensation, Anpassung der MIC-Empfangslautstärke.

3. ALSA (Advanced Linux Sound Architecture): Erweiterte Linux Sound-Architektur.

4. ANS (Automatische Geräuschunterdrückung): Unterdrückung von Hintergrundgeräuschen. ANS kann Hintergrundgeräusche mit fester Frequenz erkennen und Hintergrundgeräusche beseitigen.

5. BCK (Bit Clock Line): Bittakt, entsprechend jedem Bit digitaler Audiodaten. Der Standard heißt SCK (Serial Clock), serielle Uhr. SCK=2xAbtastfrequenzxAbtastbits

6. DAI (Digital Audio Interface): digitale Audioschnittstelle.

7. DAPM (Dynamic Audio Power Management): Durch die dynamische Energieverwaltung kann DAPM dafür sorgen, dass das Audio-Subsystem auf Linux-basierten Mobilgeräten jederzeit im Zustand mit minimalem Stromverbrauch arbeitet.

8. DRC (Dynamic Range Control): Dynamische Komprimierung, die die Audioausgabe innerhalb eines bestimmten Bereichs steuert.

9. EQ (Equalizer): Ein Equalizer, der die Klangfarbe durch Verstärkung oder Abschwächung eines oder mehrerer Frequenzbänder des Klangs anpasst.

10. I2S (Inter-IC Sound): Ein Schnittstellenstandard zur Übertragung digitaler Audiodaten zwischen ICs. Er verwendet eine serielle Methode zur Übertragung von 2 Datensätzen (linker und rechter Kanal).

11. LRCK (Links-Rechts-Takt): Rahmentakt, der zum Umschalten der Daten des linken und rechten Kanals verwendet wird, 0: linker Kanal; 1: rechter Kanal. Der Standard heißt WS (World Select), Kanalauswahl; oder FS (Frame Sync), Rahmensynchronisation; die Frequenz von LRCK = Abtastfrequenz.

12. MCLK (Master Clock): Master Clock, im Allgemeinen MCLK = 256 * LRCK. Es ist nicht Teil des I2S-Standards und wird hauptsächlich zur Synchronisierung des internen Betriebs von Analog/Digital-Wandlern verwendet.

13. Mono: Mono.

14. OSS (Open Sound System): Offenes Soundsystem.

15. PCM (Pulse Code Modulation): Pulse Code Modulation, I2S ist eine Teilmenge von PCM.

16. Rampe: Erhöhen oder verringern Sie die Lautstärke schrittweise, um schnelle Klangänderungen zu vermeiden. Wird zum Anhalten oder Fortsetzen der Musik verwendet.

17. Stereo: Zweikanal

18. TDM (Time Division Multiplexing): Zeitmultiplex. I2S kann nur bis zu 2 Datenkanäle übertragen und TDM unterstützt bis zu 16 Kanäle.

2. I2S-Schnittstelle

I2S ist ein von Philips definierter digitaler Audioübertragungsstandard, der für die Übertragung digitaler Audiodaten zwischen internen Geräten im System verwendet wird.

I2S ist ein Zweig von PCM mit derselben Schnittstellendefinition. Die Abtastrate von I2S beträgt im Allgemeinen 44,1/48 kHz und die Abtastfrequenz von PCM beträgt im Allgemeinen 8/16 kHz usw.

Die I2S-Schnittstelle verfügt über 4 Signalsätze: SCK (Bit-Takt), LRCK (Frame-Takt), SDI/SDO (Daten).

Auf dem I2S-Bus kann gleichzeitig nur ein Master-Gerät und ein Sendegerät vorhanden sein. Das Master-Gerät kann ein Sendegerät oder ein Empfangsgerät sein. Das allgemeine I2S-Blockdiagramm sieht wie folgt aus:

3. I2S-Protokoll

Zu den gängigen Protokollmodi der I2S-Schnittstelle gehören: I2S-Normalmodus, linksbündiger I2S-Modus, rechtsbündiger I2S-Modus usw.

1. I2S-Normalmodus

Der I2S-Normalmodus ist ein Sonderfall der I2S-Linksausrichtung, auch Philips-Modus genannt. Das Bild unten zeigt die Wellenform des I2S-Normalmodus.

Das LRCK-Signal (i2s_LRCK_rx/i2s_LRCK_tx) wird niedrig, um den linken Kanal anzuzeigen, und wird hoch, um den rechten Kanal anzuzeigen.

Das SD-Signal (i2s_sdo, i2s_sdi) überträgt zuerst das MSB oder LSB und sendet das erste Bit in einem SCLK-Taktzyklus, nachdem sich LRCK ändert.

Die SD-Signalbreite reicht von 16 bis 32 Bit.

2. I2S linksbündiger Modus

Die folgende Abbildung zeigt die Wellenform des linksbündigen I2S-Modus.

Das LRCK-Signal (i2s_LRCK_rx/i2s_LRCK_tx) wird hoch, um den linken Kanal anzuzeigen, und wird niedrig, um den rechten Kanal anzuzeigen.

Das SD-Signal (i2s_sdo, i2s_sdi) überträgt zuerst das MSB oder LSB und sendet das erste Bit gleichzeitig mit den Änderungen von LRCK.

Die SD-Signalbreite reicht von 16 bis 32 Bit.

3. I2S rechtsbündiger Modus

Die folgende Abbildung zeigt die Wellenform des rechtsbündigen I2S-Modus.

Das LRCK-Signal (i2s_LRCK_rx/i2s_LRCK_tx) geht hoch, um den linken Kanal anzuzeigen, und geht niedrig, um den rechten Kanal anzuzeigen.

Das SD-Signal (i2s_sdo, i2s_sdi) überträgt zuerst MSB oder LSB, im Gegensatz zum normalen oder linksbündigen I2S-Modus werden seine Daten mit dem letzten Bit an der Flanke des LRCK-Signals ausgerichtet.

Die SD-Signalbreite reicht von 16 bis 32 Bit.

Zu den weiteren Protokollformaten gehören: PCM Early Mode, PCM Late1 Mode und PCM Late2 Mode usw.

4. ALSA-Framework

Nach dem Linux-Kernel 2.6 ersetzte ALSA OSS und wurde Teil des Linux-Kernel-Audio-Subsystems.

Das ALSA-System umfasst:

1. alsa-driver: Alsa-Systemtreiber.

2. alsa-lib: Alsa-Bibliothek, User-Space-Aufruf und Kernel-Space-Interaktion.

3. alsa-utils: Befehlszeilentool.

4, alsa-plugin: alsa-Rezension.

5. Alsa-Tools: Alsa-Tools.

Das ALSA-Framework besteht aus Folgendem:

Die relevanten Funktionen im Alsa-Treiber sind wie folgt (am Beispiel der Rockchip 4a-Karte):

1. Codec: Gemeinsame Teile von Audio-Chips, einschließlich Codec-Initialisierungsfunktion, Steuerschnittstelle, Register-Cache, Steuerung, Dapm-Komponenten, Audio-Routing, Vorspannungseinstellungsfunktion und andere Beschreibungsinformationen.

Rockchip 4A-Einzelplatine, Codec verwendet ES8316-Chip, die DTS-Konfiguration dieses Chips ist wie folgt:

2. Codec DAI: Beschreibung des Audioschnittstellentreibers zum Codec, einschließlich: Taktkonfiguration, Formatkonfiguration, Funktionsbeschreibung usw.

Codec-DAI-bezogene Implementierungen sind wie folgt:

3. CPU DAI: Bezieht sich auf den I2S- und PCM-Buscontroller des SoC, der für die Übertragung von Audiodaten vom I2S-TX-FIFO zum Codec verantwortlich ist.

Die dts-bezogene Konfiguration der RK3399 CPU DAI lautet wie folgt:

4. DAI-Link: Audiodatenlink, der den im Link verwendeten Codec, codec_dai, cpu_dai und die Plattform angibt.

Der Linux 4.4-Kernel unterstützt zwei Möglichkeiten zum Erstellen einer Soundkarte: Zum einen das allgemeine Simple-Card-Framework und zum anderen die herkömmliche Erstellung eines benutzerdefinierten Maschinentreibers.

Simple Card ist ein einfacher und vielseitiger Maschinentreiber. Wenn das Simple-Card-Framework ausreicht, um Ihre Anforderungen zu erfüllen, können Sie zuerst das Simple-Card-Framework auswählen.

Die dts-bezogene Konfiguration von DAI Link lautet wie folgt:

Die relevante Implementierung von DAI Link lautet wie folgt:

5. DAPM: Die dynamische Energieverwaltung basiert auf dem entsprechenden verbesserten Framework von kcontrol und fügt entsprechende Energieverwaltungsmechanismen hinzu. Widget ist die Grundeinheit von DAPM.

Die relevanten Implementierungen von kcontrol, dapm widget und dapm Routen im Codec (es8316) sind wie folgt:

6. DMA: Verantwortlich für die Übertragung der Audiodaten im DMA-Puffer an den I2S-TX-FIFO.

5. Debugging-Befehle

ALSA ist die Basisschnittstelle für Linux zur Audioverarbeitung, ALSA bietet jedoch nur grundlegende Schnittstellen und die Bedienung ist relativ kompliziert. Unter normalen Umständen können Sie das mitgelieferte Utils-Toolset direkt verwenden. Das Utils-Toolset besteht aus einigen gekapselten Funktionsmodulen . Sie können den bereitgestellten Befehl direkt verwenden, sodass Benutzer nur relevante Befehle und Parameter eingeben müssen, um die Audio-Bedienfunktion zu realisieren.

1. Überprüfen Sie die Soundkarteninformationen

root@xiaotianbsp:~# cat /proc/asound/cards
 0 [rockchipes8316c]: rockchip_es8316 - rockchip,es8316-codec
                      rockchip, 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 Aug 16 14:43 by-path 
crw-rw----+ 1 root audio 116, 2. Aug. 16 14:43 controlC0
crw-rw----+ 1 root audio 116, 5. Aug. 16 14:43 controlC1
crw-rw----+ 1 root audio 116, 4. August 16 14:43 pcmC0D0c
crw-rw----+ 1 Root-Audio 116, 3. Aug. 16 14:43 pcmC0D0p
crw-rw----+ 1 Root-Audio 116, 6. Aug. 16 14:43 pcmC1D0p
 crw-rw----+ 1 Root-Audio 116, 1. Aug. 16 14:43 seq
crw-rw----+ 1 Root-Audio 116, 33. Aug. 16 14:43 Timer< /span>

controlCx: Steuerschnittstelle, die eine flexible Möglichkeit bietet, registrierte Soundkarten zu verwalten und vorhandene Soundkarten abzufragen.

pcmCxDxc: PCM-Schnittstelle, entsprechend dem Aufnahmegerät.

pcmCxDxp: PCM-Schnittstelle, entsprechend dem Wiedergabegerät.

Timer: Unterstützt Soundsynchronisierungsereignisse, um Timer auf der Soundkarte bereitzustellen.

seq: Sequenzer-Schnittstelle, eine High-Level-Schnittstelle für MIDI-Programmierung und Klangsynchronisation, die fortschrittlicher ist als die ursprüngliche MIDI-Schnittstelle.

2. Überprüfen Sie die Sammlung und Wiedergabe der PCM-Informationen der Soundkarte

root@xiaotianbsp:~# cat /proc/asound/pcm
00-00: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 : : Wiedergabe 1 : Aufnahme 1
01-00: ff8a0000.i2s-i2s-hifi i2s-hifi-0 : : Wiedergabe 1

3. Überprüfen Sie die ALSA-Treiberversion

root@xiaotianbsp:~# cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version k4.4.154-90-rockchip-ga14f6502e045.

4. Überprüfen Sie die Informationen der Soundkarte 0

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

5. Register anzeigen

## regmap名称
root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/name
es8316< /span>
12: 2818:0017:0016: 0015: 3314: 0013: 0011: fc10: 110f: ff0e: ff 0d: 3f0c: ff0b: 0c0a : 0c09: 0408: 0007: 0006: 1105: 0004: 1103: 2002: 0801: f300: c0root @xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/registers## es8316寄存器28: 0000000020: XXXXXXXX1c: 0000000018: XXXXXXXX14: 01f00000root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/registers0c: 0000000008: 00033f3f04: 0000000f00: 0000000f## rk3399 i2s0控制器寄存器rockchip-i2sroot@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/name









































6. Überprüfen Sie die Uhr

## 采样率44.1KHZ,mclk = 256 * sample = 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-Befehl

root@xiaotianbsp:~# amixer -h
Verwendung: amixer <options> [Befehl]
Verfügbare Optionen:  -h,--help       diese Hilfe  -c,--card N     Karte auswählen  -D,--device N   Gerät auswählen, Standard 'default'  - d,--debug     Debug-Modus  -n,--nocheck   keine Bereichsprüfung durchführen  -v,--version   Druckversion dieses Programms  cget cID       Steuerinhalte für ein Steuerelement abrufen  cset cID P     Steuerinhalte für ein Steuerelement festlegen  Inhalte       Inhalte aller Steuerelemente anzeigen für gegebene Karte  Steuerelemente       Alle Steuerelemente für eine bestimmte Karte anzeigen  sget sID       Inhalte für einen Mixer abrufen Einfache Steuerung  sset sID P     Inhalte für einen einfachen Mixer festlegen Steuerelement  scontents       Inhalte aller einfachen Mixer-Steuerelemente anzeigen (Standardbefehl)  scontrols       alle einfachen Mixer-Steuerelemente anzeigenVerfügbare Befehle:  -M,--mapped-volume Verwenden Sie das zugeordnete Volume  -R,--raw-volume Den Rohwert verwenden (Standard)  -s,--stdin     Befehle von stdin nacheinander lesen und ausführen  -a,--abstract L auswählen Abstraktionsebene (keine oder einfach)  -i,--inactive   auch inaktive Steuerelemente anzeigen  -q,--quiet     ruhig sein






















7.1 Inhalt von Karte0 anzeigen

root@xiaotianbsp:~# amixer -c 0 content
numid=16,iface=MIXER,name='ADC Double FS Mode' 
  ; type=BOOLEAN,access=rw------,values=1
  : Values=off
numid=14,iface=MIXER,name=& #39;ADC Soft Ramp'
  ; type=BOOLEAN,access=rw------,values=1
  : Values=on
numid=13,iface=MIXER,name=& #39;ADC Capture Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=192,step=0
  : Werte=192
  | dBscale-min=-96.00dB,step=0.50dB,mute=1
numid=15,iface=MIXER,name='Capture Polarity'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Element #0 'Normal'
  ; Element #1 'Invertieren'
  : Werte=0

7.2 Einen bestimmten Numid-Befehl anzeigen und konfigurieren

## 查看
root@xiaotianbsp:~# amixer -c 0 cget numid=16
numid=16,iface=MIXER,name= 'ADC Double FS Mode'
  ; type=BOOLEAN,access=rw------,values=1
  :values=off
## 配置root@xiaotianbsp:~# amixer -c 0 cset numid=16 onnumid=16,iface=MIXER,name='ADC Double FS Mode'   ; type=BOOLEAN,access=rw------,values=1  : value=on  




8. Gerätename

root@xiaotianbsp:~# aplay -l
**** Liste der WIEDERGABE-Hardwaregeräte ****
Karte 0: rockchipes8316c [ rockchip,es8316-codec], Gerät 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 []
  Untergeräte: 1/1
  Untergerät #0: Untergerät #0
Karte 1: HDMICODEC [HDMI-CODEC], Gerät 0: ff8a0000.i2s-i2s-hifi i2s-hifi-0 []
  Untergeräte: 1 /1
  Subdevice #0: subdevice #0
root@linaro-alip:~# arecord -l
*** * Liste der CAPTURE-Hardwaregeräte ****
Karte 0: rockchipes8316c [rockchip,es8316-codec], Gerät 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 [] 
  Untergeräte: 1/1
  Untergerät Nr. 0: Untergerät Nr. 0

9, Schallemission

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

10. Aufnahme

arecord -D hw:0,0 -r 16000 -c 1 -f s16_le record.wav

-D: Wiedergabegerät, der von aplay -l oder arecord -l aufgelistete Gerätename

-r: Abtastrate

-c: Audiodateikanal

-f: Sampling-Format, häufig verwendete Formate sind S16_LE, S24_LE, S32_LE, cd (kann ignoriert werden)

Sie können sich auch auf die Verwendung von Tinyalsa-Befehlen wie Tinymix, Tinypcminfo, Tinyplay und Tinycap beziehen.

11. Konvertieren Sie MP3 in WAV

lame test.mp3 test.wav --decode
Tang Xiaoou, Gründer von SenseTime, ist im Alter von 55 Jahren verstorben Im Jahr 2023 stagniert PHP Wi-Fi 7 wird vollständig verfügbar sein Anfang 2024 Debüt, fünfmal schneller als Wi-Fi 6 Das Hongmeng-System steht kurz vor der Unabhängigkeit und viele Universitäten haben „Hongmeng-Klassen“ eingerichtet Zhihui Das Startup-Unternehmen von Jun refinanziert sich, der Betrag übersteigt 600 Millionen Yuan und die Pre-Money-Bewertung beträgt 3,5 Milliarden Yuan Quark Browser PC-Version startet interne Tests KI-Code-Assistent ist beliebt, und Programmiersprachen-Rankings sind alle Es gibt nichts, was Sie tun können Das 5G-Modem und die Hochfrequenztechnologie des Mate 60 Pro liegen weit vorne MariaDB spaltet SkySQL auf und etabliert sich als unabhängiges Unternehmen Xiaomi antwortet auf Yu Chengdongs „Keel Pivot“-Plagiatsaussage von Huawei
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/4702401/blog/10322015
Recomendado
Clasificación