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

📄 window.c

📁 SBC2410 WinCE 5.0 BSP.绝大多数驱动已经调通。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*++
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:  

Abstract:  

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

Rev:
	2002.4.14	: S3C2410 port (kwangyoon LEE, kwangyoon@samsung.com)

	2001.12.21	: bug fixup (kwangyoon LEE, kwangyoon@samsung.com)
	2001.12.12	: add S3C2400 Specific definitions (kwangyoon LEE, kwangyoon@samsung.com)

Notes: 
--*/

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

//
// Memory (attribute and common) starting at 0x10000000(physical address)
//
#define PCMCIA_MEM_WIN_BASE0	0x10000000
#define PCMCIA_MEM_WIN_BASE1	PCMCIA_MEM_WIN_BASE0+PCMCIA_MEM_WIN_SIZE
#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_SIZE		0x02000

#define MEM_WIN0_START_ADDR_LO	(0x00000000 >> 12)
#define MEM_WIN0_END_ADDR_LO	(PCMCIA_MEM_WIN_SIZE >> 12)

#define PCMCIA_IO_WIN_BASE0		0x0
#define PCMCIA_IO_WIN_BASE1		0x0

#define PCMCIA_IO_WIN_SIZE      65536

#define PCMCIA_NUM_WINDOWS		7

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_IO_MAP0_ENABLE,
    WIN_IO_MAP1_ENABLE,
};

// @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|WIN_STATE_ATTRIBUTE,    // 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|WIN_STATE_16BIT,    // 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|WIN_STATE_16BIT,    // 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
 },
 {  // 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
 },


//
// Window state for the I/O windows.
//
 {  // Window 5 - socket 0 I/O window
    0,                    // socket number
    WIN_STATE_MAPS_IO|WIN_STATE_16BIT,
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_IO_WIN_SIZE,
    0x11000000,
    0
 },
 {  // Window 6 - socket 0 I/O window
    0,                    // socket number
    WIN_STATE_MAPS_IO|WIN_STATE_16BIT,
    WIN_SPEED_EXP_1NS|WIN_SPEED_MANT_10|WIN_SPEED_USE_WAIT,
    PCMCIA_IO_WIN_SIZE,
    0x11000000,
    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;

    DEBUGMSG (1,(TEXT("++PDCardSetWindow #%x\n\r"), uWindow));

    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
        bUserMode = FALSE;
    }
    
	if (uWindow >= PCMCIA_NUM_WINDOWS) {
		return CERR_BAD_WINDOW;
    }

    sock = v_WinState[uWindow].uSocket;

    if ( bUserMode ) {
        EnterCriticalSection(&g_PCIC_Crit);
    }
            
	if (pWindowState->fState & WIN_STATE_ENABLED) {
        PCICIndex(sock, REG_WINDOW_ENABLE);
        tmp = PCICDataRead()|WIN_MEMCS16_DECODE;

        if (uWindow >= SOCKET0_FIRST_IO_WINDOW) {
            //
            // We need to check here for I/O range collisions since both sockets
            // are mapped onto the same system bus for I/O addresses. 
            // (The memory windows won't collide because they have constant 
            // address ranges in the host address space)
            //
            for (start = SOCKET0_FIRST_IO_WINDOW;
                 start < PCMCIA_NUM_WINDOWS;
                 start++) {
                //
                // Don't worry about collisions with:
                // 1. the same window
                // 2. disabled windows
                //
                if ((start == uWindow) || (!(v_WinState[start].fState & WIN_STATE_ENABLED))) {
                    continue;
                }
                if ((pWindowState->uOffset + pWindowState->uSize) > 
                    v_WinState[start].uOffset) {
                    if (pWindowState->uOffset <
                        (v_WinState[start].uOffset + v_WinState[start].uSize)) {
                        LeaveCriticalSection(&g_PCIC_Crit);
						
						DEBUGMSG(1,
							(TEXT("PCMCIA:PDCardSetWindow I/O range collision with windows %d (0x%x 0x%x) and %d (0x%x 0x%x)\r\n"),
         					uWindow, pWindowState->uOffset, pWindowState->uSize,
         					start, v_WinState[start].uOffset, v_WinState[start].uSize));
                        return CERR_IN_USE;
                    }
                }
            }
        }

        //
        // Disable this window while we work on it.
        //
        tmp_mask = EnableMask[uWindow];
        tmp &= ~tmp_mask;
        PCICDataWrite(tmp);

        if (uWindow >= SOCKET0_FIRST_IO_WINDOW) {
            //
            // I/O window setup
            //
            switch (uWindow) {
            case SOCKET0_FIRST_IO_WINDOW:
            case SOCKET1_FIRST_IO_WINDOW:

⌨️ 快捷键说明

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