프로그래밍/리눅스 커널

I2S의 bclk, lrclk 출력 시점

포도알77 2024. 12. 22. 18:54

 

(1) BCLK과 LRCLK의 발생 타이밍

  1. 클럭 정보를 얻는 단계 (hw_params):
    • hw_params()는 ALSA ASoC 계층에서 PCM 정보를 전달 받는 단계임.
    • 이 단계에서 샘플링 레이트, 채널 수, 샘플 크기 패러미터를 바탕으로 정확한 BCLK, LRCLK 정보를 생성함.
      • 예를 들어 BCLK = Rate * Channel * Bit per sample, LRCLK = Rate
    • set_sysclk에서도 동일하게 설정할 수 있을 것으로 보이는데, 일반적으로 set_sysclk에서는 더 일반적인 범위의 클럭을 설정한다고 함. (예를 들어 PLL 설정이나 클럭 소스 설정)
  2. 클럭 발생 시점:
    • BCLK, LRCLK 모두 오디오 데이터가 흐르는 순간(dma 전송 준비 완료 후 trigger 호출 시점)에 같이 출력됨 (이론)
      • 하지만 대부분의 audio codec들은 bclk을 base clock으로 사용하므로, 실제 데이터와 clk이 같이 들어오면 데이터가 누락될 가능성이 높음.
      • 따라서 일반적으로 bclk 출력이 먼저 발생됨. (얼마나 빨리 줄 것인가는 Audio codec datasheet을 기반으로하는 구현 또는 tuning의 영역으로 보임)
    • 일부 ASoC에서는 소비 전류의 이유로 hw_params에서 클럭을 출력하지 않고, 실제 데이터가 흐르는 그 직전까지 클럭을 출력하지 않도록 할 수 있음. Q사의 qchannel 컨트롤

 

(2) Audio 출력시 audio if의 ops 호출 순서

  1. startup(): 오디오 스트림을 위한 리소스 초기화.
  2. set_sysclk(): 시스템 클럭 설정 (필요한 경우).
  3. set_fmt(): DAI 포맷(I2S, RJ, LJ 등) 설정.
  4. set_tdm_slot(): TDM 모드 슬롯 구성 (필요한 경우).
  5. hw_params(): 스트림 파라미터 설정(샘플링 레이트, 포맷, 채널 수 등).
  6. prepare(): 데이터 전송 준비(FIFO 리셋, 클럭 활성화).
  7. trigger() (START): DMA 활성화 및 데이터 전송 시작.
  8. pointer(): 현재 재생/수신 포인터 반환 (주기적으로 호출).
  9. trigger() (STOP): DMA 비활성화 및 데이터 전송 종료.
  10. shutdown(): 스트림 종료 후 리소스 해제.

 

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사