Пилим звук
Нужно перепроверить страницы по разработке звука, т.к. они давно не обновлялись и могут содержать ошибки
Звук заработал с ревизии 87bd64d.
Известные проблемы: - звук не работает после саспенда - чтобы работали колонки в последних ревизиях, нужно собирать ядро с включенной опцией CONFIG_NVEC_EVENT=y (в последних ревизиях заставить работать колонки не удалось, хотя в древнем ядре (ревизия ca20bea1) они работают. В домашней ветке работает в древней ревизии f23feedc099 (эта ревизия аналогична ревизии ca20bea105d9b из "рабочей" ветки).)
Ревизии для проверки звука из колонок
Звук из колонок у некоторых работает, у некоторых нет. http://4pda.ru/forum/index.php?showtopic=230018&view=findpost&p=9306944
http://repics.6dreams.net/pic/screenshots/mixa29s.png
Внутреннее устройство
IRC логи замеров 05-06 сен. 2011 дампы и логи загрузки звука от phh дамп регистров 32 ядра
Подготовка для замеров параметров работы звукового модуля.
Программная реализация
Частоты и делители
Исходники от Toshiba
Дифы со вкусом вина http://pastebin.com/VFYwkcWz http://pastebin.com/QbNsaU4k
Вот логи #ac100-ru, попытка разобраться: http://dl.dropbox.com/u/1757382/ac100/sound-logs.txt
Даташит к Realtek ALC5632: ALC5632-GRT.pdf Даташит к Texas Instruments TPA6017A2 (усилитель для внутренних колонок): TPA6017a2.pdf
Схема платы paz00: PAZ00 Schematics Document.pdf Схема платы соответствует тошибе не полностью, но по большей части правильна.
Наш файл sound/soc/codecs/alc5632.c основан наsound/soc/codecs/alc5623.c Соответствующие .h-файлы: sound/soc/codecs/alc5632.h, sound/soc/codecs/alc5623.h Даташит к ALC5623, еще нашел документацию к alc5623 Нужно сравнить исходники и свериться с даташитами
Как это реализовано
- Чип Realtec ALC5632 может работать в двух режимах: master и slave.
- В случае с Toshiba AC100 работает в slave-режиме.
- При подключении наушников происходит размыкание контакта HP_DET (вывод тегры: P22, SPI2_CS1#) с землей
- Переключение выхода с наушников на колонки производится записью в регистр кодека Reg-26h[15] (Speaker Amplifier 0: Normal 1: Power Down)
- Управление питанием усилителя колонок происходит путем управления состоянием GPIO4A (EC_MUTE на схеме)
Согласно схеме, Realtek получает:
- MCLK с вывода тегры, именуемого DAP_MCLK1
- SDAC c вывода тегры, именуемого DAP1_DOUT
- BCLK c вывода тегры, именуемого DAP1_SCLK
- SDALRCK c вывода тегры, именуемого DAP1_FS
Управление (на сколько я понимаю чтение/запись регистров) производится по шине I2C (контакты SCL, SDA). Передача данных идет по шине I2S (контакты SDAC - данные, BCLK - такт на каждый бит данных, SDALRCK - выбор канала left/right). Выбор частоты BCLK зависит от битов на канал, количества каналов и частоты. Для звука частотой 44.1 кГц, 32 бита на каждый из 2-х стерео каналов будет иметь частоту 2.8224 МГц.
Фрагмент схемы:
Описание пинов alc5632:
В текущем состоянии драйвер выставляет некоторые значения регистров; с дампом значений регистров можно ознакомиться здесь
Для текущего состояния кодека (определено по регистрам) даташит определяет следующие параметры:
Автор данной правки немного нуб и не знает, как посмотреть частоту SCLK (немного информации ниже), i2s SYSCLK и семпл рейты. Однако, на эти параметры стоит ориентироваться при отладке; для текущего состояния кодека они являются рабочими. Важно! Таблицу возможных значений регистров и клоков можно посмотреть в даташите на 82 странице, Appendix A Замечание: SCLK эквивалентно BLCK. В 5623 драйвер выбирает коэффициэнты для случая BCLK=32FS (можетбыть 64 или 32)
Стоит учесть, что, по словам marvin24, значение /sys/kernel/debug/clock/audio/rate не является значением DAP_MCLK1. Можно предположить, что нужный клок программно не инициализируется.
cat /sys/kernel/debug/clock/clock_tree
дает результат вида
pll_p_out1 on 2 7.5 28800000 pll_a on 2 x1.9.. 56448000 pll_a_out0 on 3 2.5 22579200 audio on 1 22579200 *audio_2x off 0 x2 45158400 i2s1 off 0 8 2822400 cdev1 on 1 22579200
Значения регистров можно посмотреть так:
cat /sys/kernel/debug/asoc/tegra-paz00/alc5632.0-001e/codec_reg
Логи инициализации клоков тегры и alc5632 (полный лог):
[ 118.721147] paz00_asoc_hw_params: input srate: 44100 [ 118.724580] paz00_asoc_hw_params: calculated mclk: 22579200 [ 118.727952] paz00_asoc_hw_params: corrected mclk: 22579200 [ 118.731316] tegra_asoc_utils_set_rate: set srate: 44100, mclk: 22579200 [ 118.734813] tegra_asoc_utils_set_rate: new_baseclock: 56448000, rate: 44100 [ 118.738375] clk_disable: name: cdev1 [ 118.741913] clk_disable: name: pll_a_out0 [ 118.745462] clk_disable: name: pll_a_out0 [ 118.748839] clk_disable: name: pll_a [ 118.752133] tegra_asoc_utils_set_rate: pll_a=new_base=56448000, pll_a_out0=mclk=22579200 [ 118.755670] clk_set_rate: name: pll_a, rate: 56448000 [ 118.759508] clk_set_rate: name: pll_a_out0, rate: 22579200 [ 118.763024] clk_enable: name: pll_a [ 118.766521] clk_enable: name: pll_a_out0 [ 118.769932] clk_enable: name: cdev1 [ 118.773299] clk_enable: name: pll_a_out0 [ 118.776635] clk_enable: name: i2c1 [ 118.779860] clk_enable: name: clk_m [ 118.783080] clk_disable: name: i2c1 [ 118.786198] clk_disable: name: clk_m [ 118.789211] alc5632_set_dai_sysclk: clk_id: 0, fgreq: 22579200 (Clocks after PP and dividers) [ 118.792474] clk_enable: name: i2c1 [ 118.795730] clk_enable: name: clk_m [ 118.799000] clk_disable: name: i2c1 [ 118.802109] clk_disable: name: clk_m [ 118.805238] get_coeff: rate 44100 [ 118.808340] alc5632 0-001e: alc5632_pcm_hw_params: sysclk=22579200,rate=44100,coeff=0x3075 [ 118.808352] clk_enable: name: i2c1 [ 118.811498] clk_enable: name: clk_m [ 118.814677] clk_disable: name: i2c1 [ 118.817621] clk_disable: name: clk_m [ 118.820430] clk_set_rate: name: i2s1, rate: 2822400
для 48 kHz
[21858.448055] paz00_asoc_hw_params: input srate: 48000 [21858.451106] paz00_asoc_hw_params: calculated mclk: 24576000 [21858.454251] paz00_asoc_hw_params: corrected mclk: 24576000 [21858.457353] tegra_asoc_utils_set_rate: set srate: 48000, mclk: 24576000 [21858.460542] tegra_asoc_utils_set_rate: new_baseclock: 73728000, rate: 48000 [21858.463679] clk_disable: name: cdev1 [21858.466819] clk_disable: name: pll_a_out0 [21858.470007] clk_disable: name: pll_a_out0 [21858.473117] clk_disable: name: pll_a [21858.476316] tegra_asoc_utils_set_rate: pll_a=new_base=73728000, pll_a_out0=mclk=24576000 [21858.479643] clk_set_rate: name: pll_a, rate: 73728000 [21858.483350] clk_set_rate: name: pll_a_out0, rate: 24576000 [21858.486857] clk_enable: name: pll_a [21858.490219] clk_enable: name: pll_a_out0 [21858.493511] clk_enable: name: cdev1 [21858.496750] clk_enable: name: pll_a_out0 [21858.499933] clk_enable: name: i2c1 [21858.503071] clk_enable: name: clk_m [21858.506297] clk_disable: name: i2c1 [21858.509416] clk_disable: name: clk_m [21858.512484] alc5632_set_dai_sysclk: clk_id: 0, fgreq: 24576000 (Clocks after PP and dividers) [21858.515801] clk_enable: name: i2c1 [21858.519022] clk_enable: name: clk_m [21858.522329] clk_disable: name: i2c1 [21858.525487] clk_disable: name: clk_m [21858.528626] get_coeff: rate 48000 [21858.531764] alc5632 0-001e: alc5632_pcm_hw_params: sysclk=24576000,rate=48000,coeff=0x3075 [21858.531776] clk_enable: name: i2c1 [21858.534963] clk_enable: name: clk_m [21858.538154] clk_disable: name: i2c1 [21858.541122] clk_disable: name: clk_m [21858.543966] clk_set_rate: name: i2s1, rate: 3072000
Функции: tegra_asoc_utils_set_rate (СЧИТАЕТ И ВЫСТАВЛЯЕТ КЛОКИ ТЕГРЫ), paz00_asoc_hw_params, clk_set_rate, alc5632_set_dai_sysclk Имеем клоки: pll_a, pll_a_out0, cdev1, i2s1 Ноги тегры: DAP_MCLK1, DAP1_DOUT, DAP1_SCLK, DAP1_FS Ноги alc5632: MCLK, SDAC, BCLK, SDALRCK
Описание клоков начинается с arch/arm/mach-tegra/tegra2_clocks.c строка 1697 pll_a pll_a_out0 audio cdev1
Согласно коментарию /* dap_mclk1, belongs to the cdev1 pingroup. */ - DAP_MCLK1 = cdev1 = MCLK Судя по значению (2822400) - DAP1_SCLK = i2s1 = BCLK
Соединение компонентов
Сейчас звук из DAC идет через микшер, но прямое подключение тоже не помогает.
Задачи
- Нужно понять, какие клоки каким выводам тегры соответствуют на схеме. - После этого можно будет понять, какая частота на какой контакт alc5632 подается, и - посчитать, правильные значения подаются или нет. Возможно необходимо подстравивать делители в alc5632 под нужные частоты.
Какие известные проблемы:
- muromec: клоки от балды ваще
- resetnow_: у нас, возможно, аудио клок не инициализирован