亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? keypad.c

?? i.Mx31 bootloader(for WinCE6.0)
?? C
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------
//
// File: keypad.c
//
// OEM Keypad routines for IPL on Freescale MX31 ADS hardware platform.
//
//------------------------------------------------------------------------------
#include "bsp.h"
#include "keys.h"

//------------------------------------------------------------------------------
// External Functions

//------------------------------------------------------------------------------
// External Variables

//------------------------------------------------------------------------------
// Defines
#define KPP_COLUMN_INUSE        8
#define KPP_ROW_INUSE           8
#define KPP_COLUMN_MASK         ((0x1 << KPP_COLUMN_INUSE) -1)
#define KPP_ROW_MASK            ((0x1 << KPP_ROW_INUSE) - 1)

//------------------------------------------------------------------------------
// Types
// Virtual key to bit mapping
typedef struct
{
    DWORD dwVk;
    DWORD dwBit;
} VKEY_TO_BIT;

//------------------------------------------------------------------------------
// Global Variables

//------------------------------------------------------------------------------
// Local Variables
static PCSP_KPP_REGS g_pKPP;
static PCSP_EPIT_REG g_pEPIT;

//------------------------------------------------------------------------------
// Local Functions

// 8x8 keypad matrix
static UINT8 keypadVK[] =
{
    //column 0
    0,
	VK_TSOFT1,      //SW11
	0,
	0,
	0,
	0,
	0,
	0,
	
    //column 1
    0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	
    //column 2
	0,
	0,
	0,
	0,
	0,
	0,
    0,
	0,

    //column 3
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,

    //column 4
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	
    //column 5
	VK_TSOFT2,      //SW3
    0,
	0,
	0,
	0,
	0,
	0,
    0,
	
    //column 6
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,

    //column 7
	0,
	0,
	0,
	0,
	0,
	0,
	0,
	0,
};

static const VKEY_TO_BIT sc_rgVkToBit[] = 
{
    { VK_TSOFT1,        KEY_TSOFT1 },
    { VK_TSOFT2,        KEY_TSOFT2 },
};

//------------------------------------------------------------------------------
//
// Function: EPITInit
//
// This function initializes EPIT module for msWait() in bspcmn\waitutils.c
//
// Parameters:
//      None.
//
//  Returns:
//      None.
//
//------------------------------------------------------------------------------
static void EPITInit(void)
{
	g_pEPIT = (PCSP_EPIT_REG) OALPAtoUA(CSP_BASE_REG_PA_EPIT1);
	if (g_pEPIT == NULL)
    {
        KITLOutputDebugString("EPITInit: EPIT1 null pointer!\r\n");
        return;
    }
    
    // Disable EPIT and clear all configuration bits
    OUTREG32(&g_pEPIT->CR, 0);

    // Assert software reset for the timer
    OUTREG32(&g_pEPIT->CR, CSP_BITFMASK(EPIT_CR_SWR));

    // Wait for the software reset to complete
    while (INREG32(&g_pEPIT->CR) & CSP_BITFMASK(EPIT_CR_SWR));

    // Enable timer for "free-running" mode where timer rolls
    // over from 0x00000000 to 0xFFFFFFFF
    OUTREG32(&g_pEPIT->CR,
        CSP_BITFVAL(EPIT_CR_EN, EPIT_CR_EN_ENABLE) |
        CSP_BITFVAL(EPIT_CR_ENMOD, EPIT_CR_ENMOD_RESUME) |
        CSP_BITFVAL(EPIT_CR_OCIEN, EPIT_CR_OCIEN_DISABLE) |
        CSP_BITFVAL(EPIT_CR_RLD, EPIT_CR_RLD_ROLLOVER) |
        CSP_BITFVAL(EPIT_CR_PRESCALAR, 0x20) | // divide by 32 to produce 1 ms tick
        CSP_BITFVAL(EPIT_CR_SWR, EPIT_CR_SWR_NORESET) |
        CSP_BITFVAL(EPIT_CR_IOVW, EPIT_CR_IOVW_NOOVR) |
        CSP_BITFVAL(EPIT_CR_DBGEN, EPIT_CR_DBGEN_ACTIVE) |
        CSP_BITFVAL(EPIT_CR_WAITEN, EPIT_CR_WAITEN_ENABLE) |
        CSP_BITFVAL(EPIT_CR_DOZEN, EPIT_CR_DOZEN_ENABLE) |
        CSP_BITFVAL(EPIT_CR_STOPEN, EPIT_CR_STOPEN_ENABLE) |
        CSP_BITFVAL(EPIT_CR_OM, EPIT_CR_OM_DICONNECT) |
        CSP_BITFVAL(EPIT_CR_CLKSRC, EPIT_CR_CLKSRC_CKIL)); // select 32khz clock as source
}

