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

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

?? bsptouch.cpp

?? IMX31開發(fā)板觸摸屏驅(qū)動程序
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//------------------------------------------------------------------------------
//
//  Copyright (C) 2004-2005, Motorola Inc. All Rights Reserved
//
//------------------------------------------------------------------------------
//
//  Copyright (C) 2004-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:  bsptouch.cpp
//
//  Provides the implementation for BSP-specific touch support.
//
//------------------------------------------------------------------------------
#include <windows.h>
#include <tchddsi.h>
#include "bsp.h"
#include "pmic_ioctl.h"
#include "pmic_lla.h"
#include "pmic_adc.h"

#include "regs.h"
#include "regs_adc.h"

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

//-----------------------------------------------------------------------------
// External Variables
extern "C" const int MIN_CAL_COUNT = 20;

//-----------------------------------------------------------------------------
// Defines

// Maximum allowed variance in the X coordinate samples.
#define DELTA_X_COORD_VARIANCE          24

// Maximum allowed variance in the X coordinate samples.
#define DELTA_Y_COORD_VARIANCE          24


#define TOUCHCLKSRC_FREQ            BSP_CLK_CKIL_FREQ       // clock source is CKIL
#define TOUCHCLKSRC_VAL             EPIT_CR_CLKSRC_CKIL
#define TOUCHPRESCALAR_VAL          0x000               // divide by 1
#define TOUCH_EPIT_TICKS_PER_MSEC   ((TOUCHCLKSRC_FREQ/(TOUCHPRESCALAR_VAL+1))/1000)

#define ABS(x)  ((x) >= 0 ? (x) : (-(x)))

//-----------------------------------------------------------------------------
// Types


//-----------------------------------------------------------------------------
// Global Variables
extern "C" UINT32 gTouchTimerIrq = IRQ_EPIT2;

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

static HANDLE hPMI;
static TCHAR *gEventNamePri = TEXT("EVENT_TS_PRI");
static TCHAR *gEventNameAlt = TEXT("EVENT_TS_ALT");
// Named event for interrupt registration
static TCHAR *gTouchEventName;


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

//-----------------------------------------------------------------------------
//
// Function: PmicTouchDeinit
//
// This function uninitializes the PMIC touch controller.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
static void PmicTouchDeinit(void)
{

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));

    // Deregister for PMIC pen down interrupts.
    if (PmicInterruptDeregister(PMIC_MC13783_INT_TSI) != PMIC_SUCCESS)
    {
        ERRORMSG(TRUE, (_T("PmicTouchDeinit:  PmicInterruptDeregister failed\r\n")));
    }

    // Disable PMIC touch interrupt
    // Set to inactive mode
    if (PmicADCTouchStandby(false) != PMIC_SUCCESS)
    {
        ERRORMSG(TRUE, (_T("PmicTouchDeinit:  PmicTouchStandby failed\r\n")));
    }

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));
}


//------------------------------------------------------------------------------
//
// Function: PmicTouchInit
//
// This function initializes the PMIC touch controller.
//
// Parameters:
//      None.
//
// Returns:
//      Status.
//
//------------------------------------------------------------------------------
static PMIC_STATUS PmicTouchInit(void)
{
    PMIC_STATUS rc = PMIC_ERROR;

    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));

    // Register for PMIC pen down interrupts.  Event name must match one given
    // to event created in MDD for IST signaling.
    if (PmicInterruptRegister(PMIC_MC13783_INT_TSI, gTouchEventName)
        != PMIC_SUCCESS)
    {
        ERRORMSG(TRUE, (_T("PmicTouchInit:  PmicInterruptRegister failed\r\n")));
        goto cleanUp;
    }

    // Put PMIC touch ADC into standby (required for pen down interrupt)
    if (PmicADCTouchStandby(true) != PMIC_SUCCESS)
    {
        ERRORMSG(TRUE, (_T("PmicTouchInit:  PmicTouchStandby failed\r\n")));
        goto cleanUp;
    }

    // Make sure pen down interrupt are unmasked
    if (PmicInterruptHandlingComplete(PMIC_MC13783_INT_TSI) != PMIC_SUCCESS)
    {
        ERRORMSG(TRUE, (_T("PmicTouchInit:  PmicInterruptHandlingComplete failed\r\n")));
        goto cleanUp;
    }

    rc = PMIC_SUCCESS;

cleanUp:
    if (rc != PMIC_SUCCESS) PmicTouchDeinit();

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));

    return rc;
}

