7.6 PDM Microphone Interface (MICFIL)
7.6.1 Introduction
PDM은 모바일폰과 같은 여러 애플리케이션에서 마이크에서 프로세서로 오디오를 전달하는 널리 사용되는 방법이다. 그러나, 현재의 디지털 오디오 시스템은 신호를 표현하기 위해 멀티비트 오디오 신호(멀티비트 PCM이라고도 함)를 사용한다. 이를 위해 FIR, CIC 또는/그리고 Half Band 필터 세트는 일반적으로 DSP나 소프트웨어에서 구현된다. 이 모듈은 구성 가능한 출력 샘플 속도에서 PDM 마이크 비트스트림으로 부터 16비트 오디오 신호를 제공하는 데 필요한 디지털 인터페이스를 구현한다.
7.6.2 Block diagram
아래 그림은 PDM Microphone Interface 블럭의 상위 레벨 관점을 보여준다.
7.6.3 Hardware Overview
이 모듈의 구현은 하드웨어에서 디지털 신호 처리 기술의 적용을 기반으로 한다. PDM Microphone Interface 아키텍처는 게이트를 절약하고 전력 소비를 최소화하도록 디자인되었다. 오디오 대역에서 1비트 PDM 비트스트림을 16비트 PCM 신호로 변환하기 위해 여러 필터를 구현한다.
통과대역(passband)에서 앨리어싱 주파수를 피하기 위해, 전체 필터는 80dB 저지대역(stopband) 감쇠와 0.2dB 미만의 통과대역 리플을 갖는다. 전체 모듈은 다중 채널 모드에서 작동하도록 구현된다. 모든 채널은 동일한 구성을 갖지만, 각 입력 채널은 독립적으로 켜고 끌 수 있다.
PDM Microphone Interface 모듈은 아래와 같이 구성된다:
- PDM 마이크의 각 쌍에 대한 입력 인터페이스
- 채널별 데시메이션 필터
- 채널별 FIFO
- 타임 생성 유닛
- DMA, 인터럽트 그리고 SoC에 대한 공유 인터페이스
- 하나 이상의 Hardware Voice Activity Detectors(HWVAD: 하드웨어 음성 활동 감지기)
Decimation Filter는 구성가능한 데시메이션 속도로 오디오 대역(기본적으로 20Hz-22.5KHz @48KHz 출력 샘플링 속도)에서 로우 패스 필터를 구현한다. CIC, Half Band, FIR 그리고 DC remover filter의 배열을 이용하여 구현한다.
Time Generator 유닛은 마이크에 대한 PDM 클럭을 생성한다. 이 클럭은 모든 PDM 마이크에 대해 동일하며, 모든 마이크에 대해 활성화된다. 즉, 하나의 마이크에 대해서만 PDM 클럭을 끌 수 없다. 또한 모든 필터 블럭에 대한 타이밍 신호와 컨트롤을 생성한다. 필터에서 데시메이션도 이 블럭에 의해 컨트롤된다. 각 블럭과 채널을 활성화하고 FIR FSM과 Half Band FSM에 시작 신호를 제공한다.
마지막으로, 각 Decimation Filter의 출력은 FIFO 버퍼에 저장된다. 각 FIFO는 DATACHn 레지스터에 매핑된다. 활성화된 모든 채널의 각 FIFO에서 저장된 데이터 수가 구성된 워터마크를 초과할 때, 인터럽트나 DMA 요청을 생성할 수 있다.
7.6.4 Software Overview
PDM Microphone 드라이버는 ALSA System on Chip(ASoC) 레이어 아래에서 디자인되었다. PDM Microphone용 ASoC 드라이버는 PDM Microphone 출력을 캡처하기 위한 하나의 캡처 디바이스를 제공한다. 캡처된 오디오 형식은 @ 48kHz나 44.1kHz 속도에서 8채널 32비트 너비의 선형 PCM 오디오 데이터이다.
7.6.4.1 User Interface
PDM Microphone 인터페이스는 amixer -c <pdm mic card> 툴을 사용하여 사용자 공간에서 액세스할 수 있다. 컨트롤은 아래 테이블에 나열되어 있다.
Table 86. PDM Microphone controls
ID | Name | Type | Access | Value | Default |
---|---|---|---|---|---|
1 | CH0 Gain | int | r/w | min=0, max=15 |
15 |
2 | CH1 Gain | int | r/w | min=0, max=15 |
15 |
3 | CH2 Gain | int | r/w | min=0, max=15 |
15 |
4 | CH3 Gain | int | r/w | min=0, max=15 |
15 |
5 | CH4 Gain | int | r/w | min=0, max=15 |
15 |
6 | CH5 Gain | int | r/w | min=0, max=15 |
15 |
7 | CH6 Gain | int | r/w | min=0, max=15 |
15 |
8 | CH7 Gain | int | r/w | min=0, max=15 |
15 |
9 | MICFIL Quality Select |
enum | r/w | #0 'Medium', #1 'High', #2 'N/A', #3 'N/A', #4 'VLow2', #5 'VLow1', #6 'VLow0', #7 'Low' |
#0 'Medium' |
10 | HWVAD Initialization Mode |
enum | r/w | #0 'Envelope mode', #1 'Energy mode' |
#0 'Envelope mode' |
11 | HWVAD High-Pass Filter |
enum | r/w | #0 'Filter bypass', #1 'Cut-off @1750Hz', #2 'Cut-off @215Hz', #3 'Cut-off @102Hz' |
#0 'Filter bypass' |
12 | HWVAD Zero-Crossing Detector Enable |
enum | r/w | #0 'OFF', #1 'ON' |
#0 'OFF' |
13 | HWVAD Zero-Crossing Detector Auto Threshold |
enum | r/w | #0 'OFF', #1 'ON' |
#0 'OFF' |
14 | HWVAD Noise OR Enable |
enum | r/w | #0 'Disabled', #1 'Enabled' |
#0 'Disabled' |
15 | HWVAD Sampling Rate |
enum | r/w | #0 '48KHz', #1 '44.1KHz' |
#0 '48KHz' |
16 | Clock Source | enum | r/w | #0 'Auto', #1 'AudioPLL1', #2 'AudioPLL2', #3 'ExtClk3' |
#0 'Auto' |
17 | HWVAD Input Gain |
int | r/w | min=0, max=15 |
0 |
18 | HWVAD Sound Gain |
int | r/w | min=0, max=15 |
0 |
19 | HWVAD Noise Gain |
int | r/w | min=0, max=15 |
0 |
20 | HWVAD Detector Frame Time |
int | r/w | min=1, max=64 |
1 |
21 | HWVAD Detector Initialization Time |
int | r/w | min=1, max=32 |
1 |
22 | HWVAD Noise Filter Adjustment |
int | r/w | min=1, max=32 |
1 |
23 | HWVAD Zero-Crossing Detector Threshold |
int | r/w | min=1, max=1024 |
1 |
24 | HWVAD Zero-Crossing Detector Adjustment |
int | r/w | min=1, max=16 |
1 |
7.6.4.2 Source Code Structure
아래 테이블에는 드라이버에 대한 소스 파일이 나열되어 있다.
Table 87. Audio Mixer Driver Files
File | Description |
---|---|
sound/soc/fsl/fsl_micfil.h | 공통 정의가 있는 파일 포함 |
sound/soc/fsl/fsl_micfil.c | PDM Microphone DAI Driver |
sound/soc/fsl/imx-micfil.c | PDM Microphone Machine Driver |
Documentation/devicetree/bindings/sound/fsl,micfil.txt | PDM Microphone 디바이스 트리 바인딩 문서 |
7.6.4.3 Menu Configuration Options
아래 Linux 커널 구성이 이 모듈에 대해 제공된다:
- CONFIG_SND_IMX_MICFIL - PDM Microphone Driver 구성 옵션
- Device Drivers -> Sound card support -> Advanced Linux Sound Architecture > ALSA for SoC audio support -> SoC Audio for Freescale i.MX CPUs -> SoC Audio support for i.MX boards with micfil