MOD Duo sound drivers

From MOD Wiki
Jump to: navigation, search

Código Fonte

O código fonte dos drivers do MOD Duo estão sendo desenvolvidos no repositório http://github.com/portalmod/linux-sunxi/

Em particular, os desenvolvimentos mais recentes estão em commits do branch mod-sunxi-3.4-fsanches disponível em https://github.com/portalmod/linux-sunxi/tree/mod-sunxi-3.4-fsanches

Visão Geral

Os drivers de som do MOD Duo são implementados usando a infraestrutura ALSA SoC (System on a Chip) que aorganiza o código de forma modular, com o intuito de reduzir a duplicação desnecessária de código. Sendo assim, os 3 principais módulos que compõem o driver da placa de som do MOD Duo são:

  • sound/soc/codecs/cs4245.c (driver do CODEC CS4245 da Cirrus Logic)
  • sound/soc/sunxi/i2s/*.c (drivers da interface de áudio digital I2S nativa do SoC Allwinner A20)
  • sound/soc/sunxi/mod-duo.c (driver da placa de som do MOD Duo que declara os outros drivers como dependência)

Descrição dos Drivers

driver cs4245

sound/soc/codecs/cs4245.c
driver do CODEC CS4245 da Cirrus Logic

Esse driver começou a ser escrito pelo Rafael Guayer, com base no driver de um outro chip da Cirrus Logic, o cs4270.

A implementação atual está incompleta e funciona apenas para as demandas específicas do MOD Duo:

  • Configuração do codec por meio de barramento I²C (a outra opção não implementada é SPI)
  • Sample rate de 48kHz
  • Amostras de 24 bits

Limitações conhecidas

A seguinte função deveria fazer escritas nos registradores de configuração do codec para mudar os seus parâmetros:

static int cs4245_hw_params(struct snd_pcm_substream *substream, 
                            struct snd_pcm_hw_params *params,
                            struct snd_soc_dai *dai)

A única configuração que funciona é a definida na inicialização do driver.

driver mod-duo

sound/soc/sunxi/mod-duo.c
driver da placa de som do MOD Duo

Este driver interconecta os outros drivers de acordo com as características da placa de som que nós projetamos para o MOD Duo. O driver declara que a placa usa um codec CS4245, descreve o endereço I²C usado para a comunicação com o codec, e define o fluxo de streams de áudio digital I2S entre o CODEC e a interface I2S nativa do SoC A20.

Além disso, este driver também declara os controles ALSA que selecionam:

  • as impedâncias de entrada de cada canal (esse chaveamento será removido pois recentemente decidimos que teremos um valor de impedância fixo nas entradas)
  • os níveis de ganho de entrada de cada canal
  • o chaveamento dos relés de TrueBypass
  • o ganho/atenuação de -12dB a +12dB para a saída de headphone

Os controles ALSA de features específicas do CODEC são declaradas no driver do CODEC e herdadas pelo driver do MOD Duo.

problemas conhecidos

separar driver de headphone

Idealmente deveríamos criar um driver separado só para os controles do chip LM4811 (amplificador programável para headphone) de modo a viabilizar que outras placas de som que também usam esse chip possam se beneficiar desse driver.

metadados de ganho

Alguns controles possuem declaração de metadados de níveis de ganho/atenuação, mas esses dados não aparecem no alsamixer. Já para outros controles esses dados aparecem. Precisamos verificar se isso é um bug no driver, um bug no alsamixer, ou se há alguma outra razão para esse sintoma.

novos níveis de ganho

O André Coutinho fez alguns ajustes nos valores dos resistores de modo a termos um conjunto diferente de opções de nível de ganho. Os metadados no driver precisam ser atualizados caso a proposta do André seja incorporada ao hardware.

driver sunxi-i2s

sound/soc/sunxi/i2s/*.c
drivers da interface de áudio digital I2S nativa do SoC Allwinner A20