Звук после саспенда

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

Это одна из двук наиболее актуальных проблем. Вторая - неправильное управление питанием (в частности нужно будет выкидывать функцию android_inits).

Что мы имеем После суспенда не работает звук. Ни в наушниках, ни в колонках. Мне с этой проблемой помогла справиться перезагрузка модулей snd_soc_tegra_paz00 и snd_soc_alc5632

sudo rmmod snd_soc_tegra_paz00
sudo rmmod snd_soc_alc5632
sudo modprobe snd_soc_alc5632
sudo modprobe snd_soc_tegra_paz00

Однако ogra сказал, что ему это не помогало. Он пробовал различные комбинации и даже выгружал все до модуля snd. leonro также не помогла перезагрузка модулей.

План действий

* заставить суспенд вызыватся
* застащитх звук работать после суспенда
* заставить работать микрофон
* выкинуть андроид_инит
* почистить срач

UPD: leonro сделал вызов нашей функции суспенда (alc5632_suspend) форсированным и добавил принудительное сохранение регистров в кеше. На резьюме звук появился.


Epic fail Есть два способа получить регистры звуковухи:

sudo mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/asoc/tegra-paz00/alc5632.0-001e/codec_reg

и утилита alc-ctl (исходный код alc-ctl.c), читающая (и способная записать) регистры через i2c девайс.

sudo modprobe i2c-dev
sudo ./alc-ctl /dev/i2c-0 r 26
sudo ./alc-ctl /dev/i2c-0 w 26 000f

Самый большой облом оказался в том, что эти два способа дают нам разный результат. Полагаю лечше использовать alc-ctl.

Делаем дамп регистров full-dump.sh

for reg in `seq 0 2 96 | xargs -L1 -I% echo "obase=16; %" | bc | tr '[:upper:]' '[:lower:]'` ; do
    sudo ./alc-ctl /dev/i2c-0 r $reg
done
./full-dump.sh > x01-before-playback.txt

Первая цель (ГОТОВО) - получить дамп регистров до саспенда и после (я нашел проблему с разным результатом дампа недавно и не имел возможности сделать его самостоятельно). http://dl.dropbox.com/u/36754970/x01-after-playback.txt http://dl.dropbox.com/u/36754970/x01-after-suspend.txt http://dl.dropbox.com/u/36754970/x01-after-suspend-%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5.txt

02: 8080        02: 0000 - Speaker Output Volume
06: 8080    06: 9c9c - AUXOUT Volume
08: c800    08: c000 - Phone Input
0a: e808    0a: e000 - LINE_IN Volume
0c: 1010    0c: 0c0c - STEREO DAC Input Volume
0e: 0808    0e: 0000 - MIC Input Volume
10: ee0f    10: e801 - Stereo DAC and MIC Routing Control
12: cbcb    12: dcdc - ADC Record Gain
14: 7f7f    14: 3f3f - ADC Record Mixer Control
18: e010    18: e035 - Voice DAC Volume
1c: 8008    1c: 0b88 - Output Mixer Control
22: 0000    22: 0a00 - Microphone Control
24: 00c0    24: 00c7 - Codec Digital MIC / Digital Boost Control
26: ef00    26: 000c - Power Down Control/Status

Вторая цель (ГОТОВО) - попробовать сохранять регистры в кэш прямо перед суспендом. По словам leonro сохранение регистров не помогло. UPD не вызывалась функция суспенда. Поменяли на принудительный вызов и внутри стали сохранять регистры - после резбюма звук заработал. Savalik: Тащем-та получить какой либо вывод так и не удалось. То ли alc5632_suspend и resume сами не вызываются..(не успевают вызываться) то ли нужен какой то фокус чтобы услышать ответ от туда. Stuw, ну ты понял. <-- была попытка добавить дамп регистров в лог, но никаких записей не появилось. Возможно проблемы с переводом драйвера в суспенд.