//-----------------------------------------------------------------------------
//
// Function: BSPTouchSetSampleRate
//
// This function configures the rate for acquiring touch samples by
// configuring the periodic interval of the EPIT2 timer.
//
// Parameters:
//      dwIntervalMsec
//          [in] Specifies the interval in msec to be used for generating
//          a periodic timer interrupt.  This interval sets the sample
//          rate of the touch driver.
//
// Returns:
//      None
//
//-----------------------------------------------------------------------------
void BSPTouchSetSampleRate(DWORD dwIntervalMsec)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));
    
    // Enable EPIT2 clocks
    DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, 
        DDK_CLOCK_GATE_MODE_ENABLED_ALL);

    // Configure load register with the number of EPIT ticks required
    // to achieve the specified touch timer tick interval
    OUTREG32(&g_pEPIT->LR, dwIntervalMsec*TOUCH_EPIT_TICKS_PER_MSEC);

    // Configure the compare register to generate interrupt when
    // timer reloads from EPITLR
    // OUTREG32(&g_pEPIT->CMPR, dwIntervalMsec*TOUCH_EPIT_TICKS_PER_MSEC);
    
    // Disable EPIT2 clocks
    DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, 
        DDK_CLOCK_GATE_MODE_DISABLED);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));
}


//-----------------------------------------------------------------------------
//
// Function: BSPTouchTimerInit
//
// This function initializes the EPIT2 timer for use as the touch
// periodic timer.
//
// Parameters:
//      dwIntervalMsec
//          [in] Specifies the interval in msec to be used for generating
//          a periodic timer interrupt.  This interval sets the sample
//          rate of the touch driver.
//
// Returns:
//      TRUE if successful, otherwise FALSE.
//
//-----------------------------------------------------------------------------
static BOOL BSPTouchTimerInit(DWORD dwIntervalMsec)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));

    // Enable EPIT2 clocks
    DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, 
        DDK_CLOCK_GATE_MODE_ENABLED_ALL);

    // 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));

    // Clear timer compare interrupt flag (write-1-clear)
    OUTREG32(&g_pEPIT->SR, CSP_BITFMASK(EPIT_SR_OCIF));

    // Enable timer for "set-and-forget" mode where timer is
    // loaded with EPITLR when count down to zero is reached
    OUTREG32(&g_pEPIT->CR,
        CSP_BITFVAL(EPIT_CR_EN, EPIT_CR_EN_DISABLE) |
        CSP_BITFVAL(EPIT_CR_ENMOD, EPIT_CR_ENMOD_LOAD) |
        CSP_BITFVAL(EPIT_CR_OCIEN, EPIT_CR_OCIEN_ENABLE) |
        CSP_BITFVAL(EPIT_CR_RLD, EPIT_CR_RLD_RELOAD) |
        CSP_BITFVAL(EPIT_CR_PRESCALAR, TOUCHPRESCALAR_VAL) |
        CSP_BITFVAL(EPIT_CR_SWR, EPIT_CR_SWR_NORESET) |
        CSP_BITFVAL(EPIT_CR_IOVW, EPIT_CR_IOVW_OVR) |
        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, TOUCHCLKSRC_VAL));

    // Configure the sample rate
    BSPTouchSetSampleRate(dwIntervalMsec);

    // Disable EPIT2 clocks
    DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, 
        DDK_CLOCK_GATE_MODE_DISABLED);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));

    return TRUE;
}


//-----------------------------------------------------------------------------
//
// Function: BSPTouchTimerClrIntr
//
// This function clears EPIT2 compare interrupt flag( w1c )
// 
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void BSPTouchTimerClrIntr(void)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));

    // Enable EPIT2 clocks
    DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, 
        DDK_CLOCK_GATE_MODE_ENABLED_ALL);
    
    // Clear timer compare interrupt flag (write-1-clear)
    OUTREG32(&g_pEPIT->SR, CSP_BITFMASK(EPIT_SR_OCIF));

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));

    return;
}


//-----------------------------------------------------------------------------
//
// Function: BSPTouchTimerEnable
//
// This function activates the touch timer for the specified
// periodic timer interrupt.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void BSPTouchTimerEnable(void)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));

    // Enable EPIT2 clocks
    DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, 
        DDK_CLOCK_GATE_MODE_ENABLED_ALL);
    
    // Clear timer compare interrupt flag (write-1-clear)
    OUTREG32(&g_pEPIT->SR, CSP_BITFMASK(EPIT_SR_OCIF));

    // Enable the timer
    INSREG32(&g_pEPIT->CR, CSP_BITFMASK(EPIT_CR_EN),
        CSP_BITFVAL(EPIT_CR_EN, EPIT_CR_EN_ENABLE));

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));

    return;
}


