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

📄 bak_hw.cpp

📁 backlite driver for wince4.2
💻 CPP
字号:
//
// 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.
//
/*

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

*/

#include <windows.h>
#include <nkintr.h>
#include <nkintr.h>
#include "oalintr.h"
#include "drv_glob.h"
#include "bak_hw.h"

volatile IOPreg *g_s2440IOP;
volatile PWMreg *g_s2440PWM;

DWORD  g_TouchInterrupt;
HANDLE g_hTouchInterrupt;
HANDLE g_hTouchInterruptThread;
UINT g_Timer=0xFFFFFFFF;
UINT g_MilliSecond=0xFFFFFFFF;

//Reset LCD
VOID 
ResetLcd()
{
    
	g_s2440IOP = (IOPreg *)IOP_BASE;
    g_s2440PWM = (PWMreg *)PWM_BASE;     

    //Config GPD9,lcd reset
    g_s2440IOP->rGPDCON &= ~(3<<18);
    g_s2440IOP->rGPDCON |=  (1<<18);
    g_s2440IOP->rGPDDAT &=  (0<<9);
    Sleep(100);
    g_s2440IOP->rGPDDAT |=  (1<<9);

	//Config GPC6,light lcd backlight
    g_s2440IOP->rGPCCON &= ~(3<<12);
    g_s2440IOP->rGPCCON |=   1<<12;
    g_s2440IOP->rGPCDAT |=   1<<6;

    //Config GPC7
    g_s2440IOP->rGPCCON &= ~(3<<14);
    g_s2440IOP->rGPCCON |=   1<<14;
    g_s2440IOP->rGPCDAT |=   1<<7;

    //Config GPB1
    g_s2440IOP->rGPBCON &= ~(3<<2);
    g_s2440IOP->rGPBCON |=   1<<2;
    g_s2440IOP->rGPBDAT |=   1<<1;

    //Config GPB0
    g_s2440IOP->rGPBCON &= ~(3<<0);
    g_s2440IOP->rGPBCON |=  (1<<0);
    g_s2440IOP->rGPBDAT &= ~(1<<0);

    //Set logo
    memcpy((void *)FRAMEBUF_BASE, gImage_GPS_LOGO, ARRAY_SIZE_TFT_16BIT);
}    

//
// Perform all one-time initialization of the backlight
//
VOID 
BacklightInitialize()
{
    unsigned char HiRatio;
    
	RETAILMSG(DEBUGMODE, (TEXT("BacklightInitialize+++\r\n") ));
	
    HiRatio  = DEFAULT_BACKLITE;

    if ( (HiRatio<0) || (HiRatio>100) )
        RETAILMSG(DEBUGMODE, (TEXT("Invalide HiRatio value!\r\n") ));
    
	g_s2440IOP->rGPBCON = g_s2440IOP->rGPBCON & (~(3<<0)) | (2<<0) ;// set GPB0 as TOUT0
	g_s2440PWM->rTCON   = g_s2440PWM->rTCON & (~(0xf<<0)) ;		// clear manual update bit, stop Timer1

	g_s2440PWM->rTCFG0 	&= 0xffffff00;					// set Timer 0&1 prescaler 0
	g_s2440PWM->rTCFG0 |= (PRESCALER);

	g_s2440PWM->rTCFG1 	&= 0xfffffff0;					// set Timer0 MUX 1/2
	g_s2440PWM->rTCFG1  |= 0x00000000;					// set Timer0 MUX 1/2

	g_s2440PWM->rTCNTB0  = ( 96000000 )/( FREQ_PWM1 *16 );		        //if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
	g_s2440PWM->rTCMPB0  = ( g_s2440PWM->rTCNTB0*(HiRatio))/100 ;	//if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high

	g_s2440PWM->rTCON = g_s2440PWM->rTCON & (~(0xf<<0)) | (0x0e<<0) ;  //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
	
	g_s2440PWM->rTCON = g_s2440PWM->rTCON & (~(0xf<<0)) | (0x0d<<0) ;	//开启背光控制

    RETAILMSG(DEBUGMODE, (TEXT("BacklightInitialize---\r\n") ));    

    return;
}


VOID SetBacklitePWM( unsigned char HiRatio)
{   	
    if ( (HiRatio<0) || (HiRatio>99) )
    {
        RETAILMSG(DEBUGMODE, (TEXT("Invalide HiRatio value!\r\n") ));
        return;
    }
	
	g_s2440PWM->rTCMPB0  = ( g_s2440PWM->rTCNTB0*(HiRatio))/100 ;	//if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high   
}

