我安装了一张 PCI 卡,上面有两个串行端口和一个并行端口。芯片组是MCS9865
.我从以下网址下载了最新的驱动程序(V1.0.12)这里。我跑了,make
然后make install
。现在两个串口是/dev/ttyD0
和/dev/ttyD1
。我已经对它们进行了测试,picocom
并且运行良好。问题是当我重新启动系统时没有/dev/ttyD0
和/dev/ttyD1
。我需要再做一次make install
。有什么解决办法吗?
的输出lspci -v
显示:
03:01.0 Serial controller: NetMos Technology PCI 9865 Multi-I/O Controller (prog-if 02 [16550])
Subsystem: Device a000:1000
Flags: bus master, medium devsel, latency 32, IRQ 19
I/O ports at df00 [size=8]
Memory at fbeff000 (32-bit, non-prefetchable) [size=4K]
Memory at fbefe000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [48] Power Management version 2
Kernel driver in use: mcs9865-serial
03:01.1 Serial controller: NetMos Technology PCI 9865 Multi-I/O Controller (prog-if 02 [16550])
Subsystem: Device a000:1000
Flags: bus master, medium devsel, latency 32, IRQ 18
I/O ports at de00 [size=8]
Memory at fbefd000 (32-bit, non-prefetchable) [size=4K]
Memory at fbefc000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [48] Power Management version 2
Kernel driver in use: mcs9865-serial
03:01.2 Parallel controller: NetMos Technology PCI 9865 Multi-I/O Controller (prog-if 03 [IEEE1284])
Subsystem: Device a000:2000
Flags: bus master, medium devsel, latency 32, IRQ 7
I/O ports at dd00 [size=8]
I/O ports at dc00 [size=8]
Memory at fbefb000 (32-bit, non-prefetchable) [size=4K]
Memory at fbefa000 (32-bit, non-prefetchable) [size=4K]
Capabilities: [48] Power Management version 2
make install
显示这个:
cp mcs9865.ko mcs9865-isa.ko /lib/modules/2.6.32-5-amd64/kernel/drivers/serial/
depmod -A
chmod +x mcs9865
cp mcs9865 /etc/init.d/
ln -s /etc/init.d/mcs9865 /etc/rcS.d/S99mcs9865 || true
ln: creating symbolic link `/etc/rcS.d/S99mcs9865': File exists
modprobe mcs9865
modprobe mcs9865-isa
我正在运行 debian 6.0.5 以及最新的软件包。
答案1
通常的工作方式是:
- 模块源代码包含对
MODULE_DEVICE_TABLE
宏来声明该模块支持的设备标识符表。 - 在编译的模块中,别名存储为符号值,
__mod_alias_NNN
其中 NNN 是整数。该值对设备的总线标识进行编码,例如pci:v00009710d00009865sv*sd*bc*sc*i*
,对于标识为的 PCI 设备供应商 0x9710,设备0x9865。
它们还存储在__mod_pci_device_table
PCI 设备、__mod_usb_device_table
USB 设备等名称下。 - 这
depmod
程序创建一个别名表,将__mod_alias_NNN
值映射到模块名称。该表存储在modules.alias
内核模块根目录的文件中,例如/lib/modules/2.6.32-5-amd64/modules.alias
.
它还创建诸如modules.pcimap
、modules.usbmap
、 ... 之类的文件,这些文件由过时的热插拔基础设施使用,该基础设施已被纳入 modprobe。 - 当内核检测到没有驱动程序的设备时,它会尝试通过调用由
kernel.modprobe
系统控制,即/sbin/modprobe
默认情况下。内核传递一个参数来modprobe
指示请求什么驱动程序。对于 PCI 设备,该名称类似于pci:v00009710d00009865sv*sd*bc*sc*i*
. modprobe
搜索具有给定名称的模块。如果它找到具有请求名称的模块(在遵循其配置文件中定义的别名之后,其中包括/etc/modprobe.d/*.conf
和/lib/modules/$(uname -r)/modules.alias
),它将加载该模块。
modprobe
不会加载已被blacklist
配置文件中的指令列入黑名单的模块。
运行lspci -n
以查看设备的 PCI ID,并检查上面的链以查看哪里出了问题。
有时,驱动程序适用于与其目标设备非常相似的设备,但具有不同的 PCI id。在这种情况下,驱动程序可能会工作,但不会自动加载,因为它没有声明您设备的 PCI id。您可以在 中手动添加别名/etc/modprobe/my_aliases.conf
。
您可以通过将模块名称添加到/etc/modules
.
答案2
一个快速修复方法是每次重新启动后运行
modprobe mcs9865
modprobe mcs9865-isa
对我来说,似乎内核模块没有自动插入。
有一个初始化脚本,因此您可能只需将其添加到默认运行级别即可
sudo update-rc.d mcs9865 defaults