window.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 555 行 · 第 1/2 页

C
555
字号
/*++
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) 1995-2000 Microsoft Corporation.  All rights reserved.

Module Name:  

Abstract:  

   Platform dependent PCMCIA memory and I/O window functions and data.

Notes: 
--*/

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


//
// Memory (attribute and common) starting at 0xd0000
//
#define PCMCIA_MEM_WIN_BASE0     0x0D0000
#define PCMCIA_MEM_WIN_BASE1     PCMCIA_MEM_WIN_BASE0+PCMCIA_MEM_WIN_SIZE

#ifdef MAX_WINDOWS
#define PCMCIA_MEM_WIN_BASE2     PCMCIA_MEM_WIN_BASE1+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE3     PCMCIA_MEM_WIN_BASE2+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE4     PCMCIA_MEM_WIN_BASE3+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE5     PCMCIA_MEM_WIN_BASE4+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE6     PCMCIA_MEM_WIN_BASE5+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE7     PCMCIA_MEM_WIN_BASE6+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE8     PCMCIA_MEM_WIN_BASE7+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE9     PCMCIA_MEM_WIN_BASE8+PCMCIA_MEM_WIN_SIZE
#else
#define PCMCIA_MEM_WIN_BASE2     PCMCIA_MEM_WIN_BASE1+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE3     PCMCIA_MEM_WIN_BASE2+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE5     PCMCIA_MEM_WIN_BASE3+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE6     PCMCIA_MEM_WIN_BASE5+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE7     PCMCIA_MEM_WIN_BASE6+PCMCIA_MEM_WIN_SIZE
#define PCMCIA_MEM_WIN_BASE8     PCMCIA_MEM_WIN_BASE7+PCMCIA_MEM_WIN_SIZE
#endif

#define PCMCIA_MEM_WIN_SIZE     0x02000
#define MEM_WIN0_START_ADDR_LO   (PCMCIA_MEM_WIN_BASE0 >> 12)
#define MEM_WIN0_END_ADDR_LO     (PCMCIA_MEM_WIN_SIZE >> 12)

#define PCMCIA_IO_WIN_BASE0      0
#define PCMCIA_IO_WIN_BASE1      0
#define PCMCIA_IO_WIN_BASE2      0
#define PCMCIA_IO_WIN_BASE3      0

#define PCMCIA_IO_WIN_SIZE      65536


#ifdef MAX_WINDOWS

#define PCMCIA_NUM_WINDOWS     14

UCHAR EnableMask[PCMCIA_NUM_WINDOWS] = {
    WIN_MEM_MAP0_ENABLE,
    WIN_MEM_MAP1_ENABLE,
    WIN_MEM_MAP2_ENABLE,
    WIN_MEM_MAP3_ENABLE,
    WIN_MEM_MAP4_ENABLE,
    WIN_MEM_MAP0_ENABLE,
    WIN_MEM_MAP1_ENABLE,
    WIN_MEM_MAP2_ENABLE,
    WIN_MEM_MAP3_ENABLE,
    WIN_MEM_MAP4_ENABLE,
    WIN_IO_MAP0_ENABLE,
    WIN_IO_MAP1_ENABLE,
    WIN_IO_MAP0_ENABLE,
    WIN_IO_MAP1_ENABLE
};

#else

#define PCMCIA_NUM_WINDOWS     12

UCHAR EnableMask[PCMCIA_NUM_WINDOWS] = {
    WIN_MEM_MAP0_ENABLE,
    WIN_MEM_MAP1_ENABLE,
    WIN_MEM_MAP2_ENABLE,
    WIN_MEM_MAP3_ENABLE,
    WIN_MEM_MAP0_ENABLE,
    WIN_MEM_MAP1_ENABLE,
    WIN_MEM_MAP2_ENABLE,
    WIN_MEM_MAP3_ENABLE,
    WIN_IO_MAP0_ENABLE,
    WIN_IO_MAP1_ENABLE,
    WIN_IO_MAP0_ENABLE,
    WIN_IO_MAP1_ENABLE
};
#endif

// @doc DRIVERS

