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.1KHz, 32KHz, 48KHz, 96KHz 사이의 속도 변환용으로 디자인되었다.
- 8KHz ~ 100KHz 범위의 다른 입력 샘플 속도도 지원되지만, 성능은 떨어진다(자세한 내용은 IC 사양 참조).
- 30KHz ~ 100KHz 범위의 다른 출력 샘플 속도도 지원되지만, 성능은 떨어진다.
- 수신/발신 샘플 속도의 느린 변화에 자동 조정.
- 샘플 클럭 지터에 대한 톨러런트.
- 주로 실시간 스트리밍 오디오 사용을 위해 디자인되었다. 입력 샘플 클럭을 사용할 수 없을 때, 비실시간 스트리밍 오디오 사용에 사용할 수 있다.
- 모든 사용 사례에서, 출력 샘플 클럭을 활성화해야 한다.
- 실시간 스트리밍 오디오의 경우, 입력과 출력 클럭을 모두 사용할 수 있도록 활성화해야 한다.
- 비실시간 스트리밍 오디오의 경우, 이상적인 비율 값을 ASRC 인터페이스 레지스터에 설정하여, 입력 샘플 속도 클럭을 피할 수 있다.
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 파일(/proc/driver/asrc)을 생성한다. proc은 각 쌍의 패널 번호를 추적하는 데 사용된다. 모든 쌍이 사용되지 않으면, 사용자는 proc 파일을 통해 채널 번호를 조정할 수 있다. 총 채널 수는 10개이어야 하며, 그렇지 않으면 조정된 값이 제대로 저정되지 않는다.
7.2.2.1 Sequence for Memory to ASRC to Memory
- /dev/mxc_asrc 디바이스 열기(open)
- 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 디바이스 닫기(close)
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
- 메모리에서 ASRC로, ASRC에서 메모리로 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 81. 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
그러면 ALSA 드라이버는 내장 모듈로만 구성할 수 있다.
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"를 포함해야 한다.(일반적으로 SPBA 클럭은 "dma"를 사용한다.)
- dmas: Documentation/devicetree/bindings/dma/dma.txt에 설명된 일반적인 dma 디바이스 트리 바인딩이다.
- dma-names: "txa", "rxa", "txb", "rxb", "txc", "rxc", 6개의 dmas를 정의해야 한다.
- fsl,clk-map-version: 서로 다른 SoC에서 매핑 관계는 다르다. 이 버전 번호는 클럭 맵 정보를 나타내는 데 사용할 수 있다.
- 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 코어 클럭이 활성화된다.
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: 입력 클럭 소스는 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 이외의 클럭을 사용하는 경우, 사용자는 클럭이 사용 가능한지 확인해야 한다.
- outclk: 출력 클럭 소스는 입력 클럭 소스와 동일하다.
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 쌍 상태를 쿼리한다.