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

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

?? socket.c

?? 三星2410 Windows CE 4.2 PCMCIA驅動源碼。適合所有以S3C2410X為主芯片開發的平臺。
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// 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.
Copyright (c) 2002. Samsung Electronics, co. ltd  All rights reserved.

Module Name:  

   socket.c
   
Abstract:  

Rev:
	2001.12.21	: Bug Fixup (kwangyoon LEE, kwangyoon@samsung.com)
	2001.12.12	: add S3C2400 Specific codes (kwangyoon LEE, kwangyoon@samsung.com)
		
Notes: 
--*/

#include <windows.h>
#include <types.h>
#include <cardserv.h>
#include <sockserv.h>
#include <sockpd.h>
#include <memory.h>
#include <pc.h>


//#define FORCE_POLLING 1

//
// CEPC PCMCIA Socket Services Socket APIs:
//    PDCardInquireSocket
//    PDCardGetSocket
//    PDCardSetSocket
//    PDCardInquireAdapter
//

#define NUM_SOCKETS 1
#define NUM_POWER_ENTRIES 4
#define VCC_DEFAULT_INDEX 2

//
// @doc DRIVERS
//

PDCARD_ADAPTER_INFO v_AdapterInfo = {
    1,  // memory granularity (for production platforms, this should be 1)
    0,  // adapter capabilities
    8,  // cache line size in 32-bit words
    NUM_POWER_ENTRIES
};

