⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keymatrix.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        goto error_return;
    }
    DEBUGMSG(ZONE_INIT, (TEXT("[KBD] pGPIOReg mapped at %x\r\n"), pGPIOReg));

    // Keypad Virtual alloc
    ioPhysicalBase.LowPart = dwIOCTRLBase;    
    pKeyPadReg = (S3C6410_KEYPAD_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_KEYPAD_REG), FALSE);
    if (pKeyPadReg == NULL)
    {
        DEBUGMSG(ZONE_ERROR,(TEXT("[KBD] pKeyPadReg : MmMapIoSpace failed!\r\n")));
        goto error_return;
    }
    DEBUGMSG(ZONE_INIT, (TEXT("[KBD] pKeyPadReg mapped at %x\r\n"), pKeyPadReg));

    DEBUGMSG(ZONE_INIT,(TEXT("--KeybdDriverInitializeAddresses\r\n")));

    return TRUE;

error_return:

    if ( pSysConReg )
    {
        MmUnmapIoSpace((PVOID)pSysConReg, sizeof(S3C6410_SYSCON_REG));
        pSysConReg = NULL;
    }

    if ( pGPIOReg )
    {
        MmUnmapIoSpace((PVOID)pGPIOReg, sizeof(S3C6410_GPIO_REG));
        pGPIOReg = NULL;
    }

    if ( pKeyPadReg )
    {
        MmUnmapIoSpace((PVOID)pKeyPadReg, sizeof(S3C6410_KEYPAD_REG));
        pKeyPadReg = NULL;
    }

    DEBUGMSG(ZONE_INIT,(TEXT("--KeybdDriverInitializeAddresses[FAILED!!!]\r\n")));
    return FALSE;
}
/****************************************************************************/


/*****************************************************************************
*    Function Name : VarInit
*    Function Desc  : Initialization for variables about Key Change. 
*
*/
void VarInit(void)
{
    int i;

    for( i=0; i<SIZE_KEY; i++)
    {
        KeyChange[i].Mask = 0;
        KeyChange[i].Cnt  = 0;
    }
}
/****************************************************************************/


/*****************************************************************************
*    Function Name : AreAllKeysUp
*    Function Desc  : Check that all keys are released. 
*
*/
BOOL AreAllKeysUp(void)
{
    DWORD tmp = 0, tmp1 = 0, i;

    for(i=0;i<SIZE_COLS;i++)
    {
        tmp |= KeyState[i];
        tmp1 |= ChangeState[i];
    }

    return (tmp || tmp1)? FALSE:TRUE;
}
/****************************************************************************/

/*****************************************************************************
*    Function Name : KScan_ProcState
*    Function Desc  : Handle KeyMatrix State. Check which keys are changed.
*
*/
DWORD KScan_ProcState(int kidx, int idx, PDWORD key, PBOOL press)
{
    int val, i;
    DWORD count = 0;
    int mask;

    val = ChangeState[kidx];
    for(i=0;i<SIZE_BITS;i++)
    {
        mask = 1<<i;

        if( (KeyState[kidx] & mask) && (KeyCode[idx].Type == KCODE_TYPE_SL) && (KeyCode[idx].Fin == 0) )
        {
            if( (KeyCode[idx].TimeoutCnt == CNT_LONGKEY) )
            {
                // key down
                *key++ = KeyCode[idx].Scan | SCAN_EXT;
                *press++ = FALSE;
                // key up
                *key++ = KeyCode[idx].Scan | SCAN_EXT;
                *press++ = TRUE;
                count+=2;

                KeyCode[idx].TimeoutCnt = 0;
                KeyCode[idx].Fin = TRUE;
                RETAILMSG(FALSE, (TEXT(">>> KSCAN:LONG[%d] - %d, key - 0x%x\r\n"), idx, KeyCode[idx].Scan,*key));
            }
            else
            {
                KeyCode[idx].TimeoutCnt++;
            }
        }

        // state changed
        if( val & mask )
        {
            // Need to check whether the key changed really
            if( KeyChange[idx].Cnt == 0 ) // in counting
            {
                KeyChange[idx].Cnt = CNT_VALIDKEY;
                KeyChange[idx].Mask = ( KeyState[kidx] & mask )? 0: mask;
            }
            else
            {
            // checked key state
                if( KeyChange[idx].Mask != (KeyState[kidx] & mask) )
                {
                    if( --KeyChange[idx].Cnt == 0 )
                    {
                        if( KeyChange[idx].Mask == 0 )  // Key UP
                        {
                            if( KeyCode[idx].Type == KCODE_TYPE_NORMAL )
                            {
                                *key++ = KeyCode[idx].Scan;
                                *press++ = TRUE;
                                count++;

                                RETAILMSG(FALSE, (TEXT(">>> KSCAN:UP  [%d] - %d\r\n"), idx, KeyCode[idx].Scan));
                            }
                            else    // KCODE_TYPE_SL
                            {
                                if( KeyCode[idx].Fin == FALSE )
                                {
                                    // key down
                                    *key++ = KeyCode[idx].Scan;
                                    *press++ = FALSE;
                                    // key up
                                    *key++ = KeyCode[idx].Scan;
                                    *press++ = TRUE;
                                    count+=2;

                                    KeyCode[idx].Fin = TRUE;

                                    RETAILMSG(FALSE, (TEXT(">>> KSCAN:SHORT[%d] - %d\r\n"), idx, KeyCode[idx].Scan));
                                }
                            }

                            KeyState[kidx] &= ~mask;
                        }
                        else    // Key Down
                        {
                            if( KeyCode[idx].Type == KCODE_TYPE_NORMAL )
                            {
                                *key++ = KeyCode[idx].Scan;
                                *press++ = FALSE;
                                count++;

                                RETAILMSG(FALSE, (TEXT(">>> KSCAN:DOWN[%d] - %d\r\n"), idx, KeyCode[idx].Scan));
                            }
                            else    // KCODE_TYPE_SL
                            {
                                KeyCode[idx].TimeoutCnt = 0;
                                KeyCode[idx].Fin = FALSE;
                            }

                            KeyState[kidx] |= mask;
                        }
                    }
                }
                else
                {
                    KeyChange[idx].Cnt = 0;
                    RETAILMSG(0, (TEXT(">>> KSCAN:Must be not occurred[%d] %x, %llx, %llx\r\n"), idx,KeyChange[idx].Mask,KeyState,mask));
                }
            }
        }
        else
        {
            if( KeyChange[idx].Cnt ) // in counting
            {
                KeyChange[idx].Cnt = 0;
                RETAILMSG(0, (TEXT(">>> KSCAN:Canceled [%d]\r\n"), idx));
            }
        }
        idx++;
    }

    return count;
}
/****************************************************************************/

