LINUX.ORG.RU

alsa, взаимодействие с драйвером звуковой карты

 , , , ,


0

1

Шолом, православные.

Здесь я впервые, пришел за советом. В этих ваших линуксах плыву, так что не ругайтесь сильно. Вопросов будет много и охватывать они будут много чего, если tl;dr - уж извиняйте.

Не могли бы вы пояснить, что представляет из себя алса, как это чудо работает, как работает и опознается драйвер звуковой карты, как с ним работает алса? Подробностей особо не надо, просто поправьте меня, где ошибаюсь, да помогите склеить отдельно понятые части.
В моем понимании, есть звуковая карта, находящаяся на шине pci.
1) К ее регистрам можно получить доступ как к диапазону памяти, задав соответствующие бар-регистры (=смещение диапазона регистров контроллера) в конфигурационном пространстве pci.
2) При старте системы биос проверяет наличие абонентов на шине (Кстати, как? Перебор всех возможных адресов в конфигспейсе на наличие в них записей? Перечитывание спецификации pci мне в этом поможет - сто лет назад с ней ознакамливался), считывает все vid, did, и какие там еще информационные поля есть. На основе этих полей и каких-то предустановленных в биос таблиц определяются устройства, их формальные названия, задаются смещения для адресации регистров, выставляются режимы работы базового оборудования (контроллеры южного моста: диски гибкие и не очень, старинная видеокарточка; северного моста: контроллер памяти, управление питанием/частотой, графическая подсистема).
3) На настроенном оборудовании выполняется загрузка ядра в память - раскрутка системы. Ядро выполняет донастройку, все работает.

Сильно ошибся? Примерно так для меня выглядит раскрутка системы с нуля.

Хотелось бы заострить внимание на пункте 3). Сразу скажу изначальную проблему: после замены материнской платы (и камня) система завелась, но звуковая карта не подтянулась, и, насколько я могу видеть, все остальные устройства определены как-то тоже не так, за исключением сети. Тот аудио девайс, что есть - какой-то наворот видеокарточки, раньше он тоже был.
Сейчас я ожидал увидеть
00:1f.3 Realtek ALC887 или что-нибудь вроде того - исходя из доки на материнскую плату.

pewpew# cat /proc/asound/cards
 1 [HDMI           ]: HDA-Intel - HDA ATI HDMI
                      HDA ATI HDMI at 0xdfe60000 irq 125

pewpew# lspci
00:00.0 Host bridge: Intel Corporation Device 190f (rev 07)
00:01.0 PCI bridge: Intel Corporation Device 1901 (rev 07)
00:14.0 USB controller: Intel Corporation Device a12f (rev 31)
00:16.0 Communication controller: Intel Corporation Device a13a (rev 31)
00:17.0 SATA controller: Intel Corporation Device a102 (rev 31)
00:1c.0 PCI bridge: Intel Corporation Device a114 (rev f1)
00:1d.0 PCI bridge: Intel Corporation Device a118 (rev f1)
00:1d.1 PCI bridge: Intel Corporation Device a119 (rev f1)
00:1d.2 PCI bridge: Intel Corporation Device a11a (rev f1)
00:1f.0 ISA bridge: Intel Corporation Device a148 (rev 31)
00:1f.2 Memory controller: Intel Corporation Device a121 (rev 31)
00:1f.3 Audio device: Intel Corporation Device a170 (rev 31)
00:1f.4 SMBus: Intel Corporation Device a123 (rev 31)
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Pitcairn PRO [Radeon HD 7850]
01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Cape Verde/Pitcairn HDMI Audio [Radeon HD 7700/7800 Series]
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 09)
05:00.0 PCI bridge: ASMedia Technology Inc. ASM1083/1085 PCIe to PCI Bridge (rev 04)

pewpew# lsmod | grep snd_hda
snd_hda_codec_hdmi     53248  1 
snd_hda_intel          36864  5 snd_hda_codec_hdmi
snd_hda_controller     32768  1 snd_hda_intel
snd_hda_codec         143360  3 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_controller
snd_hwdep              20480  1 snd_hda_codec
snd_pcm               106496  4 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel,snd_hda_controller
snd                    86016  17 snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec,snd_hda_intel,snd_seq_device
soundcore              16384  2 snd,snd_hda_codec

Соответственно, пытаюсь разобраться, почему в интернете советуют переустанавливать/конфигурировать alsa (второе по жиденьким мануалам для моего случая, кстати, не помогло, а первое я что-то пока не могу понять, как сделать).

