none
WINCE5.0 如何共享中断? RRS feed

  • 问题

  • 我有一块AMD X86的板子,板子上ISA总线挂载了一个CPLD 通过CPLD扩展了6个串口。共用了一个中断10,6个串口的地址分别是300、308、310、318、320、328。在XP下测试了这6个串口都能正常收发的。我在CE5.0下配置了注册表如下:

     

    IF BSP_SERIAL3
    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial3]
       "SysIntr"=dword:1A
      
    "IoBase"=dword:300
      
    "IoLen"=dword:8
      
    "DeviceArrayIndex"=dword:2
      
    "Prefix"="COM"
      
    "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
      
    "Dll"="Com16550.Dll"
      
    "Order"=dword:0
    ; Turn on follows for Installable ISR (isr16550 supporting SOFTWARE FIFO)
       "Irq"=dword:A
      
    "IsrDll"="isr16550.dll"
      
    "IsrHandler"="ISRHandler"

    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial3\Unimodem]
      
    "Tsp"="Unimodem.dll"
      
    "DeviceType"=dword:0
      
    "FriendlyName"=LOC_FRIENDLYNAME_SERIAL3
      
    "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
    ENDIF BSP_SERIAL3

    ; COM4
    IF BSP_SERIAL4
    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial4]
      
    "SysIntr"=dword:23
      
    "IoBase"=dword:308
      
    "IoLen"=dword:8
      
    "DeviceArrayIndex"=dword:3
      
    "Prefix"="COM"
      
    "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
      
    "Dll"="Com16550.Dll"
      
    "Order"=dword:0
    ; Turn on follows for Installable ISR (isr16550 supporting SOFTWARE FIFO)
       "Irq"=dword:A
      
    "IsrDll"="isr16550.dll"
      
    "IsrHandler"="ISRHandler"

    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial4\Unimodem]
      
    "Tsp"="Unimodem.dll"
      
    "DeviceType"=dword:0
      
    "FriendlyName"=LOC_FRIENDLYNAME_SERIAL4
      
    "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
    ENDIF BSP_SERIAL4

    其他的配置类似。

    另外,我在init.c中加入可如下:

    OALIntrStaticTranslate(SYSINTR_FIRMWARE + 10, 10); //默认的 此串口能正常收发
     
      OALIntrStaticTranslate(SYSINTR_FIRMWARE + 19, 10);
         OALIntrStaticTranslate(SYSINTR_FIRMWARE + 20, 10); 
         OALIntrStaticTranslate(SYSINTR_FIRMWARE + 21, 10);
         OALIntrStaticTranslate(SYSINTR_FIRMWARE + 22, 10);
         OALIntrStaticTranslate(SYSINTR_FIRMWARE + 23, 10); 

    现在CE系统中串口都可creatfile成功。但是一发送数据就卡死。

    请问应该如何配置

     

     

    2011年9月8日 2:57

答案

  • 一般一个IRQ只能接一个SysIntr。否则在中断发生时,OEMInterruptHandler就不知道该给谁发event了。

    至于6个串口share一个IRQ的情况,可以有以下的办法:

    1。专门创建一个简单的驱动作为interrupt的中继,即OEMInterruptHandler将IRQ对应的唯一的Event发给该驱动,该驱动根据hardware register检查是哪一个串口触发的interrupt。然后再发相应的Event通知那个串口驱动。

    2。为IRQ 10 reserve 6个SysIntr,在OEMInterruptHandler中,检查是哪一个串口出发的interrupt,然后返回相应的SysIntr.

    注意,不要用静态方式将一个IRQ绑定到多个SysIntr上。

    2011年9月8日 4:44
    版主