본문 바로가기

ALSA

ALSA

우선 해당 문서 출처는 아래와 같습니다.

(http://pds21.egloos.com/pds/201612/23/62/alsa(embedded_linux).pdf)

DAPM : http://pds18.egloos.com/pds/202006/19/62/DAPM(Dynamic_Audio_Power_Management).pdf 

제가 Audio쪽을 여러해 시작하면서 여러가지 시행 착오를 겪었습니다.

 

우선 회사에서 Audio쪽을 맡으셨다면 빨리 도망치세요 ㅋ

(이말은 검색해 보시면 알 껍니다 ㅋㅋ)

 

사수가 없다면 폭망각입니다. (진심입니다)

저역시 사수가 없어서 맨땅에 헤딩하고, 뭐 학원이라도 다녀야 하나 생각했습니다.

저의 케이스의 경우는 이전 담당자들이 힘들어서 다 도망쳐서... 3명중에 저 혼자 남은 상황에서

양산을 하게 되는.. 극한 case 몰리게 되었죠..

역시 엄청난 양의 욕을 먹고, 전 새로운 사람이 되었죠.

저에게 마치 빛처럼 노하우를 전수하신 분이 있습니다. 

이글루스 블로그를 운영하시는 쾌도난마님입니다.

 

얼굴을 모르지만 이자리를 빌어 감사하는 말씀을 드립니다.

쾌도난마님 처럼 아무 대가 없이 많은 사람들에게 제가 알고 있는 know-how를 share 할 생각입니다.

 

다만 많은 자료를 찾고 짜집기 하다보니, 출처가 명확하지 않은 부분이 있어..

혹시나 원 저자의 자료를 출처를 밝히지 않고 사용했다면 , 알려주셔서.. 제가 표기할 수 있도록 도움을..

또한 불쾌하시거나 문제가 되면 지우거나 다른 방법으로 설명하도록 하겠습니다.

 

 

우선 step 1 은 쾌도난마의 글을 읽는 것입니다.( http://furmuwon.egloos.com/category/ALSA )

 But 그러나.. 이조차 이해가 되지 않는다면..제 글.. 순차적으로 읽고 따라오시거나..

더 쉬운 자료를 찾으시고, 좀 더..코드를 보라는 원론적인...이야기를 드릴수 밖에..없네요 ^^

1. What is ALSA?

ALSA는 Advanced Linux Sound Architecture 약어로 Linux에서 Audio device를 접근하는 방법을 구조화 시킨 것입니다.

A. Introduce ALSA

1)  homepage : https://www.alsa-project.org/wiki/Main_Page

(현재 Document link가 끊겨 있습니다. 분명 옛날에는 읽었는데 아닌가... ㅡ_ㅡ; )

2) 옛날 문서이기는 한데.. 개인이 정리한 pdf 문서가 있는데 개념적인 정리가 되어있습니다.