Итак, теперь самое для меня тумманое - подробный пункт 3). Для простоты буду говорить только о подсистеме аудио.
На определенном этапе в память будет загружен определенный набор драйверов (linux/drivers/ ??? почему-то

pewpew# grep snd_hda . -R
./gpu/drm/i915/intel_audio.c: * will bind dynamically to the snd_hda_intel driver's corresponding master
./gpu/drm/i915/intel_audio.c: * corresponding snd_hda_intel driver's master component.

интеловские драйвера, похоже, лежат в гпу. Где находятся риалтековские - я так и не нашел. Насколько могу судить по их сайту, драйвера они включают в alsa).
Если драйвера, как в моем случае, включены в состав alsa, а он, в свою очередь, включен в состав ядра - то они тоже окажутся в памяти. Далее, ядро каким-то образом (кстати, каким?) определяет, какой драйвер должен использоваться для имеющегося оборудования, использует в дальнейшем только его. При запуске драйвера выполняется инициализация, вторичная настройка оборудования в соответствии с возможностями драйвера и звуковой подсистемы (а значит, она должна быть загружена раньше, чем драйвер?). Не очень понимаю, какую роль во всем этом играет файловая операция probe (ldd3 и интернет ясности не внесли, я что-то фундаментальное для этого никак не могу уловить, видимо).
Дальше alsa предоставляет какой-то унифицированный интерфейс для звуковой системы надлежащего уровня, или самодостаточно обрабатывает вызовы от приложений, если они работают с alsa напрямую.

Вот тут у меня много непонимания и косяков, подскажите/поправьте, пожалуйста, очень нужно для выстроения стройной картинки в голове.
Как же так тогда получается, что устройство у меня определяется неверно? Неужели драйверов для него нету в имеющейся сборке alsa? Хотя в моей текущей системе - Ubuntu 14.04 LTS - все должно работать из коробки, согласно англоязычном форумам. Могла ли замена материнской платы сбить какую-то конфигурацию alsa?
Что еще не очень понятно, почему-то realtek отсутствует в списке поддерживаемых alsa'ой, хотя это, наверное, один из самых распространенных вендоров интегрированных звуковух: http://www.alsa-project.org/main/index.php/Matrix:Main

Буду благодарен за любые советы, ответы, замечания и исправления.

PS. В конечном итоге мне бы хотелось заставить звук работать как можно меньшими телодвижениями благодаря появлению понимания, как это все работает. В идеале - поправить какой-нибудь конфиг. Чуть хуже - пересобрать всю alsa. Совсем ужас - всю систему (лол)

PPS. linux device drivers 3rd ed пролистан n лет назад. Мозги не вправил.

PPPS. Что-то тэг (br) работает как-то не так



Последнее исправление: pewpew (всего исправлений: 1)

Ответ на: комментарий от anonymous

Сейчас - чтобы заработало. В перспективе собирался разрабатывать. Вопросы бы все равно задал, но сегодня прямо звезды совпали.

Добавлю по части своих глюков - dmesg | grep acpi -i выдает какие-то ошибки вида
а) много таких
[ 0.477964] ACPI Error: No object attached to node [UHSD] ffff88024c908460 (20141107/exresnte-128)
[ 0.477965] ACPI Error: Method parse/execution failed [\_SB_.PCI0.XHC_.RHUB.HS06._PLD] (Node ffff88024c908640), AE_AML_NO_OPERAND (20141107/psparse-536)
б) По одной такой
[ 0.015833] ACPI Error: [\_SB_.PCI0.XHC_.RHUB.HS11] Namespace lookup failure, AE_NOT_FOUND (20141107/dswload-210)
[ 0.162064] acpi PNP0A08:00: _OSC failed (AE_ERROR); disabling ASPM
[ 0.476307] ACPI Error: No object attached to node [UHSD] ffff88024c908460 (20141107/exresnte-128)

Без понимания предмета непонимания вся гуглежка по этим ошибкам будет сводится к чтению филькиной грамоты. Ну, куда деваться.

pewpew
() автор топика
Ответ на: комментарий от anonymous

раз ты удалил пост... озвучу - «чтоб заработало».

в этом случае так тему и сформулирй не забыв выкатить модель материнки и dmesg.

anonymous
()
Ответ на: комментарий от pewpew

весь гуглеж сводится к «модель материнки snd hda не работает», расслабся :)

anonymous
()
Ответ на: комментарий от pewpew

ну вот спросил ты в соседней теме как читать регистры устройства - тебе ответили и что дальше? subj? хочешь понимания - ботай ldd и отслеживай тематические списки рассылки.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо за совет, в процессе. А как в теории от версии ядра зависит звуковая подсистема? В чем я не угадал по части расположения драйверов звуковых карт в первом посте?

pewpew
() автор топика
Ответ на: комментарий от anonymous

Не спрашивал. Я же сразу написал - это мой первый пост на лор'е. Железом я занимаюсь уже очень давно, ldd тоже, как я написал, читал. Мне нужно какое-то глобальное понимание стройной структуры драйверов, их подлючения.

pewpew
() автор топика
Ответ на: комментарий от anonymous

Да, в курсе. Только до миксера дело не доходит, еще раз приведу листинг:

pewpew# cat /proc/asound/cards
 1 [HDMI           ]: HDA-Intel - HDA ATI HDMI
                      HDA ATI HDMI at 0xdfe60000 irq 125

Между делом, спрошу: а можно здесь как-нибудь одним постом сразу отвечать на несколько? Будет какое-то безумное дерево, если каждому отдельный ответ отсылать.

