1

我正在尝试为我的 PCI 声卡创建一个简单的驱动程序,我将在其中使用 ALSA api。要运行我的驱动程序,我已将原始 snd_intel8x0 声卡驱动程序列入黑名单。此时我的探测函数被调用,我的 PCI IO 端口被分配,并且 PCI 设备被启用。

不幸的是,当我尝试使用 ALSA api 时,出现以下错误:

[...] 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 正在运行,则存在一个sound文件夹)

我在互联网上的搜索以及在这里和其他论坛中的问题表明,我必须以某种方式用我的驱动程序构建 ALSA。我该怎么做?任何指南,教程链接都非常感谢。

非常感谢提前。我希望能得到一些有用的答案。我试图解决这个问题很长时间没有成功。

问候,内德林。

4

2 回答 2

1

您在编译或加载模块时做错了什么,但由于您没有提及您是如何尝试这样做的,因此没有更具体的说明。

有关如何编译和加载模块的说明,请参阅Linux 设备驱动程序的第 2 章。
对于 ALSA 驱动程序,请参阅编写 ALSA 驱动程序

于 2012-11-08T08:30:28.597 回答
1

好吧,我将尽可能详细地解释我所做的事情。

所以这是我使用的makefile

obj-m := alsa.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

密码 := $(shell 密码)

全部:$(MAKE) -C $(KERNELDIR) M=$(PWD)

干净: rm -rf *.o ~ core .depend 。.cmd *.ko *.mod.c .tmp_versions

我用sudo insmod .ko加载

在这里我会说,最初我不想使用 ALSA。那时我创建了一个准系统 PCI 驱动程序,它只初始化 PCI 设备并在探测函数中注册 IO 端口和 IO 内存。我成功加载了这个模块(执行了探测并保留了 IO 区域)。为了构建这个 PCI 驱动程序,我使用了上面提到的 Makefile。后来我决定我需要 ALSA,从那以后我得到 [...] alsa: Unknown symbol snd_card_register (err 0)错误

如您发送给我的链接中所述,我还尝试将我的驱动程序包含在 ALSA 树中。以下是我如何更改 /sound/pci 中的 Makfile 和 Kconfig 文件(我在 /sound/pci/Nedelin_ALSA_PCI.o 中创建了一个指向实际代码的链接。我提到这一点是为了避免对文件名):

生成文件

...

snd-nedelinxalsaxpci-objs := Nedelin_ALSA_PCI.o

...

obj-$(CONFIG_SND_NEDELINXALSAXPCI) += snd-nedelinxalsaxpc

配置

配置 SND_NEDELINXALSAXPCI

三态“英特尔/SiS/nVidia/SND_NEDELINXALSAXPCI 驱动程序”

选择 SND_AC97_CODEC

help 这是我的司机...

这似乎很成功。我在 make menuconfig 中找到了我的驱动程序并将其作为模块加载。重新编译我的内核,也OK。我在 /lib/modules//kernel/sound/pci 中看到了我的驱动程序。如果我尝试使用 modprobe 加载它,它似乎已加载(执行了 module_init())但我的探测函数未执行。

我完全糊涂了。

于 2012-11-08T20:43:15.813 回答