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

📄 window.h

📁 EP9315开发板的Wince6.0的BSP包文件
💻 H
字号:
//**********************************************************************
//                                                                      
// Filename: window.h
//                                                                      
// Description: 
//
// 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.
//
// Use of this source code is subject to the terms of the Cirrus 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 
// EULA.RTF on your install media.
//
// Copyright(c) Cirrus Logic Corporation 2005, All Rights Reserved                       
//                                                                      
//**********************************************************************

#ifndef _PCMCIA_EP93XX_WINDOW_H_
#define _PCMCIA_EP93XX_WINDOW_H_

//#undef DEBUGMSG
//#define DEBUGMSG RETAILMSG

#define ZONE_INIT 1
#define ZONE_FUNCTION 1
#define ZONE_PDD	1
#define ZONE_API	1

UINT32 CalculatePcmciaTimings (   UINT32 NsSpeed );


template <class TSocketClass>
class CEp93xxMemoryWindow : public CPcmciaMemWindowImpl<TSocketClass>
{
public:
    CEp93xxMemoryWindow( TSocketClass* pPcmSocket,
                         DWORD dwWinIndex,
                         const SS_WINDOW_STATE* pcWindowState,
                         const SS_WINDOW_INFO* pcWindowInfo ) : CPcmciaMemWindowImpl<TSocketClass>( pPcmSocket,
                                                                                                    dwWinIndex,
                                                                                                    pcWindowState,
                                                                                                    pcWindowInfo )
    {
        Initialize();
    }
    ~CEp93xxMemoryWindow()
    {
        Deinitialize();
    }
    STATUS CardSetWindow( PSS_WINDOW_STATE pWindowState )
	{
		STATUS status;
		volatile ULONG * pPcConfigReg=NULL;
		ULONG   ulPcConfig = 0;


		status= CPcmciaMemWindowImpl<TSocketClass>::CardSetWindow( pWindowState ) ;

		DEBUGMSG(1,(TEXT("SetWindow Address= %x \r\n"),m_WinInfo.uMemBase ));

		if( status == CERR_SUCCESS )
		{
			if( pWindowState->fState & WIN_STATE_ATTRIBUTE ) //Attribute window.
			{
				pPcConfigReg = SMC_PCCONFIG_ATT1; 
			}
			else
			{
				pPcConfigReg = SMC_PCCONFIG_MEM1;			//common window.
			}

			if (pWindowState->fState & WIN_STATE_ENABLED)  
			{
				if( pWindowState->fState & WIN_STATE_ATTRIBUTE ) //Attribute window.
				{

					DEBUGMSG(1,(TEXT("SetWindow ATTRIBUTE\r\n")));
					ulPcConfig |= CalculatePcmciaTimings(300);
				}
				else
				{
					UINT8 exp  = pWindowState->fSpeed & WIN_SPEED_EXP_MASK;
					UINT8 mant = pWindowState->fSpeed & WIN_SPEED_MANT_MASK;


					DEBUGMSG(1,(TEXT("SetWindow COMMON\r\n")));
					//
					// 301ns and slower, set to 600ns
					//
					if ((exp >= WIN_SPEED_EXP_1US) || ((exp == WIN_SPEED_EXP_100NS) && (mant > WIN_SPEED_MANT_30))) 
					{
						ulPcConfig |= CalculatePcmciaTimings( 600 );
					}

					//
					// Check to see if it is 300ns
					//
					else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_30))                           
					{
						ulPcConfig |= CalculatePcmciaTimings( 300 );
					}

					//
					// Check to see if it is 250ns
					//
					else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_25))
					{
						ulPcConfig |= CalculatePcmciaTimings( 250 );
					}

					//
					// Check to see if it is 200ns
					//
					else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_20))
					{
						ulPcConfig |= CalculatePcmciaTimings( 200 );
					}
					//
					// Check to see if it is 150ns
					//
					else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_15))
					{
						ulPcConfig |= CalculatePcmciaTimings( 150 );
					}

					//
					// 100ns and faster, set to 100ns 
					else                                                                                            
					{
						ulPcConfig |= CalculatePcmciaTimings(100);
					}
				}

			}else
			{
				ulPcConfig = PCCONFIG_ADDRESSTIME_MASK |
							 PCCONFIG_HOLDTIME_MASK    |
							 PCCONFIG_ACCESSTIME_MASK  |
							 PCCONFIG_MW_8BIT;
			}

//			if( !(  pWindowState->fState & WIN_STATE_ATTRIBUTE ) )
			{
				if (pWindowState->fState & WIN_STATE_16BIT)
				{
					ulPcConfig |= PCCONFIG_MW_16BIT;
					DEBUGMSG(ZONE_PDD, (TEXT("Setting window  to 16 bit access\r\n")));
				}
				else
				{
					ulPcConfig |= PCCONFIG_MW_8BIT;
					DEBUGMSG(ZONE_PDD, (TEXT("Setting window  to 8 bit access\r\n")));
				}
			}

			ASSERT( pPcConfigReg );
			*pPcConfigReg = ulPcConfig;

		}
		return status;


	}

