0

我正在为 DOS 开发一个应用程序。我需要通过并行端口进行通信。

目前我被困在如何确定哪个 PCI 功能的 BAR(基地址寄存器)包含该并行端口的基地址(即数据端口地址)?:?

准确地说,是否存在特定 BAR 将始终包含该并行端口的基地址的行业约定或标准或事实上的标准?

如果不是,那么我如何确定该 PCI 并行端口的基地址(无论是在 pci 扩展卡上还是集成在主板上)?

实际上我关心的是PCI 扩展卡上的并行端口。AFAIK,BIOS 不知道这些。BIOS 只会将资源分配给 pci 卡,仅此而已。因此,BDA 中可能没有此类并行端口的条目,因为 BIOS 制造商只知道他们的主板拥有的所有设备。

例如,在 PC 上,我在 pci 扩展卡上安装了 4 个并行端口,并且在主板上集成了 1 个并行端口。现在其他 2 个并行端口的条目在哪里?

这就是为什么 BIOS 似乎只包含集成在芯片组或主板上的三个并行端口的条目。所以,我认为我们必须读取 PCI BAR 以获取安装在主板上的 pci 扩展卡上的任何并行端口的基地址。

谢谢

4

2 回答 2

2

基于内存的并行端口(包括串行端口)列表仅限于三个条目(最初在IBM PC中是 4 个)。当即插即用(PnP) 技术尚不存在时,它专为基于 ISA 的旧系统而设计。

在较新的系统上,应使用 BIOS PnP 功能来检测任何基于 PCI 的并行端口设备。这涉及扫描所有 PCI 设备以找到属于Parallel Port子类的Communication Device类。直接从英特尔网站(PDF 文件)或从ACPI 网站获取英特尔的即插即用 BIOS 规范。您将在该文档中找到如何访问 PnP BIOS 功能。

请注意,由于某些系统可能仍具有板载并行端口,因此您仍需要使用 BIOS 内存检测其存在。如果板载并行端口少于三个,则还应在该内存中列出其他基于 PCI 的并行端口。但是,建议假设它们不是,因为 BIOS 中可能存在错误。因此,结合内存和 PnP BIOS 的检测结果,然后删除任何重复项。

如果您想检测实际的并行端口以确保它存在并工作,请检查 VirtualBox 的 BIOS汇编源代码(最初来自Bochs的 BIOS)。具体来说,detect_parport功能。

编辑:有关 PCI 设备当前配置的更多详细信息。

PCI 设备的当前配置存储在扩展系统配置数据(ESCD) 中。这也被某些 BIOS称为NVRAM 。PnP BIOS 规范的函数0x410x42中描述了检索其数据的方法。但是,ESCD 规范与 PnP BIOS 规范是分开的。你可以在这里得到它(PDF文件)。

我在英特尔网站上找不到链接,抱歉。他们曾经提供这些旧规格,也可以从他们的网站上搜索到,但现在很难找到。我的仍然是 RTF 格式。PDF ESCD规范似乎是最后一个版本,与我的版本相同,即 1.02A 版。

于 2012-08-24T03:27:04.147 回答
0

如果在 BIOS 中配置了内置并行端口,则无法通过基地址将数据发送到 pci 并行端口,发送到该 pci 并行端口的一种方法是禁用 bios 中的并行端口...

我已经测试了这个场景,它在我身边运行良好。

但是如果你想使用多个端口,比如内置和pci并口,内置端口可以使用io基地址,但是对于pci并口,你需要知道pci并口制造商提供的驱动程序...如果它是系统提供的驱动程序,也许有一种方法可以通过公共 ioctl 或通过将驱动程序作为普通文件访问来挂钩他们的驱动程序..

我使用了在 Windows 7 上运行的通用端口。

于 2012-09-06T02:23:58.610 回答