Вопрос или проблема
Я использую собственную дистрибуцию Linux на кастомной плате с ATSAMA5D29. Мне удалось заставить звук работать на демонстрационной плате, но когда я запускаю его на собственной аппаратуре, я получаю ошибку:
# speaker-test
speaker-test 1.2.11
Устройство воспроизведения по умолчанию
Параметры потока: 48000Hz, S16_LE, 1 канал
Используется 16 октав розового шума
ALSA lib dlmisc.c:226:(snd_dlsym_verify) невозможно проверить версию для символа _snd_pcm_empty_open
ALSA lib dlmisc.c:348:(snd_dlobj_cache_get0) символ _snd_pcm_empty_open не определён внутри [builtin]
Ошибка открытия воспроизведения: -6, Нет такого устройства или адреса
Это происходит даже при работе на обратной звуковой карте. Вот список устройств (точно такое же, как и на работающей демонстрационной плате)
# aplay -l
**** Список аппаратных устройств ВОСПРОИЗВЕДЕНИЯ ****
карта 0: Loopback [Loopback], устройство 0: Loopback PCM [Loopback PCM]
Подустройства: 8/8
Подустройство #0: подустройство #0
Подустройство #1: подустройство #1
Подустройство #2: подустройство #2
Подустройство #3: подустройство #3
Подустройство #4: подустройство #4
Подустройство #5: подустройство #5
Подустройство #6: подустройство #6
Подустройство #7: подустройство #7
карта 0: Loopback [Loopback], устройство 1: Loopback PCM [Loopback PCM]
Подустройства: 8/8
Подустройство #0: подустройство #0
Подустройство #1: подустройство #1
Подустройство #2: подустройство #2
Подустройство #3: подустройство #3
Подустройство #4: подустройство #4
Подустройство #5: подустройство #5
Подустройство #6: подустройство #6
Подустройство #7: подустройство #7
карта 1: CLASSD [CLASSD], устройство 0: CLASSD PCM snd-soc-dummy-dai-0 [CLASSD PCM snd-soc-dummy-dai-0]
Подустройства: 1/1
Подустройство #0: подустройство #0
# aplay -L
null
Отбрасывать все образцы (воспроизведение) или генерировать нулевые образцы (захват)
default:CARD=Loopback
Loopback, Loopback PCM
Устройство звука по умолчанию
sysdefault:CARD=Loopback
Loopback, Loopback PCM
Устройство звука по умолчанию
front:CARD=Loopback,DEV=0
Loopback, Loopback PCM
Передний выход / вход
surround21:CARD=Loopback,DEV=0
Loopback, Loopback PCM
2.1 Объемный выход для передних и сабвуферных колонок
surround40:CARD=Loopback,DEV=0
Loopback, Loopback PCM
4.0 Объемный выход для передних и задних колонок
surround41:CARD=Loopback,DEV=0
Loopback, Loopback PCM
4.1 Объемный выход для передних, задних и сабвуферных колонок
surround50:CARD=Loopback,DEV=0
Loopback, Loopback PCM
5.0 Объемный выход для передних, центральной и задних колонок
surround51:CARD=Loopback,DEV=0
Loopback, Loopback PCM
5.1 Объемный выход для передних, центральной, задних и сабвуферных колонок
surround71:CARD=Loopback,DEV=0
Loopback, Loopback PCM
7.1 Объемный выход для передних, центральной, боковых, задних иwoofer колонок
default:CARD=CLASSD
CLASSD, CLASSD PCM snd-soc-dummy-dai-0
Устройство звука по умолчанию
sysdefault:CARD=CLASSD
CLASSD, CLASSD PCM snd-soc-dummy-dai-0
Устройство звука по умолчанию
Вывод dmesg может дать некоторые подсказки:
# dmesg | grep classd
устройство: 'fc048000.classd': device_add
шина: 'platform': добавить устройство fc048000.classd
PM: добавление информации для platform:fc048000.classd
платформа fc048000.classd: Не связываем /ahb/apb/clock-controller@f0014000 - может никогда не стать dev
/ahb/apb/classd@fc048000 Отбрасывание связи fwnode с /ahb/apb/clock-controller@f0014000
платформа fc048000.classd: Не связываем /ahb/apb/interrupt-controller@fc020000 - может никогда не стать dev
/ahb/apb/classd@fc048000 Отбрасывание связи fwnode с /ahb/apb/interrupt-controller@fc020000
/ahb/apb/classd@fc048000 Связанный как fwnode потребитель с /ahb/apb/pinctrl@fc038000
/ahb/apb/classd@fc048000 Отбрасывание связи fwnode с /ahb/apb/pinctrl@fc038000/classd_default_pfets
/ahb/apb/classd@fc048000 Отбрасывание связи fwnode с /ahb/apb/pinctrl@fc038000/classd_default_nfets
устройство: 'platform:fc038000.pinctrl--platform:fc048000.classd': device_add
devices_kset: Перемещение fc048000.classd в конец списка
PM: Перемещение platform:fc048000.classd в конец списка
платформа fc048000.classd: Связанный как потребитель с fc038000.pinctrl
/ahb/apb/classd@fc048000 Отбрасывание связи fwnode с /ahb/apb/pinctrl@fc038000
шина: 'platform': добавить драйвер atmel-classd
шина: 'platform': __driver_probe_device: найдено устройство fc048000.classd с драйвером atmel-classd
шина: 'platform': really_probe: исследуем драйвер atmel-classd с устройством fc048000.classd
atmel-classd fc048000.classd: нет состояния инициализации pinctrl
atmel-classd fc048000.classd: нет состояния pinctrl сна
atmel-classd fc048000.classd: нет состояния pinctrl ожидания
atmel-classd fc048000.classd: тип модуляции PWM дифференциальный, наложение не включено
драйвер: 'atmel-classd': driver_bound: связан с устройством 'fc048000.classd'
шина: 'platform': really_probe: связано устройство fc048000.classd с драйвером atmel-classd
Есть больше информации в sysfs и debugfs, но ни одна из них не отличалась от работающей платы, насколько я мог судить. Соответствующие конфигурации ядра:
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_DMAENGINE_PCM=y
CONFIG_SND_PCM_TIMER=y
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_PROC_FS=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_CTL_FAST_LOOKUP=y
CONFIG_SND_DEBUG=y
CONFIG_SND_DEBUG_VERBOSE=y
CONFIG_SND_DRIVERS=y
CONFIG_SND_HDA_PREALLOC_SIZE=64
CONFIG_SND_ARM=y
CONFIG_SND_SPI=y
CONFIG_SND_SOC=y
CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
CONFIG_SND_ATMEL_SOC=y
CONFIG_SND_ATMEL_SOC_CLASSD=y
Если у кого-то есть идеи или другую отладочную информацию, которую я должен предоставить, пожалуйста, дайте знать.
Ответ или решение
Проблема: ALSA не выводит звук на кастомном дистрибутиве Linux
Вы сталкиваетесь с проблемой, когда ALSA не может воспроизводить звук на вашем кастомном дистрибутиве Linux, установленном на базе ATSAMA5D29. Это может быть вызвано различными факторами, начиная от конфигурации ядра до неправильной работы драйверов или аппаратных проблем. Вот подробный разбор возможных причин и подходов для решения данной ситуации.
1. Анализ сообщений об ошибках
Ошибка:
Playback open error: -6, No such device or address
указывает на то, что ALSA не может открыть устройство воспроизведения. Это может свидетельствовать о неправильной конфигурации звуковых устройств или о том, что нужное устройство недоступно.
2. Проверка конфигурации ALSA
Ваша команда aplay -l
показывает, что устройства распознаются должным образом:
card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
...
card 1: CLASSD [CLASSD], device 0: CLASSD PCM snd-soc-dummy-dai-0 [CLASSD PCM snd-soc-dummy-dai-0]
Однако, несмотря на наличие двух звуковых карт, основной проблемой может быть отсутствие полного функционала для CLASSD.
Рекомендуется:
- Убедиться, что драйвер для SOUND_SOC_ATMEL корректно загружен. Для этого выполните:
lsmod | grep atmel
. - Проверить конфигурацию устройства и его совместимость с ALSA. Ваша конфигурация ядра выглядит правильно, так как включены необходимы опции:
CONFIG_SND=y
CONFIG_SND_SOC=y
CONFIG_SND_ATMEL_SOC=y
...
Однако стоит убедиться, что существуют все необходимые компоненты для работы вашего аппаратного обеспечения.
3. Проверка dmesg
Ваш вывод dmesg | grep classd
указывает на то, что устройство CLASSD загружается, но присутствуют несколько предупреждений о невозможности установить связи с определёнными устройствами.
Рекомендации:
- Убедитесь, что все зависимости и модули, необходимые для работы CLASSD, загружены и правильно конфигурированы.
- Проверьте наличие необходимых драйверов для управления питанием и состояния устройства.
4. Проверка Sysfs и Debugfs
Хотя вы упомянули, что информация в sysfs и debugfs не выявила разницы между рабочей и нерабочей версиями оборудования, стоит обратить внимание на:
- Возможные разночтения в конфигурации
devicetree
вашего кастомного оборудования. - Параметры конфигурации, такие как пины управления и режимы работы, чтобы обеспечить корректную инициализацию.
5. Дополнительные шаги по отладке
- Попробуйте использовать разные параметры в
speaker-test
, указав конкретное устройство для вывода, например:speaker-test -c 1 -D default:CARD=CLASSD
- Следите за выводом dmesg во время выполнения команды для выявления новых сообщений об ошибках или предупреждений, которые могут дать подсказку о причине проблемы.
Заключение
Выявление проблемы с ALSA на кастомной платформе может потребовать времени и опыта в отладке. Предложенные шаги и рекомендации по диагностике помогут более детально рассмотреть ситуацию и выявить коренные причины. Широкий доступ к информации об ошибках, правильная конфигурация программного обеспечения и драйверов, а также проверка оборудования могут решить эту проблему. В случае возникновения дополнительных вопросов или если проблема не будет устранена, рекомендуется обратиться за помощью на специализированные форумы или к профессиональным техническим экспертам.