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

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

?? dvs.c

?? 6410BSP3
?? C
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//
// Copyright (c) Samsung Electronics. Co. LTD.  All rights reserved.
//
/*++
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.

Module Name:    dvs.c

Abstract:       Dynamic Voltage and Frequency Scaling Implementation

Functions:


Notes:


--*/

#include <bsp.h>

// Power Transition Table
#include <pmplatform.h>
#include "dvs.h"
#include "s3c6410_pm.h"

extern void System_EnableIRQ(void);
extern void System_DisableIRQ(void);
extern void ChangeDivider(UINT32);
extern void ChangeToL1(UINT32);
extern void ChangeToL0(UINT32);
static volatile DWORD g_dwCurrentIdleTime;
static SYSTEM_ACTIVE_LEVEL g_CurrentLevel = SYS_L0;
static volatile S3C6410_SYSCON_REG *g_pSysConReg = NULL;
static volatile unsigned int *g_pOTGLinkReg = NULL;
#ifdef DVS_EN
static BOOL g_bBSP_DVSEN=TRUE;
#else
static BOOL g_bBSP_DVSEN=FALSE;
#endif

static BOOL g_bDVSEN=FALSE;

// ProfileTable[Lv][0] = Idle Rate
// ProfileTable[Lv][1] = Active Rate
// ProfileTable[Lv][2] = Shift Down count
// ProfileTable[Lv][3] = Shift Up count
static DWORD g_aDVFSProfileTable[SYS_LEVEL_MAX][4];
static BOOL g_bProfileDVS = FALSE;
static DWORD g_dwLastTickCount_NonDVS = 0;    // for Profile Non-DVS Idle rate
static DWORD g_dwLastIdleCount_NonDVS = 0;    // for Profile Non-DVS Idle rate

#define Steady_LockTime        0xE16
#define Transit_LockTime    0x2
#define MPS_1332GHz    ((1<<31)|(333<<16)|(3<<8)|(0<<0))
#define MPS_667GHz    ((1<<31)|(333<<16)|(3<<8)|(1<<0))

static BOOL CheckUSBinUse(void);

void InitializeDVS(void)
{
    if(!g_bBSP_DVSEN)
    {
        return;
    }
    g_pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
    g_pOTGLinkReg = (unsigned int *)OALPAtoVA(S3C6410_BASE_REG_PA_USBOTG_LINK, FALSE);
    g_CurrentLevel = SYS_L0;    // Initial System Level

#ifdef    ENABLE_VOLTAGE_CONTROL
    PMIC_Init();

    // This is caused by SMDK board bug. You can erase this line if you use the other board.
//    PMIC_VoltageSet(SETVOLTAGE_BOTH, VoltageARM(g_CurrentLevel), 0);
#endif
}

void SetCurrentIdleTime(DWORD dwIdleTime)
{
    g_dwCurrentIdleTime = dwIdleTime;

}

static BOOL CheckUSBinUse(void)
{
    // Check USB Device in Use
    if (*g_pOTGLinkReg & (0x3<<18))
    {
        if (g_bDVSEN == TRUE)
        {
            g_bDVSEN = FALSE;     // Disable DVS
            if (g_CurrentLevel != SYS_L0)
            {
                ChangeDVSLevel(SYS_L0);
            }
            OALMSG(OAL_POWER && OAL_FUNC, (L"[DVS] DVS disabled by USB\r\n"));
        }
        return TRUE;    // Do not apply DVS, when USB is in Use
    }
    else
    {
        if (g_bDVSEN == FALSE)
        {
            // Enable DVS after USB operation finished
            g_bDVSEN = TRUE;
            OALMSG(OAL_POWER && OAL_FUNC, (L"[DVS] DVS enabled\r\n"));
        }
    }
    return FALSE;
}