<leonro> если в кратце, то глобальный суспенд вызывает с SND_SOC_BIAS_ON <leonro> поэтому вот этот свитч <leonro> switch (codec->dapm.bias_level) { <leonro> не запускает нан суспенд <leonro> теперь надо понять, почему alc5632_set_bias_level не вызывается <leonro> это дифф, только он загаже <leonro> загаже <leonro> загажен <leonro> http://paste.ubuntu.com/707283/ <leonro> а это греп на лог <leonro> http://paste.ubuntu.com/707286/ <stuw> спасибо <stuw> leonro, а ты запускал проигрывание музыки? <leonro> да <stuw> у нас при попытке суспенда карточка находится в состоянии ON, хотя функция суспенда ожидает STANDBY или OFF. <leonro> ага <stuw> по идее у нас должно быть в дмесг сообщение CODEC is on over suspend <leonro> нет, не должен <leonro> зависит от дебаг левел <stuw> ах да, там не просто принтк <stuw> возможно нам надо DAMP виджеты править, чтобы правильно звуковуха переходила между состояниями <leonro> надо надо патчи взять с апстрима, я сделал гит лог на сок-кор.с <leonro> у нас <leonro> commit 5b54391a00b20031637ab2ced6d211f75d929195 <leonro> Author: Stephen Warren <[email protected]> <leonro> Date: Fri Apr 15 13:37:05 2011 -0700 <leonro> в апстрием <leonro> commit f0e8ed858edb327802ee65fd695cc1538286226f <leonro> Author: Mark Brown <[email protected]> <leonro> Date: Tue Sep 20 11:41:54 2011 +0100 <stuw> хм... тоже хорошая идея ) <leonro> плюс я подвинул codec->driver->suspend(codec, PMSG_SUSPEND); <leonro> чуть выше, и заработал наш суспенд и резьюм, правда звук нет


<leonro> в кратце, звук после суспенда заработал <stuw> что ты для этого сделал? <stuw> в 2-х словах <leonro> я пишу :) <leonro> сек <leonro> подвинул вот эту строчку <leonro> 1131 codec->driver->suspend(codec, PMSG_SUSPEND); <leonro> в snd_soc_suspend наверх <leonro> кто-то выставляет <leonro> в функции alc5632_set_bias_level <leonro> вот это значение SND_SOC_BIAS_ON <leonro> вот эта строчка 1105 card->rtd[i].codec->dapm.suspend_bias_level = card->rtd[i].codec-> dapm.bias_level; <leonro> из soc_core.c <leonro> корочен надо найти и понят кто играется с dapm.bias_level <leonro> вот этим я и занимался, время от времени :) <stuw> вот эта строчка 1105 card->rtd[i].codec->dapm.suspend_bias_level = card->rtd[i].codec-> dapm.bias_level; <--- она вроде ни на что не влияет, т.к. ниже проверяется bias_level а не suspend_bias_level <stuw> ты сохранение регистров добавлял в alc5632_suspend ? <stuw> или оно и так заработало? <leonro> да, я прогнал <leonro> да у меня филл_кеш в суспенд


Третья цель - собрать dmesg с дебажного ядра в .config выставить y для: CONFIG_DEBUG_KERNEL=y а также CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y CONFIG_PM_VERBOSE=y CONFIG_PM_SLEEP_ADVANCED_DEBUG=y

Спасибо leonro за принты - http://paste.ubuntu.com/707922/

282 /* dapm stream operations */
283 #define SND_SOC_DAPM_STREAM_NOP         0x0
284 #define SND_SOC_DAPM_STREAM_START       0x1
285 #define SND_SOC_DAPM_STREAM_STOP        0x2
286 #define SND_SOC_DAPM_STREAM_SUSPEND     0x4
287 #define SND_SOC_DAPM_STREAM_RESUME      0x8
288 #define SND_SOC_DAPM_STREAM_PAUSE_PUSH  0x10
289 #define SND_SOC_DAPM_STREAM_PAUSE_RELEASE   0x20
[  148.627511] snd_ snd_soc_suspend: capture.stream_name=Capture
[  148.627558] snd_ soc_dapm_stream_event: widget Right ADC - Right HiFi Capture stream Capture event 4
[  148.627607] snd_ soc_dapm_stream_event: widget Left ADC - Left HiFi Capture stream Capture event 4
[  148.627653] snd_ soc_dapm_stream_event: widget Right DAC - Right HiFi Playback stream Capture event 4
[  148.627700] snd_ soc_dapm_stream_event: widget Left DAC - Left HiFi Playback stream Capture event 4
[  148.628541] snd_ dapm_power_widgets: Run all the bias changes in parallel
[  149.109072] snd_ soc_dapm_stream_event: widget Right ADC - Right HiFi Capture stream Playback event 8
[  149.109139] snd_ soc_dapm_stream_event: widget Left ADC - Left HiFi Capture stream Playback event 8
[  149.109190] snd_ soc_dapm_stream_event: widget Right DAC - Right HiFi Playback stream Playback event 8
[  149.109237] snd_ soc_dapm_stream_event: widget Left DAC - Left HiFi Playback stream Playback event 8
[  149.111545] snd_ dapm_power_widgets: Run all the bias changes in parallel

Т.е. события на suspend-resume приходят, но мы остаемся с неправильным биас левел

Нужно потрейсить функции

dapm_pre_sequence_async
dapm_post_sequence_async

При суспенде: первая переводит в режим PREPARE (если d->dev_power = 0), потом меняются значения виджетов, потом вторая переводит из PREPARE в STANBY (что по идее должно позволять суспенд).

dmesg_suspend_log.txt dmesg_suspend_log.patch В логе видно, что для Mic Bias1 почему-то форсится питание. snd_ dapm_power_widgets: force power to 1 for Mic Bias1 Из-за этого похоже девайс и остается во включенном состоянии.

<leonro_> закоментирощал вот эти строчки http://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/sound/soc/tegra/paz00.c#line155 и http://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/sound/soc/tegra/paz00.c#line163 <stuw> leonro_, https://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/sound/soc/tegra/paz00.c#line220 <stuw> ее не хватает, чтобы мы не уходили в суспенд? <stuw> в смысле закоментировать только ее если <leonro_> stuw: возможно, я вчера много чего закоментировал :), ... Возможно хватит 220 строки, чтобы мы начали в суспенд уходить.


Цель четвертая - разобраться с колонками Вообщем включение колонок после саспенда благодаря leonro было осилено: http://pastebin.com/vqimtdcs

Предсонный diff от leonro: http://paste.ubuntu.com/708928/