https://paz00.ru/index.php?title=%D0%97%D0%B2%D1%83%D0%BA_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5_%D1%81%D0%B0%D1%81%D0%BF%D0%B5%D0%BD%D0%B4%D0%B0&feed=atom&action=historyЗвук после саспенда - История изменений2024-03-28T08:37:42ZИстория изменений этой страницы в викиMediaWiki 1.39.5https://paz00.ru/index.php?title=%D0%97%D0%B2%D1%83%D0%BA_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5_%D1%81%D0%B0%D1%81%D0%BF%D0%B5%D0%BD%D0%B4%D0%B0&diff=48&oldid=prevUnknown user в 08:13, 15 октября 20142014-10-15T08:13:04Z<p></p>
<p><b>Новая страница</b></p><div>Это одна из двук наиболее актуальных проблем. Вторая - неправильное управление питанием (в частности нужно будет выкидывать функцию android_inits).<br />
<br />
'''Что мы имеем'''<br />
После суспенда не работает звук. Ни в наушниках, ни в колонках. Мне с этой проблемой помогла справиться перезагрузка модулей snd_soc_tegra_paz00 и snd_soc_alc5632<br />
<pre><br />
sudo rmmod snd_soc_tegra_paz00<br />
sudo rmmod snd_soc_alc5632<br />
sudo modprobe snd_soc_alc5632<br />
sudo modprobe snd_soc_tegra_paz00<br />
</pre><br />
Однако ogra сказал, что ему это не помогало. Он пробовал различные комбинации и даже выгружал все до модуля snd. leonro также не помогла перезагрузка модулей.<br />
<br />
'''План действий'''<br />
* заставить суспенд вызыватся<br />
* застащитх звук работать после суспенда<br />
* заставить работать микрофон<br />
* выкинуть андроид_инит<br />
* почистить срач<br />
<br />
UPD: leonro сделал вызов нашей функции суспенда (alc5632_suspend) форсированным и добавил принудительное сохранение регистров в кеше. На резьюме звук появился.<br />
<br />
<br />
'''Epic fail'''<br />
Есть два способа получить регистры звуковухи:<br />
<pre><br />
sudo mount -t debugfs none /sys/kernel/debug<br />
cat /sys/kernel/debug/asoc/tegra-paz00/alc5632.0-001e/codec_reg<br />
</pre><br />
и утилита [http://stuw.narod.ru/ac100/tools/alc-ctl alc-ctl] (исходный код [http://stuw.narod.ru/ac100/tools/alc-ctl.c alc-ctl.c]), читающая (и способная записать) регистры через i2c девайс.<br />
<pre><br />
sudo modprobe i2c-dev<br />
sudo ./alc-ctl /dev/i2c-0 r 26<br />
sudo ./alc-ctl /dev/i2c-0 w 26 000f<br />
</pre><br />
Самый большой облом оказался в том, что эти два способа дают нам разный результат. Полагаю лечше использовать alc-ctl.<br />
<br />
'''Делаем дамп регистров'''<br />
full-dump.sh<br />
<pre><br />
for reg in `seq 0 2 96 | xargs -L1 -I% echo "obase=16; %" | bc | tr '[:upper:]' '[:lower:]'` ; do<br />
sudo ./alc-ctl /dev/i2c-0 r $reg<br />
done<br />
</pre><br />
<pre><br />
./full-dump.sh > x01-before-playback.txt<br />
</pre><br />
<br />
'''Первая цель (ГОТОВО)''' - получить дамп регистров до саспенда и после (я нашел проблему с разным результатом дампа недавно и не имел возможности сделать его самостоятельно).<br />
http://dl.dropbox.com/u/36754970/x01-after-playback.txt<br />
http://dl.dropbox.com/u/36754970/x01-after-suspend.txt<br />
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<br />
<br />
<pre><br />
02: 8080 02: 0000 - Speaker Output Volume<br />
06: 8080 06: 9c9c - AUXOUT Volume<br />
08: c800 08: c000 - Phone Input<br />
0a: e808 0a: e000 - LINE_IN Volume<br />
0c: 1010 0c: 0c0c - STEREO DAC Input Volume<br />
0e: 0808 0e: 0000 - MIC Input Volume<br />
10: ee0f 10: e801 - Stereo DAC and MIC Routing Control<br />
12: cbcb 12: dcdc - ADC Record Gain<br />
14: 7f7f 14: 3f3f - ADC Record Mixer Control<br />
18: e010 18: e035 - Voice DAC Volume<br />
1c: 8008 1c: 0b88 - Output Mixer Control<br />
22: 0000 22: 0a00 - Microphone Control<br />
24: 00c0 24: 00c7 - Codec Digital MIC / Digital Boost Control<br />
26: ef00 26: 000c - Power Down Control/Status<br />
</pre><br />
<br />
'''Вторая цель (ГОТОВО)''' - попробовать сохранять регистры в кэш прямо перед суспендом.<br />
По словам leonro сохранение регистров не помогло. '''UPD''' не вызывалась функция суспенда. Поменяли на принудительный вызов и внутри стали сохранять регистры - после резбюма звук заработал.<br />
Savalik: Тащем-та получить какой либо вывод так и не удалось. То ли alc5632_suspend и resume сами не вызываются..(не успевают вызываться) то ли нужен какой то фокус чтобы услышать ответ от туда. Stuw, ну ты понял. <-- была попытка добавить дамп регистров в лог, но никаких записей не появилось. Возможно проблемы с переводом драйвера в суспенд.<br />
<br />
<br />
<br />
<leonro> если в кратце, то глобальный суспенд вызывает с SND_SOC_BIAS_ON<br />
<leonro> поэтому вот этот свитч<br />
<leonro> switch (codec->dapm.bias_level) {<br />
<leonro> не запускает нан суспенд<br />
<leonro> теперь надо понять, почему alc5632_set_bias_level не вызывается<br />
<leonro> это дифф, только он загаже<br />
<leonro> загаже<br />
<leonro> загажен<br />
<leonro> http://paste.ubuntu.com/707283/<br />
<leonro> а это греп на лог<br />
<leonro> http://paste.ubuntu.com/707286/<br />
<stuw> спасибо<br />
<stuw> leonro, а ты запускал проигрывание музыки?<br />
<leonro> да<br />
<stuw> у нас при попытке суспенда карточка находится в состоянии ON, хотя функция суспенда ожидает STANDBY или OFF.<br />
<leonro> ага<br />
<stuw> по идее у нас должно быть в дмесг сообщение CODEC is on over suspend<br />
<leonro> нет, не должен<br />
<leonro> зависит от дебаг левел<br />
<stuw> ах да, там не просто принтк<br />
<stuw> возможно нам надо DAMP виджеты править, чтобы правильно звуковуха переходила между состояниями<br />
<leonro> надо надо патчи взять с апстрима, я сделал гит лог на сок-кор.с<br />
<leonro> у нас<br />
<leonro> commit 5b54391a00b20031637ab2ced6d211f75d929195<br />
<leonro> Author: Stephen Warren <swarren@nvidia.com><br />
<leonro> Date: Fri Apr 15 13:37:05 2011 -0700<br />
<leonro> в апстрием<br />
<leonro> commit f0e8ed858edb327802ee65fd695cc1538286226f<br />
<leonro> Author: Mark Brown <broonie@opensource.wolfsonmicro.com><br />
<leonro> Date: Tue Sep 20 11:41:54 2011 +0100<br />
<stuw> хм... тоже хорошая идея )<br />
<leonro> плюс я подвинул codec->driver->suspend(codec, PMSG_SUSPEND);<br />
<leonro> чуть выше, и заработал наш суспенд и резьюм, правда звук нет<br />
<br />
<br />
<br />
<leonro> в кратце, звук после суспенда заработал<br />
<stuw> что ты для этого сделал?<br />
<stuw> в 2-х словах<br />
<leonro> я пишу :)<br />
<leonro> сек<br />
<leonro> подвинул вот эту строчку<br />
<leonro> 1131 codec->driver->suspend(codec, PMSG_SUSPEND);<br />
<leonro> в snd_soc_suspend наверх<br />
<leonro> кто-то выставляет<br />
<leonro> в функции alc5632_set_bias_level<br />
<leonro> вот это значение SND_SOC_BIAS_ON<br />
<leonro> вот эта строчка 1105 card->rtd[i].codec->dapm.suspend_bias_level = card->rtd[i].codec-> dapm.bias_level;<br />
<leonro> из soc_core.c<br />
<leonro> корочен надо найти и понят кто играется с dapm.bias_level<br />
<leonro> вот этим я и занимался, время от времени :)<br />
<stuw> вот эта строчка 1105 card->rtd[i].codec->dapm.suspend_bias_level = card->rtd[i].codec-> dapm.bias_level; <--- она вроде ни на что не влияет, т.к. ниже проверяется bias_level а не suspend_bias_level<br />
<stuw> ты сохранение регистров добавлял в alc5632_suspend ?<br />
<stuw> или оно и так заработало?<br />
<leonro> да, я прогнал<br />
<leonro> да у меня филл_кеш в суспенд<br />
<br />
<br />
'''Третья цель''' - собрать dmesg с дебажного ядра<br />
в .config выставить y для:<br />
CONFIG_DEBUG_KERNEL=y<br />
а также<br />
CONFIG_PM_DEBUG=y<br />
CONFIG_PM_ADVANCED_DEBUG=y<br />
CONFIG_PM_VERBOSE=y<br />
CONFIG_PM_SLEEP_ADVANCED_DEBUG=y<br />
<br />
Спасибо leonro за принты - http://paste.ubuntu.com/707922/<br />
<pre><br />
282 /* dapm stream operations */<br />
283 #define SND_SOC_DAPM_STREAM_NOP 0x0<br />
284 #define SND_SOC_DAPM_STREAM_START 0x1<br />
285 #define SND_SOC_DAPM_STREAM_STOP 0x2<br />
286 #define SND_SOC_DAPM_STREAM_SUSPEND 0x4<br />
287 #define SND_SOC_DAPM_STREAM_RESUME 0x8<br />
288 #define SND_SOC_DAPM_STREAM_PAUSE_PUSH 0x10<br />
289 #define SND_SOC_DAPM_STREAM_PAUSE_RELEASE 0x20<br />
</pre><br />
<pre><br />
[ 148.627511] snd_ snd_soc_suspend: capture.stream_name=Capture<br />
[ 148.627558] snd_ soc_dapm_stream_event: widget Right ADC - Right HiFi Capture stream Capture event 4<br />
[ 148.627607] snd_ soc_dapm_stream_event: widget Left ADC - Left HiFi Capture stream Capture event 4<br />
[ 148.627653] snd_ soc_dapm_stream_event: widget Right DAC - Right HiFi Playback stream Capture event 4<br />
[ 148.627700] snd_ soc_dapm_stream_event: widget Left DAC - Left HiFi Playback stream Capture event 4<br />
[ 148.628541] snd_ dapm_power_widgets: Run all the bias changes in parallel<br />
[ 149.109072] snd_ soc_dapm_stream_event: widget Right ADC - Right HiFi Capture stream Playback event 8<br />
[ 149.109139] snd_ soc_dapm_stream_event: widget Left ADC - Left HiFi Capture stream Playback event 8<br />
[ 149.109190] snd_ soc_dapm_stream_event: widget Right DAC - Right HiFi Playback stream Playback event 8<br />
[ 149.109237] snd_ soc_dapm_stream_event: widget Left DAC - Left HiFi Playback stream Playback event 8<br />
[ 149.111545] snd_ dapm_power_widgets: Run all the bias changes in parallel<br />
</pre><br />
Т.е. события на suspend-resume приходят, но мы остаемся с неправильным биас левел<br />
<br />
Нужно потрейсить функции<br />
<pre><br />
dapm_pre_sequence_async<br />
dapm_post_sequence_async<br />
</pre><br />
При суспенде: первая переводит в режим PREPARE (если d->dev_power = 0), потом меняются значения виджетов, потом вторая переводит из PREPARE в STANBY (что по идее должно позволять суспенд).<br />
<br />
[http://ac100.wikispaces.com/file/view/dmesg_suspend_log.txt/265418170/dmesg_suspend_log.txt dmesg_suspend_log.txt]<br />
[http://ac100.wikispaces.com/file/view/dmesg_suspend_log.patch/265418188/dmesg_suspend_log.patch dmesg_suspend_log.patch]<br />
В логе видно, что для '''Mic Bias1''' почему-то форсится питание.<br />
snd_ dapm_power_widgets: force power to 1 for Mic Bias1 <br />
Из-за этого похоже девайс и остается во включенном состоянии.<br />
<br />
<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<br />
<stuw> leonro_, https://gitorious.org/~marvin24/ac100/marvin24s-kernel/blobs/chromeos-ac100-2.6.38/sound/soc/tegra/paz00.c#line220<br />
<stuw> ее не хватает, чтобы мы не уходили в суспенд?<br />
<stuw> в смысле закоментировать только ее если<br />
<leonro_> stuw: возможно, я вчера много чего закоментировал :), ...<br />
Возможно хватит 220 строки, чтобы мы начали в суспенд уходить.<br />
<br />
<br />
'''Цель четвертая''' - разобраться с колонками<br />
Вообщем включение колонок после саспенда благодаря leonro было осилено:<br />
http://pastebin.com/vqimtdcs<br />
<br />
Предсонный diff от leonro:<br />
http://paste.ubuntu.com/708928/</div>Unknown user