PDCARD_POWER_ENTRY v_PowerEntries[NUM_POWER_ENTRIES] = {
 { 0,    PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
 { 33,   PWR_SUPPLY_VCC },
 { 50,   PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
 { 120,  PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 }
};

PDCARD_SOCKET_STATE v_SockState[NUM_SOCKETS] = {
{
    SOCK_CAP_IO,
#ifdef FORCE_POLLING
    EVENT_MASK_BATTERY_DEAD|EVENT_MASK_BATTERY_LOW|
#else
    EVENT_MASK_BATTERY_DEAD|EVENT_MASK_BATTERY_LOW|EVENT_MASK_CARD_DETECT|
#endif
        EVENT_MASK_WRITE_PROTECT,   // status change interrupt mask
    0,  // present socket state
    0,  // control and indicators
    0,  // interface type
    0,  // Vcc
    0,  // Vpp1
    0   // Vpp2
},
};

extern DWORD g_Irq; // PCMCIA IRQ set in init.c

//
// Set the socket controller registers to initial state with no card inserted.
//
VOID InitSocketNoCard(UINT32 uSocket, BOOL bUserMode)
{
    UCHAR tmp;
    UINT32 status; 
    UINT32 i; 
    UINT32 first, last;
    PDCARD_WINDOW_STATE WinState;

    DEBUGMSG (1,(TEXT("++InitSocketNoCard #%x\n\r"), uSocket));

    PCICIndex(uSocket, REG_POWER_CONTROL);
	PCICDataWrite(PWR_AUTO_POWER);

#if	0
    tmp = CFG_CARD_DETECT_ENABLE | (UCHAR)(g_Irq << 4);
	PCICIndex(uSocket, REG_STATUS_CHANGE_INT_CONFIG);
    PCICDataWrite(tmp);
#else
	// PD6710 specific code to enable management interrupt(routed to -INTR)

    tmp = CFG_CARD_DETECT_ENABLE;
	PCICIndex(uSocket, REG_STATUS_CHANGE_INT_CONFIG);
    PCICDataWrite(tmp);

    // Enable Manage Interrupt
    PCICIndex(0, REG_INTERRUPT_AND_GENERAL_CONTROL);
	tmp = PCICDataRead();
	tmp |= INT_ENABLE_MANAGE_INT;
	PCICDataWrite(tmp);
#endif

	//
    // Disable the I/O windows
    //
    first = (uSocket == 0) ? SOCKET0_FIRST_IO_WINDOW : SOCKET1_FIRST_IO_WINDOW;
    last = first + 2;
    for (i = first; i < last; i++) {
        status = PDCardGetWindow(i, &WinState);
        if (status == CERR_SUCCESS) {
            WinState.fState &= ~WIN_STATE_ENABLED;
			WinState.uOffset = 0;
            // set the high bit in the window index if we are in kernel-mode
            PDCardSetWindow(bUserMode ? i : (i|ADP_STATE_KERNEL_MODE), &WinState);
        }
    }
    DEBUGMSG (1,(TEXT("--InitSocketNoCard\n\r")));
}

//
// PDCardGetSocket
//
// @func    STATUS | PDCardGetSocket | Get the socket state of the specified socket.
// @rdesc   Returns one of the CERR_* return codes in cardserv.h.
//
// @comm    This function reads the specified socket's state and returns it in
//          the PDCARD_SOCKET_STATE structure.
//
STATUS
PDCardGetSocket(
    UINT32 uSocket,             // @parm Socket number (first socket is 0)
    PPDCARD_SOCKET_STATE pState // @parm Pointer to PDCARD_SOCKET_STATE structure
    )
{
    UINT8 tmp;
    PPDCARD_SOCKET_STATE pPDDState;

    if (uSocket >= NUM_SOCKETS) {
        return CERR_BAD_SOCKET;
    }

    pPDDState = &v_SockState[uSocket];
    
    EnterCriticalSection(&g_PCIC_Crit);

    pPDDState->fNotifyEvents = 0;        // Start off with nothing

    //
    // First acknowledge any status change interrupts
    //
    PCICIndex(uSocket, REG_CARD_STATUS_CHANGE);
    tmp = PCICDataRead();
/*
	DEBUGMSG(ZONE_PDD,
    	(TEXT("PDCardGetSocket(%d) REG_CARD_STATUS_CHANGE(0x%x) = 0x%x\r\n"),
    	uSocket, REG_CARD_STATUS_CHANGE, tmp));
*/

    //
    // Figure out the socket state
    //
    PCICIndex(uSocket, REG_INTERFACE_STATUS);
    tmp = PCICDataRead();
/*
	DEBUGMSG(ZONE_PDD,
    	(TEXT("PDCardGetSocket(%d) REG_INTERFACE_STATUS(0x%x) = 0x%x\r\n"),
    	uSocket, REG_INTERFACE_STATUS, tmp));
*/

    if ((tmp & (STS_CD1|STS_CD2)) == (STS_CD1|STS_CD2)) {
        pPDDState->fNotifyEvents |= EVENT_MASK_CARD_DETECT;
//		DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) CARD_DETECT\r\n"), uSocket));
    } else {
//		DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) ~CARD_DETECT\r\n"), uSocket));
        InitSocketNoCard(uSocket, FALSE);
        goto pcgs_exit;
    }

#ifdef NOT_IMPLEMENTED
    switch (tmp & (STS_BVD1|STS_BVD2)) {
    case STS_BVD1:
        pPDDState->fNotifyEvents |= EVENT_MASK_BATTERY_LOW;
		DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) BATTERY_LOW\r\n"), uSocket));
        break;

    case STS_BVD2:
    case 0:
		DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) BATTERY_DEAD\r\n"), uSocket));
        pPDDState->fNotifyEvents |= EVENT_MASK_BATTERY_DEAD;
        break;
    }
#endif NOT_IMPLEMENTED

    if (tmp & STS_WRITE_PROTECT) {
		DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) WRITE_PROTECT\r\n"), uSocket));
        pPDDState->fNotifyEvents |= EVENT_MASK_WRITE_PROTECT;
    }


    if (tmp & STS_CARD_READY) {
//		DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) CARD_READY\r\n"), uSocket));
        pPDDState->fNotifyEvents |= EVENT_MASK_CARD_READY;
    }

pcgs_exit:
    memcpy(pState, pPDDState, sizeof(PDCARD_SOCKET_STATE));
    LeaveCriticalSection(&g_PCIC_Crit);
    return CERR_SUCCESS;
}   // PDDCardGetSocket


