Пилим звук

Материал из Toshiba AC100 wiki
Версия от 08:13, 2 августа 2016; Stuw (обсуждение | вклад) (Fix formatting)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Нужно перепроверить страницы по разработке звука, т.к. они давно не обновлялись и могут содержать ошибки

Звук заработал с ревизии 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_: у нас, возможно, аудио клок не инициализирован