如何以编程方式访问 ISA 配置空间,它是什么样子的——如何为 ISA PnP Option ROM 设置基地址?
1 回答
使用 ISA 隔离过程选择卡,如下所示:
上电时,所有即插即用卡检测到 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] 命令会将所有卡发送到隔离状态并进入此状态,它将串行标识符/资源数据指针重置为开头。
卡第一次进入隔离状态时,需要使用设置 RD_DATA 端口命令(当您向地址端口发送 00h 偏移量时发送)设置 READ_DATA 端口地址。接下来,软件对串行隔离寄存器执行 72 对读取以隔离卡(偏移量 01h)。
如果序列标识号的下一位为 1,则读取会导致每张卡将 55h 放置在 SDL[7:0] 上。如果它不是 1,则它不断言任何内容并检查 SDL[1:0],如果其为 01 55h 已被另一张卡断言。如果它是 01b,那么它将在下一次读取时断言 AAh,如果不是 01b,它将检查下一次读取的 10b。软件对隔离寄存器的下一次读取会导致断言 55h 或未检测到 01b 的卡断言 AAh。其他卡检查 01b 的低 2 个 SDL 位。如果存在 01b,则它们进入睡眠状态。所有其他卡检查它们是否已发送序列标识符的最后一位,如果没有,则进入下一轮。如果他们有,它将是唯一剩下的卡。
隔离卡保持隔离状态,而所有其他卡均未通过隔离协议并返回睡眠状态。
所有处于睡眠/隔离/配置状态的设备都会拦截对卡控制寄存器的写入,并根据数据和它们所处的状态将其解释为某些命令。对唤醒寄存器的写入将被卡中的卡接受隔离状态作为新的 CSN。此卡上的 CSN 设置为唯一编号。写入此值会导致此卡转换到 Config 状态。然后,您通过写入 LDN 寄存器来选择一个逻辑设备编号,只有处于配置状态的设备通过将该逻辑设备的寄存器映射到偏移量 0x30 以下来响应。
配置空间如下所示:
为了为 MMIO 空间(包括 Option ROM)选择基地址,您将基地址放入内存描述符中偏移 0x40–0x5F 处。大概是卡写的上限寄存器告诉你它需要多少内存。在 PCI 上,您将所有 1 写入 BAR 以获取大小。不确定ISA。有 4 个内存描述符和 8 个 I/O 描述符。您配置一个 24 位地址,该地址位于 16MiB 以下的 1MiB ISA 孔中,该地址被编程为转发到 ISA 桥接器。
为了继续隔离过程以隔离下一张卡,参数为零的 Wake[CSN] 命令(写入唤醒寄存器偏移量 0x03)将强制所有没有 CSN 的卡进入隔离状态(Wake[CSN ] 带有非零参数的命令将强制具有匹配 CSN 的卡进入配置状态。任何处于隔离或配置状态的卡接收到不是它自己的 CSN 转换到睡眠状态)。
不要忘记 ISA-XT 总线出现在 8086–80186 上是作为具有 20 位寻址的 8 位总线。80286 芯片组及更高版本是 16 位和 24 位寻址。80486 SIO(.A) 和 IB 南桥只是 PCI 总线上用作 ISA 桥的单功能 PCI 设备。PCEB 南桥也是如此(通过 IO 端口访问 ESC 次南桥寄存器)。PIIX–PIIX4E 南桥是多功能 PCI 设备。ICH0 南桥是多设备和多功能 PCI 设备,而 ISA 桥是 PCI 总线上的可选独立设备,与南桥分开。