//
// PDCardSetSocket
//
// @func    STATUS | PDCardSetSocket | Set the socket state of the specified socket.
// @rdesc   Returns one of the CERR_* return codes in cardserv.h.
//
// @comm    This function sets the specified socket's state and adjusts the socket
//          controller appropriately.
//          PDCardGetSocketState will usually be called first and adjustments will
//          be made to the PDCARD_SOCKET_STATE structure before PDCardSetSocketState
//          is called.  This avoids duplicated socket state on different layers and
//          it avoids unintentionally setting socket parameters.
//
// @xref <f PDCardGetSocketState>
//
STATUS
PDCardSetSocket(
    UINT32 uSocket,             // @parm Socket number (first socket is 0)
    PPDCARD_SOCKET_STATE pState // @parm Pointer to PDCARD_SOCKET_STATE structure
    )
{
    UINT8 tmp, intctl;
    PPDCARD_SOCKET_STATE pPDDState;
    STATUS ret;
    int t;

    DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket(%d) entered\r\n"), uSocket));

    if (uSocket >= NUM_SOCKETS) {
        ret = CERR_BAD_SOCKET;
        goto pcss_fail;
    }

    //
    // Check socket power level indexes
    //
    if ((pState->fVcc & SOCK_VCC_LEVEL_MASK) >= NUM_POWER_ENTRIES ||
        !(v_PowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].fSupply & PWR_SUPPLY_VCC)) {
        ret = CERR_BAD_VCC;
        goto pcss_fail;
    }
    if (pState->uVpp1 >= NUM_POWER_ENTRIES || pState->uVpp2 >= NUM_POWER_ENTRIES ||
        !(v_PowerEntries[pState->uVpp1].fSupply & PWR_SUPPLY_VPP1) ||
        !(v_PowerEntries[pState->uVpp2].fSupply & PWR_SUPPLY_VPP2)) {
        ret = CERR_BAD_VPP;
        goto pcss_fail;
    }

    EnterCriticalSection(&g_PCIC_Crit);

    PCICIndex(uSocket, REG_INTERFACE_STATUS);
    tmp = PCICDataRead();

    if ((tmp & (STS_CD1|STS_CD2)) != (STS_CD1|STS_CD2)) {
        DEBUGMSG(ZONE_PDD,
            (TEXT("PDCardSetSocket(%d) No card inserted\r\n"), uSocket));
        InitSocketNoCard(uSocket, FALSE);
        goto pcss_exit;
    }

    pPDDState = &v_SockState[uSocket];

    //
    // Set the status change interrupt sources
    //
#if	1
    tmp = (UCHAR)(g_Irq << 4); // CFG_MANAGEMENT_IRQ_BIT* bits will be set
#else
	tmp =0;
#endif	

    if (pState->fInterruptEvents & EVENT_MASK_CARD_DETECT) {
        tmp |= CFG_CARD_DETECT_ENABLE;
    }
    if (pState->fInterruptEvents & EVENT_MASK_BATTERY_DEAD) {
        tmp |= CFG_BATTERY_DEAD_ENABLE;
    }
    if (pState->fInterruptEvents & EVENT_MASK_BATTERY_LOW) {
        tmp |= CFG_BATTERY_WARNING_ENABLE;
    }
    if (pState->fIREQRouting & SOCK_IREQ_ENABLE) {
//		tmp |= CFG_READY_ENABLE;
    } 
    PCICIndex(uSocket, REG_STATUS_CHANGE_INT_CONFIG);
    PCICDataWrite(tmp);
	DEBUGMSG(ZONE_PDD,
    (TEXT("PDCardSetSocket(%d) REG_STATUS_CHANGE_INT_CONFIG(0x%x) = 0x%x\r\n"),
    uSocket, REG_STATUS_CHANGE_INT_CONFIG, tmp));

#if	1
	// PD6710 specific code to enable management interrupt(routed to -INTR)
    PCICIndex(0, REG_INTERRUPT_AND_GENERAL_CONTROL);
	tmp = PCICDataRead();
	tmp |= INT_ENABLE_MANAGE_INT;
	PCICDataWrite(tmp);
