7.2 Asynchronous Sample Rate Converter (ASRC)
7.2.1 Introduction
Asynchronous Sample Rate Converter(ASRC)는 신호의 샘플링 속도를 샘플링 속도가 다른 신호로 변환한다. ASRC는 동시에 최대 10개 채널의 샘플링 속도 변환을 지원한다. 각 채널의 샘플링 속도 변환은 들어오고 나가는 한 쌍의 심플링 속도와 연관된다. ASRC는 동시에 최대 3개의 샘플링 속도 쌍을 지원한다.
7.2.1.1 Hardware Operation
ASRC에는 아래 기능이 포함된다:
- 1/24에서 8 사이의 비율 (Fsin/Fsout)을 지원한다.
- 44.1 KHz, 32 KHz, 48 KHz 및 96 KHz 사이의 속도 변환을 위해 설계되었다.
- 8 KHz ~ 100 KHz 범위의 다른 입력 샘플링 속도도 지원되지만, 성능은 떨어진다(자세한 내용은 IC 사양 참조).
- 30 KHz ~ 100 KHz 범위의 다른 출력 샘플링 속도도 지원되지만, 성능은 떨어진다.
- 들어오고 나가는 샘플링 속도의 변화를 늦추기 위한 자동 조정.
- 샘플 clock jitter에 대한 tolerant (일정 범위의 허용 오차를 나타냄)
- 주로 실시간 오디오 스트리밍 사용을 위해 설계되었다. 입력되는 샘플 clock을 사용할 수 없을 때, 비실시간 오디오 스트리밍을 사용할 수 있다.
- 모든 사용 사례에서 출력 샘플링 clock을 활성화해야 한다.
- 실시간 오디오 스트리밍의 경우, 입력과 출력 모두 clock이 사용 가능하고 활성화되어야 한다.
- 비실시간 오디오 스트리밍의 경우, ASRC 인터페이스 레지스터에 이상적인 비율 값을 설정하여 입력 샘플링 속도 clock을 피할 수 있다.
ASRC는 폴링, 인터럽트와 DMA 모드를 지원하지만 더 나은 성능을 위해 플랫폼에서는 DMA 모드만 사용된다. ASRC는 아래 DMA 채널을 지원한다:
- 주변 디바이스에서 주변 디바이스로, 예 : ASRC에서 ESAI로
- 메모리에서 주변 디바이스로, 예 : 메모리에서 ASRC로
- 주변 디바이스에서 메모리로, 예 : ASRC에서 메모리로
자세한 설명은 SoC와 연관된 Applications Processor 설명서의 ASRC 장을 참조한다.
7.2.2 Software Operation
오디오 시스템의 보조 컴포넌트로서, ASRC 드라이버 구현은 플랫폼의 사용 사례에 따라 다르다.
현재, ASRC는 두 가지 시나리오에서 사용된다.
- Memory > ASRC > Memory, ASRC는 사용자 애플리케이션이나 ALSA 플러그인에 의해 컨트롤된다.
- Memory > ASRC > 주변 디바이스, ASRC는 다른 ALSA 드라이버에 의해 직접 컨트롤된다.
위의 그림과 같이, ASRC 스트림 인터페이스는 사용자 공간에 대한 인터페이스를 제공한다. ASRC는 /dev/mxc_asrc 아래에 자신을 등록하고, 모듈이 삽입될 때 /proc/driver/asrc 파일을 생성한다. proc은 각 쌍의 채널 번호를 추적에 사용한다. 모든 쌍이 사용되지 않는 경우, 사용자는 proc 파일을 통해 채널 번호를 조정할 수 있다. 총 채널의 수는 10이어야 한다. 그렇지 않으면 조정된 값이 제대로 저장되지 않는다.
7.2.2.1 Sequence for Memory to ASRC to Memory
- /dev/mxc_asrc 디바이스 열기
- ASRC 쌍 요청 - ASRC_REQ_PAIR
- ASRC 쌍 구성 - ASRC_CONIFG_PAIR
- ASRC 시작 - ASRC_START_CONV
- 로우 오디오 데이터(변환될)를 사용자가 유지 관리하는 입력 버퍼에 쓴다. asrc_convert_buffer 구조체를 입출력 버퍼의 길이와 주소로 채운다. 드라이버는 출력 버퍼 크기에 따라 출력 데이터를 사용자가 유지 관리하는 출력 버퍼 주소로 복사한다. 모든 데이터가 변환될 때까지 이 단계를 반복한다. - ASRC_CONVERT
- ASRC 변환을 정지 - ASRC_STOP_CONV
- ASRC 쌍 해제 - ASRC_RELEASE_PAIR
- /dev/mxc_asrc 디바이스 닫기
7.2.2.2 Sequence for Memory to ASRC to Peripheral
주변 오디오 디바이스 경로의 ASRC에 대한 메모리는 7.1 오디오 코덱 드라이버에 포함된다. 7.1 오디오 사운드 카드에서 "cs42888audio [cs42888-audio], device 1: HiFi-ASRC-FE (*)"라는 이름의 새 디바이스가 ASRC로 재생 및 캡처되도록 지정된다. 아래 단계는 ASRC를 메모리에서 주변 디바이스로 호출하는 흐름을 보여준다:
- 사운드 디바이스(PCM)가 등록되었으며, ALSA 드라이버에서 DMA 채널을 활성화하기 시작한다.
- ASRC 쌍 요청 - fsl_asrc_request_pair
- ASRC 쌍 구성 - fsl_asrc_config_pair
- Memory에서 ASRC로 그리고 ASRC에서 Memory로 DMA 채널을 활성화
- DMA 채널과 ASRC 변환 시작 - fsl_asrc_start_pair
- 오디오 데이터 재생이 완료되면, DMA 채널과 ASRC를 정지 - fsl_asrc_stop_pair
- ASRC 쌍 해제 - fsl_asrc_release_pair
7.2.2.3 Source Code Structure
아래 테이블은 sound/soc/fsl에서 사용할 수 있는 소스 파일을 나열한다.
Table 82. ASRC Source File List
File | Description |
sound/soc/fsl/fsl_asrc_m2m.c | ASRC M2M 드라이버 구현 코드 |
sound/soc/fsl/imx-cs42888.c | 7.1 오디오 코덱 머신 드라이버의 ASRC에서 ESAI TX로의 메모리 구현 |
sound/soc/fsl/imx-pcm-dma.c | 7.1 오디오 코덱 플랫폼 드라이버의 ASRC에서 ESAI TX로의 메모리 구현 |
sound/soc/fsl/fsl_esai.c | 7.1 오디오 코덱 CPU 드라이버의 ASRC에서 ESAI TX로의 메모리 구현 |
sound/soc/fsl/cs42xx8 | 7.1 오디오 코덱 드라이버의 ASRC에서 ESAI TX로의 메모리 구현 |
sound/soc/fsl/fsl_asrc.c | ASRC P2P의 ALSA CPU DAI 드라이버 |
sound/soc/fsl/fsl_asrc.h | ASRC P2P의 ALSA CPU DAI 드라이버에 대한 헤더 파일 |
sound/soc/fsl/fsl_asrc_dma.c | ASRC P2P용 ALSA 플랫폼 레이어 |
sound/soc/fsl/sound/soc/fsl/fsl_asrc_dma.c | ASRC M2M용 ALSA 플랫폼 레이어 |
7.2.2.4 Menu Configuration Options
메뉴 구성 옵션은 아래와 같다:
-> Device Drivers
-> Sound card support
-> Advanced Linux Sound Architecture
-> ALSA for SoC audio support
-> SoC Audio for Freescale i.MX CPUs
-> Asynchronous Sample Rate Converter (ASRC) module support
그러면 ASRC 드라이버를 내장 모듈로만 구성할 수 있다.
7.2.2.5 Device Tree Binding
ASRC M2M에 대한 디바이스 트리 바인딩의 기능은 아래와 같다:
- compatible: 호한 가능 목록에는 "fsl,imx6q-asrc"가 포함해야 한다.
- reg: 디바이스에 대한 레지스터 집합의 오프셋과 길이
- interrupts: ASRC 인터럽트를 포함한다.
- clocks: clock-names의 각 항목에 대한 항목을 포함한다.
- clock-names: "mem", "ipg", "asrck"와 "dma"를 포함해야 한다(일반적으로, "dma"는 SPBA clock에 사용).
- dmas: Documentation/devicetree/bindings/dma/dma.txt에 설명된 일반 dma 디바이스 트리 바인딩
- dma-names: "txa", "rxa", "txb", "rxb", "txc", "rxc"등 6개의 dma를 정의해야 한다.
- fsl,clk-map-version: SoC가 다르면 매핑 관계가 달라 진다. 이 버전 번호는 clock 맵 정보를 나타내는 데 사용할 수 있다.
- fsl,clk-channel-bits: 채널 비트 정보를 나타낸다.
ASRC P2P에 대한 디바이스 트리 바인딩 기능은 아래와 같다:
- compatible: 호환 가능 목록에는 "fsl,imx6q-asrc-p2p"가 포함되어야 한다.
- fsl,p2p-rate: Back-End(I2S) 재생과 녹음을 위한 유효한 샘플링 속도
- fsl,p2p-width: Back-End(I2S) 재생과 녹음을 위한 유요한 샘플링 폭
- fsl,asrc-dma-rx-events: ASRC Rx에 대한 3개의 SDMA 이벤트 번호를 포함한다.
- fsl,asrc-dma-tx-events: ASRC Tx에 대한 3개의 SDMA 이벤트 번호를 포함한다.
7.2.2.6 Programming Interface (Exported API and IOCTLs)
ASRC Exported API는 ASRC 서비스를 사용하는 ALSA 드라이버를 허용한다.
아래 ASRC IOCTL은 사용자 공간 애플리케이션에 사용된다:
ASRC_REQ_PAIR:
ASRC 드라이버에서 쌍을 적용한다. 쌍이 할당되면, ASRC core clock이 활성화된다.
ASRC_CONFIG_PAIR:
할당된 ASRC 쌍을 구성한다. 사용자는 struct asrc_config에 정의된 파라미터를 제공할 책임이 있다. asrc_config의 항목은 아래와 같다:
- pair: IOCTL(ASRC_REQ_PAIR)에서 할당된 ASRC 쌍.
- channel_num: 채널 번호
- buffer_num: 입출력 버퍼 사용에 필요한 버퍼 수. 입출력 버퍼는 ASRC 드라이버 내부에 할당된다. 사용자는 사용자 공간으로 이 버퍼를 다시 매핑할 책임이 있다.
- dma_buffer_size: 입/출력 버퍼의 버퍼 크기. 버퍼 크기는 페이지 크기 단위여야 한다. 일반적으로 4K 바이트가 사용된다.
- input_sample_rate: 입력 샘플링 속도. 입력 샘플링 속도는 5.512k, 8k, 11.025k, 16k, 22k, 32k, 44.1k, 48k, 64k, 88.2k, 96k, 176.4k, 192k 여야 한다.
- output_sample_rate: 출력 샘플링 속도. 출력 샘플링 속도는 32k, 44.1k, 48k, 64k, 88.2k, 96k, 176.4k,192k 여야 한다.
- input_word_width: 입력 오디오 데이터의 워드 폭. 입력 데이터의 워드 폭은 16 비트나 24 비트일 수 있다.
- output_word_width: 출력 오디오 데이터의 워드 폭. 출력 데이터의 워드 폭은 16 비트나 24 비트일 수 있다.
- inclk: 입력 clock 소스는 ESAI RX clock, SSI1 RX clock, SSI2 RX clock, SPDIF RX clock, MLB_clock, ESAI TX clock, SSI1 TX clock, SSI2 TX clock, SPDIF TX clock, ASRCLK1 clock, NONE 일 수 있다. NONE 이외의 clock을 사용하는 경우, 사용자는 clock을 사용할 수 있는지 확인해야 한다.
- outclk: 출력 clock 소스는 입력 clock 소스와 동일하다.
ASRC_CONVERT:
ASRC_CONFIG_PAIR에서 설정된 파라미터에 따라 입력 데이터를 출력 데이터로 변환한다. 드라이버는 변환을 위해 input_buffer_vaddr에서 input_buffer_length 만큼의 바이트 데이터를 복사한다. 변환 후, 드라이버는 ASRC에 의해 생성된 데이터 번호에 따라 output_buffer_length를 채우고, output_buffer_vaddr에 output_buffer_length 만큼의 데이터를 복사한다. 그러나 ASRC_CONVERT를 호출하기 전에, 사용자는 입력 샘플링 속도와 출력 샘플링 속도의 비율에 따라 output_buffer_length를 채울 책임이 있다. 생성된 버퍼 크기가 사용자가 채운 output_buffer_size보다 큰 경우, 드라이버는 사용자가 채운 output_buffer_size만 output_buffer_vaddr에 복사한다. 생성된 버퍼 크기가 사용자가 채운 output_buffer_size보다 작으면(차이는 64바이트 미만이여야 한다), ASRC_CONVERT 호출은 실패한다.
- input_buffer_vaddr: 입력 버퍼의 가상 주소
- output_buffer_vaddr: 출력 버퍼의 가상 주소
- input_buffer_length: 입력 버퍼의 길이(바이트)
- output_buffer_length: 출력 버퍼의 길이(바이트)
ASRC_START_CONV:
ASRC 쌍 변환 시작
ASRC_STOP_CONV:
ASRC 쌍 변환 정지
ASRC_STATUS:
ASRC 쌍의 상태 질의