(http://pds21.egloos.com/pds/201612/23/62/alsa(embedded_linux).pdf)

 

해당 문서를 간략히 요약하자면

i. User영역과 Kernel 영역이 나눠져 있고, user 영역에서는 ALSA library를 호출해서 사용합니다.

 

 

ii. ALSA Kernel Driver

  (linux device driver에 대한 기초가 없으시면.. 일단.. 기초지식을 검색하시고 난 후에 ^^..)

   a. ALSA Kernel Driver는 User space의 System call(open, ioctl, write, read, close)에 대응
   b. ALSA Kernel Driver는 User space 와 Sound Card Device Driver의 인터페이스를

      담당하고 Audio Buffer 및 Signal을 관리 및 운용

 

iii. ALSA Library

a. Application에게 공통된 API를 제공하여 ALSA Kernel Driver를 사용 할 수 있도록 합니다.
b. ALSA Library가 /dev/snd/* 의 device file을 제어함으로 Application에서 직접 device file을 open,close 할 필요가 없습니다.

  

 

B. ALSA folder Architecture

우선 linux kernel에서 ALSA를 보려고 한다면 linux kernel에 sound folder안을 보시면 됩니다.

 

 

각folder 의 description은 다음과 같습니다.

1) arm / ppc / sparc

     각 아키텍쳐에 specific 한 top-level card 모듈

2) core folder

    - native ALSA 모듈이 포함됨 / ALSA library

    a. core/oss

        PCM과 Mixer OSS 에뮬레이션의 코드가 저장되어 있음

    b. core/seq

        ALSA sequencer를 위한 서브디렉토리.

        sequencer core & primary sequencer 모듈(snd-seq-midi, snd-seq-virmidi 등)

       CONFIG_SND_SEQUENCER가 kernel config에 설정되어 있을 때만 컴파일됨

    c.  core/seq/oss

        OSS sequencer 에뮬레이션 코드

2) include

    ALSA 드라이버의 공용 헤더파일들을 위한 디렉토리

3) drivers

    서로 다른 아키텍쳐상의 서로 다른 드라이버들 중 공유 코드

     ex) pcm driver, serial MIDI driver

4) i2c

    ALSA I2C 컴포넌트포함

    Linux상에 표준 I2C가 존재하지만 ALSA는 sound 카드를 위한 전용 I2C를 사용

5) oss

    OSS/Lite 는 Linux 2.6 tree 에 여기에 저장됨

6) pci

    PCI 사운드 카드를 위한 top-level card module 과 PCI 버스에 특화된 코드

7) pcmcia

    PCMCIA, 특히 PCCard 드라이버는 이 디렉토리로 올 예정임

8) synth

    the synth 미들레벨 모듈 포함하고 있음.

9) soc

    embedded system을 위한 driver

10) usb

    USB-audio driver를 포함

 

2. ALSA SoC Layer

(https://www.kernel.org/doc/html/latest/sound/soc/overview.html)

 

첫번째는 codec driver입니다. 

이는 DAC이나 AMP를 device에 붙이게 된다면, 해당 업체에서 기본적으로 제공하는 driver입니다.

또한 sound/soc/codecs folder에도 있으니 참조하시면 됩니다

말 그대로 codec의 특성 및 운영 방법에 대한 명세입니다.

 

두번째는 platform driver 입니다. 

stream 제어와 관련된 사항들을 설정하는 부분입니다. 

다시 말해서 Raw data , PCM이나 Compress data(mp3등)를 출력하기 위해서는 buffer를 control해 주어야 하는데

이와 관련된 부분이 Platform driver입니다.

웬만하면 DMA를 사용해서 한방에 빵 ~ 하겠지요..

memcpy를 할 수도 있겠지만 서도..

 

세번째는 Machine driver입니다. 

이는 기존에 Machine driver를 참고로 해서 짜거나 기존 reference code 들을 짜면 되는데

저는 해당 driver 부분 때문에 완전 헤메게 됩니다.

이놈 때문에 다 막히는 셈입니다. (ALSA학원 다니고 싶다..이런 생각까지 들게 함 ㅋ)

여기서 Sound card도 등록하고 DAI(Digital Audio Interface)- I2S 및 Codec Device의 관계도 설정합니다.

 

네번째는 Component driver입니다.

I2S IP Block 및 Audio codec내 Audio Interface 관계를 정리해 놓은 것입니다.

Machine driver에서 DAI의 detail이 더 해 졌다고 생각하시면 됩니다.

이는 이후에 code를 보면서 참조하면 좋을 듯합니다.

 

A. ALSA 는 X86의 Sound Card를 위해 만들어 졌습니다.
B. Embedded processor 용에 대응하기 위하여 ALSA System On Chip(SoC) Layer가 존재.
C. ASoC는 다음 목표로 설계 되었다.

    1) Audio Codec Driver 독립적 및 재사용 가능 하도록 설계
    2) Audio Codec 과 I2S 및 PCM Audio interfac의 연결을 쉽도록 설계
    3) Dynamic Audio Power Management(DAPM) 설계 (Audio Codec 내 Power Block 자동 제어 알고리즘)
    4) Pop 및 Click 잡음 감소 (Audio Codec의 Power를 up/down 하면서 생겨나는 잡음을 줄임)
    5) Board 특정 컨트롤을 위해 설계. 예를들면 스피커 앰프를 위한 소리 제어
       (ASoC의 도움 없다면 Audio Function과 별개로 GPIO 제어로 스피커 앰프를 ON/OFF 시켜야 한다)

D. ASoC는 기본적으로 다음 4가지의 driver로 구분합니다.

1) Codec Driver : Audio Codec내 Control을 제어한다.


2) Platform Driver : SoC 내 DMA 및 DAI(Digital Audio Interface)를 제어    

3) Machine Driver : Embedded Board의 Audio 관련 Device의 연결상태를 선언 및 제어한다. (sound card 등록)   

e.g. turning on an amp at start of playback   

 

4) Component Driver(DAI) : I2S IP Block 및 Audio codec내 Audio Interface(I2S,PCM,PDM 등)을 제어한다.


 

3. ALSA Operation Diagram

A. 초록색 Diagram은 PC에서 sound를 출력하는 형태

B. 붉은색은 embedded system

C. 파란색은 Android Platform

 

 

'ALSA' 카테고리의 다른 글

Audio Linux driver : A. Driver Location and Description  (0) 2019.10.24