Как собрать ALSA с моим собственным звуковым драйвером PCI

Я пытаюсь создать простой драйвер для своей звуковой карты PCI, в котором я буду использовать API ALSA. Для запуска моего драйвера я внес в черный список оригинальный драйвер звуковой карты snd_intel8x0. В этот момент вызывается моя функция зондирования, выделяются мои порты ввода-вывода PCI и включается устройство PCI.

К сожалению, когда я пытаюсь использовать API ALSA, я получаю следующие ошибки:

[...] alsa: Неизвестный символ snd_card_register (ошибка 0)

[...] alsa: Неизвестный символ snd_card_create (ошибка 0)

[...] alsa: Неизвестный символ snd_card_free (ошибка 0)

[...] alsa: неизвестный символ snd_device_new (ошибка 0)

Также в файле /proc/kallsyms отсутствуют символы snd* (если работает оригинальный драйвер snd_intel8x0, то все вышеперечисленные функции snd* доступны в /proc/kallsyms)

И папка /proc/asound исчезает, когда исходный драйвер занесен в черный список (если работает snd_intel8x0, папка звука присутствует)

Мой поиск в Интернете и вопросы здесь и на других форумах показывают, что мне нужно как-то собрать ALSA с моим драйвером. Как мне это сделать? Любые рекомендации, ссылки на учебные пособия приветствуются.

Заранее большое спасибо. Надеюсь получить полезные ответы. Я пытаюсь решить эту проблему уже давно и безуспешно.

Привет, Неделин.


person user1784828    schedule 06.11.2012    source источник


Ответы (2)


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

Описание компиляции и загрузки модулей см. в главе 2 драйверов устройств Linux.
Информацию о драйверах ALSA см. в разделе Написание драйвера ALSA.

person CL.    schedule 08.11.2012

Что ж, я постараюсь максимально подробно объяснить, что я сделал.

Итак, вот makefile, который я использую

obj-m := alsa.o

KERNELDIR ?= /lib/modules/$(оболочка uname -r)/сборка

PWD := $(оболочка pwd)

все: $(MAKE) -C $(KERNELDIR) M=$(PWD)

очистить: rm -rf *.o ~ core .depend ..cmd *.ko *.mod.c .tmp_versions

Я выполняю загрузку с помощью sudo insmod .ko.

Здесь я скажу, что изначально я не хотел использовать ALSA. В этот момент я создал один пустой драйвер PCI, который только инициализировал устройство PCI и регистрировал порты ввода-вывода и память ввода-вывода в функции зонда. И мне удалось загрузить этот модуль (зонд был выполнен, и области ввода-вывода были зарезервированы). Для сборки этого драйвера PCI я использовал вышеупомянутый Makefile. Позже я решил, что мне нужна ALSA, и с тех пор я получаю ошибки [...] alsa: Unknown symbol snd_card_register (err 0).

Я также попытался включить свой драйвер в дерево ALSA, как описано в ссылке, которую вы мне прислали. Вот как я изменил файлы Makfile и Kconfig в /sound/pci (одно замечание: я создал ссылку в /sound/pci/Nedelin_ALSA_PCI.o, которая указывает на фактический код. Я упоминаю об этом, чтобы избежать каких-либо комментариев по поводу имена файлов):

Makefile

...

snd-nedelinxalsaxpci-objs := Nedelin_ALSA_PCI.o

...

obj-$(CONFIG_SND_NEDELINXALSAXPCI) += snd-nedelinxalsaxpc

Kconfig

конфигурация SND_NEDELINXALSAXPCI

tristate "Драйвер Intel/SiS/nVidia/SND_NEDELINXALSAXPCI"

выберите SND_AC97_CODEC

Помогите Это мой драйвер...

Это казалось успешным. Я нашел свой драйвер в make menuconfig и загрузил его как модуль. Перекомпилировал ядро, тоже ОК. И я вижу свой драйвер в /lib/modules//kernel/sound/pci. Если я пытаюсь загрузить его с помощью modprobe, кажется, что он загружен (module_init() выполняется), но моя функция probe не выполняется.

Я совершенно сбит с толку.

person user1784828    schedule 08.11.2012