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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pmic.c

?? Microsoft WinCE 6.0 BSP FINAL release source code for use with the i.MX27ADS TO2 WCE600_FINAL_MX27_S
?? C
字號:
//
// Copyright (C) 2004-2007, 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: pmic.c
//
// This file contains the OAL support code for the PMIC interface.
//
//------------------------------------------------------------------------------
#include <bsp.h>
#include "regs.h"
#include "regs_regulator.h"

//------------------------------------------------------------------------------
// External Functions
extern VOID OALClockSetGatingMode(DDK_CLOCK_GATE_INDEX index, 
    DDK_CLOCK_GATE_MODE mode);
    
//------------------------------------------------------------------------------
// External Variables
extern BOOL g_oalPostInit;
extern CRITICAL_SECTION g_oalPmicMutex;
extern PBSP_ARGS g_pBSPARGS;        // From debug.c

//------------------------------------------------------------------------------
// Defines
#define PMIC_SPI_DATA_LSH       0
#define PMIC_SPI_NULL_LSH       24
#define PMIC_SPI_ADDR_LSH       25
#define PMIC_SPI_RW_LSH         31

#define PMIC_SPI_DATA_WID       24
#define PMIC_SPI_NULL_WID       1
#define PMIC_SPI_ADDR_WID       6
#define PMIC_SPI_RW_WID         1

#define PMIC_SPI_RW_READ        0
#define PMIC_SPI_RW_WRITE       1

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

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

//------------------------------------------------------------------------------
// Local Variables
static PCSP_CSPI_REGS g_pCSPI;
static UINT32 g_INTREG;
static DDK_CLOCK_GATE_INDEX g_CGI;

//------------------------------------------------------------------------------
// Functions

//------------------------------------------------------------------------------
//
// Function: OALPmicLock
//
// Obtains a lock for the CSPI hardware so that the OAL and PMIC core driver
// can safely share access.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
static void OALPmicLock(void)
{
    // There is no need to acquire a critical section before accessing the
    // CSPI bus if the OAL is still in the initialization stage since we
    // are guaranteed that no other PMIC device drivers will be running yet.
    if (g_oalPostInit) {
        // Must ensure exclusive access to the CSPI bus for the OAL until
        // the current CSPI transaction is completed.
        EnterCriticalSection(&g_oalPmicMutex);
    }

    OALClockSetGatingMode(g_CGI, DDK_CLOCK_GATE_MODE_ENABLE);
    
    INSREG32BF(&g_pCSPI->CONTROLREG, 
        CSPI_CONTROLREG_SPIEN, CSPI_CONTROLREG_SPIEN_ENABLE);

    // Store the current INT register configuration and turn
    // off all interrupts
    g_INTREG = INREG32(&g_pCSPI->INT);
    OUTREG32(&g_pCSPI->INT, 0);
}

//------------------------------------------------------------------------------
//
// Function: OALPmicUnlock
//
// Release the lock previously obtained by OALPmicLock.
//
// Parameters:
//      None.
//
// Returns:
//      None.
//
//------------------------------------------------------------------------------
static void OALPmicUnlock(void)
{    
    // Restore INTREG configuration
    OUTREG32(&g_pCSPI->INT, g_INTREG);

    INSREG32BF(&g_pCSPI->CONTROLREG, 
        CSPI_CONTROLREG_SPIEN, CSPI_CONTROLREG_SPIEN_DISABLE);
    
    OALClockSetGatingMode(g_CGI, DDK_CLOCK_GATE_MODE_DISABLE);

    if (g_oalPostInit) {
        // The current CSPI transaction has been completed. Other PMIC
        // device drivers or the OAL may now access the CSPI bus.
        LeaveCriticalSection(&g_oalPmicMutex);
    }
}

//------------------------------------------------------------------------------
//
// Function: OALPmicCalcDiv
//
// Calculates the CSPI data rate divider needed to obtain the specified
// data transfer frequency.
//
// Parameters:
//      freq
//          [in] Target CSPI bit clock frequency.
//
// Returns:
//      Calculated divider for the CSPI DATARATE bits.
//
//------------------------------------------------------------------------------
static UINT32 OALPmicCalcDiv(UINT32 freq)
{    
    UINT32 n, div, cspiClk;

    // CSPI uses PERCLK2 as clock input
    cspiClk = g_pBSPARGS->clockFreq[DDK_CLOCK_SIGNAL_PERDIV2];

    for (n = CSPI_CONTROLREG_DATARATE_DIV4; 
        n < CSPI_CONTROLREG_DATARATE_DIV512; n++) {
        if (n % 2)
            div = 3 * (2 << (((n-1)/2 - 1)));   // odd
        else
            div = 2 * (2 << ((n/2) - 1));       // even
        
        if ((cspiClk / div) <= freq) break;
    }

    return div;
}

