7.1 Advanced Linux Sound Architecture (ALSA) System on a Chip (ASoC) Sound
7.1.1 ALSA Sound Driver Introduction
현재 Linux 시스템에서 가장 널리 사용되는 아키텍처인 Advanced Linux Sound Architecture(ALSA)는 Linux 운영 체제에 오디오와 MIDI 기능을 제공한다.
ALSA에는 아래와 같은 주요 기능이 있다:
- 일반적인 사운드 카드에서 전문적인 다증 채널 오디오 인터페이스에 이르기까지, 모든 유형의 오디오 인터페이스를 효율적으로 지원한다.
- 완전하게 모듈화된 사운드 드라이버.
- SMP와 스레드에 안전한 디자인.
- 사용자 공간 라이브러리(alsa-lib)는 애플리케이션 프로그래밍을 단순화하고 더 높은 레벨의 기능을 제공한다.
- 이전 Open Sound System (OSS) API를 지원하여, 대부분의 OSS 프로그램에 대한 바이너리 호환성을 제공한다.
ALSA System on Chip(ASoC) 레이어는 SoC 오디오를 위해 디자인되어 있다. ASoC 레이어의 전반적인 프로젝트 목표는 임베디드 시스템 온 칩 프로세서와 휴대용 오디오 CODEC에 대한 향상된 ALSA 지원을 제공한다.
ASoC 레이어는 아래와 같은 기능도 제공한다:
- CODEC 독립성. 다른 플랫폼과 머신에서 CODEC 드라이버를 재사용할 수 있다.
- CODEC과 SoC 사이의 손쉬운 I2S/PCM 오디오 인터페이스를 설정한다. 각 SoC 인터페이스와 CODEC은 오디오 인터페이스 기능을 코어에 등록한다.
- Dynamic Audio Power Management(DAPM). DAPM은 어떤 오디오 사용 사례가 활성화되든 오디오 서브 시스템의 전력 소비를 최소화하도록 설계된 ASoC 기술이다. DAPM은 항상 낮은 오디오의 전원 상태를 보장하고 사용자 공간 오디오 컴포넌트에 완전히 투명하다. DAPM은 모바일 디바이스나 복잡한 오디오 요구 사항이 있는 디바이스에 이상적이다.
- 소음(pop and click) 감소. 올바른 순서(디지털 음소거 사용을 포함)로 CODEC의 전원을 켜고 끄면 소음(pop and click)을 줄일 수 있다. ASoC는 전원 상태를 변경할 때 CODEC에 시그널을 보낸다.
- 머신별 컨트롤. 머신이 사운드 카드에 컨트롤(예: 스피커 앰프의 볼륨 컨트롤)을 추가하도록 허용한다.
ASoC는 기본적으로 임베디드 오디오 시스템을 3가지 컴포넌트로 나눈다:
- Machine 드라이버 - 재생 시작시 외부 앰프를 켜는 것과 같은 모든 머신별 컨트롤과 오디오 이벤트를 처리한다.
- Platform 드라이버 - 해당 플랫폼에 대한 오디오 DMA 엔진과 오디오 인터페이스 드라이버(예: I2S, AC97, PCM)를 포함한다.
- CODEC 드라이버 - 플랫폼에 독립적이고 오디오 컨트롤, 오디오 인터페이스 기능, CODEC DAPM 정의 그리고 CODEC I/O 기능을 포함한다.
ASoC에 대한 자세한 정보는 linux/Documentation/sound/alsa/soc와 www.alsa-project.org/main/index.php/ASoC에 있는 Linux OS 소스 트리의 Linux 커널 문서에서 찾을 수 있다.
7.1.2 SoC Sound Card
현재, 스테레오 CODEC (WM8958, WM8960, WM8962, and WM8524), 7.1 CODEC (cs42888)와 AM/FM CODEC (si4763) 드라이버는 ASoC 아키텍처를 사용하여 구현되어 있다.
이러한 사운드 카드 드라이버는 독립적으로 내장되어 있다. 스테레오 사운드 카드는 스테레오 재생과 캡처를 지원한다. 7.1 사운드 카드는 최대 8개의 오디오 채널 재생을 지원한다. ASRC를 활성화하는동안, 7.1 사운드 카드는 2채널이나 6채널 오디오 재생만 지원한다. AM/FM 사운드 카드는 라디오 PCM 캡처를 지원한다.
참고:
7.1 CODEC은 i.MX 6Quad와 i.MX 6Solo SABRE Auto 플랫폼에서만 지원된다.
AM/FM CODEC은 i.MX 6Quad와 i.MX 6Solo SABRE Auto 플랫폼에서만 지원된다.
7.1.2.1 Stereo CODEC Features
스테레오 CODEC은 아래 기능을 지원한다:
- 재생과 캡처의 샘플 속도는 8 KHz, 32 KHz, 44.1 KHz, 48 KHz 그리고 96KHz 이다.
- 채널:
- 재생: 2채널 지원
- 캡처: 2채널 지원
- 오디오 형식:
- 재생:
- SNDRV_PCM_FMTBIT_S16_LE
- SNDRV_PCM_FMTBIT_S20_3LE
- SNDRV_PCM_FMTBIT_S24_LE
- 캡처:
- SNDRV_PCM_FMTBIT_S16_LE
- SNDRV_PCM_FMTBIT_S20_3LE
- SNDRV_PCM_FMTBIT_S24_LE
- 재생:
7.1.2.2 7.1 Audio Codec Features
- 재생과 녹화를 위한 샘플 속도:
- 48 KHz, 96 KHz, 192 KHz
- 재생: 5.512k, 8k, 11.025k, 16k, 22k, 32k, 44.1k, 48k, 64k, 88.2k, 96k, 176.4k, 192k (ASRC 사용)
- 채널:
- 재생: 2, 4, 6, 8 채널
- 재생(ASRC 사용): 2, 6 채널
- 캡처: 2, 4 채널
- 오디오 형식:
- 재생:
- SNDRV_PCM_FMTBIT_S16_LE
- SNDRV_PCM_FMTBIT_S20_3LE
- SNDRV_PCM_FMTBIT_S24_LE
- 재생(ASRC 사용):
- SNDRV_PCM_FMTBIT_S16_LE
- SNDRV_PCM_FMTBIT_S24_LE
- 캡처:
- SNDRV_PCM_FMTBIT_S16_LE
- SNDRV_PCM_FMTBIT_S20_3LE
- SNDRV_PCM_FMTBIT_S24_LE
- 재생:
7.1.2.3 AM/FM Codec Features
- 캡처를 위해 지원되는 샘플 속도: 48KHz
- 지원되는 채널:
- 캡처: 2채널 지원
- 지원되는 오디오 형식:
- 캡처: SNDRV_PCM_FMTBIT_S16_LE
7.1.2.4 Sound Card Information
등록된 사운드 카드 정보는 "aplay -l"와 "arecord -l" 커맨드를 사용하여 다음과 같이 나열할 수 있다. 예를 들어, 스테레오 사운드 카드는 "card 0"로 등록된다.
root@ /$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: wm8962audio [wm8962-audio], device 0: HiFi wm8962-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
7.1.3 Hardware Operation
아래 섹션에서는 ASoC 드라이버의 하드웨어 작동에 대해 설명한다.
7.1.3.1 Stereo Audio CODEC
스테레오 오디오 CODEC은 I2C 인터페이스로 컨트롤되고 있다. 오디오 데이터는 DMA 채널을 통해 사용자 데이터 버퍼에서 SSI FIFO로 또는 SSI FIFO에서 전송되고 있다. DMA 채널은 오디오 샘플 비트에 따라 선택되고 있다. AUDMUX는 SSI 포트와 CODEC과 연결되는 출력 포트 사이의 경로를 설정하는 데 사용되고 있다. CODEC은 마스터 모드에서 작동하고 BCLK와 LRCLK를 제공한다. BCLK와 LRCLK는 오디오 샘플 속도에 따라 구성할 수 있다.
WM8958, WM8960와 WM8962 ASoC CODEC 드라이버는 ASoC 아키텍처에 따라 오디오 record/playback/mixer API를 내보낸다.
CODEC 드라이버는 오디오 캡처와 재생을 제공하도록 CODEC을 구성하는 일반적이고 하드웨어 독립적인 코드이다. 대상 플랫폼이나 머신을 특정하는 코드를 포함하지 않는다. CODEC 드라이버는 아래를 처리한다:
- CODEC DAI와 PCM 구성
- CODEC 컨트롤 I/O - I2C 사용
- 믹서와 오디오 컨트롤
- CODEC 오디오 작업
- DAC Digital 음소거 컨트롤
WM8958, WM8960와 WM8962 CODEC은 모듈이 초기화될 때 I2C 클라이언트로 등록된다. API는 구조체 snd_soc_dai_ops에 의해 상위 레이어로 보내지고 있다.
GPIO 인터럽트 시그널을 통해 헤드폰 장착/제거를 감지할 수 있다.
SSI 듀얼 FIFO 기능은 기본으로 활성화되어 있다.
7.1.3.2 7.1 Audio Codec
7.1 오디오 코덱에는 I2C 인터페이스로 컨트롤되는 8채널 DAC와 4 채널 ADC가 포함된다. 오디오 데이터는 DMA 채널을 통해 사용자 데이터 버퍼에서 ESAI FIFO로 전송되고 있다. DMA 채널은 오디오 샘플 비트에 따라 선택되고 있다. 코덱은 ESAI가 BCLK와 LRCLK를 제공하므로 슬레이브 모드로 작동한다. BCLK와 LRCLK는 오디오 샘플 속도에 따라 구성할 수 있다. ESAI는 최대 8개의 오디오 출력 포트를 지원한다. ASRC를 활성화하는 동안, 7.1 오디오 코덱은 ASRC를 통해 2채널이나 6채널 재생을 지원한다. i.MX 6 Sabre ARD 보드에는 4개의 오디오 입력 포트가 있는 CS42888 코덱이 사용되고 있고, 각 포트는 I2S 형식(네트워크 모드)의 2개의 데이터 채널을 수신하여 8채널 재생 기능을 제공한다. 이 코덱에는 ESAI와 연결된 2개의 오디오 출력 포트가 있어, 4채널 녹음 기능을 제공한다.
코덱 드라이버는 오디오 캡처와 재생을 제공하도록 코덱을 구성하는 일반적인이고 하드웨어 독립적인 코드이다. 대상 플랫폼이나 머신을 특정하는 코드를 포함하지 않는다. 코덱 드라이버는 아래를 처리한다:
- Codec DAI와 PCM 구성
- Codec 컨트롤 I/O - I2C 사용
- 믹서와 오디오 컨트롤
- Codec 오디오 작업
- DAI Digital 음소거 컨트롤
CS42888 코덱은 모듈이 초기화될 때 I2C 클라이언트로 등록된다. API는 구초제 snd_soc_dai_ops에 의해 상위 레이어로 보내지고 있다.
7.1.3.3 AM/FM Codec
AM/FM 코덱은 가상의 코덱이며, Tuner 디바이스에 연결된 PCM 인터페이스만 있다. 오디오 데이터는 DMA 채널을 통해 사용자 데이터 버퍼에서 SSI FIFO로 또는 SSI FIFO에서 전송되고 있다. DMA 채널은 오디오 샘플 비트에 따라 선택되고 있다. AUDMUX는 SSI 포트와 코덱과 연결되는 출력 포트 사이의 경로를 설정하는 데 사용되고 있다. 코덱은 BCLK와 LRCLK를 제공하므로 마스터 모드에서 작동한다. BCLK와 LRCLK는 오디오 샘플 속도에 따라 구성할 수 있다.
7.1.4 Software Operation
아래 섹션에서는 ASoC 드라이버의 소프트웨어 작동에 대해 설명한다.
7.1.4.1 ASoC Driver Source Architecture
imx-pcm-dma.c 파일은 스테레오 ALSA SoC 드라이버, 7.1 ALSA SoC 드라이버 그리고 다른 CODEC 드라이버에서 공유되고 있다. 이 파일은 DMA 버퍼를 미리 할당하고 DMA 채널을 관리한다.
스테레오 CODEC은 SSI 인터페이스로 CPU와 연결되어 있다. fsl_ssi.c 파일은 스테레오 ALSA SoC용 CPU DAI 드라이버를 등록하고 온칩 SSI 인터페이스를 구성한다. wm8962.c는 스테레오 CODEC과 하이파이 DAI 드라이버를 등록한다. 스테레오 코덱에서 직접적인 하드웨어 작업은 wm8994.c, wm8960.c, wm8962.c 파일에 있다. imx-wm8958.c, imx-wm8960.c, imx-wm8962.c 파일은 드라이버 디바이스를 생성하고 스테레오 사운드 카드를 등록하는 머신 레이어 코드이다.
다중 채널 코덱은 ESAI 인터페이스로 CPU와 연결되어 있다. fsl_esai.c 파일은 스테레오 ALSA SoC용 CPU DAI 드라이버를 등록하고 온칩 ESAI 인터페이스를 구성한다. cs42888.c 파일은 다중 채널 CODED과 하이파이 DAI 드라이버를 등록한다. 다중 채널 CODEC에서 직접적인 하드웨어 작업은 cs42888.c 파일에 있다. imx-cs42888.c 파일은 드라이버 디바이스를 생성하고 스테레오 사운드 카드를 등록하는 머신 레이어 코드이다.
AM/FM CODEC은 SSI 인터페이스로 CPU와 연결되어 있다. fsl_ssi.c 파일은 스테레오 ALSA SoC용 CPU DAI 드라이버를 등록하고 온칩 SSI 인터페이스를 구성한다. si476x.c 파일은 Tuner CODEC과 Tuner DAI 드라이버를 등록한다. CODEC에서 직접적인 하드웨어 작업은 si476x.c 파일에 있다. imx-si476x.c 파일은 드라이버 디바이스를 생성하고 사운드 카드를 등록하는 머신 레이어 코드이다.
7.1.4.2 Sound Card Registration
코덱은 동일한 등록 절차를 갖는다:
- 코덱 드라이버는 코덱 드라이버, DAI 드라이버 그리고 해당 동작 기능을 등록한다.
- 플랫폼 드라이버는 PCM 드라이버, CPU DAI 드라이버 그리고 해당 동작 기능을 등록하고, PCM 컴포넌트에 대한 버퍼를 미리 할당하고 재생과 캡처 작업이 가능하도록 설정한다.
- 머신 레이어는 코덱과 CPU 사이의 DAI 링크를 생성하고, 사운드 카드와 PCM 디바이스를 등록한다.
7.1.4.3 Device Open
ALSA 드라이버는 아래 기능을 수행한다:
- 수행할 작업에 대해, 사용 가능한 서브스트림을 할당
- 저수준의 하드웨어 디바이스를 open
- ALSA 런타임 정보(런타임 구조체에는 열려있는 서브스트림의 모든 하드웨어, DMA 그리고 소프트웨어 기능이 포함됨)에 하드웨어 기능을 할당
- 작동을 위한 DMA 읽기나 쓰기 채널을 구성
- CPU DAI와 CPU DAI 인터페이스를 구성
- CODEC 하드웨어를 구성
- 전송 트리거
처음 트리거한 후, 이어지는 DMA 읽기/쓰기 작업은 DMA 콜백에 의해 구성된다.
7.1.4.4 Device Tree Binding
아래 문서를 참조한다:
- Documentation/devicetree/bindings/sound/fsl,ssi.txt
- Documentation/devicetree/bindings/sound/fsl-sai.txt
- Documentation/devicetree/bindings/sound/fsl,esai.txt
- Documentation/devicetree/bindings/sound/fsl,asrc.txt
- Documentation/devicetree/bindings/sound/wm8962.txt
- Documentation/devicetree/bindings/sound/wm8960.txt
- Documentation/devicetree/bindings/sound/wm8994.txt
- Documentation/devicetree/bindings/sound/cs42xx8.txt
- Documentation/devicetree/bindings/sound/imx-audmux.txt
- Documentation/devicetree/bindings/sound/imx-audio-wm8962.txt
- Documentation/devicetree/bindings/sound/imx-audio-cs42888.txt
- Documentation/devicetree/bindings/sound/imx-audio-si476x.txt
7.1.4.5 Source Code Structure
아래 테이블은 sound/soc/fsl에 있는 스테레오 코덱 SoC 드라이버 소스를 보여준다.
Table 78. Stereo Codec SoC Driver Files
File | Description |
---|---|
sound/soc/fsl/imx-wm8958.c sound/soc/fsl/imx-wm8960.c sound/soc/fsl/imx-wm8962.c |
스테레오 CODEC ALSA SoC용 머신 레이어 (I2S 마스터로서 CODEC) |
sound/soc/fsl/imx-pcm-dma.c | 스테레오 CODEC ALSA SoC용 플랫폼 레이어 |
sound/soc/fsl/imx-pcm.h | PCM 드라이버와 AUDMUX 레지스터 정의 헤더 파일 |
sound/soc/fsl/fsl_ssi.c | 스테레오 CODEC ALSA SoC용 SSI CPU DAI 드라이버 |
sound/soc/fsl/fsl_ssi.h | SSI CPU DAI 드라이버와 SSI 레지스터 정의 헤더 파일 |
sound/soc/fsl/fsl_sai.c | 스테레오 CODEC ALSA SoC용 SAI CPU DAI 드라이버 |
sound/soc/fsl/fsll_sai.h | SAI CPU DAI 드라이버와 SAI 레지스터 정의 헤더파일 |
codecs/wm8994.c codecs/wm8960.c codecs/wm8962.c |
스테레오 CODEC ALSA SoC용 CODEC 레이어 |
codecs/wm8994.h codecs/wm8960.h codecs/wm8962.h |
스테레오 CODEC 드라이버용 헤더 파 |
아래 테이블에는 AM/FM 코덱 SoC 드라이버 소스 파일이 나열되어 있다. 이 파일들은 sound/soc 아래에 있다.
Table 79. AM/FM Codec SoC Driver Source Files
File | Description |
---|---|
sound/soc/fsl/imx-si476x.c | 스테레오 CODEC ALSA SoC용 머신 레이어 (I2S 슬레이브로서 CODEC) |
sound/soc/fsl/imx-pcm-dma.c | 스테레오 CODEC ALSA SoC용 플랫폼 레이어 |
sound/soc/fsl/imx-pcm.h | PCM 드라이버와 AUDMUX 레지스터 정의 헤더 파일 |
sound/soc/fsl/fsl_ssi.c | 스테레오 CODEC ALSA SoC용 SSI CPU DAI 드라이버 |
sound/soc/fsl/fsl_ssi.h | SSI CPU DAI 드라이버와 SSI 레지스터 정의 헤더 파일 |
sound/soc/codecs/si476x.c | 스테레오 CODEC ALSA SoC용 코덱 레이어 |
아래 테이블은 다중 채널 ADC SoC 드라이버 소스파일을 보여준다.
Table 80. CS42888 ASoC Driver Source File
File | Description |
---|---|
sound/soc/fsl/imx-cs42888.c | 다중 채널 CODEC ALSA SoC용 머신 레이어 |
sound/soc/fsl/imx-pcm-dma.c | 다중 채널 CODEC ALSA SoC용 플랫폼 레이어 |
sound/soc/fsl/imx-pcm.h | PCM 드라이버용 헤더 파일 |
sound/soc/fsl/fsl_esai.c | 다중 채널 CODEC ALSA SoC용 ESAI CPU DAI 드라이버 |
sound/soc/fsl/fsl_esai.h | ESAI CPU DAI 드라이버 헤더 파일 |
sound/soc/codecs/cs42xx8.c | 다중 채널 CODEC ALSA SoC용 코덱 레이어 |
sound/soc/codecs/cs42xx8.h | 다중 패널 CODEC 드라이버 헤더 파일 |
sound/soc/fsl/fsl_asrc.c | ASRC P2P의 CPU DAI 드라이버 |
sound/soc/fsl/fsl_asrc.h | ASRC P2P의 CPU DAI용 헤더 파일 |
sound/soc/fsl/fsl_asrc_pcm.c | ASRC P2P용 플랫폼 레이어 |
7.1.4.6 Menu Configuration Options
이 모듈에는 아래와 같은 Linux 커널 구성 옵션이 제공된다.
- SoC 오디오는 WM8958, WM8960, WM8962 CODEC을 지원한다. menuconfig에서, 이 옵션은 아래에서 사용할 수 있다:
-> Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> ALSA for SoC audio support -> SoC Audio for Freescale CPUs -> SoC Audio support for i.MX boards with wm8962 (or wm8958, wm8960)
- SoC 오디오는 i.MX cs42888를 지원한다. menuconfig에서, 이 옵션은 아래에서 사용할 수 있다:
-> Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> ALSA for SoC audio support -> SoC Audio for Freescale CPUs -> SoC Audio support for i.MX boards with cs42888
- SoC 오디오는 AM/FM을 지원한다. menuconfig에서, 이 옵션은 아래에서 사용할수 있다:
-> Device Drivers -> Sound card support -> Advanced Linux Sound Architecture -> ALSA for SoC audio support -> SoC Audio for Freescale CPUs -> SoC Audio support for i.MX boards with si476x