#endif

    //
    // Enable or disable IREQ interrupts
    //
    PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
    tmp = PCICDataRead();
    tmp &= (UCHAR)~g_Irq; // Turn off INT_IRQ_BIT* bits
    if (pState->fIREQRouting & SOCK_IREQ_ENABLE) {
		DEBUGMSG(1, (TEXT("Enable IREQ interrupts #%x\r\n"), g_Irq));
        tmp |= ((UCHAR)g_Irq)|INT_CARD_NOT_RESET; // Turn on INT_IRQ_BIT* bits
    } else {
        tmp |= INT_CARD_NOT_RESET;
    }
    PCICDataWrite(tmp);

	DEBUGMSG(1,
		(TEXT("PDCardSetSocket voltage = %d\r\n"),
		v_PowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].uPowerLevel));
    // ignore Vpp 
    if ((pState->fVcc & SOCK_VCC_LEVEL_MASK) != (pPDDState->fVcc & SOCK_VCC_LEVEL_MASK)) {
        //
        // Set socket power as requested.
        //
        switch (v_PowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].uPowerLevel) {
        case 0:
            PCICIndex(uSocket, REG_POWER_CONTROL);
            PCICDataWrite(0);
            goto pcss_exit; // this is what it used to do so I won't change it
        case 33:
            PCICIndex(uSocket, 0x16);//REG_MISC_CONTROL_1);
            PCICDataWrite(0x02);  // enable 3.3V
            DEBUGMSG(1, (TEXT("set to 3.3V\r\n")));
            break;
        case 50:
            PCICIndex(uSocket, 0x16);//REG_MISC_CONTROL_1);
            if (PCICDataRead() & 0x01) // i.e., if we detect a 5V card:
			{
                PCICDataWrite(0x00);  // disable 3.3V (i.e., use 5V)
	            DEBUGMSG(1, (TEXT("set to 5V\r\n")));
            }
            else
            {
                // this is a 3.3V ONLY card and mustn't be powered at 5V
                // so ignore the command; we'd assert here save that card
                // services will attempt to apply 5V to read the CIS.
                PCICDataWrite(0x02);  // enable 3.3V

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
婷婷国产在线综合| 久久久www成人免费毛片麻豆| 国产精品久久免费看| 国产999精品久久久久久| 欧美—级在线免费片| 欧美久久久久久久久中文字幕| 亚洲欧洲精品成人久久奇米网| 波多野结衣的一区二区三区| 国产精品动漫网站| 在线观看不卡视频| 日日摸夜夜添夜夜添国产精品| 欧美一级爆毛片| 国产精品羞羞答答xxdd| 国产精品美女久久久久久 | 日本成人在线视频网站| 日韩一区二区三区观看| 国产精品一区二区三区乱码| 国产精品超碰97尤物18| 欧美性猛交xxxx乱大交退制版 | 69久久夜色精品国产69蝌蚪网| 日韩av在线播放中文字幕| 亚洲精品一区二区三区在线观看| 成人av影院在线| 一区二区三区欧美日| 日韩一级片网站| 成人精品视频一区二区三区 | 亚洲第一成年网| www国产精品av| 97久久超碰精品国产| 日本成人在线视频网站| 亚洲欧洲www| 91精品黄色片免费大全| 成人h精品动漫一区二区三区| 亚洲午夜一区二区| 久久久av毛片精品| 欧美日韩情趣电影| 成人av综合一区| 久久国产精品露脸对白| 亚洲人精品一区| 日韩欧美一卡二卡| 在线免费精品视频| 国产精品一级在线| 免费在线成人网| 亚洲免费在线视频| 欧美国产1区2区| 欧美不卡一区二区三区四区| 色先锋aa成人| 风流少妇一区二区| 久久99久国产精品黄毛片色诱| 中文字幕日韩精品一区| 日韩精品专区在线| 欧美精选一区二区| 91久久精品一区二区三| 丁香婷婷综合五月| 狠狠v欧美v日韩v亚洲ⅴ| 国产制服丝袜一区| 五月天一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 国产视频一区在线观看| 欧美va亚洲va香蕉在线| 欧美日韩一区不卡| 欧美视频一区二区三区| 97aⅴ精品视频一二三区| 韩国精品主播一区二区在线观看 | 国产视频一区不卡| 日韩欧美一二三四区| 欧美午夜精品一区二区蜜桃| 99精品欧美一区二区蜜桃免费 | 欧美一区二区在线免费观看| 91福利视频网站| 色伊人久久综合中文字幕| 99久久er热在这里只有精品66| 国产精品18久久久久| 国产麻豆精品久久一二三| 久久福利资源站| 久久狠狠亚洲综合| 国内久久婷婷综合| 国产福利91精品一区二区三区| 久久精品国产精品青草| 久久国产福利国产秒拍| 蜜桃视频免费观看一区| 99久久久国产精品免费蜜臀| 成人免费黄色在线| 成人av在线影院| 91热门视频在线观看| 91网站最新网址| 欧美在线一二三| 欧美日韩电影在线| 日韩欧美自拍偷拍| 国产午夜亚洲精品不卡| 国产精品免费看片| 亚洲美女免费视频| 亚洲欧美另类久久久精品| 亚洲欧美成人一区二区三区| 一区二区三区日本| 日本在线观看不卡视频| 国产精品一区二区在线看| 不卡的电影网站| 在线免费亚洲电影| 精品日韩av一区二区| 久久久久久久av麻豆果冻| 国产精品麻豆久久久| 一区二区三区免费| 免费在线欧美视频| 成人一道本在线| 欧美日韩精品一区二区天天拍小说 | 久久久综合网站| 亚洲欧洲日韩一区二区三区| 一区二区在线看| 美国欧美日韩国产在线播放| 免播放器亚洲一区| 国产另类ts人妖一区二区| bt7086福利一区国产| 欧美精品日韩一区| 欧美激情一区二区三区在线| 亚洲一区二区欧美激情| 激情综合网最新| 色狠狠桃花综合| 精品噜噜噜噜久久久久久久久试看 | 欧美挠脚心视频网站| 久久在线观看免费| 亚洲综合一区二区精品导航| 极品少妇xxxx精品少妇| 在线观看一区二区视频| 久久久精品一品道一区| 亚洲美女少妇撒尿| 国产美女精品一区二区三区| 91色乱码一区二区三区| 精品久久一区二区| 专区另类欧美日韩| 久久不见久久见免费视频7| 91蝌蚪porny| 国产亚洲精品免费| 日韩高清不卡一区二区三区| 99久久久无码国产精品| 日韩欧美综合在线| 亚洲成人777| 91色综合久久久久婷婷| 久久久久国色av免费看影院| 图片区小说区国产精品视频| eeuss鲁片一区二区三区 | 国产成人av影院| 欧美一区二区福利在线| 亚洲线精品一区二区三区八戒| 成人久久18免费网站麻豆 | 日韩精品亚洲一区| 色狠狠桃花综合| 中文字幕亚洲在| 懂色中文一区二区在线播放| 欧美大尺度电影在线| 午夜精品福利在线| 欧美性色欧美a在线播放| 国产精品国模大尺度视频| 国产麻豆成人精品| 欧美一二三区在线观看| 午夜激情一区二区三区| 在线视频欧美区| 老司机午夜精品99久久| 欧美日韩综合一区| 樱花草国产18久久久久| 99国产精品久| 国产精品久久777777| 不卡的av网站| 国产精品的网站| 不卡高清视频专区| 综合久久一区二区三区| 不卡的av电影在线观看| 亚洲素人一区二区| 91蝌蚪porny| 亚洲影院理伦片| 欧美人伦禁忌dvd放荡欲情| 日韩激情一二三区| 日韩欧美自拍偷拍| 国模一区二区三区白浆| 国产视频视频一区| av一区二区三区黑人| 亚洲精品你懂的| 欧美日韩高清一区二区不卡| 亚洲v中文字幕| 欧美一区二区三区视频在线| 奇米色777欧美一区二区| 精品处破学生在线二十三| 国产盗摄一区二区| 中文字幕永久在线不卡| 在线看不卡av| 免播放器亚洲一区| 国产清纯在线一区二区www| www.综合网.com| 亚洲小说欧美激情另类| 91精品国产综合久久久久久漫画 | 亚洲一区在线视频观看| 欧美日韩成人一区二区| 精品亚洲免费视频| 中文字幕av一区二区三区| 色综合网站在线| 琪琪久久久久日韩精品| 国产精品欧美一区二区三区| 91久久精品一区二区三区| 免费观看成人av| 成人欧美一区二区三区在线播放|