//------------------------------------------------------------------------------
//
// Function: OALPmicExchange
//
// Performs a data exchange with the PMIC.
//
// Parameters:
//      packet
//          [in] Read/Write packet sent to the PMIC
//
//      data
//          [in] data read from the exchange
//
// Returns:
//      Returns TRUE if successful, otherwise returns FALSE.
//
//------------------------------------------------------------------------------
static BOOL OALPmicExchange(UINT32 packet, PUINT32 pData)
{   
    // Write the packet to the TXFIFO
    OUTREG32(&g_pCSPI->TXDATA, packet);

    // Start the exchange
    INSREG32BF(&g_pCSPI->CONTROLREG, 
        CSPI_CONTROLREG_XCH, CSPI_CONTROLREG_XCH_EN);
    
    // Wait until transaction is complete
    while (!(INREG32(&g_pCSPI->INT) & CSP_BITFMASK(CSPI_INT_RR))) {
        if (g_oalPostInit) {
            // WinCE 6.00 does not implement the SC_Sleep() API that was
            // available in WinCE 5.00 and there is no suitable alternative
            // API. Note that calling NKSleep(0) simply causes this thread
            // to hang. Therefore, we can only use a NO-OP here.
            ;
        }
    };

    // Read the data
    *pData = INREG32(&g_pCSPI->RXDATA);
    
    return TRUE;
}

