我有点卡在编程设备MSI(消息信号中断)上,欢迎任何指针...... (我的环境是 Watcom C + DOS/32a - dos 扩展器,在平面模式下......)
@ PIC(8259) 模式对我来说没问题...
我在下面列出了我所做的事情,也许有人可以帮助澄清这些......谢谢!
(1)多消息启用 = 0(对于单个 MSI 设置此字段 = 0;MMC = 100b)
(2) MSI能力中的MSI消息地址寄存器
- 位[31:20] = 0xFEE
- bit[19:12] = 0(目标 ID,并找到本地 APIC ID = 0...)
- bit3 = 0(重定向提示 = 0)
- bit2 = 0(目标模式,不关心,因为 RH = 0)
(3) MSI能力中的MSI消息数据寄存器
- bit15 = 0(触发模式 = 边沿)
- bit14 = 0(触发电平,如果触发模式 = 边沿则忽略)
- 位[10:8] = 000(传送模式 = 固定)
- bit[7:0] = 0x20(向量,我选择使用0x20)
(4)最后通过设置 MSICAP.MC.MSIE = 1 来启用 MSI
- 我已经大致阅读了文档(第 10 章)http://download.intel.com/products/processor/manual/253668.pdf
- 我认为没有必要对 IO APIC 和本地 APIC 寄存器进行编程,因为 MSI 不会路由到 APIC 系统......!
当前状态:启用 MSIE = 1 后发现系统挂起,设备通过 MSI 产生中断!
注意:在上面的序列中,没有安装服务例程,因为我不知道该怎么做......(这是我的应用程序挂起的原因吗?)
谢谢 !
[20120822 更新]将Message Data字段 中的向量设置为 0x20 时,app 挂起...但如果设置为 0x76,我发现 app 没有挂起,然后我可以检查设备是否产生中断,Local APIC 收到此中断消息如下:
对于 PCI 设备(AHCI 控制器):
- ID(中断禁用)= 0
- IS(中断状态)= 0
- MSI 上限 = 09,FEE00000,00000076
对于 AHCI HBA 寄存器:
- PxIS = 00000023
- PxIE = 7DC0007F
- IS = 00000001
- IE 位 1 = 1
通过 1 和 2,我认为设备成功发送消息以请求服务,因为:
- IS bit0 = 1(端口 0 有挂起的中断状态)
- IE(中断启用)= 1
- PCI 命令寄存器 bit10(ID) = 0
- MSICAP.MC.MSIE = 1(至 MSI 引擎)
我还发现 LAPIC 收到了这个中断消息,因为:
- 本地 APIC IRR(中断请求寄存器) bit118(=0x76) = 1
- 本地 APIC ISR(In-Service register) bit118(=0x76) = 1
因此,设备似乎产生了中断,而本地 APIC 接收到了这个;即便如此,我的服务程序也没有被调用!