//-----------------------------------------------------------------------------
//
// Function: BSPTouchTimerDisable
//
// DESCRIPTION:
//      This function disables the touch timer and clears any pending
//      timer interrupt.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
void BSPTouchTimerDisable(void)
{
    DDK_CLOCK_GATE_MODE cgMode;
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));

    // If the touch timer is enabled
    if (DDKClockGetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, &cgMode) && 
        (cgMode != DDK_CLOCK_GATE_MODE_DISABLED))
    {
        // Disable the timer
        CLRREG32(&g_pEPIT->CR, CSP_BITFMASK(EPIT_CR_EN));

        // Clear timer compare interrupt flag (write-1-clear)
        OUTREG32(&g_pEPIT->SR, CSP_BITFMASK(EPIT_SR_OCIF));

        DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));

        // Disable EPIT2 clocks
        DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_EPIT2, 
            DDK_CLOCK_GATE_MODE_DISABLED);
    }
    
    return;
}


//-----------------------------------------------------------------------------
//
// Function: BSPTouchTimerIrqQuery
//
// DESCRIPTION:
//      This function queries the touch timer interrupt status.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//-----------------------------------------------------------------------------
BOOL BSPTouchTimerIrqQuery(void)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));

     // Return timer compare interrupt flag
    return INREG32(&g_pEPIT->SR);

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));
}


//-----------------------------------------------------------------------------
//
// Function: BSPTouchDealloc
//
// This function frees the resources allocated by the touch driver.
//
// Parameters:
//      None.
//
// RETURNS:
//      None.
//
//-----------------------------------------------------------------------------
static void BSPTouchDealloc(void)
{
    DEBUGMSG(ZONE_FUNCTION, (TEXT("+%s()\r\n"), __WFUNCTION__));

    // If touch timer was allocated
    if (g_pEPIT != NULL)
    {
        // Free virtual space allocated for peripheral registers
        MmUnmapIoSpace(g_pEPIT, sizeof(CSP_EPIT_REG));
        g_pEPIT = NULL;
    }

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-%s()\r\n"), __WFUNCTION__));
    return;
}


