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

📄 system.c

📁 CE下 NET2778 NDIS Drivers, 在每个平台上都可以使用
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************

Copyright (C) 2003, 2004, NetChip Technology, Inc. (http://www.netchip.com)

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.

SYSTEM.C

NetChip NET2272 PCI-RDK 'System' file

'System' is a collection of system level functions. Most of these functions
are specific to the NetChip RDK implementation, and can be discarded or 
re-implemented for your platform.

NetChip's System file includes:
 - DMA support
 - Interrupt support

 - Memory allocation (with leak detection)
 - Various helper routines

NetChip support: If you have technical problems, comments or feedback about this product, 
please contact us: support@netchip.com. Please write "Firmware API" in the subject.
In the body, please provide the software release code (e.g. RE010203), the application
filename, the NetChip chip you are using, plus any helpful details.

******************************************************************************/

///////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <NcCommon.h>
#include <Nc2272Db.h>       // NET2272 RDK daughterboard register and bit definitions
#include <NcDevice.h>
#include <NcFindHardware.h>

#include <nkintr.h>
#include <ceddk.h>
#include <giisr.h>
#include <ddkreg.h>

#define __USB200_H__
#include <usbfn.h>
#include <NcUfnPdd.h>

#if _NC_BANDON
#include "oalintr.h"

#include "XSC1.h"
#include "XSC1bd.h"
#include "dmacbits.h"
#include <NcXscale.h>

#endif // #if _NC_BANDON

#if _NC_CEPC
#include <plx.h>
#endif // #if _NC_CEPC
///////////////////////////////////////////////////////////////////////////////
// Public variables
///////////////////////////////////////////////////////////////////////////////

// For advanced RDK programming: The following pointers can be configured to 
// access special PCI-RDK registers:
//  - PLX9054 Local Configuration registers
//  - PCI-RDK EPLD
// Generally, there is no need to access these special registers.
PBYTE Plx9054ConfigAddress;     // Base address of PCI-RDK PLX9054 Local Configuration registers
PBYTE EpldBaseAddress;          // Base address of PCI-RDK EPLD Local Configuration registers

///////////////////////////////////////////////////////////////////////////////
// Private variables
///////////////////////////////////////////////////////////////////////////////
static UINT MallocRefCount = 0;
static HANDLE hRdk = INVALID_HANDLE_VALUE;
static HANDLE hInterruptThread = INVALID_HANDLE_VALUE;

///////////////////////////////////////////////////////////////////////////////
// Another set of stubs for the CEPC platform
#if _NC_CEPC
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void 
NcSleep(
    UINT dwMilliseconds
    )
{   // Stub function
    DWORD temp;
    temp = dwMilliseconds;
}

///////////////////////////////////////////////////////////////////////////////
void
Rdk_ResetNetchip(
    void
    )
{   // Stub function
    NCPRINTF(DEFAULT_PRINT, ("Turning RESET bit off...\r\n"));

    *(PBYTE)((PBYTE)NETCHIP_BASEADDRESS + EPLD_IO_CONTROL_REGISTER) =
    (
        (0<<EPLD_DMA_ENABLE) |
        (1<<DMA_CTL_DACK) |
        (1<<DMA_TIMEOUT_ENABLE) |       // 
        (1<<USER) |
        (0<<MPX_MODE) |
        (0x01<<BUSWIDTH) |              // Two bits: 00= 8-bit bus, 01 = 16-bit bus, 10 = 32-bit bus
        (1<<NET2272_RESET) |            // Assert NET2272 reset
        0
    );

    Sleep(5);

    NCPRINTF(DEFAULT_PRINT, ("Turning RESET bit on...\r\n"));

    *(PBYTE)((PBYTE)NETCHIP_BASEADDRESS + EPLD_IO_CONTROL_REGISTER) =
        *(PBYTE)((PBYTE)NETCHIP_BASEADDRESS + EPLD_IO_CONTROL_REGISTER) & ~(1<<NET2272_RESET);

    /* Make sure the Split DMA Bus Mode is disabled */
    *(PBYTE)((PBYTE)NETCHIP_BASEADDRESS + EPLD_DMA_CONTROL_REGISTER) = 0;

}

///////////////////////////////////////////////////////////////////////////////
INTERRUPTCONTROL
System_InterruptController(
    INTERRUPTCONTROL InterruptRequest
    )
{
    static INTERRUPTCONTROL InterruptStatus;

    switch (InterruptRequest)
    {
    case NCSYS_INTERRUPT_DISABLE:
        InterruptStatus = InterruptRequest;

		// Disable Interrupts
		*(PDWORD)(Plx9054ConfigAddress + INTCSR) =
			*(PDWORD)(Plx9054ConfigAddress + INTCSR)|
			(0<<PCI_INTERRUPT_ENABLE)|
			(0<<LOCAL_INTERRUPT_INPUT_ENABLE)|
			0;
		HISTO(DEFAULT_HISTORY, "IntD", InterruptStatus, 0, 0);
        break;

    case NCSYS_INTERRUPT_ENABLE:
        InterruptStatus = InterruptRequest;
		// Enable Interrupts
		*(PDWORD)(Plx9054ConfigAddress + INTCSR) =
			*(PDWORD)(Plx9054ConfigAddress + INTCSR)|
			(1<<PCI_INTERRUPT_ENABLE)|
			(1<<LOCAL_INTERRUPT_INPUT_ENABLE)|
			0;
		HISTO(DEFAULT_HISTORY, "IntE", InterruptStatus, 0, 0);
        break;

    case NCSYS_INTERRUPT_STATUS:
        break;

    default:
        NCPRINTF(VOLUME_MINIMUM, ("System_InterruptController(): Unknown request\n"));
        break;
    }
    
    return InterruptStatus;
}

///////////////////////////////////////////////////////////////////////////////
void
System_InitializeDma(
    void
    )
{

}

///////////////////////////////////////////////////////////////////////////////
static DWORD WINAPI
InterruptThread(
    PVOID pvContext
    )
{
	PCEUFNPDD_CONTEXT pContext = (PCEUFNPDD_CONTEXT)pvContext;
	CONST HANDLE Objs[2] = {pContext->hInterruptEvent, pContext->hKillEvent};
    ULONG       WaitReturn;
    BOOL        KillThread = FALSE;

    // spin till we are told to shutdown.  
    while (!KillThread) 
    {
//        WaitReturn = WaitForMultipleObjects(2, Objs, FALSE, 5000);
        WaitReturn = WaitForSingleObject(pContext->hInterruptEvent, 5000);// INFINITE);
        switch(WaitReturn)
        {
        case WAIT_OBJECT_0:     // hSX2SerialEvent
            /*
                InterruptEvent is tied SYSINTR_USB20_CLIENT
            */
            //DEBUGMSG(TRUE, (TEXT("Got 2272 Interrupt!!!\n")));

			EnterCriticalSection(&pContext->csInterrupt);

            Nc_InterruptHandler();

			LeaveCriticalSection(&pContext->csInterrupt);

            InterruptDone(pContext->SysIntr);
            break;

        case WAIT_OBJECT_0+1:
            KillThread = TRUE;
            break;

        case WAIT_TIMEOUT:
			/*
            RETAILMSG(TRUE, (TEXT("Timeout\n")));
            RETAILMSG(TRUE, (TEXT("IRQSTAT1=%8.8x\n"), NETCHIP_READ(IRQSTAT1)));
            RETAILMSG(TRUE, (TEXT("IRQSTAT0=%8.8x\n"), NETCHIP_READ(IRQSTAT0)));
            RETAILMSG(TRUE, (TEXT("IRQENB1=%8.8x\n"), NETCHIP_READ(IRQENB1)));
            RETAILMSG(TRUE, (TEXT("IRQENB0=%8.8x\n"), NETCHIP_READ(IRQENB0)));
			RETAILMSG(TRUE, (TEXT("INTCSR=%8.8x\n"), *(PDWORD)(Plx9054ConfigAddress + INTCSR)));
			*/
            continue;

        default:
            break;
        }
    }

    RETAILMSG(1, (TEXT("InterruptThread(): exiting\n")));

    return 0;
}

///////////////////////////////////////////////////////////////////////////////
HANDLE
StartInterruptThread(
    PCEUFNPDD_CONTEXT pContext
    )
{
    HANDLE hInterruptThread;

    pContext->hInterruptEvent = CreateEvent(0, FALSE, FALSE, NULL);
	pContext->hKillEvent = CreateEvent(0, FALSE, FALSE, NULL);

    if ( !InterruptInitialize(pContext->SysIntr,
                              pContext->hInterruptEvent,
                              NULL,
                              0) ) {

⌨️ 快捷键说明

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