我正在尝试为我的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正在运行asound文件夹)
我在互联网上的搜索以及此处和其他论坛中的问题表明我必须使用我的驱动程序以某种方式构建ALSA。 我该怎么做?任何指南,教程链接都受到高度赞赏。
提前多多感谢。我希望得到一些有用的答案。我试图解决这个问题很长一段时间没有成功。
问候,Nedelin。
答案 0 :(得分:0)
在编译或加载模块时你做错了什么,但由于你没有提到你是怎么做的,所以没有更具体的说法。
有关如何编译和加载模块的说明,请参阅Linux Device Drivers的第2章 对于ALSA驱动程序,请参阅Writing an ALSA Driver。
答案 1 :(得分:0)
我会尽可能详细地解释我所做的事情。
所以这是我使用的makefile
obj-m:= alsa.o
KERNELDIR?= / lib / modules / $(shell uname -r)/ build
PWD:= $(shell pwd)
全部:$(MAKE)-C $(KERNELDIR)M = $(PWD)
clean:rm -rf * .o ~core .depend。 .cmd * .ko * .mod.c .tmp_versions
我使用 sudo insmod .ko
进行加载在这里,我要说最初我不想使用ALSA。那时我创建了一个裸骨PCI驱动程序,它只在探测功能中初始化了PCI设备和已注册的IO端口和IO内存。我成功加载了这个模块(执行了探测并保留了IO区域)。为了构建这个PCI驱动程序,我使用了上面提到的Makefile。 后来我决定我需要ALSA,从那以后我得到了 [...] alsa:未知符号snd_card_register(错误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
的Kconfig
配置SND_NEDELINXALSAXPCI
三态“Intel / SiS / nVidia / SND_NEDELINXALSAXPCI驱动程序”
选择SND_AC97_CODEC
帮助 这是我的司机......
这似乎很成功。我将我的驱动程序放在make menuconfig中并将其作为模块加载。重新编译我的内核,也行。我在/ lib / modules // kernel / sound / pci中看到了我的驱动程序。如果我尝试使用modprobe加载它似乎已加载(执行module_init())但我的探测函数未执行。
我完全糊涂了。