void UpdateDVS(void)
{
    static IDLE_LOG tLastLogFine;   //< This value must be retained to next Update
    static IDLE_LOG tLastLogCoarse; //< This value must be retained to next Update

    IDLE_LOG tCurLog;
    DWORD dwCurrentMSec;
    DWORD dwCurrentIdleMSec;
    DWORD dwIdleTick, dwActiveTick; //< This variables is used for profile

    if(!g_bBSP_DVSEN)
    {
        return;
    }

    if(CheckUSBinUse())
    {
        return;
    }

    dwCurrentMSec = CurMSec;
    dwCurrentIdleMSec = g_dwCurrentIdleTime;

    if ( (dwCurrentMSec - tLastLogFine.dwTickCount) >=  DVS_UPDATE_PERIOD_FINE )
    {
        tCurLog.dwTickCount = dwCurrentMSec;
        tCurLog.dwIdleCount = g_dwCurrentIdleTime;
        tCurLog.dwIdleRate = (100*(dwCurrentIdleMSec-tLastLogFine.dwIdleCount))/(dwCurrentMSec-tLastLogFine.dwTickCount);

        dwIdleTick = dwCurrentIdleMSec-tLastLogFine.dwIdleCount;
        dwActiveTick = (dwCurrentMSec-tLastLogFine.dwTickCount)-dwIdleTick;

        tLastLogFine.dwTickCount = tCurLog.dwTickCount;
        tLastLogFine.dwIdleCount = tCurLog.dwIdleCount;
        tLastLogFine.dwIdleRate = tCurLog.dwIdleRate;

        if (tCurLog.dwIdleRate < ShiftUpRate)    // Pump Up the Clock
        {
            if (g_bProfileDVS)
            {
                g_aDVFSProfileTable[g_CurrentLevel][0] += dwIdleTick;        // Idle
                g_aDVFSProfileTable[g_CurrentLevel][1] += dwActiveTick;    // Active
                g_aDVFSProfileTable[g_CurrentLevel][3] ++ ; // Shift up
            }
            OALMSG(OAL_POWER && OAL_FUNC, ((L"U[%d:%d]\r\n"), g_CurrentLevel, tCurLog.dwIdleRate));
            ChangeDVSLevel(ShiftUpLevel);
        }
        else
        {
            if ( (dwCurrentMSec - tLastLogCoarse.dwTickCount) >=  DVS_UPDATE_PERIOD_COARSE )
            {
                tCurLog.dwIdleRate = (100*(dwCurrentIdleMSec-tLastLogCoarse.dwIdleCount))/(dwCurrentMSec-tLastLogCoarse.dwTickCount);
                if (g_bProfileDVS)
                {
                    dwIdleTick = dwCurrentIdleMSec-tLastLogCoarse.dwIdleCount;
                    dwActiveTick = (dwCurrentMSec-tLastLogCoarse.dwTickCount)-dwIdleTick;

                    g_aDVFSProfileTable[g_CurrentLevel][0] += dwIdleTick;        // Idle
                    g_aDVFSProfileTable[g_CurrentLevel][1] += dwActiveTick;    // Active
                    g_aDVFSProfileTable[g_CurrentLevel][2] ++; // Shift down
                }
                tLastLogCoarse.dwTickCount = tCurLog.dwTickCount;
                tLastLogCoarse.dwIdleCount = tCurLog.dwIdleCount;
                tLastLogCoarse.dwIdleRate = tCurLog.dwIdleRate;

                OALMSG(OAL_POWER && OAL_FUNC, ((L"D[%d:%d]\r\n"), g_CurrentLevel, tCurLog.dwIdleRate));

                if (tCurLog.dwIdleRate > ShiftDownRate)    // Pump Down the Clock
                {
                    ChangeDVSLevel(ShiftDownLevel);
                }

            }
        }
    }
}

