3841|11

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于注册表的系统中断和物理中断的迷惑 [复制链接]

今天看了一下优龙的外部串口ST16C2550驱动,发现一些不解的现象
在注册表有
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\S16550_A]
    "SysIntr"=dword:00000012——这是系统中断
    "Dll"="com16550.dll"
    "Prefix"="COM"
    "DeviceArrayIndex"=dword:0
    "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"
    "Index"=dword:6
    "Order"=dword:2
    "irq"=dword:24——(16进制)物理中断对应#define IRQ_EINT8   36
    "RegStride"=dword:2
    "IoLen"=dword:100
    "IOBase"=dword:08000000
    "InterfaceType"=dword:0
    "BusNumber"=dword:0

按照以前,一般是通过获得注册表物理中断,然后再申请系统中断的,可是我看里面的代码是直接获得系统中断,就开始操作中断了,那这个物理中断是如何和系统中断结合起来的?纳闷,知道的帮忙解答一下,3Q。
BOOL CPdd16550::Init()
{
    if ( CSerialPDD::Init() && IsKeyOpened() && m_XmitFlushDone!=NULL) {
        // IST Setup .
        DDKISRINFO ddi;
        if (GetIsrInfo(&ddi)!=ERROR_SUCCESS) {
            return FALSE;
        }
        m_dwSysIntr = ddi.dwSysintr;------直接获得系统中断,咋回事?
        if (m_dwSysIntr !=  MAXDWORD && m_dwSysIntr!=0 )
            m_hISTEvent= CreateEvent(0,FALSE,FALSE,NULL);
        
        if (m_hISTEvent!=NULL) {
            if (!InterruptInitialize(m_dwSysIntr,m_hISTEvent,0,0)) {
                m_dwSysIntr = MAXDWORD ;
                return FALSE;
            }
        }
        else
            return FALSE;
        
        // Get Device Index.
        if (!GetRegValue(PC_REG_DEVINDEX_VAL_NAME, (PBYTE)&m_dwDevIndex, PC_REG_DEVINDEX_VAL_LEN)) {
            m_dwDevIndex = 0;
        }
        if (!GetRegValue(PC_REG_SERIALWATERMARK_VAL_NAME,(PBYTE)&m_dwWaterMark,sizeof(DWORD))) {
            m_dwWaterMark = 8;
        }
        if (!MapHardware() || !CreateHardwareAccess()) {
            return FALSE;
        }
        
        return TRUE;        
    }
    return FALSE;
}

最新回复

正解  详情 回复 发表于 2010-3-29 15:13
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
晕,难道没有老兄遇到这些事,以前有人提过,我还不相信,郁闷。
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是不是我的问题太挫了,没有人理我,呜呜。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

4
 
友情帮顶!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
这种方式是wince5之前版本是静态分配系统中断的方式。在ISR函数(如OEMInterruptHandler)中根据产生的此外设占用的物理中断来返回系统中断激活IST。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 iwillbeback008 的回复:
友情帮顶!


晕,我卡在这里了,help me
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 alien75 的回复:

这种方式是wince5之前版本是静态分配系统中断的方式。在ISR函数(如OEMInterruptHandler)中根据产生的此外设占用的物理中断来返回系统中断激活IST。


正解!

应该是事先用静态方式绑定的中断。lz可以看看intr.c文件。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果是WINCE5,出于一些使用的目的可能用OALIntrStaticTranslate建立物理中断和系统中断的对应,这个关系感觉象是unique的
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 ricky_hu 的回复:
引用 4 楼 alien75 的回复:

这种方式是wince5之前版本是静态分配系统中断的方式。在ISR函数(如OEMInterruptHandler)中根据产生的此外设占用的物理中断来返回系统中断激活IST。


正解!

应该是事先用静态方式绑定的中断。lz可以看看intr.c文件。

真的是哦,3Q。呵呵。
//------------------------------------------------------------------------------
//
//  Function:  BSPIntrInit
//
BOOL BSPIntrInit()
{
    S3C2440A_IOPORT_REG *pOalPortRegs;
    ULONG value;

    OALMSG(OAL_INTR&&OAL_FUNC, (L"+BSPIntrInit\r\n"));
   
    // Then get virtual address for IO port
    pOalPortRegs = OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);

    // Set GPG1 as EINT9
    value = INREG32(&pOalPortRegs->GPGCON);
    OUTREG32(&pOalPortRegs->GPGCON, (value & ~(3 << 2))|(2 << 2));

    // Disable pullup
    value = INREG32(&pOalPortRegs->GPGUP);
    OUTREG32(&pOalPortRegs->GPGUP, value | (1 << 1));

    // High level interrupt
    value = INREG32(&pOalPortRegs->EXTINT1);
    OUTREG32(&pOalPortRegs->EXTINT1, (value & ~(0xf << 4))|(0x1 << 4));

    // Add static mapping for Built-In OHCI
    OALIntrStaticTranslate(SYSINTR_OHCI, IRQ_USBH);
    OALIntrStaticTranslate(SYSINTR_EINT8, IRQ_EINT8);
    OALIntrStaticTranslate(SYSINTR_EINT9, IRQ_EINT9);

        // OALIntrStaticTranslate(SYSINTR_USBFN, IRQ_USBFN);
    OALMSG(OAL_INTR&&OAL_FUNC, (L"-BSPIntrInit(rc = 1)\r\n"));
    return TRUE;
}
 
 
 

回复

129

帖子

0

TA的资源

一粒金砂(初级)

10
 
郁闷,弄个外部串口上去还是不行。呵呵。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
6楼正解,系统中断和物理中断已经在OAL中提前绑定好了。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 4 楼 alien75 的回复:
这种方式是wince5之前版本是静态分配系统中断的方式。在ISR函数(如OEMInterruptHandler)中根据产生的此外设占用的物理中断来返回系统中断激活IST。


正解
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表