ISRSCRIPT

DMDLL_PCIInterruptConnect함수에서 사용하는 구조체

인터럽트가 발생하면 이것이 제조사의 PCI 하드웨어가 발생한 인터럽트인지 아닌지를 파악하도록 스크립트를 작성한다. 또한 인터럽트를 금지시키도록 스크립트를 추가 작성한다.

보통 PCI 하드웨어의 경우, 하나의 인터럽트 핀을 여러개의 PCI 하드웨어가 공유하는것이 일반적이다. 따라서, 인터럽트가 발생하면 반드시 해당하는 인터럽트를 어떤 카드가 발생시킨것인지를 확인해야 한다. 또한, 인터럽트 처리를 완료할때 까지 해당하는 카드의 인터럽트발생을 금지(지연)시켜야 할 필요가 있다. 이와 같이 인터럽트인지와 금지 방법을 기술하는 스크립트가 ISRSCRIPT 이다.


Description

typedef struct
_ISRSCRIPT
{
    #define DMIICORE_ISCRIPT_VERSION1 1 // 1.0
    int Version;
    struct _condition // 인터럽트인지조건
    {
        BOOLEAN ON; // 기능사용여부

        #define DMIICORE_ISCRIPT_TYPE_1BYTE 0
        #define DMIICORE_ISCRIPT_TYPE_2BYTE 1
        #define DMIICORE_ISCRIPT_TYPE_4BYTE 2
        int TypeNumber; // Operand 의 바이트크기

        #define DMIICORE_ISCRIPT_OPERANDTYPE_CONSTANT 0
        #define DMIICORE_ISCRIPT_OPERANDTYPE_BASEADDRESS 1
        int Operand1Type; // Operand1Value의 의미(상수를 사용할것인지 아니면 
        // BaseAddress를 지칭할것이지를 알린다)

        int Operand1Offset;

        #define DMIICORE_ISCRIPT_OPERANDVALUE_BASE0 0
        #define DMIICORE_ISCRIPT_OPERANDVALUE_BASE1 1
        #define DMIICORE_ISCRIPT_OPERANDVALUE_BASE2 2
        #define DMIICORE_ISCRIPT_OPERANDVALUE_BASE3 3
        #define DMIICORE_ISCRIPT_OPERANDVALUE_BASE4 4
        #define DMIICORE_ISCRIPT_OPERANDVALUE_BASE5 5
        ULONG Operand1Value; // 상수혹은 BaseAddress Index

        #define DMIICORE_ISCRIPT_OPERATIONTYPE_OR 0
        #define DMIICORE_ISCRIPT_OPERATIONTYPE_AND 1
        #define DMIICORE_ISCRIPT_OPERATIONTYPE_ADD 2
        #define DMIICORE_ISCRIPT_OPERATIONTYPE_SUB 3
        #define DMIICORE_ISCRIPT_OPERATIONTYPE_MUX 4
        #define DMIICORE_ISCRIPT_OPERATIONTYPE_DIV 5
        int Operation1Type; // 연산방법

        int Operand2Type;

        int Operand2Offset;

        ULONG Operand2Value;

        #define DMIICORE_ISCRIPT_COMPARETYPE_EQUAL 0
        #define DMIICORE_ISCRIPT_COMPARETYPE_NOTEQUAL 1
        #define DMIICORE_ISCRIPT_COMPARETYPE_STORE 2
        // MASK에서는 이 값만 사용해야 한다
        int comparetype;

        int Operand3Type;
        // 3rd Parameter는 MASK의 경우,
        // DMIICORE_ISCRIPT_OPERANDTYPE_CONSTANT 일 수 없다!!

        int Operand3Offset;

        ULONG Operand3Value;

    }CONDITION; // 인터럽트를 인식하는 용도

    struct _mask // 인터럽트금지방법
    {
        BOOLEAN ON; // 기능사용여부
        int TypeNumber;
        int Operand1Type;
        int Operand1Offset;
        ULONG Operand1Value;
        int Operation1Type;
        int Operand2Type;
        int Operand2Offset;
        ULONG Operand2Value;
        int comparetype;
        int Operand3Type;
        int Operand3Offset;
        ULONG Operand3Value;
    }MASK; // 인터럽트를 금지(마스킹)하는 용도
}ISRSCRIPT, *PISRSCRIPT;

하드웨어 인터럽트가 발생하면, 제조사는 자신의 PCI하드웨어의 어떤 메모리혹은 레지스터를 읽어서 인터럽트발생여부를 확인할 수 있는지를 정의해야 한다. 그리고 하드웨어 인터럽트를 일정시간 동안 금지시킬 수 있는 방법도 정의해야 한다. 이때 사용하는 것이 ISRSCRIPT 구조체이다.

예를 들어, 어떤 PCI카드가 인터럽트를 발생했다고 가정하자. 이 카드가 인터럽트를 발생하면, 항상 자신의 PCI Base Address 0의 메모리로 부터 0x10바이트(오프셋) 떨어진 곳의 4바이트의 내용을 읽어서 마지막 비트0의 값이 1을 나타낸다고 한다면, 이것은 다음과 같이 정리해볼 수 있다.

if(( *(unsigned long)((unsigned char *)(Base0) + 0x10) & 0x00000001) == 0x00000001)
{
    // 인터럽트가 발생한 조건으로 사용된다
}

이와 같은 내용을 설명하는 스크립트는 다음과 같이 작성될 수 있다.

IsrScript.CONDITION.ON = TRUE;
IsrScript.CONDITION.TypeNumber = DMIICORE_ISCRIPT_TYPE_4BYTE;
IsrScript.CONDITION.Operand1Type = 
DMIICORE_ISCRIPT_OPERANDTYPE_BASEADDRESS;
IsrScript.CONDITION.Operand1Value = DMIICORE_ISCRIPT_OPERANDVALUE_BASE0; 
// BaseAddress 0

IsrScript.CONDITION.Operand1Offset = 0x10; // Offset 0x10

IsrScript.CONDITION.Operation1Type = DMIICORE_ISCRIPT_OPERATIONTYPE_AND;
IsrScript.CONDITION.Operand2Type = DMIICORE_ISCRIPT_OPERANDTYPE_CONSTANT;
IsrScript.CONDITION.Operand2Value = 0x00000001;

IsrScript.CONDITION.comparetype = DMIICORE_ISCRIPT_COMPARETYPE_EQUAL;
IsrScript.CONDITION.Operand3Type = DMIICORE_ISCRIPT_OPERANDTYPE_CONSTANT;
IsrScript.CONDITION.Operand3Value = 0x00000001;

Field

results matching ""

    No results matching ""