void ChangeDVSLevel(SYSTEM_ACTIVE_LEVEL NewLevel)
{
    if(!g_bDVSEN)
    {
        return;
    }
    if (g_CurrentLevel == NewLevel)
    {
        // There is no need to change
        return;
    }
    else
    {
#ifdef    ENABLE_VOLTAGE_CONTROL
        if(g_CurrentLevel > NewLevel)    // Clock Speed of New Level is Slower, Voltage of New Level is Lower
        {
            PMIC_VoltageSet(SETVOLTAGE_ARM, VoltageARM(NewLevel), 100);
            PMIC_VoltageSet(SETVOLTAGE_INTERNAL, VoltageInternal(NewLevel), 100);
        }
#endif

        ChangeClockDivider(NewLevel);

#ifdef    ENABLE_VOLTAGE_CONTROL
        if(g_CurrentLevel < NewLevel)    // Clock Speed of New Level is Faster, Voltage of New Level is Higher
        {
            PMIC_VoltageSet(SETVOLTAGE_ARM, VoltageARM(NewLevel), 100);
            PMIC_VoltageSet(SETVOLTAGE_INTERNAL, VoltageInternal(NewLevel), 100);
        }
#endif
        OALMSG(OAL_POWER && OAL_FUNC, (L"[DVS] System Level Changed [%d -> %d]\r\n", g_CurrentLevel, NewLevel));

        // Update System Level Variable
        g_CurrentLevel = NewLevel;
    }
}

void ChangeClockDivider(SYSTEM_ACTIVE_LEVEL NewLevel)
{
    DWORD dwNewCLKDIV = 0;

    // Change System Clock Divider
    dwNewCLKDIV = (g_pSysConReg->CLK_DIV0 & ~((0xf<<28)|(0xf<<12)|(0x7<<9)|(0xf)))
                    | ((SysMFCLKDiv(NewLevel)-1)<<28)
                    | ((SysPCLKDiv(NewLevel)-1)<<12)
                    | ((SysHCLKx2Div(NewLevel)-1)<<9)
                    | (SysARMCLKDiv(NewLevel)-1);
    //OALMSG(OAL_POWER && OAL_FUNC, ((L"0x%x CV[%d,%d,%d,%d,%d] 0x%x\r\n"), g_pSysConReg, g_CurrentLevel, SysMFCLKDiv(NewLevel), SysPCLKDiv(NewLevel), SysHCLKx2Div(NewLevel), SysARMCLKDiv(NewLevel), dwNewCLKDIV));

    System_DisableIRQ();

    if ((NewLevel == SYS_L0) && (g_CurrentLevel != SYS_L0))         // L1~5 --> L0
    {
        #if ((TARGET_ARM_CLK == CLK_666MHz) && SYNCMODE)
        g_pSysConReg->APLL_LOCK = Transit_LockTime;
        ChangeToL0(dwNewCLKDIV);
        g_pSysConReg->APLL_LOCK = Steady_LockTime;

        #else
        ChangeDivider(dwNewCLKDIV);

        #endif
    }
    else if ((NewLevel != SYS_L0) && (g_CurrentLevel == SYS_L0))    // L0 --> L1~5
    {
        #if ((TARGET_ARM_CLK == CLK_666MHz) && SYNCMODE)
        g_pSysConReg->APLL_LOCK = Transit_LockTime;
        ChangeToL1(dwNewCLKDIV);
        g_pSysConReg->APLL_LOCK = Steady_LockTime;

        #else
        ChangeDivider(dwNewCLKDIV);

        #endif
    }
    else                                                            // L1~5 --> L1~5
    {
        ChangeDivider(dwNewCLKDIV);
    }

    System_EnableIRQ();

}