PDCARD_WINDOW_STATE v_WinState[PCMCIA_NUM_WINDOWS] = {
//
// Window state for the attribute and common memory windows.
//
 {  // Window 0 - socket 0 attribute or common window
    0,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE0,
    0
 },
 {  // Window 1 - socket 0 attribute or common window
    0,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE1,
    0
 },
 {  // Window 2 - socket 0 attribute or common window
    0,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE2,
    0
 },
 {  // Window 3 - socket 0 attribute or common window
    0,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE3,
    0
 },
#ifdef MAX_WINDOWS
 {  // Window 4 - socket 0 attribute or common window
    0,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE4,
    0
 },
#endif
 {  // Window 5 - socket 1 attribute or common window
    1,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE5,
    0
 },
 {  // Window 6 - socket 1 attribute or common window
    1,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE6,
    0
 },
 {  // Window 7 - socket 1 attribute or common window
    1,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE7,
    0
 },
 {  // Window 8 - socket 1 attribute or common window
    1,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE8,
    0
 },
#ifdef MAX_WINDOWS
 {  // Window 9 - socket 1 attribute or common window
    1,                    // socket number
    WIN_STATE_ENABLED,    // state flags
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_MEM_WIN_SIZE,
    PCMCIA_MEM_WIN_BASE9,
    0
 },
#endif

//
// Window state for the I/O windows.
//
 {  // Window 10 - socket 0 I/O window
    0,                    // socket number
    WIN_STATE_MAPS_IO,
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_IO_WIN_SIZE,
    PCMCIA_IO_WIN_BASE0,
    0
 },
 {  // Window 11 - socket 0 I/O window
    0,                    // socket number
    WIN_STATE_MAPS_IO,
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_IO_WIN_SIZE,
    PCMCIA_IO_WIN_BASE1,
    0
 },
 {  // Window 12 - socket 1 I/O window
    1,                    // socket number
    WIN_STATE_MAPS_IO,
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_IO_WIN_SIZE,
    PCMCIA_IO_WIN_BASE2,
    0
 },
 {  // Window 13 - socket 1 I/O window
    1,                    // socket number
    WIN_STATE_MAPS_IO,
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_IO_WIN_SIZE,
    PCMCIA_IO_WIN_BASE3,
    0
 }
};



//
// PDCardGetWindow
//
// @func    STATUS | PDCardGetWindow | Report the current state of a memory or I/O window
// @rdesc   Returns one of the CERR_* error codes in cardserv.h
//
STATUS
PDCardGetWindow(
    UINT32 uWindow,                     // @parm Window number (the first window is 0)
    PPDCARD_WINDOW_STATE pWindowState   // @parm Pointer to a PDCARD_WINDOW_STATE structure.
    )
{
    if (uWindow >= PCMCIA_NUM_WINDOWS) {
        return CERR_BAD_WINDOW;
    }

    memcpy(pWindowState, &(v_WinState[uWindow]), sizeof(PDCARD_WINDOW_STATE));
    return CERR_SUCCESS;
}


//
// PDCardSetWindow
//
// @func    STATUS | PDCardSetWindow | Change the characteristics of a memory or I/O window
// @rdesc   Returns one of the CERR_* error codes in cardserv.h
//
STATUS
PDCardSetWindow(
    UINT32 uWindow,                     // @parm Window number (the first window is 0)
    PPDCARD_WINDOW_STATE pWindowState   // @parm Pointer to a PDCARD_WINDOW_STATE structure.
    )
{
    //
    // base_reg will be added to a base register index to get the
    // correct window register index for the specified window.
    //
    UINT8 base_reg;
    UINT8 tmp;
    UINT8 tmp_mask;
    UINT32 start;
    UINT32 address;
    UINT  sock;
    BOOL  bUserMode = TRUE;

    if ( uWindow & ADP_STATE_KERNEL_MODE) { // check the kernel-mode bit
        ASSERT( !(PCMCIA_NUM_WINDOWS & ADP_STATE_KERNEL_MODE) );
        uWindow &= ~ADP_STATE_KERNEL_MODE;  // clear it

⌨️ 快捷键说明

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