//------------------------------------------------------------------------------
//
// Function: OALPmicWrite
//
// Writes data to the specified PMIC register address.
//
// Parameters:
//      addr
//          [in] PMIC register address
//
//      data
//          [in] data to write
//
// Returns:
//      Returns TRUE if successful, otherwise returns FALSE.
//
//------------------------------------------------------------------------------
BOOL OALPmicWrite(UINT32 addr, UINT32 data)
{
    BOOL rc;
    UINT32 temp;    
    
    UINT32 packet = CSP_BITFVAL(PMIC_SPI_RW, PMIC_SPI_RW_WRITE);

    CSP_BITFINS(packet, PMIC_SPI_DATA, data);
    CSP_BITFINS(packet, PMIC_SPI_ADDR, addr);    

    // Transfer the packet and discard the data
    OALPmicLock();
    rc = OALPmicExchange(packet, &temp);
    OALPmicUnlock();

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: OALPmicRead
//
// Reads data from the specified PMIC register address.
//
// Parameters:
//      addr
//          [in] PMIC register address
//
//      data
//          [out] data read
//
// Returns:
//      Returns TRUE if successful, otherwise returns FALSE.
//
//------------------------------------------------------------------------------
BOOL OALPmicRead(UINT32 addr, PUINT32 pData)
{
    BOOL rc;
    
    UINT32 packet = CSP_BITFVAL(PMIC_SPI_RW, PMIC_SPI_RW_READ);

    CSP_BITFINS(packet, PMIC_SPI_ADDR, addr);

    // Transfer the packet and read the data
    OALPmicLock();
    rc = OALPmicExchange(packet, pData);
    OALPmicUnlock();

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: OALPmicWriteMasked
//
// Writes data to particular set of bits within a specified PMIC register 
// address.
//
// Parameters:
//      addr
//          [in] PMIC register address
//
//      mask
//          [in] Bit mask for specifying the bits to be written
//
//      data
//          [in] data to write
//
// Returns:
//      Returns TRUE if successful, otherwise returns FALSE.
//
//------------------------------------------------------------------------------
BOOL OALPmicWriteMasked(UINT32 addr, UINT32 mask, UINT32 data)
{   
    BOOL rc = FALSE;
    UINT32 temp;    
    UINT32 packet = CSP_BITFVAL(PMIC_SPI_RW, PMIC_SPI_RW_READ);

    CSP_BITFINS(packet, PMIC_SPI_ADDR, addr);

    // Transfer the packet and read the data
    OALPmicLock();
    if (!OALPmicExchange(packet, &temp)) {
        ERRORMSG(TRUE, (_T("OALPmicExchange failed\r\n")));
        goto cleanUp;
    }

    CSP_BITFINS(packet, PMIC_SPI_RW, PMIC_SPI_RW_WRITE);
    CSP_BITFINS(packet, PMIC_SPI_DATA, (temp & (~mask)) | (data & mask));
        
    // Transfer the packet and discard the data    
    if (!OALPmicExchange(packet, &temp)) {
        ERRORMSG(TRUE, (_T("OALPmicExchange failed\r\n")));
        goto cleanUp;
    }

    rc = TRUE;
    
cleanUp:
    OALPmicUnlock();

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: OALPmicSetSupplyVoltages
//
// Configures the normal and standby voltages for the CPU.
//
// Parameters:
//      voltCodeNormal
//          [in] Voltage code for the PMIC normal (non-DVS) voltage
//
//      voltCodeStandby
//          [in] Voltage code for the PMIC standby voltage
//
// Returns:
//      Returns TRUE if successful, otherwise returns FALSE.
//
//------------------------------------------------------------------------------
BOOL OALPmicSetSupplyVoltages(UINT32 voltCodeNormal, UINT32 voltCodeStandby)
{
    BOOL rc;
    DWORD dwStart;
    
    rc = OALPmicWriteMasked(MC13783_SW0_ADDR, 
        CSP_BITFMASK(MC13783_SW0_SW1A) | 
        CSP_BITFMASK(MC13783_SW0_SW1ASTBY), 
        CSP_BITFVAL(MC13783_SW0_SW1A, voltCodeNormal) |
        CSP_BITFVAL(MC13783_SW0_SW1ASTBY, voltCodeStandby));

    // Wait ~1 msec for the supply voltage to settle
	dwStart = OALTimerGetCount();
	while((OALTimerGetCount() - dwStart) < g_oalTimer.countsPerMSec);

    return rc;
}

//------------------------------------------------------------------------------
//
// Function: OALPmicInit
//
// Initializes the PMIC interface for OAL communication.
//
// Parameters:
//      voltCodeNormal
//          [in] Voltage code for the PMIC normal (non-DVS) voltage
//
//      voltCodeStandby
//          [in] Voltage code for the PMIC standby voltage
//
// Returns:
//      Returns TRUE if successful, otherwise returns FALSE.
//
//------------------------------------------------------------------------------
BOOL OALPmicInit(UINT32 voltCodeNormal, UINT32 voltCodeStandby)
{
    BOOL rc = FALSE;
    UINT32 temp;
    PCSP_GPIO_REGS pGPIO;

    pGPIO = (PCSP_GPIO_REGS)OALPAtoUA(CSP_BASE_REG_PA_GPIO);

    // PD25 - PD31
    // CSPI1_RDY, CSPI1_SS2, CSPI1_SS1, CSPI1_SS0, CSPI1_SCLK, CSPI1_MISO, CSPI1_MOSI
    // Note: PD26 is muxed with USBH2_DATA5/RCV.
    OAL_IOMUX_PRI_PINS(pGPIO, GPIO_PORT_D, 0xFE000000);

    // CSPI1 mapping
    g_pCSPI = (PCSP_CSPI_REGS)OALPAtoUA(CSP_BASE_REG_PA_CSPI1);
    if (g_pCSPI == NULL) {
        OALMSG(OAL_ERROR, (_T("OALPmicInit: OALPAtoUA returned NULL\r\n")));
        goto cleanUp;
    }

    // Turn on CSPI clocks
    g_CGI = DDK_CLOCK_GATE_INDEX_CSPI1;
    OALClockSetGatingMode(g_CGI, DDK_CLOCK_GATE_MODE_ENABLE);

    // Configure the CSPI interface and enable it before writing to  
    // other CSPI registers
    OUTREG32(&g_pCSPI->CONTROLREG,
        CSP_BITFVAL(CSPI_CONTROLREG_SPIEN, CSPI_CONTROLREG_SPIEN_ENABLE) |
        CSP_BITFVAL(CSPI_CONTROLREG_MODE, CSPI_CONTROLREG_MODE_MASTER) |
        CSP_BITFVAL(CSPI_CONTROLREG_XCH, CSPI_CONTROLREG_XCH_IDLE) |
        CSP_BITFVAL(CSPI_CONTROLREG_POL, CSPI_CONTROLREG_POL_ACTIVE_HIGH) |
        CSP_BITFVAL(CSPI_CONTROLREG_PHA, CSPI_CONTROLREG_PHA0) |
        CSP_BITFVAL(CSPI_CONTROLREG_SSCTL, CSPI_CONTROLREG_SSCTL_ASSERT) |
        CSP_BITFVAL(CSPI_CONTROLREG_SSPOL, CSPI_CONTROLREG_SSPOL_ACTIVE_HIGH) |
        CSP_BITFVAL(CSPI_CONTROLREG_BITCOUNT, CSPI_CONTROLREG_BITCOUNT_32BIT) |
        CSP_BITFVAL(CSPI_CONTROLREG_DATARATE, OALPmicCalcDiv(BSP_PMIC_CSPI_FREQ)) |
        CSP_BITFVAL(CSPI_CONTROLREG_DRCTL, CSPI_CONTROLREG_DRCTL_DONTCARE) |
        CSP_BITFVAL(CSPI_CONTROLREG_CS, CSPI_CONTROLREG_CS_SS0));

    OUTREG32(&g_pCSPI->INT, 0);
    OUTREG32(&g_pCSPI->DMA, 0);
    OUTREG32(&g_pCSPI->TEST, 0);

    // Turn the CSPI module and clocks off to save power between transfers
    INSREG32BF(&g_pCSPI->CONTROLREG, 
        CSPI_CONTROLREG_SPIEN, CSPI_CONTROLREG_SPIEN_DISABLE);    
    OALClockSetGatingMode(g_CGI, DDK_CLOCK_GATE_MODE_DISABLE);

    // Configure PC14 as CPLD_PRIINT (Note: Muxed with TOU1)
    OAL_IOMUX_INTR_PIN(pGPIO, BSP_PMIC_GPIO_PORT, 
        BSP_PMIC_GPIO_PIN, GPIO_INT_TYPE_POSLEVEL);

    rc = OALPmicSetSupplyVoltages(voltCodeNormal, voltCodeStandby);

    OALPmicRead(MC13783_SW0_ADDR, &temp);
    OALMSGS(OAL_INFO, (_T("SW1A voltages:  0x%x (normal = %d, DVS = %d, standby = %d)\r\n"), 
        temp, CSP_BITFEXT(temp, MC13783_SW0_SW1A), CSP_BITFEXT(temp, MC13783_SW0_SW1A),
        CSP_BITFEXT(temp, MC13783_SW0_SW1ASTBY)));

    OALPmicRead(MC13783_SW4_ADDR, &temp);
    OALMSGS(OAL_INFO, (_T("SW1A configuration: 0x%x (mode = %d, standby mode = %d, DVS speed = %d, panic = %d, soft start = %d)\r\n"), 
        temp, CSP_BITFEXT(temp, MC13783_SW4_SW1AMODE), CSP_BITFEXT(temp, MC13783_SW4_SW1ASTBYMODE),
        CSP_BITFEXT(temp, MC13783_SW4_SW1ADVSSPEED), CSP_BITFEXT(temp, MC13783_SW4_SW1APANIC), 
        CSP_BITFEXT(temp, MC13783_SW4_SW1ASFST)));
    
cleanUp:
    
    return rc;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合色在线| 亚洲一二三四在线| 亚洲午夜私人影院| 国产乱色国产精品免费视频| 91影视在线播放| 精品国产一区二区在线观看| 久久日韩粉嫩一区二区三区| aaa亚洲精品| 亚洲超丰满肉感bbw| 国产精品66部| 7777精品久久久大香线蕉| 一区在线播放视频| 韩国精品主播一区二区在线观看| 欧美影院一区二区三区| 国产精品人成在线观看免费| 麻豆精品一区二区| 337p亚洲精品色噜噜| 亚洲精品伦理在线| 97se亚洲国产综合自在线观| 国产日韩欧美激情| 国产精品1区2区| 精品国产一区二区精华| 午夜天堂影视香蕉久久| 精品视频全国免费看| 一区二区三区日韩精品视频| 99国产精品久| 久久综合丝袜日本网| 欧美性生活大片视频| 国产乱码一区二区三区| 色综合久久88色综合天天免费| 久久久亚洲午夜电影| 精品一区二区三区香蕉蜜桃 | 久久国产生活片100| 7777精品伊人久久久大香线蕉的 | 久久久久久久av麻豆果冻| 久久综合综合久久综合| 精品国产乱码91久久久久久网站| 久久国产人妖系列| 26uuu亚洲综合色欧美| 国产美女精品一区二区三区| 国产喂奶挤奶一区二区三区| 国产精品高潮呻吟| 国产欧美日韩麻豆91| 国产成人精品综合在线观看| 欧美—级在线免费片| 波多野结衣亚洲一区| 亚洲欧美激情在线| 91福利在线观看| 日韩黄色免费电影| 久久综合九色综合97_久久久| 国产精品一色哟哟哟| 亚洲国产精品精华液2区45| 粉嫩蜜臀av国产精品网站| 国产精品入口麻豆原神| 色中色一区二区| 丝袜美腿亚洲综合| 精品福利在线导航| 成人av手机在线观看| 亚洲精品国久久99热| 欧美精品精品一区| 国产精品99久| 一区二区三区在线免费视频| 91精品国产日韩91久久久久久| 国产一区在线视频| 亚洲精品自拍动漫在线| 欧美精品久久一区| 国产成人亚洲精品青草天美| 亚洲乱码日产精品bd| 日韩欧美一区在线观看| 高清在线成人网| 五月天一区二区三区| 国产日韩精品一区二区浪潮av| 日本韩国视频一区二区| 美女网站色91| 亚洲色欲色欲www| 欧美一卡二卡三卡| 91丨porny丨蝌蚪视频| 日本不卡在线视频| 亚洲图片另类小说| 日韩精品一区国产麻豆| 一本一道久久a久久精品| 精品一区二区三区在线视频| 亚洲一区二区在线播放相泽| 日本一区二区免费在线观看视频 | 亚洲午夜久久久| 国产色91在线| 91精品国产综合久久香蕉麻豆| 99国内精品久久| 国产ts人妖一区二区| 日韩国产在线观看一区| 亚洲色大成网站www久久九九| 欧美一区二区免费| 91免费视频观看| 国产精品888| 日韩国产高清在线| 亚洲韩国精品一区| 专区另类欧美日韩| 欧美日韩1区2区| 国产原创一区二区三区| 日韩精品在线看片z| 国内精品久久久久影院薰衣草| 悠悠色在线精品| 国产精品久久久久久久久免费相片 | 最近中文字幕一区二区三区| 久久久午夜电影| 精品福利一区二区三区| 日韩午夜av一区| 日韩一卡二卡三卡四卡| 欧美妇女性影城| 欧美顶级少妇做爰| 7777精品伊人久久久大香线蕉经典版下载 | 欧美日韩大陆在线| 欧美日韩一区二区三区免费看| 国产精品18久久久久久vr| 欧美经典一区二区三区| 国产精品99久久久久| 麻豆精品在线播放| 久久99国内精品| 久久国产精品区| 欧美aaaaaa午夜精品| 美国毛片一区二区| 国内精品伊人久久久久av一坑 | 久久国内精品自在自线400部| 天天亚洲美女在线视频| 日本成人在线网站| 国产乱淫av一区二区三区 | 国产麻豆精品在线| www.在线成人| 色婷婷精品久久二区二区蜜臀av | 久久久精品免费免费| 日本一区二区三区国色天香 | 在线精品亚洲一区二区不卡| 欧美性xxxxxxxx| 在线观看www91| 欧美欧美午夜aⅴ在线观看| 91精品国产综合久久久久久| 精品少妇一区二区三区在线播放 | 国产精品视频在线看| 中文字幕亚洲视频| 亚洲国产日韩a在线播放性色| 午夜成人在线视频| 捆绑紧缚一区二区三区视频| 毛片av一区二区| 成人午夜电影小说| 在线观看日产精品| 91精品国产高清一区二区三区蜜臀| 欧美一区二区三区成人| 日韩精品一区二| 国产精品看片你懂得| 亚洲一区二区五区| 国产一区二区三区综合| 97久久超碰国产精品| 欧美一级一级性生活免费录像| 久久先锋影音av| 亚洲成人综合视频| 丁香婷婷综合色啪| 91精品国产一区二区三区蜜臀| 中文字幕巨乱亚洲| 日韩精品久久理论片| 91网站在线播放| 亚洲精品在线网站| 一区二区三区四区av| 国产福利一区在线| 欧美一区二区三区男人的天堂| 国产精品灌醉下药二区| 九色porny丨国产精品| 99久久婷婷国产精品综合| 日韩一二三区不卡| 亚洲韩国一区二区三区| 国产精品亚洲а∨天堂免在线| 欧美日韩和欧美的一区二区| 亚洲国产成人私人影院tom| 欧美aa在线视频| 欧美日韩免费在线视频| 亚洲视频一二三| 成人黄色软件下载| 精品日产卡一卡二卡麻豆| 五月婷婷激情综合网| 在线观看免费视频综合| 国产精品久久久久aaaa樱花| 黄色日韩三级电影| 日韩午夜在线观看视频| 午夜精品久久久久久久99水蜜桃| 91亚洲精品一区二区乱码| 中文字幕欧美日本乱码一线二线| 久久er精品视频| 欧美成人艳星乳罩| 日本欧美加勒比视频| 日韩av电影天堂| 成人免费视频网站在线观看| 久久久99久久精品欧美| 另类小说欧美激情| 亚洲伦理在线免费看| 懂色一区二区三区免费观看| 久久只精品国产| 国产精品1区二区.| 欧美高清在线精品一区| 成人高清免费观看| 国产精品白丝在线| 91老师片黄在线观看|