///-----------------------------------------------------------------------------
//
// Function: BSPTouchAlloc
//
// This function allocates the resources needed by the touch driver.
//
// Parameters:
//      None.
//

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
播五月开心婷婷综合| 国产亚洲精品免费| 久久综合九色综合欧美就去吻| 国产精品嫩草久久久久| 日韩国产精品91| 波波电影院一区二区三区| 欧美一卡二卡三卡四卡| 亚洲免费大片在线观看| 国产黄色91视频| 欧美理论电影在线| 亚洲欧美激情插| 国产成人精品免费在线| 日韩午夜精品视频| 天天免费综合色| 色妞www精品视频| 精品国产一区久久| 日韩中文字幕一区二区三区| 日本伦理一区二区| 国产精品久久网站| 国产不卡在线视频| 2023国产精品自拍| 久久精品国产亚洲高清剧情介绍 | 欧美亚洲国产bt| 国产精品全国免费观看高清 | 色综合网站在线| 国产色产综合色产在线视频| 老司机免费视频一区二区 | 精品国产乱码久久久久久图片| 亚洲自拍偷拍网站| 色先锋资源久久综合| 中文字幕一区二区三区四区不卡| 国内偷窥港台综合视频在线播放| 精品区一区二区| 久久99国产精品尤物| 日韩一区二区影院| 久久国产精品区| 精品久久99ma| 精品在线观看视频| 日韩你懂的在线播放| 久久不见久久见免费视频7| 日韩免费在线观看| 国产精品456| 国产精品乱人伦一区二区| 国产传媒一区在线| 国产精品久久久久久久久快鸭| 国产白丝网站精品污在线入口 | 日韩精品一区国产麻豆| 免费欧美在线视频| 久久久久久一二三区| 成人性生交大片免费看视频在线| 国产精品看片你懂得| 在线观看亚洲专区| 日本不卡免费在线视频| 国产日韩欧美麻豆| 99久久99久久免费精品蜜臀| 亚洲国产精品久久久男人的天堂| 欧美高清精品3d| 国产成人亚洲综合色影视| 中文字幕一区在线观看视频| 91九色最新地址| 免费成人在线影院| 中文字幕精品一区二区三区精品| 色综合久久88色综合天天免费| 亚洲综合免费观看高清完整版在线 | 日韩免费高清电影| 国产精品一线二线三线精华| 国产精品超碰97尤物18| 欧美区一区二区三区| 国产一区二区三区国产| 曰韩精品一区二区| 久久久久国产精品麻豆ai换脸| 国产电影一区二区三区| 五月婷婷色综合| 国产欧美日韩另类视频免费观看| 欧美亚洲综合久久| 精品一区二区国语对白| 亚洲综合色自拍一区| 久久综合色综合88| 欧美日韩你懂的| 成人午夜私人影院| 免播放器亚洲一区| 亚洲欧美另类久久久精品| 精品国产伦一区二区三区观看体验| 波多野结衣精品在线| 久久爱www久久做| 亚洲444eee在线观看| 国产精品福利一区| 精品免费一区二区三区| 欧美日韩一级黄| 99免费精品视频| 国产一区二区三区最好精华液| 香蕉影视欧美成人| 亚洲日本va在线观看| 国产片一区二区三区| 欧美一区三区二区| 91福利资源站| 91色视频在线| 国产成人av网站| 国精产品一区一区三区mba桃花| 午夜精品123| 亚洲高清在线精品| 一区二区三区四区不卡视频| 国产欧美一区视频| 久久久天堂av| 欧美精品一区二区三区很污很色的| 在线亚洲免费视频| 一本久久精品一区二区| av不卡一区二区三区| 成人精品国产一区二区4080| 国产一区二区三区观看| 韩国av一区二区三区四区| 日韩成人免费电影| 三级亚洲高清视频| 青青草成人在线观看| 日本一不卡视频| 日本午夜一本久久久综合| 日韩电影在线看| 麻豆国产一区二区| 极品少妇一区二区| 国产精品影视在线观看| 国产精品18久久久久久久网站| 国产成人高清在线| 成人看片黄a免费看在线| 成人av在线资源| av亚洲产国偷v产偷v自拍| av成人免费在线| 在线观看日韩精品| 欧美一区二区三区视频| 制服丝袜日韩国产| 精品国产乱码久久久久久久| 欧美精品一区在线观看| 国产精品区一区二区三| 亚洲精品欧美专区| 五月综合激情婷婷六月色窝| 奇米精品一区二区三区四区| 国产在线一区二区| 成人激情午夜影院| 欧美精品丝袜中出| 26uuu亚洲综合色| 国产精品久久久久久久久快鸭| 亚洲影院在线观看| 久久成人精品无人区| 成人丝袜高跟foot| 欧美视频一区二区在线观看| 日韩一本二本av| 国产精品久久久久四虎| 亚洲123区在线观看| 久久成人综合网| 日本道色综合久久| 欧美一区二区免费观在线| 欧美激情一区二区三区四区| 一级特黄大欧美久久久| 久久成人免费网站| 色素色在线综合| 精品av综合导航| 18欧美乱大交hd1984| 蜜桃视频一区二区三区| 99热在这里有精品免费| 欧美一区二区日韩一区二区| √…a在线天堂一区| 免费在线看一区| 成人激情开心网| 欧美变态口味重另类| 1024成人网| 国产乱子伦一区二区三区国色天香| 色综合天天在线| 2023国产精品| 秋霞电影网一区二区| 成人午夜伦理影院| 精品日韩在线一区| 亚洲一线二线三线久久久| 国产成人午夜电影网| 日韩午夜三级在线| 亚洲国产日韩av| 成人av综合一区| 欧美精品一区二区高清在线观看| 亚洲精品国产a| 91一区一区三区| 国产调教视频一区| 另类调教123区 | www.欧美色图| 欧美精品一区二区久久久| 奇米精品一区二区三区在线观看一| 色综合天天天天做夜夜夜夜做| 久久综合av免费| 久久av中文字幕片| 7777精品伊人久久久大香线蕉最新版 | 欧美蜜桃一区二区三区| 亚洲日本一区二区| a亚洲天堂av| 中文字幕一区日韩精品欧美| 国产成人综合网站| 久久这里都是精品| 麻豆91免费观看| 日韩三级高清在线| 免费久久精品视频| 日韩免费观看2025年上映的电影| 午夜欧美在线一二页| 欧美三级中文字幕在线观看| 一区二区三区在线视频观看|