protected:
    virtual void FreeResources()
    {
    }
    virtual void DisableWindow()
    {
    }
    virtual void ProgramWindow()
    {
    }
    virtual DWORD GetNewOffset( PSS_WINDOW_STATE pWindowState )
    {
        return 0;
    }
    virtual DWORD GetNewLength( PSS_WINDOW_STATE pWindowState,
                                DWORD dwNewOffset )
    {
        DWORD   dwMappedSize = pWindowState->uSize + pWindowState->uOffset;
        // Make it Page Alignment.
        dwMappedSize = ( ( dwMappedSize + m_WinInfo.uMemMinSize - 1 ) /
                         m_WinInfo.uMemMinSize ) * m_WinInfo.uMemMinSize;
        return dwMappedSize;
    }
    virtual BOOL GetBaseAddress( PSS_WINDOW_STATE pWindowState,
                                 DWORD dwNewOffset,
                                 DWORD dwNewLength,
                                 DWORD& dwNewBase )
    {
        dwNewBase = m_WinInfo.uMemBase;
        return TRUE;
    }
};

template <class TSocketClass>
class CEp93xxIOWindow : public CPcmciaIoWindowImpl<TSocketClass>
{
public:
    CEp93xxIOWindow( TSocketClass* pPcmSocket,
                     DWORD dwWinIndex,
                     const SS_WINDOW_STATE* pcWindowState,
                     const SS_WINDOW_INFO* pcWindowInfo ) : CPcmciaIoWindowImpl<TSocketClass>( pPcmSocket,
                                                                                               dwWinIndex,
                                                                                               pcWindowState,
                                                                                               pcWindowInfo )
    {
        m_dwIoAddrBase = m_WinInfo.uIOFirstByte;
        Initialize();
    }
    ~CEp93xxIOWindow()
    {
        Deinitialize();
    }

    STATUS CardSetWindow( PSS_WINDOW_STATE pWindowState )
	{
		STATUS status;
		ULONG   ulPcConfig = 0;
		volatile ULONG * pPcConfigReg=SMC_PCCONFIG_IO1;

		status= CPcmciaIoWindowImpl<TSocketClass>::CardSetWindow( pWindowState );


		DEBUGMSG(1,(TEXT("SetWindow IO Base Address= %x \r\n"),m_WinInfo.uIOFirstByte  ));

		if( status == CERR_SUCCESS )
		{
				ULONG ulPcConfig=0;

				UINT8 exp  = pWindowState->fSpeed & WIN_SPEED_EXP_MASK;
				UINT8 mant = pWindowState->fSpeed & WIN_SPEED_MANT_MASK;


				DEBUGMSG(1,(TEXT("SetWindow IO\r\n")));
				//
				// 301ns and slower, set to 600ns
				//
			/*	if ((exp >= WIN_SPEED_EXP_1US) || ((exp == WIN_SPEED_EXP_100NS) && (mant > WIN_SPEED_MANT_30))) 
				{
					ulPcConfig |= CalculatePcmciaTimings( 600 );
				}

				//
				// Check to see if it is 300ns
				//
				else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_30))                           
				{
					ulPcConfig |= CalculatePcmciaTimings( 300 );
				}

				//
				// Check to see if it is 250ns
				//
				else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_25))
				{
					ulPcConfig |= CalculatePcmciaTimings( 250 );
				}

				//
				// Check to see if it is 200ns
				//
				else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_20))
				{
					ulPcConfig |= CalculatePcmciaTimings( 200 );
				}
				//
				// Check to see if it is 150ns
				//
				else if ((exp == WIN_SPEED_EXP_100NS) && (mant == WIN_SPEED_MANT_15))
				{
					ulPcConfig |= CalculatePcmciaTimings( 150 );
				}

				//
				//
				else */                                                                                           
				{
					ulPcConfig |= CalculatePcmciaTimings(300);
				}


			//ulPcConfig |= CalculatePcmciaTimings(ulPcConfig);

			
			if (pWindowState->fState & WIN_STATE_16BIT)
			{
				ulPcConfig |= PCCONFIG_MW_16BIT;
				DEBUGMSG(ZONE_PDD, (TEXT("Setting window  to 16 bit access\r\n")));
			}
			else
			{
				ulPcConfig |= PCCONFIG_MW_8BIT;
				DEBUGMSG(ZONE_PDD, (TEXT("Setting window  to 8 bit access\r\n")));
			}
			
			// *SMC_PCCONFIG_MEM1=ulPcConfig;
			*pPcConfigReg = ulPcConfig;

			// *SMC_PCCONFIG_IO1 = ulPcConfig;

		}
		return status;
	}


protected:
    virtual void FreeResources()
    {
    }
    virtual void DisableWindow()
    {
    }
    virtual void ProgramWindow()
    {
    }
    virtual DWORD GetNewOffset( PSS_WINDOW_STATE pWindowState )
    {
        return 0;
    }
    virtual DWORD GetNewLength( PSS_WINDOW_STATE pWindowState,
                                DWORD dwNewOffset )
    {
        DWORD   dwMappedSize = pWindowState->uSize + pWindowState->uOffset;
        // Make it Page Alignment.
        dwMappedSize = ( ( dwMappedSize + m_WinInfo.uIOMinSize - 1 ) /
                         m_WinInfo.uIOMinSize ) * m_WinInfo.uIOMinSize;
        return dwMappedSize;
    }
    virtual BOOL GetBaseAddress( PSS_WINDOW_STATE pWindowState,
                                 DWORD dwNewOffset,
                                 DWORD dwNewLength,
                                 DWORD& dwNewBase )
    {
        dwNewBase = m_dwIoAddrBase;
        return TRUE;
    }

    DWORD   m_dwIoAddrBase;
};

template <class TBridgeClass>
class CEp93xxWindowBridgeContainer : public CRefObject, public CLockObject
{
protected:
    CEp93xxWindowBridgeContainer( TBridgeClass* pBridge )
    {
        m_pBridge = pBridge;
    }
    TBridgeClass*   m_pBridge;
};



#endif // _PCMCIA_EP93XX_WINDOW_H_

⌨️ 快捷键说明

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