// for Profiling DVS transition and Measuring CPU idle and active rate
void ProfileDVSOnOff(BOOL bOnOff)
{
    int i;

    if(!g_bDVSEN)
    {
        return;
    }

    if (bOnOff)
    {
        for (i=0; i<SYS_LEVEL_MAX; i++)
        {
            g_aDVFSProfileTable[i][0] = 0;
            g_aDVFSProfileTable[i][1] = 0;
            g_aDVFSProfileTable[i][2] = 0;
            g_aDVFSProfileTable[i][3] = 0;
        }

        g_bProfileDVS = TRUE;

        // Profile Idle Rate in Non DVS Mode when USB cable is plugged
        if (*g_pOTGLinkReg & (0x3<<18))        // Check USB Device in Use
        {
            g_dwLastTickCount_NonDVS = CurMSec;
            g_dwLastIdleCount_NonDVS = g_dwCurrentIdleTime;

            OALMSG(TRUE, (L"[Non DVS] Profile Start...\r\n"));
        }
        else
        {
            OALMSG(TRUE, (L"[DVS] Profile Start...\r\n"));
        }
    }
    else
    {
        g_bProfileDVS = FALSE;

        // Profile Idle Rate in Non DVS Mode when USB cable is plugged
        if (*g_pOTGLinkReg & (0x3<<18))        // Check USB Device in Use
        {
            DWORD dwTick, dwIdle;

            dwTick = CurMSec - g_dwLastTickCount_NonDVS;
            dwIdle = g_dwCurrentIdleTime - g_dwLastIdleCount_NonDVS;
            g_dwLastTickCount_NonDVS = 0;
            g_dwLastIdleCount_NonDVS = 0;

            OALMSG(TRUE, (L"[Non DVS] Profile Stop...   Idle[%d ms] Active[%d ms]\r\n", dwIdle, dwTick-dwIdle));
        }
        else
        {
            OALMSG(TRUE, (L"[DVS] Profile Stop...\r\n"));
            OALMSG(TRUE, (L"Level(ARM,Internal)  Div(A,Hx2,P,MFC)  Idle/Active    Down/Up \r\n"));

            for (i=0; i<SYS_LEVEL_MAX; i++)
            {
                OALMSG(TRUE, ((L" %d  (%dmV,%dmV)   (%d,%d,%d,%d)    [%d ms]/[%d ms]   [%d]/[%d]\r\n"), i,
                           VoltageARM(i), VoltageInternal(i),
                           SysARMCLKDiv(i), SysHCLKx2Div(i), SysPCLKDiv(i), SysMFCLKDiv(i),
                           g_aDVFSProfileTable[i][0], g_aDVFSProfileTable[i][1],
                           g_aDVFSProfileTable[i][2], g_aDVFSProfileTable[i][3]));
            }
        }
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男女性色大片免费观看一区二区 | zzijzzij亚洲日本少妇熟睡| 亚洲成av人片在线观看| 亚洲黄色免费电影| 亚洲国产成人91porn| 五月婷婷综合在线| 日产精品久久久久久久性色| 日本aⅴ免费视频一区二区三区| 成人免费毛片a| 91污在线观看| 欧美性受极品xxxx喷水| 3d成人h动漫网站入口| 日韩精品一区二区三区在线观看| 久久综合九色综合欧美就去吻| 国产亚洲一区二区在线观看| 国产精品夫妻自拍| 污片在线观看一区二区| 色婷婷精品久久二区二区蜜臂av| 欧美日韩精品电影| 久久综合成人精品亚洲另类欧美 | 日韩高清一区二区| 欧美中文字幕不卡| 国产午夜亚洲精品理论片色戒| 丝袜a∨在线一区二区三区不卡| 国产精品一线二线三线精华| 在线观看91精品国产入口| 欧美激情一区二区三区不卡 | 久久一区二区三区国产精品| 青青青伊人色综合久久| 欧美狂野另类xxxxoooo| 国产午夜精品在线观看| 久久电影网电视剧免费观看| 91九色02白丝porn| 国产婷婷色一区二区三区| 紧缚捆绑精品一区二区| 欧美性欧美巨大黑白大战| 亚洲精品成a人| 欧洲精品中文字幕| 亚洲国产视频直播| 在线成人高清不卡| 美女一区二区视频| 精品视频色一区| 亚洲欧洲精品天堂一级| 日本不卡视频一二三区| 日韩欧美色综合网站| 精品在线一区二区三区| 久久久久久久久久电影| 日日夜夜免费精品| 日韩精品一区二区在线观看| 国产一区二区91| 日韩欧美在线影院| 午夜欧美电影在线观看| 欧美午夜影院一区| 蜜桃久久久久久| 亚洲国产成人午夜在线一区| av激情亚洲男人天堂| 亚洲成人综合在线| 精品理论电影在线| 理论电影国产精品| 国产精品天干天干在线综合| 国产一区二区调教| 日韩美女视频19| 99久久精品免费| 亚洲视频一区在线| 欧美丰满美乳xxx高潮www| 国内国产精品久久| 久久精品视频一区| 欧美午夜精品久久久久久孕妇| 日本sm残虐另类| 亚洲色图视频网站| 欧美电视剧免费观看| 99国产精品久久久久久久久久久| 日韩精品成人一区二区三区| 欧美激情一二三区| 日韩一区国产二区欧美三区| 成人免费观看男女羞羞视频| 视频一区二区国产| 国产精品亲子伦对白| 91精品国产手机| 国产一区二区中文字幕| 亚洲精品高清在线| 国产网站一区二区三区| 欧美日韩不卡在线| 成人福利视频在线| 亚洲免费毛片网站| 欧美日韩mp4| youjizz久久| 精品一二三四区| 亚洲成人av一区二区三区| 国产精品久久综合| 久久综合视频网| 678五月天丁香亚洲综合网| www.欧美.com| 国产精品69久久久久水密桃| 日韩福利视频导航| 性做久久久久久久免费看| 国产精品久久看| 国产日韩综合av| 91小视频免费看| 国产福利一区在线| 亚洲线精品一区二区三区| 26uuu久久天堂性欧美| 欧美日韩成人综合| 欧美性淫爽ww久久久久无| 99精品视频在线免费观看| 国产河南妇女毛片精品久久久| 天天综合网天天综合色| 蜜臀精品一区二区三区在线观看| 亚洲午夜久久久久久久久电影网| 最新日韩在线视频| 国产精品久久99| 欧美国产视频在线| 国产午夜亚洲精品不卡| 国产欧美一区二区三区沐欲 | 色综合中文字幕国产| 综合分类小说区另类春色亚洲小说欧美| 日韩精品一区二区三区视频播放 | 亚洲国产精品久久久久婷婷884 | 亚洲成年人影院| 一区二区三区四区激情| 26uuu欧美日本| 久久久亚洲欧洲日产国码αv| 久久综合国产精品| 国产日韩精品一区二区浪潮av| 国产欧美日韩精品一区| 国产精品无圣光一区二区| 亚洲欧洲三级电影| 亚洲一区二区中文在线| 国产精品日产欧美久久久久| 日本一区二区久久| 亚洲欧美色一区| 亚洲国产三级在线| 免费成人av资源网| 国产精品亚洲午夜一区二区三区 | 国产亚洲一区二区在线观看| 国产亚洲欧美中文| 中文字幕亚洲欧美在线不卡| 一区二区三区国产| 日韩激情一区二区| 国产一区二区精品久久| 91网站在线播放| 欧美人xxxx| 久久综合色播五月| 综合在线观看色| 三级成人在线视频| 国产不卡在线视频| 精彩视频一区二区| 97se亚洲国产综合自在线| 欧美性大战久久久| 2020国产精品自拍| 亚洲精品视频自拍| 久久国产精品72免费观看| eeuss鲁片一区二区三区| 欧美日韩国产中文| 久久免费视频一区| 亚洲图片欧美综合| 国产麻豆日韩欧美久久| 91黄视频在线| 久久综合久久综合久久综合| 亚洲综合色噜噜狠狠| 国产伦精品一区二区三区免费| 色诱亚洲精品久久久久久| 日韩色在线观看| 一区二区三区自拍| 粉嫩绯色av一区二区在线观看 | 大胆亚洲人体视频| 5858s免费视频成人| 国产精品美日韩| 免费成人结看片| 欧美日韩在线观看一区二区| 亚洲国产精品ⅴa在线观看| 五月综合激情婷婷六月色窝| av不卡免费在线观看| 日韩欧美精品在线视频| 亚洲国产中文字幕| 丁香五精品蜜臀久久久久99网站| 91精品国产aⅴ一区二区| 综合久久久久综合| 成人一道本在线| 精品国产免费一区二区三区香蕉| 国产清纯白嫩初高生在线观看91| 日本中文字幕一区| 欧美综合在线视频| 亚洲欧洲99久久| 成人中文字幕合集| 久久久精品天堂| 国产一级精品在线| 精品国产一区二区三区四区四| 日韩精品五月天| 欧美日韩高清在线| 性欧美疯狂xxxxbbbb| 在线观看日韩精品| 亚洲国产日韩一区二区| 91久久精品一区二区三| 国产精品免费视频观看| 国产成人一区二区精品非洲| 精品国产成人在线影院| 九色porny丨国产精品| 欧美一二三区在线| 久久爱另类一区二区小说|