//------------------------------------------------------------------------------
//
// Function: msStall
//
// This function stalls system for time specified in milliseconds.
//
// Parameters:
//      nMilliseconds
//          [in] The milliseconds to stall system.
//
//  Returns:
//      None.
//
//------------------------------------------------------------------------------
static void msStall(unsigned nMilliseconds)
{
    UINT32 startCount, maxCount;
    
    if (g_pEPIT == NULL)
    {
        KITLOutputDebugString("msStall: ERROR - Timer not initialized\r\n");
        return;
    }  	
    
    startCount = EPIT_CNT_COUNT_MAX - INREG32(&g_pEPIT->CNT);
    maxCount = startCount + nMilliseconds;
    
    // wait for nMilliseconds number of ticks
    while((EPIT_CNT_COUNT_MAX - INREG32(&g_pEPIT->CNT)) < maxCount);
}

//------------------------------------------------------------------------------
//
// Function: KeypadSetClock
//
// This function enables or disables the clock of Keypad module.
//
// Parameters:
//      bEnable
//          [in] TRUE to enable KPP clock, otherwise disable it.
//
//  Returns:
//      None.
//
//------------------------------------------------------------------------------
static void KeypadSetClock(BOOL bEnable)
{
    PCSP_CCM_REGS pCCM = OALPAtoUA(CSP_BASE_REG_PA_CCM);

    if (bEnable)
    {
        // Enable KPP clock
        SETREG32(&pCCM->CGR[1], 0x3 << 20);
    }
    else
    {
        // Disable KPP clock
        CLRREG32(&pCCM->CGR[1], 0x3 << 20);
    }
}

//------------------------------------------------------------------------------
//
// Function: KeypadInit
//
// This function sets up the keypad module for IPL reading ULDR forcing key.
//
// Parameters:
//      None. 
//
//  Returns:
//      None.
//
//------------------------------------------------------------------------------
void KeypadInit(void)
{
    PCSP_IOMUX_REGS pIOMUX = OALPAtoUA(CSP_BASE_REG_PA_IOMUXC);

    // Configure IOMUX to request KPP pins
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL0, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL1, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL2, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL3, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL4, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL5, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL6, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_COL7, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW0, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW1, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW2, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW3, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW4, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW5, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW6, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
    OAL_IOMUX_SET_MUX(pIOMUX, DDK_IOMUX_PIN_KEY_ROW7, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);

    // Enable KPP clock
    KeypadSetClock(TRUE);

    // Map KPP registers
    g_pKPP = OALPAtoUA(CSP_BASE_REG_PA_KPP);

    // Enable no. of rows in keypad (KRE = 1)
    // Configure columns as open-drain (KCO = 1)
    INSREG16BF(&g_pKPP->KPCR, KPP_KPCR_KRE, KPP_ROW_MASK);
    INSREG16BF(&g_pKPP->KPCR, KPP_KPCR_KCO, KPP_COLUMN_MASK);

    // Write 0's to all columns
    INSREG16BF(&g_pKPP->KPDR, KPP_KPDR_KCD, 0);

    // Configure rows as input, columns as output
    INSREG16BF(&g_pKPP->KDDR, KPP_KDDR_KCDD, KPP_COLUMN_MASK);
    INSREG16BF(&g_pKPP->KDDR, KPP_KDDR_KRDD, 0);

    // Clear KPKD and KPSR_KPKR status flag (w1c)
    // Clear synchronizer chain - KDSC (w1c)
    // Enable keypad interrupt - Set KDIE,
    // clear KRIE (avoid false release events)
    OUTREG16(&g_pKPP->KPSR,
        (CSP_BITFVAL(KPP_KPSR_KPP_EN, KPP_KPSR_KPP_EN_ENABLE) |
        CSP_BITFVAL(KPP_KPSR_KPKD, KPP_KPSR_KPKD_CLEAR) |
        CSP_BITFVAL(KPP_KPSR_KPKR, KPP_KPSR_KPKR_CLEAR) |
        CSP_BITFVAL(KPP_KPSR_KDSC, KPP_KPSR_KDSC_CLEAR) |
        CSP_BITFVAL(KPP_KPSR_KDIE, KPP_KPSR_KDIE_INT_ENABLE) |
        CSP_BITFVAL(KPP_KPSR_KRIE, KPP_KPSR_KRIE_INT_DISABLE)));

    // Disable KPP clock
    KeypadSetClock(FALSE);

    // Initialize EPIT for msStall()
    EPITInit();
}    