/*****************************************************************************
*    Function Name : KScan_ProcIO
*    Function Desc  : Scan code
*                     Read KEYIF
*
*/
void KScan_ProcIO(void)
{
    int i;

    for(i = 0 ; i < SIZE_COLS; i++)
    {
        KEYIF_Column_Set(0x0);
        // select a column
        KEYIF_Column_Bitset(false,i);
        Sleep(1);
        ChangeState[i] = KeyState[i]^((~ KEYIF_Row_Read())&0xff);
        RETAILMSG(FALSE, (TEXT("[KSCAN](%d)-%x\r\n"), i, ChangeState[i]));
        Sleep(1);
    }
    KEYIF_Column_Set(0x0);
}
/****************************************************************************/

/*****************************************************************************
*    Function Name : KScan_SetINTMode
*    Function Desc  : Initialize the H/W
*
*/
void KScan_SetINTMode(void)
{
    RETAILMSG(FALSE,(TEXT("+Select all column\r\n")));
    // select all column - Set Keypad column GPIO to [Key PAD COL]
    GPIO_CtrlHandler(ENUM_COL, ENUM_AUXFUNC);

    KEYIF_Column_Set(0x0);

    // configure - Set Keypad row GPIO to [Key PAD ROW]
    GPIO_CtrlHandler(ENUM_ROW, ENUM_AUXFUNC);

    // unmask the key interrupt
    KEYIF_Status_Clear();
}
/****************************************************************************/

/*****************************************************************************
*    Function Name : KeybdPdd_ToggleKeyNotification
*    Function Desc  : Toggle Key
*
*/
void WINAPI KeybdPdd_ToggleKeyNotification(KEY_STATE_FLAGS  KeyStateFlags)
{
    unsigned int fLights;

    DEBUGMSG(ZONE_FUNCTION, (TEXT("KeybdPdd_ToggleKeyNotification\r\n")));

    fLights = 0;
    if (KeyStateFlags & KeyShiftCapitalFlag)
    {
        fLights |= 0x04;
    }

    if (KeyStateFlags & KeyShiftNumLockFlag)
    {
        fLights |= 0x2;
    }
    /*
    Keyboard lights is disabled once driver is installed because the
    PS2 controller sends back a response which goes to the IST and corrupts
    the interface.  When we figure out how to disable the PS2 response we
    can re-enable the lights routine below
    */

    return;
}
/****************************************************************************/

/*****************************************************************************
*    Function Name : IsrThreadProc
*    Function Desc  : IST of KeyBD D/D
*        Create IST
*        Wait for Event according to the KEYPAD INT
*        KScan_SetIOMode() : Handle H/W
*        KScan_ProcIO() :
*        KScan_ProcState() :
*
*/
extern UINT v_uiPddId;
extern PFN_KEYBD_EVENT v_pfnKeybdEvent;

BOOL KeyMatrix::IsrThreadProc()
{
    DWORD dwPriority;
    DWORD i, step;

    DWORD   rguiScanCode[SIZE_KEY];
    BOOL    rgfKeyUp[SIZE_KEY];
    UINT    cEvents;
    DWORD ret;
    DWORD timeout;
    HANDLE gEventIntr;
    DWORD irq, sysintr;

    ReadRegDWORD( TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("Priority256"), &dwPriority );
    if(dwPriority == 0)
    {
        dwPriority = DEFAULT_PRIORITY;
    }

    DEBUGMSG(ZONE_INIT, (TEXT("+[KEYBD]IsrThreadProc\r\n")));
    // update the IST priority
    CeSetThreadPriority(GetCurrentThread(), (int)dwPriority);

    irq = IRQ_KEYPAD;
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &irq, sizeof(UINT32), &sysintr, sizeof(UINT32), NULL))
    {
        ERRORMSG( 1, (TEXT("ERROR: Failed to request the IRQ_KEY sysintr.\r\n")));
        sysintr = SYSINTR_UNDEFINED;
        return(FALSE);
    }

    gEventIntr = CreateEvent(NULL, FALSE, FALSE, NULL);
    if( NULL == gEventIntr )
    {
        ERRORMSG( 1, (TEXT("Event is not created\r\n")));
        return(FALSE);
    }

    if( InterruptInitialize(sysintr, gEventIntr, NULL, 0) == FALSE )
    {
        ERRORMSG( 1, (TEXT("interrupt is not initialized\n\r")));
        return(FALSE);
    }


    timeout = INFINITE;
    DEBUGMSG(ZONE_INIT, (TEXT("+[KEYBD]Enter Infinite Loop\r\n")));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -