如何访问 ISA 配置 space,它是什么样子的?

How to access the ISA configuration space and what does it look like?

如何以编程方式访问 ISA 配置 space 以及它是什么样的 -- 如何为 ISA PnP Option ROM 设置基地址?

使用如下 ISA 隔离程序 selected 卡:

上电时,所有即插即用卡检测到ISA总线复位信号,RESET_DRV,将它们的CSN设置为0,并进入Wait for Key状态。在访问自动配置端口(地址、读取、写入)之前,软件必须在 RESET_DRV 之后延迟 2 毫秒,这样设备才能执行初始配置,从非易失性存储器加载初始配置寄存器值,设置CSN为0,及时进入等待按键状态。处于等待密钥状态的卡在检测到启动密钥之前不会响应对其自动配置端口的任何访问,并且将忽略对其即插即用接口的所有 ISA 访问。

初始化密钥由软件通过向地址端口写入序列6A,B5,DA,ED,F6,FB,7D,BE, DF,6F,37,1B,0D,86,C3,61 B0,58,2C,16,8B,45,A2,D1, E8,74,3A,9D,CE,E7,73,39发送。当 ISA 卡检测到这个序列时,它们进入睡眠状态。在此状态下,卡侦听 Wake[CSN] 命令,写入数据由软件设置为 0x00。此 Wake[CSN] 命令会将所有卡发送到隔离状态并进入此状态,它将串行 identifier/resource 数据指针重置为开头。

卡第一次进入隔离状态时,需要使用 Set RD_DATA 端口命令设置 READ_DATA 端口地址(当您将偏移量 00h 发送到地址端口)。接下来,软件对串行隔离寄存器执行 72 对读取以隔离卡(偏移量 01h)。

如果序列号的下一位为 1,则读取会导致每张卡在 SDL[7:0] 上放置 55h。如果不是 1,则它不声明任何内容并检查 SDL[1:0]如果 55h 已被另一张卡断言,它将是 01。如果它是 01b,那么它将在下次读取时断言 AAh,如果不是 01b,它将在下次读取时检查 10b。软件对隔离寄存器的下一次读取会导致断言 55h 或未检测到 01b 的卡断言 AAh。其他卡检查 01b 的低 2 SDL 位。如果 01b 存在,它们将进入睡眠状态。所有其他卡片检查它们是否发送了序列标识符的最后一位,如果没有,它们将进入下一轮。如果他们有,它将是唯一剩下的卡片。

隔离卡保持隔离状态,而所有其他卡均未通过隔离协议并返回睡眠状态。

对卡控制寄存器的写入被处于 sleep/isolation/config 状态的所有设备拦截,并根据数据和它们所处的状态被解释为某些命令。将接受对唤醒寄存器的写入由处于隔离状态的卡片作为新的CSN。此卡上的 CSN 设置为唯一编号。写入此值会导致此卡转换为 Config 状态。然后,您通过写入 LDN 寄存器来 select 一个逻辑设备号,只有处于 Config 状态的设备通过映射偏移量 0x30 以下的该逻辑设备的寄存器来响应。

配置 space 如下所示:

为了 select MMIO space(包括 Option ROM)的基地址,您将基地址放在内存描述符的偏移量 0x40–0x5F 中。想必上限寄存器是卡写的,告诉你需要多少内存。在 PCI 上,您将全 1 写入 BAR 以获得大小。不确定ISA。有4个内存描述符和8个I/O描述符。您配置一个 24 位地址,该地址位于 16MiB 以下的 1MiB ISA 孔中的某个位置,该地址被编程为转发到 ISA 桥。

为了继续隔离程序以隔离下一张卡,参数为零的唤醒[CSN]命令(写入唤醒寄存器偏移量0x03)将强制所有没有CSN的卡进入隔离状态(带有非零参数的唤醒 [CSN] 命令将强制具有匹配 CSN 的卡进入配置状态。任何处于隔离或配置状态的卡接收到的 CSN 不是它自己的过渡到睡眠状态)。

不要忘记 ISA-XT 总线出现在 8086–80186 上作为具有 20 位寻址的 8 位总线。 80286 芯片组及以后是 16 位,24 位寻址。 80486 SIO(.A) 和 IB 南桥只是 PCI 总线上的单一功能 PCI 设备,用作 ISA 桥。 PCEB 南桥也是如此(ESC subsouthbridge 寄存器通过 IO 端口访问)。 PIIX–PIIX4E 南桥是多功能 PCI 设备。 ICH0 南桥是一个多设备和多功能的 PCI 设备,而 ISA 桥是 PCI 总线上的一个可选的独立设备,与南桥分开。