//------------------------------------------------------------------------------
//
// Function: FindBit
//
// This function finds the bit mask that corresponds to this virtual key.
//
// Parameters:
//      dwVk
//          [in] The virtual key.
//
//      rgVkToBit
//          [in] The virtual key to bit mapping table.
//
//      cVkToBit
//          [in] The size of the mapping table.
//
//  Returns:
//      The bit mask that corresponds to this virtual key.
//
//------------------------------------------------------------------------------
static DWORD FindBit(DWORD dwVk, const VKEY_TO_BIT *rgVkToBit, DWORD cVkToBit) 
{
    DWORD dwBit = 0;
    DWORD dwIdx;

    for (dwIdx = 0; dwIdx < cVkToBit; ++dwIdx)
    {
        const VKEY_TO_BIT *pVkToBit = &rgVkToBit[dwIdx];
        if (pVkToBit->dwVk == dwVk)
        {
            dwBit = pVkToBit->dwBit;
            break;
        }
    }

    return dwBit;
}

//------------------------------------------------------------------------------
//
// Function: KeypadRead
//
// This function returns a bit mask of the keys that are currently down.
//
// Parameters:
//      None. 
//
//  Returns:
//      The bit mask of the keys pressed.
//
//------------------------------------------------------------------------------
DWORD KeypadRead(void)
{
    UINT16 data[2][KPP_COLUMN_INUSE];
    DWORD ix;
    UINT16 ic, ir, ik;
    DWORD dwBits = 0;

    // Enable KPP clock
    KeypadSetClock(TRUE);

    //--------------------------------------------------------------
    // Read keypad physical state
    //--------------------------------------------------------------
    
    // Write '1' to all columns
    INSREG16BF(&g_pKPP->KPDR, KPP_KPDR_KCD, KPP_COLUMN_MASK);

    // Configure column as totem-pole outputs
    INSREG16BF(&g_pKPP->KPCR, KPP_KPCR_KCO, ~KPP_COLUMN_MASK);

    // Configure columns as open drain
    INSREG16BF(&g_pKPP->KPCR, KPP_KPCR_KCO, KPP_COLUMN_MASK);

    // Read all rows, we have to get same result twice
    ix = 0;
    do
    {
        // Wait debounce time on second and later meassures
        if (ix > 0) msStall(20);
        
        // Read all keypad columns
        for (ic = 0; ic < KPP_COLUMN_INUSE; ic++)
        {
            // Set column bit to zero
            INSREG16BF(&g_pKPP->KPDR, KPP_KPDR_KCD, ~(1 << ic));
            
            // Wait for outputs to settle
            msStall(1);
            
            // Get row status
            data[ix&1][ic] = EXTREG16BF(&g_pKPP->KPDR, KPP_KPDR_KRD);
        }
        
        // Write '1' to all columns
        INSREG16BF(&g_pKPP->KPDR, KPP_KPDR_KCD, KPP_COLUMN_MASK);
    } while (ix++ < 1 || memcmp(data[0], data[1], sizeof(data[0]) != 0));

    //--------------------------------------------------------------
    // Convert physical state to virtual keys state
    //--------------------------------------------------------------
    for (ic = 0, ik = 0; ic < KPP_COLUMN_INUSE; ic++)
    {
        // Find pressed virtual keys
        if ((data[0][ic] & KPP_ROW_MASK) == KPP_ROW_MASK)
        {
            ik += KPP_ROW_INUSE;
        }
        else for (ir = 0; ir < KPP_ROW_INUSE; ir++, ik++)
        {
            if ((data[0][ic] & (1 << ir)) == 0)
            {
                DWORD dwVk = keypadVK[ik];
                DWORD dwBit = FindBit(dwVk, sc_rgVkToBit, dimof(sc_rgVkToBit));
                dwBits |= dwBit;
                if (dwBit == 0)
                    KITLOutputDebugString("KeypadRead: No bit mask for key 0x%x\r\n", dwVk);
            }
        }
    }

    // Disable KPP clock
    KeypadSetClock(FALSE);

    return dwBits;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本久久电影网| 免费成人在线播放| 成人av免费在线观看| 国产欧美日韩麻豆91| 国产精品99久久久| 国产精品日日摸夜夜摸av| av电影在线观看完整版一区二区| 亚洲桃色在线一区| 欧美视频在线一区二区三区 | 日韩一区二区三区在线视频| 久久精品国产秦先生| 久久久久国色av免费看影院| 成人免费视频国产在线观看| 一区二区视频在线| 欧美一区中文字幕| 国产在线播放一区| 亚洲少妇最新在线视频| 欧美日本在线一区| 国产二区国产一区在线观看 | 亚洲欧美激情视频在线观看一区二区三区| 99麻豆久久久国产精品免费| 亚洲成人先锋电影| 欧美精品一区二区三区视频 | 不卡高清视频专区| 亚洲国产裸拍裸体视频在线观看乱了| 欧美日韩国产成人在线免费| 久久国产尿小便嘘嘘| 1000精品久久久久久久久| 欧美日韩中文字幕一区二区| 精品一区二区三区免费| 中文字幕在线观看不卡| 欧美精品免费视频| jlzzjlzz亚洲女人18| 男女男精品视频网| 国产精品二三区| 日韩午夜精品视频| 一本一本大道香蕉久在线精品| 美日韩黄色大片| 亚洲最大色网站| 国产清纯白嫩初高生在线观看91 | 免费观看在线综合| 亚洲婷婷综合色高清在线| 91精品国产综合久久久久久久久久| 国产美女一区二区三区| 日日摸夜夜添夜夜添国产精品 | 色94色欧美sute亚洲线路一久| 久久不见久久见免费视频1| 亚洲男人的天堂网| 国产午夜精品久久久久久免费视 | 国产精品欧美一区二区三区| 日韩亚洲欧美一区二区三区| 久久综合九色综合欧美就去吻| 99久久伊人精品| 国产在线精品不卡| 免费在线欧美视频| 一区二区三区日韩| 亚洲欧洲成人自拍| 欧美韩日一区二区三区四区| 精品久久人人做人人爱| 欧美精品一卡两卡| 一本久久精品一区二区| 99re这里只有精品首页| 国产激情一区二区三区| 久久精品国产精品亚洲精品| 亚洲h动漫在线| 亚洲永久精品大片| 亚洲精品视频免费看| 欧美国产成人精品| 国产亚洲欧美一区在线观看| 精品国产一区二区三区久久久蜜月| 在线播放欧美女士性生活| 欧美性一二三区| 欧美色综合天天久久综合精品| 一本到三区不卡视频| 99精品国产99久久久久久白柏| 国产69精品一区二区亚洲孕妇| 国产精一品亚洲二区在线视频| 韩国一区二区三区| 国产精品99久久久久久有的能看| 国产一区二区视频在线| 国内精品伊人久久久久影院对白| 久久精品理论片| 国产综合成人久久大片91| 另类小说欧美激情| 狠狠v欧美v日韩v亚洲ⅴ| 国产乱码精品一区二区三区av| 国产乱子伦一区二区三区国色天香| 国产在线精品视频| 波多野结衣精品在线| 91丨九色丨黑人外教| 91极品视觉盛宴| 欧美日韩精品一区二区三区四区 | 91日韩精品一区| 色久优优欧美色久优优| 欧美人与禽zozo性伦| 国产精品三级电影| 最近中文字幕一区二区三区| 亚洲精品视频在线看| 亚洲国产精品人人做人人爽| 日韩国产成人精品| 国产一区高清在线| 一本色道久久综合亚洲91 | 亚洲视频图片小说| 亚洲自拍偷拍麻豆| 免费成人av在线| 国产电影一区二区三区| 色婷婷香蕉在线一区二区| 3atv在线一区二区三区| 久久久久久久久久看片| 亚洲欧洲日产国码二区| 天天色 色综合| 国产精品 欧美精品| 91在线视频播放| 欧美一区二区三区播放老司机| 久久久久青草大香线综合精品| 亚洲欧美偷拍三级| 青青草精品视频| 99精品欧美一区二区三区小说 | 精品国偷自产国产一区| 国产精品久久夜| 日韩av网站免费在线| 粉嫩高潮美女一区二区三区 | 日韩免费在线观看| 1000部国产精品成人观看| 日本不卡在线视频| 99视频在线精品| 欧美电视剧免费全集观看| 亚洲欧美精品午睡沙发| 狠狠网亚洲精品| 欧美色图激情小说| 中文字幕免费不卡在线| 免费高清在线视频一区·| 91麻豆产精品久久久久久| 久久无码av三级| 丝袜亚洲另类丝袜在线| www.在线欧美| 2021久久国产精品不只是精品| 亚洲一区在线播放| 高清成人免费视频| 精品国产一区二区三区四区四| 亚洲免费三区一区二区| 国产激情一区二区三区桃花岛亚洲| 欧美丰满一区二区免费视频| 中文字幕人成不卡一区| 国产曰批免费观看久久久| 欧美一级夜夜爽| 亚洲一区二区3| 成人av电影免费在线播放| 精品国精品国产尤物美女| 日韩高清一区在线| 欧美日韩精品系列| 1024成人网色www| 成人免费视频视频在线观看免费| 久久免费午夜影院| 九九国产精品视频| 日韩丝袜美女视频| 肉肉av福利一精品导航| 欧美无砖砖区免费| 亚洲一区二区视频在线观看| 99视频有精品| 亚洲美女偷拍久久| 91在线国内视频| 亚洲品质自拍视频| 99久久精品99国产精品| 亚洲欧洲精品一区二区三区不卡| 国产一区二区福利| 久久久久久久综合日本| 国产在线精品免费av| 国产亚洲欧美激情| 国产成人免费在线观看| 国产喷白浆一区二区三区| 国产黄色精品视频| 亚洲国产高清aⅴ视频| voyeur盗摄精品| 中文字幕在线不卡国产视频| www.66久久| 亚洲一区二区三区免费视频| 欧日韩精品视频| 亚洲成人777| 日韩天堂在线观看| 国产成人亚洲精品青草天美| 欧美韩日一区二区三区| www.欧美色图| 午夜精品久久久久久久久| 制服丝袜亚洲播放| 黄色资源网久久资源365| 中文字幕av一区二区三区| 97aⅴ精品视频一二三区| 亚洲午夜免费电影| 欧美一区二区精品在线| 国产精品中文字幕日韩精品| 国产精品传媒入口麻豆| 欧美视频中文一区二区三区在线观看| 青青草伊人久久| 中文av字幕一区| 欧美狂野另类xxxxoooo| 国内成+人亚洲+欧美+综合在线 | 亚洲精品一二三| 日韩一区二区在线播放| 不卡电影一区二区三区|