vxbus 模式进行pci设备驱动开发无法挂接中断

hncaoling1987 2014-11-13 11:47:22
我现在用的是vxworks6.9,硬件平台为i7,x86体系。我在程序中使用vxbFindPciDevice(globalBusCtrlID,.....),其他参数都是普通方式一样的参数,可以成功找到设备,并且我也可以获得pci设备的基地址,但是在我用vxbIntConnect(globalBusCtrlID,......)挂接中断时,却无法正确挂接,函数返回-1.
请问各位大牛吗,能不能指点我一下,我已经被这个问题纠结很久了。是不是对于pci设备来说,必须使用vxbus的模式将驱动封装,才可以使用vxbIntConnect挂接中断,可是如果必须使用vxbus模式的话我的驱动程序设计起来就会很复杂,但是直接使用vxbus提供的这些函数去访问,挂接中断就是不成功。帮帮忙吧!一定十分感谢。
...全文
2091 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zizicky 2016-08-11
  • 打赏
  • 举报
回复
你好,能否告诉一个大致的中断挂接流程吗?hwconf.c是否需要修改,还有就是是否必须封装成vxbus形式的驱动?
hncaoling1987 2014-11-24
  • 打赏
  • 举报
回复
引用 11 楼 tpu 的回复:
可以把ABCD都试一下
我已经结贴给分了,不过我最后还有个问题,就是如果我的bios里并没有给我的pci设备分配中断号,你说可以修改bios或者强制给,这是怎么做的呢,能详细说明一下不,感谢~~~~~
hncaoling1987 2014-11-24
  • 打赏
  • 举报
回复
问题已经解决了,谢谢各位,尤其是tpu,真的谢谢你的耐心解答。
hncaoling1987 2014-11-24
  • 打赏
  • 举报