VOID SetBacklitePWMOff()
{
    RETAILMSG(DEBUGMODE, (TEXT("SetBacklitePWMOff+++\r\n") ));
    g_s2440IOP->rGPBCON &= ~(3<<2);
    g_s2440IOP->rGPBCON |=   1<<2;    
    g_s2440IOP->rGPBDAT &= ~(1<<1);
    RETAILMSG(DEBUGMODE, (TEXT("SetBacklitePWMOff---\r\n") ));
}

VOID SetBacklitePWMOn()
{
    RETAILMSG(DEBUGMODE, (TEXT("SetBacklitePWMOn+++\r\n") ));
    g_s2440IOP->rGPBCON &= ~(3<<2);
    g_s2440IOP->rGPBCON |=   1<<2;    
    g_s2440IOP->rGPBDAT |=   1<<1;    
    RETAILMSG(DEBUGMODE, (TEXT("SetBacklitePWMOn---\r\n") ));
}

BOOL CreatTimerThread()
{
    RETAILMSG(DEBUGMODE, (TEXT("CreatTimerThread+++\r\n") ));

    g_TouchInterrupt = SYSINTR_TOUCH_CHANGED;

    g_hTouchInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!g_hTouchInterrupt)
    {
        RETAILMSG(DEBUGMODE,(TEXT("Unable to create backlite interrupt event\r\n")));
        return(FALSE);
    }
    
    if (! InterruptInitialize(g_TouchInterrupt, g_hTouchInterrupt, NULL, 0)) 
    {
        RETAILMSG(DEBUGMODE,(TEXT("Unable to initialize backlite SYSINTR_TOUCH interrupt\r\n")));
        return FALSE;
    }

    g_hTouchInterruptThread  = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
                                            0,
                                            (LPTHREAD_START_ROUTINE)TimerThread,
                                            NULL,
                                            0,
                                            NULL);
    if (!g_hTouchInterruptThread)
    {
        RETAILMSG(DEBUGMODE,(TEXT("Unable to create interrupt thread\r\n")));
        return FALSE;
    }

    CeSetThreadPriority(g_hTouchInterruptThread, 96);

    RETAILMSG(DEBUGMODE, (TEXT("CreatTimerThread---\r\n") ));

    return TRUE;
}

VOID TimerThread()
{
    RETAILMSG(DEBUGMODE, (TEXT("TimerThread+++\r\n") ));
    
    while (TRUE)
    {
        WaitForSingleObject(g_hTouchInterrupt, INFINITE);

        RETAILMSG(DEBUGMODE, (TEXT("g_Timer = 0x%x,g_MilliSecond = 0x%x.\r\n"),g_Timer, g_MilliSecond ));

        //Kill timer here
        if ( (FIRST_INIT_TIMER == g_MilliSecond) && (INVALIDE_TIMER == g_Timer))  //no timer and first time,do nothing
        {
            //do nothing
        }
        else if (NULL  == g_Timer)  //awake timer
        {
            SetBacklitePWMOn();
            if (FIRST_INIT_TIMER != g_MilliSecond)
            {
                BackliteSetTimer(g_MilliSecond);
            }           
        }
        else    //already set timer,but no trigger
        {
            BackliteKillTimer();
            BackliteSetTimer(g_MilliSecond);
        }

        InterruptDone(g_TouchInterrupt);
    }

    RETAILMSG(DEBUGMODE, (TEXT("TimerThread---\r\n") ));
}

VOID CALLBACK TimerProc( 
HWND hwnd,    // handle to window for timer messages 
UINT message, // WM_TIMER message 
UINT idTimer, // timer identifier 
DWORD dwTime) // current system time 
{
    RETAILMSG(DEBUGMODE, (TEXT("TimerProc+++\r\n") ));
    SetBacklitePWMOff();
    //BackliteKillTimer();
    RETAILMSG(DEBUGMODE, (TEXT("TimerProc---\r\n") ));
}

BOOL BackliteKillTimer()
{
    RETAILMSG(DEBUGMODE, (TEXT("TimerProc+++\r\n") ));

    KillTimer(NULL, g_Timer);
    g_Timer = NULL;
    
    RETAILMSG(DEBUGMODE, (TEXT("TimerProc---\r\n") ));

    return TRUE;
}

BOOL BackliteSetTimer(UINT unMilliSecond)
{
    RETAILMSG(DEBUGMODE, (TEXT("CreateTimer+++\r\n") ));
    g_Timer = SetTimer(NULL, 1, unMilliSecond, (TIMERPROC) TimerProc);
    if (NULL == g_Timer)
    {
        RETAILMSG(DEBUGMODE, (TEXT("Fail to create timer!") ));
        return FALSE;
    }
    
    RETAILMSG(DEBUGMODE, (TEXT("CreateTimer---\r\n") ));
    return TRUE;
}

⌨️ 快捷键说明

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