7.1 Advanced Linux Sound Architecture (ALSA) System on a Chip (ASoC) Sound
7.1.1 ALSA Sound Driver Introduction
현재 Linux 시스템에서 가장 널리 사용되는 아키텍쳐인 ALSA(Advanced Linux Sound Architecture)는 Linux 운영 체제에서 오디오와 MIDI 기능을 제공한다.
ALSA에는 아래과 같은 중요한 기능이 있다:
- 일반 소비자용 사운드 카드에서 전문가용 멀티채널 오디오 인터페이스에 이르기까지 모든 유형의 오디오 인터페이스를 효울적으로 지원한다.
- 완전히 모듈화된 사운드 드라이버.
- SMP와 스레드에 안전한 설계.
- 애플리케이션 프로그램을 단순화하고 더 높은 레벨의 기능을 제공하기 위한 사용자 공간 라이브러리(alsa-lib).
- 대부분 OSS 프로그램에 대한 바이너리 호환성을 제공하는 이전 OSS(Open Sound System) API를 지원.
ALSA System on Chip(ASoC) 레이어는 SoC 오디오용으로 설계되었다. ASoC 레이어의 전체 프로젝트 목표는 임베디드 시스템 온 칩 프로세서와 휴대용 오디오 CODEC을 위한 더 나은 ALSA 지원 제공이다.
ASoC 레이어는 아래과 같은 기능도 제공한다:
- CODEC 독립적. 다른 플랫폼과 머신에서 CODEC 드라이버를 재사용할 수 있다.
- CODEC과 SoC 사이의 간편한 I2S/PCM 오디오 인터페이스를 설정한다. 각 SoC 인터페이스와 CODEC은 오디오 인터페이스 기능을 core에 등록한다.
- Dynamic Audio Power Management (DAPM). DAPM은 오디오(활성화된 사용 사례) 시스템에 관계없이 오디오 서브시스템의 전력 소비를 최소화하도록 설계된 ASoC 기술이다. DAPM은 항상 낮은 오디오 전력 상태를 보장하고 사용자 공간 오디오 컴포넌트에 완전히 투명하다. DAPM은 모바일 디바이스나 복잡한 오디오 요구 사항이 있는 디바이스에 이상적이다.
- pop, click (처음 전원인가시 발생하는 잡음 소리) 감소. 올바은 순서(디지털 음소거 사용 포함)로 CODEC에 전원을 먼저/나중 공급하면 pop, click(잡음 소리)을 줄일 수 있다. ASoC는 전원 상태를 변경할 때 CODEC에 신호를 보낸다.
- 머신별 컨트롤. 머신이 사운드 카드에 컨트롤을 추가할 수 있도록 허용한다(예: 스피커 앰프의 볼륨 컨트롤).
ASoC는 기본적으로 임베디드 오디오 시스템을 3가지 컴포넌트로 분류한다:
- 머신 드라이버 - 재생 시작시 외부 앰프를 켜는 것과 같은 모든 머신 관련 컨트롤과 오디오 이벤트를 처리한다.
- 플랫폼 드라이버 - 해당 플랫폼에 대한 오디오 DMA 엔진과 오디오 인터페이스 드라이버(예: I2S, AC97, PCM)를 포함한다.
- CODEC 드라이버 - 플랫폼 독립적이고 오디오 컨트롤, 오디오 인터페이스 기능, CODEC DAPM 정의와 CODEC I/O 기능을 포함한다.
ASoC에 대한 더 자세한 정보는 Linux OS 소스 트리 linux/Documentation/sound/alsa/soc와 www.alsa-project.org/main/index.php/ASoC에서 찾을 수 있다.
7.1.2 SoC Sound Card
현재 스테레오 CODEC(WM8958, WM8960, WM8962, 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 platform에서만 지원된다.
AM/FM CODEC은 i.MX 6Quad와 i.MX 6Solo SABRE Auto platform에서만 지원된다.
7.1.2.1 Stereo CODEC Features
스테레오 CODEC은 아래 기능을 지원한다:
- 재생과 캡쳐를 위한 샘플 속도는 8 KHz, 32 KHz, 44.1 KHz, 48 KHz, 96 KHz 이다.
- 채널:
- 재생: 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.512 k, 8 k, 11.025 k, 16 k, 22 k, 32 k, 44.1 k, 48 k, 64 k, 88.2 k, 96 k, 176.4 k, 192 k (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
- 캡쳐를 위해 지원되는 샘플 속도: 48 KHz
- 지원되는 채널:
- 캡쳐: 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 오디오 CODEC에는 I2C 인터페이스로 제어되는 8채널 DAC와 4채널 ADC가 포함된다. 오디오 데이터는 DMA 채널로 사용자 데이터 버퍼에서 ESAI FIFO로 전송된다. DMA 채널은 오디오 샘플 비트에 따라 선택된다. CODEC은 ESAI가 BCLK와 LRCLK를 제공하므로 슬레이브 모드로 작동한다. BCLK와 LRCLK는 오디오 샘플 레이트에 따라 구성될 수 있다. ESAI는 최대 8개의 오디오 출력 포트를 지원한다. ASRC를 활성화하는 동안, 7.1 오디오 CODEC은 ASRC를 통해 2 또는 6채널 재생을 지원한다. i.MX 6 Saber ARD 보드에는 4개의 오디오 입력 포트가 있는 CS42888 CODEC이 사용되며, 각 포트는 I2S 형식(네트워크 모드)으로 2개의 데이터 채널을 수신하여 8채널의 재생 기능을 제공한다. 이 CODEC에는 ESAI와 연결된 2개의 오디오 출력 포트도 있어 4채널 녹음 기능을 제공한다.
CODEC 드라이버는 오디오 캡처와 재생을 제공하기 위해 CODEC를 구성하는 하드웨어 독립적인 일반 코드이다. 여기에는 대상 플랫폼이나 머신에 특화된 코드가 포함되어 있지 않다. CODEC 드라이버는 다음을 처리한다 :
- CODEC DAI와 PCM 구성
- CODEC I/O 컨트롤 - I2C 사용
- 믹서와 오디오 컨트롤
- CODEC 오디오 동작
- DAI Digital 음소거 컨트롤
CS42888 CODEC은 모듈이 초기화될 때 I2C 클라이언트로 등록된다. API는 snd_soc_dai_ops 구조체로 상위 레이어에 노출된다.
7.1.3.3 AM/FM Codec
AM/FM CODEC은 가상의 CODEC이며, Tuner 디바이스에 연결된 PCM 인터페이스만 있다. 오디오 데이터는 DMA 채널로 사용자 데이터 버퍼에서 SSI FIFO로 전송되거나 SSI FIFO에서 사용자 데이터 버퍼로 전송된다. DMA 채널은 오디오 샘플 비트에 따라 선택된다. AUDMUX는 SSI 포트와 CODEC과 연결되는 출력 포트 사이의 경로를 설정하는 데 사용된다. CODEC은 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와 HiFi DAI 드라이버를 등록한다. 스테레오 CODEC에서 직접적인 하드웨어 작업은 wm8994.c, wm8960.c, wm8962.c에 있다. imx-wm8958.c, imx-wm8960.c, imx-wm8962.c는 드라이버 디바이스를 생성하고 스테레오 사운드 카드를 등록하는 머신 레이어 코드이다.
멀티 채널 CODEC은 ESAI 인터페이스로 CPU에 연결된다. fsl_esai.c는 스테레오 ALSA SoC용 CPU DAI 드라이버를 등록하고 온칩 ESAI 인터페이스를 구성한다. cs42888.c는 멀티 채널 CODEC와 HiFi 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
CODEC의 등록 순서는 다음과 같다:
- CODEC 드라이버는 CODEC 드라이버, DAI 드라이버, 그들의 동작 함수를 등록한다.
- 플랫폼 드라이버는 PCM 드라이버, CPU DAI 드라이버와 그들의 동작 함수를 등록하고, PCM 컴포넌트에 대한 버퍼를 미리 할당하고 적용할 수 있는 재생과 캡처 작업을 설정한다.
- 머신 레이어는 CODEC과 CPU 사이에 DAI 링크를 생성하고 사운드 카드와 PCM 디바이스를 등록한다.
7.1.4.3 Device Open
ALSA 드라이버는 아래 기능을 수행한다:
- 수행할 작업에 대해 여유 있게 서브스트림을 할당한다.
- 저수준의 하드웨어 디바이스를 연다.
- 하드웨어 기능을 ALSA 런타임 정보에 할당한다(런타임 구조체에는 열려있는 서브스트림의 모든 하드웨어, DMA와 소프트웨어 기능이 포함된다).
- 작동을 위해 DMA 읽기나 쓰기 채널을 구성한다.
- CPU DAI와 CODEC 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의 스테레오 CODEC SoC 드라이버 소스를 보여준다.
Table 79. 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 CODEC SoC 드라이버 소스 파일이 나열되어 있다. 이 파일은 sound/soc 아래에 있다.
Table 80. 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 드라이버와 AUDMIX 레지스터 정의 헤더 파일 |
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용 CODEC 레이어 |
아래 테이블은 멀티 채널 ADC SoC 드라이버 소스 파일을 보여준다.
Table 81. 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용 CODEC 레이어 |
sound/soc/codecs/cs42xx8.h | 멀티 채널 CODEC ALSA SoC용 헤더 파일 |
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 Audio는 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 Audio는 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 Audio는 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