回复
引用 12 楼 hncaoling1987 的回复:
[quote=引用 10 楼 hncaoling1987 的回复:] [quote=引用 8 楼 hncaoling1987 的回复:] [quote=引用 6 楼 tpu 的回复:] 用不用vxbus都一样的, 只是形式不同
我按照你说的方法,用sysPciPirqShow,可以看到我的设备所在的bus号,为11的对应的dest irq有16,17,18,19.,那么要怎样确保在ioapic也配置正确了呢,然后用intConnect挂接的时候,怎样得到中断向量呢,因为我用Inum_To_Ivec(irq)这样的方式是不行的。 谢谢你了啊。[/quote] 按照你说的方法,将configInum.h文件中的vector改成了vxbIoApicIntrShowAll显示的vector,但是在configInum.h显示的INT_NUM_IOAPIC_IRQx 是只到15,下面的就是以INT_NUM_IOAPIC_PIRQA这样的形式出现。我获得的中断号是16。所以将INT_NUM_IOAPIC_PIRQA进行了修改。然后在我的工程中,做了挂接中断的修改。 sysIntDisable(irq); IntConnect(INUM_TO_IVEC(INT_NUM_GET(irq),(VOIDFUNCPTR)xxx,0); sysIntEnable(irq); 但是无法识别INT_NUM_GET这个宏定义,所以我直接用 IntConnect(INUM_TO_IVEC(sysInumTbl[irq],(VOIDFUNCPTR)xxx,0); 我在中断服务程序里用logMsg打印了信息,并且释放信号量,但是还是没有看到打印的信息且也没有释放信号量。说明还是没有进入中断服务程序。 我的这些步骤是否有问题,还有其他方法可以看到我的中断号最终使用的中断向量确实是INT_NUM_IOAPIC_PIRQA吗?[/quote] 对应于busid和deviceid的共有16,17,18,19这四个irq号,我都试了一遍,但是发现经过sysInumTbl数组之后,全都为0,用INUM_TO_IVEC转换也就不起作用了,这是什么原因啊,INT_NUM_GET这个宏定义也用不了,我看镜像工程里也都有包含congifInum.h文件,应该是可以直接使用的才对。 还麻烦你再解答一次。[/quote] 是的,你说的确实是正确的,如果要用这个函数的话,还是必须得封装成vxbus下的驱动。
Tony363 2014-11-24
  • 打赏
  • 举报
回复
vxbIntConnect(globalBusCtrlID,......)挂接中断时,却无法正确挂接,函数返回-1. 这个一看就错了,vxBus里面的第一个参数pDev一定是PCI设备的,你这显然不对!一定要注意第一个参数要的是谁的pDev,pci设备还是pci控制器的,你先改改试试。如果是69的话,应该有很多pci设备的vxbus driver,你完全可以参考的写一个
hncaoling1987 2014-11-24
  • 打赏
  • 举报
回复
引用 10 楼 hncaoling1987 的回复:
[quote=引用 8 楼 hncaoling1987 的回复:] [quote=引用 6 楼 tpu 的回复:] 用不用vxbus都一样的, 只是形式不同
我按照你说的方法,用sysPciPirqShow,可以看到我的设备所在的bus号,为11的对应的dest irq有16,17,18,19.,那么要怎样确保在ioapic也配置正确了呢,然后用intConnect挂接的时候,怎样得到中断向量呢,因为我用Inum_To_Ivec(irq)这样的方式是不行的。 谢谢你了啊。[/quote] 按照你说的方法,将configInum.h文件中的vector改成了vxbIoApicIntrShowAll显示的vector,但是在configInum.h显示的INT_NUM_IOAPIC_IRQx 是只到15,下面的就是以INT_NUM_IOAPIC_PIRQA这样的形式出现。我获得的中断号是16。所以将INT_NUM_IOAPIC_PIRQA进行了修改。然后在我的工程中,做了挂接中断的修改。 sysIntDisable(irq); IntConnect(INUM_TO_IVEC(INT_NUM_GET(irq),(VOIDFUNCPTR)xxx,0); sysIntEnable(irq); 但是无法识别INT_NUM_GET这个宏定义,所以我直接用 IntConnect(INUM_TO_IVEC(sysInumTbl[irq],(VOIDFUNCPTR)xxx,0); 我在中断服务程序里用logMsg打印了信息,并且释放信号量,但是还是没有看到打印的信息且也没有释放信号量。说明还是没有进入中断服务程序。 我的这些步骤是否有问题,还有其他方法可以看到我的中断号最终使用的中断向量确实是INT_NUM_IOAPIC_PIRQA吗?[/quote] 对应于busid和deviceid的共有16,17,18,19这四个irq号,我都试了一遍,但是发现经过sysInumTbl数组之后,全都为0,用INUM_TO_IVEC转换也就不起作用了,这是什么原因啊,INT_NUM_GET这个宏定义也用不了,我看镜像工程里也都有包含congifInum.h文件,应该是可以直接使用的才对。 还麻烦你再解答一次。
hncaoling1987 2014-11-21
  • 打赏
  • 举报
回复
引用 8 楼 hncaoling1987 的回复:
[quote=引用 6 楼 tpu 的回复:] 用不用vxbus都一样的, 只是形式不同
我按照你说的方法,用sysPciPirqShow,可以看到我的设备所在的bus号,为11的对应的dest irq有16,17,18,19.,那么要怎样确保在ioapic也配置正确了呢,然后用intConnect挂接的时候,怎样得到中断向量呢,因为我用Inum_To_Ivec(irq)这样的方式是不行的。 谢谢你了啊。[/quote] 按照你说的方法,将configInum.h文件中的vector改成了vxbIoApicIntrShowAll显示的vector,但是在configInum.h显示的INT_NUM_IOAPIC_IRQx 是只到15,下面的就是以INT_NUM_IOAPIC_PIRQA这样的形式出现。我获得的中断号是16。所以将INT_NUM_IOAPIC_PIRQA进行了修改。然后在我的工程中,做了挂接中断的修改。 sysIntDisable(irq); IntConnect(INUM_TO_IVEC(INT_NUM_GET(irq),(VOIDFUNCPTR)xxx,0); sysIntEnable(irq); 但是无法识别INT_NUM_GET这个宏定义,所以我直接用 IntConnect(INUM_TO_IVEC(sysInumTbl[irq],(VOIDFUNCPTR)xxx,0); 我在中断服务程序里用logMsg打印了信息,并且释放信号量,但是还是没有看到打印的信息且也没有释放信号量。说明还是没有进入中断服务程序。 我的这些步骤是否有问题,还有其他方法可以看到我的中断号最终使用的中断向量确实是INT_NUM_IOAPIC_PIRQA吗?
tpu 2014-11-21
  • 打赏
  • 举报
回复
可以把ABCD都试一下
hncaoling1987 2014-11-20
  • 打赏
  • 举报
回复
引用 6 楼 tpu 的回复:
用不用vxbus都一样的, 只是形式不同
我按照你说的方法,用sysPciPirqShow,可以看到我的设备所在的bus号,为11的对应的dest irq有16,17,18,19.,那么要怎样确保在ioapic也配置正确了呢,然后用intConnect挂接的时候,怎样得到中断向量呢,因为我用Inum_To_Ivec(irq)这样的方式是不行的。 谢谢你了啊。
tpu 2014-11-20
  • 打赏
  • 举报
回复
vxbIoApicIntrShowAll可以显示实际的ioapic的配置, 即每个irq(0-23)对应的vector 然后,configInum.h里面, INT_NUM_IOAPIC_IRQx 0xxx必须跟实际的配置一致.不一致就改configInum.h 最后挂接的时候,用INUM_TO_IVEC(INT_NUM_GET(irq))的方式.
tpu 2014-11-19
  • 打赏
  • 举报
回复
x86的bsp,比如pcPentium4目录下, 有批次CfgIntStub.c文件. 里面的sysPciPirqShow可以显示从bios读出的路由表. 如果你的卡所在的bus号不在这个表中,要么在bios中添加,要么强制指定一个(根据硬件连接)
tpu 2014-11-19
  • 打赏
  • 举报
回复
用不用vxbus都一样的, 只是形式不同
hncaoling1987 2014-11-18
  • 打赏
  • 举报
回复
引用 3 楼 accessysq 的回复:
Vxworks没研究过。
非常感谢你的回复啊,那我想再请问你几个问题: 第一:假设bios里面有正确的表,那我自己可以通过什么方式查看这个中断路由表吗? 第二:如果这种普通的驱动方式在x86体系下太复杂了,那么如果用vxbus方式是不是就不存在这些问题了。如果驱动注册成功之后,是否可以用vxbiIntConnect(ID,0,PTR);即中断向量在pci总线控制器初始化所有pci设备的时候已经正确得到,并且已经保存在设备所在的vxbus device id号里了。 期待你的回复。
tpu 2014-11-17
  • 打赏
  • 举报
回复
x86的pci中断稍微复杂一点. pci中断路由表是从bios读出来的.确保你的bios里面有正确的表. ioapic也要配置正确. 总之,x86系统下跟bios关系太紧密了.
hncaoling1987 2014-11-13
  • 打赏
  • 举报
回复
本人先顶一个,还望大神快快现身,帮帮我这个困扰了许久的问题。必定感激在心啊!!!!!
  • 打赏
  • 举报
回复
Vxworks没研究过。
ksshm 2014-11-13
  • 打赏
  • 举报
回复
谢谢分享必定感激在心啊

2,179

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