(1) BCLK과 LRCLK의 발생 타이밍
- 클럭 정보를 얻는 단계 (hw_params):
- hw_params()는 ALSA ASoC 계층에서 PCM 정보를 전달 받는 단계임.
- 이 단계에서 샘플링 레이트, 채널 수, 샘플 크기 패러미터를 바탕으로 정확한 BCLK, LRCLK 정보를 생성함.
- 예를 들어 BCLK = Rate * Channel * Bit per sample, LRCLK = Rate
- set_sysclk에서도 동일하게 설정할 수 있을 것으로 보이는데, 일반적으로 set_sysclk에서는 더 일반적인 범위의 클럭을 설정한다고 함. (예를 들어 PLL 설정이나 클럭 소스 설정)
- 클럭 발생 시점:
- BCLK, LRCLK 모두 오디오 데이터가 흐르는 순간(dma 전송 준비 완료 후 trigger 호출 시점)에 같이 출력됨 (이론)
- 하지만 대부분의 audio codec들은 bclk을 base clock으로 사용하므로, 실제 데이터와 clk이 같이 들어오면 데이터가 누락될 가능성이 높음.
- 따라서 일반적으로 bclk 출력이 먼저 발생됨. (얼마나 빨리 줄 것인가는 Audio codec datasheet을 기반으로하는 구현 또는 tuning의 영역으로 보임)
- 일부 ASoC에서는 소비 전류의 이유로 hw_params에서 클럭을 출력하지 않고, 실제 데이터가 흐르는 그 직전까지 클럭을 출력하지 않도록 할 수 있음. Q사의 qchannel 컨트롤
- BCLK, LRCLK 모두 오디오 데이터가 흐르는 순간(dma 전송 준비 완료 후 trigger 호출 시점)에 같이 출력됨 (이론)
(2) Audio 출력시 audio if의 ops 호출 순서
- startup(): 오디오 스트림을 위한 리소스 초기화.
- set_sysclk(): 시스템 클럭 설정 (필요한 경우).
- set_fmt(): DAI 포맷(I2S, RJ, LJ 등) 설정.
- set_tdm_slot(): TDM 모드 슬롯 구성 (필요한 경우).
- hw_params(): 스트림 파라미터 설정(샘플링 레이트, 포맷, 채널 수 등).
- prepare(): 데이터 전송 준비(FIFO 리셋, 클럭 활성화).
- trigger() (START): DMA 활성화 및 데이터 전송 시작.
- pointer(): 현재 재생/수신 포인터 반환 (주기적으로 호출).
- trigger() (STOP): DMA 비활성화 및 데이터 전송 종료.
- shutdown(): 스트림 종료 후 리소스 해제.
'프로그래밍 > 리눅스 커널' 카테고리의 다른 글
pinctrl-names과 pinctrl (0) | 2024.10.22 |
---|---|
s906b sound card probe 살펴보기 (1) | 2022.05.26 |
s906b alsa sound card 코드 따라가기 (0) | 2022.05.19 |
삼성 S906B (S22+) 리눅스 커널 다운 및 vim, cscope, ctags 준비 (0) | 2022.05.19 |