VxWorks 6.8 系统 F81216DG 扩展4串口共享中断驱动

VxWorks 6.8 系统 F81216DG 扩展4串口共享中断驱动

技术交流QQ群:691976956

写这个文章之前,请大家先了解下 F81216DG 这个芯片,链接如下:
www.dfi-itox.com/pages/support/wdt/F81216.pdf

VxWorks 6.x 系统下对VXBUS ID 为PCI的设备是可以支持中断共享的,但是对 PLB 设备,默认情况下是无法支持中断共享的。
网上看了几篇论文,说可以支持,大致内容如下:
1、通过配置 pInfo->sioChan = -1, 传入参数到 ns16550vxbSioChanConnect 函数中,将全部的设备都挂接中断服务程序及使能中断号;
2、修改了下 ISR 程序里面,进中断服务程序后,判断当前是哪个设备产生的中断,找到对应的 pDev,然后执行指定通道的数据处理即可。

我严重怀疑这个论文的真实性,但无法确定的是论文所指的运行平台是X86还是 mips的,据说mips可以支持,毫无压力。

经过几波的折腾,我把做过的测试列出来:
一、第一次测试过程
1、在 pc.h 中配置扩展的4个串口的中断号及串口个数;

2、在 configInum.h 文件中配置扩展串口的中断向量;
3、在 hwconf.c 文件中配置串口资源及设备;

4、在内核配置空间中,打开 DRV_SIO_NS16550 驱动组件;
5、编译系统映像;

6、上电加载映像,动态加载串口测试程序,测试。
结论:扩展的 4 个串口,只有最后一个是 OK 的,其它的3路不通。

二、调试过程
1、在驱动中的ISR中增加了一条打印语句:logMsg ("sss \r\n",0,0,0,0,0,0);

2、测试发现前面三个串口在数据发送测试中,没有该信息打印输出,证明没有进中断,而最后一个有进入,打印输出;
3、在系统下输入 isrShow,发现确实没有中断产生;

4、更换了 5.5 的驱动,测试结果:
最后一个可以发送几个字符后系统重启,使用轮询方式或者直接操作寄存器,数据可以发送出去,说明该问题应该是中断导致。

5、4 个串口,只有最后一个可以进中断,有如下几处怀疑:
     1) 前面的3路被屏蔽,中断信号没有传递到 8259A,也就是看到的无法触发中断;

     2)中断向量放置位置不对,触发了中断,是无效的,没有捕获到;
     3) X86的系统不支持ISA类的中断共享,无解;
     4) F81216 的中断共享需要打开或者重新配置;

6、排除法
     1)由于扩展串口是外设,直接写数据可以发送出去,因此可以判定,中断信号肯定是有发送出去;排除
     2)中断向量放置不对,单独打开1路,可以进中断,说明和向量没有关系;
     3)无法确定,能够肯定的是 PCI 的设备,可以通过 APIC的MP表来做动态映射,肯定可以支持,已驱动过很多个网卡;
     4)需要查看芯片手册,针对中断相关的寄存器都需要打印出来对比,
     经过打印确认,寄存器:中断选择寄存器,配置的都是0x9,说明中断号配置正确,但是还有高4位的低2位, 截图:

     

     默认情况改下,BIOS 配置的都是 0, 这里似乎不太的正确。
     在系统初始化阶段对该芯片进行重新编程来修改,代码比较简单,暂时不贴图。
     经过了好几种组合,发现修改后,问题依旧。
     
5、修改独立的中断号;
     将 4 个串口中断号分别配置为 5,6,7,10,配置到 F81216中,如下图所示:

    

     截图来看,中断号配置正确。
     测试结论:只有第1个串口可以通,剩余的 3个都不行。