pewpew
() автор топика
Ответ на: комментарий от pewpew

Первый пост tl;dr, все драйвера находятся в дереве исходникова ядра. Alsa это драйвер и юзерспейсная библиотека-интерфейс к нему.

anonymous
()
Ответ на: комментарий от anonymous

Да, моя маленькая проблема решилась накатом свежего ядра. С учетом сообщения товарища anonymous (30.12.2015 23:57:04), надо полагать, обновились драйвера, snd_hda_intel.

Спасибо.

pewpew
() автор топика
Ответ на: комментарий от anonymous

Я правильно понимаю, что если мой lsmod выглядит, как в листинге ниже, то драйвер snd_hda_intel обеспечивает работу с самой железкой, самый низкий уровень; остальные snd_hda* служат для приведения низкого уровня к стандартному интерфейсу работы с аудио - soundcore, который и является драйвером alsa?

pewpew# lsmod | grep alsa
pewpew# lsmod | grep hda
snd_hda_codec_hdmi     53248  1 
snd_hda_codec_realtek    81920  1 
snd_hda_codec_generic    73728  2 snd_hda_codec_realtek
snd_hda_intel          32768  5 
snd_hda_controller     36864  1 snd_hda_intel
snd_hda_codec         147456  5 snd_hda_codec_realtek,snd_hda_codec_hdmi,snd_hda_codec_generic,snd_hda_intel,snd_hda_controller
snd_hwdep              16384  1 snd_hda_codec
snd_pcm               110592  4 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel,snd_hda_controller
snd                    86016  21 snd_hda_codec_realtek,snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec_generic,snd_hda_codec,snd_hda_intel,snd_seq_device
soundcore              16384  2 snd,snd_hda_codec

pewpew
() автор топика
Ответ на: комментарий от pewpew

хз, вот Какой общий способ прочитать регистры железки? тоже про звук, всего несколько часов назад и тут свежий регистрант со схожими болячками. совпадение?

«linux device drivers 3rd ed пролистан n лет назад. Мозги не вправил.» так что и ldd ты не читал... но раз ты настаиваешь вот тебе для понимания http://www.alsa-project.org/main/index.php/ALSA_Driver_Documentation

anonymous
()

3) На настроенном оборудовании выполняется загрузка ядра в память - раскрутка системы. Ядро выполняет донастройку, все работает.


После получения управления, ядро само производит полную настройку системы, не полагается на BIOS и не использует его сервисы (int 10h), если ты об этом.

На определенном этапе в память будет загружен определенный набор драйверов (linux/drivers/ ??? почему-то интеловские драйвера, похоже, лежат в гпу.


Потому что это устройство от HDMI интерфейса.

Далее, ядро каким-то образом (кстати, каким?) определяет, какой драйвер должен использоваться для имеющегося оборудования, использует в дальнейшем только его.


Примерно так (описание может содержать ошибки): перечисление устройств на шинах (PCI, USB), чтение VID/PID, подключение соответствующего драйвера (если есть в наличии), возможно еще запуск probe(), чтобы драйвер убедился, что железка в системе действительно существует.

PPS. linux device drivers 3rd ed пролистан n лет назад. Мозги не вправил.

Там же все вроде бы весьма популярно расписано, почитай более вдумчиво.

Кстати, вот тут как раз твою тему обсуждают.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от anonymous

2 anonymous (31.12.2015 0:08:54) Зуб даю, то не я писал.

2 m0rph: Правильно ли я понимаю, что сперва собираются все структуры, как то static const struct pci_device_id, после чего после сбора IDs всех подключенных устройств, ядро (какой именно модуль, я пока не знаю) пробегается по структурам, составляет список вида «устройство - драйвер», попутно их инициализируя? После того, как все устройства будут зарегистрированы (или не будут, если что-то будет с незнакомым id), будет произведен последовательный запуск операции probe()?

2 оба: Господа, ну серьезно, ldd3 вот так вот просто не заходит, как томик Тютчева. Очень много каких-то принципиальных вопросов и недопониманий, которые не позволяют нарастить полноценное и повсеместное осознание того, как это все работает от а до я. Позвольте уж немного вас поспрашивать, чтобы окончательно сформировать «скелет», на который потом нарастить «мыщцы» в виде конкретных типов, интерфейсов, перечитав ldd3. Надеюсь на понимание.

pewpew
() автор топика
Ответ на: комментарий от pewpew

Ну для Linux за свою жизнь я написал всего лишь один полноценный драйвер для некоего устройства в ПЛИС. Основное мое «дровописательство» приходилось в свое время на DOS. Так что я плохой источник информации. Ты говоришь, что дружишь с железом, значит скорее всего имеешь дело с цифровой схемотехникой, микроконтроллерами. Соответственно ты должен иметь представление, как это все работает в коде без ОС вообще и в какой-нибудь FreeRTOS. А значит вполне можешь разобрать ldd3. Можешь еще почитать что-нибудь вроде «Robert Love - Linux kernel development», там описывалось простым языком, как ядро строит «дерево устройств» и т.п.

m0rph ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.