我正在开发DOS应用程序。我需要通过并行端口进行通信。
目前我仍然坚持如何确定哪个PCI功能的BAR(基地址寄存器)包含该并行端口的基地址(即数据端口地址)? :
确切地说,是否存在行业惯例或标准或事实上的标准,特定BAR将始终包含该并行端口的基地址?
如果没有,那么如何确定该PCI并口的基地址(无论是在pci扩展卡上还是集成在主板上)?
实际上我关心 PCI扩展卡上的并行端口。 AFAIK,BIOS并不了解这些。 BIOS只会将资源分配给pci卡和它。因此,可能没有BDA中此类并行端口的条目,因为BIOS制造商只知道他们的主板所有设备。
例如,在PC上,我在pci扩展卡上安装了4个并行端口,并且在mobo上集成了1个并行端口。现在其他2个并行端口的条目在哪里?
这就是为什么BIOS似乎只有三个并行端口集成\嵌入在芯片组或主板上的条目。因此,我认为我们必须阅读PCI BAR以获取mobo上安装的pci扩展卡上任何并行端口的基地址。
由于
答案 0 :(得分:2)
基于内存的并行端口列表(包括串行端口)仅限于三个条目(最初在 IBM PC 中为4个)。当即插即用(PnP)技术尚不存在时,它专为基于旧ISA的系统而设计。
在较新的系统上,应使用BIOS PnP功能来检测任何基于PCI的并行端口设备。这涉及扫描所有PCI设备以找到具有并行端口子类的通信设备类。直接从Intel website(PDF文件)或ACPI website获取英特尔的即插即用BIOS规范。您将在该文档中找到如何访问PnP BIOS功能。
请注意,由于某些系统可能仍然具有板载并行端口,因此您仍需要使用BIOS内存检测其存在。如果板载并行端口少于三个,则还应在该存储器中列出其他基于PCI的并行端口。但是,建议假设它们不是,因为BIOS中可能存在错误。因此,结合内存和PnP BIOS的检测结果,然后删除任何重复。
如果要检测实际并行端口以确保其存在且正常工作,请检查VirtualBox的BIOS assembly source code(最初来自 Bochs 'BIOS)。具体来说,detect_parport
函数。
编辑:有关PCI设备当前配置的更多详细信息。
PCI设备的当前配置存储在扩展系统配置数据(ESCD)中。某些BIOS也将此称为 NVRAM 。 PnP BIOS规范的函数 0x41 和 0x42 中描述了检索其数据的方法。但是,ESCD规范与PnP BIOS规范是分开的。你可以得到它here(PDF文件)。
我无法找到英特尔网站上的链接,抱歉。他们过去常常提供这些旧规格,也可以从他们的网站上搜索到,但现在很难找到。我仍然使用RTF格式。 PDF ESCD 规范似乎是最后一个版本,与我的版本相同,版本为1.02A。
答案 1 :(得分:0)
afaik如果在BIOS中配置内置并行端口,则无法通过基地址将数据发送到pci并行端口,通过禁用BIOS中的并行端口来发送到该pci并行端的一种方式...
我已经测试了这个场景,它在我身边很好用。
但是如果你想使用很多端口,比如内置端口和pci并行端口,对于内置端口你可以使用io基地址,但对于pci并行端口,你需要知道pci提供的驱动程序并行端口的制造商...如果它是系统提供的驱动程序,也许有办法通过公共ioctl挂钩他们的驱动程序或通过正常文件访问驱动程序..
我使用在Windows 7上运行的通用端口。