我在编程设备MSI(消息信号中断)方面遇到了一些困难,欢迎任何指针...(我的环境是Watcom C + DOS/32a - dos扩展器,在flat模式下...)
@ PIC(8259)模式对我来说没问题...
我列出了我所做的事情,希望有人可以帮助澄清这些...谢谢!
(1)多重消息启用= 0(对于单个MSI,请将此字段设置为0;MMC = 100b)
(2)对于MSI功能中的MSI消息地址寄存器
- bit [31:20] = 0xFEE
- bit [19:12] = 0(目标ID,并发现本地APIC ID = 0...)
- bit3 = 0(重定向提示= 0)
- bit2 = 0(目标模式,不关心因为RH = 0)
(3)对于MSI功能中的MSI消息数据寄存器
- bit15 = 0(触发模式= edge)
- bit14 = 0(触发电平,如果触发模式= edge,则忽略)
- bit [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和Local APIC寄存器,因为MSI不路由到APIC系统...!
当前状态:在启用MSIE = 1并且设备通过MSI生成中断后,我发现系统挂起!
注意:在上述序列中,由于我不知道如何执行服务例程(这是我的应用程序挂起的原因吗?),所以未安装服务程序。
谢谢!
[20120822更新]
当将Message Data字段中的向量设置为0x20时,应用程序会挂起...但如果设置为0x76,则发现应用程序没有挂起,然后我可以检查设备是否生成中断以及本地APIC是否收到此中断消息,如下所示:
对于PCI设备(AHCI控制器):
- ID(中断禁用) = 0
- IS(中断状态) = 0
- MSI Cap = 09,FEE00000,00000076
对于AHCI HBA寄存器:
- PxIS = 00000023
- PxIE = 7DC0007F
- IS = 00000001
- IE位1 = 1
通过1和2,我认为设备成功发送了请求服务的消息,因为:
- IS位0 = 1(端口0具有待处理的中断状态)
- IE(中断使能)= 1
- PCI命令寄存器位10(ID)= 0
- MSICAP.MC.MSIE = 1(对于MSI引擎)
此外,我发现LAPIC接收了此中断消息,因为:
- 本地APIC IRR(中断请求寄存器)位118(=0x76)= 1
- 本地APIC ISR(正在服务寄存器)位118(=0x76)= 1
因此,似乎是设备生成了中断并且本地APIC接收到了中断,即使如此,我的服务例程仍未被调用!