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

📄 nsc.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
📖 第 1 页 / 共 5 页
字号:
/*

  Copyright(c) 1998,1999 SIC/Hitachi,Ltd.

	Module Name:

		nsc.c

	Revision History:

		26th May   1999		Released

*/
//#define OUTMSG

#include "nsc.h"
#include "newdong.h"
#include "firregs.h"
#include "cc.h"	
/******************************************************************************
 * Modification Done by Maneesh Gupta
 *
 * S1.h has been replaced by platform.h 
 * Mobytel.h has been removed as it is no longer needed.
 * SH4.h has been included
 *****************************************************************************/
//#include "platform.h"
//#include "sh4.h"
/******************************************************************************
 * End of modification Done by Maneesh Gupta
 *****************************************************************************/
//#include "oalintr.h"
#include "hw16550.h"
#include "macros.h"
extern DWORD dwSysIntrIR;
extern DWORD dwSysIntrFirmware;
extern DWORD dwHD64465Base;

extern UIR IrDongleResource;
/*
 *  We keep a linked list of device objects
 */
IrDevice *firstIrDevice = NULL;

/* This fuction sets up the device for Recv */
void SetupRecv(IrDevice *thisDev);

BOOL AllocateFirRegs();	
VOID FreeFirRegs();	


//
// Debug Counters
//
DebugCounters RegStats = {0,0,0,0,0,0,0,0,0};

#ifdef RECEIVE_PACKET_LOGGING

typedef struct {
    UCHAR Data[12];
} DATA_BITS;


typedef struct {
    USHORT Tag;
    USHORT Line;
    union {
        struct {
            PNDIS_PACKET    Packet;
            PVOID           DmaBuffer;
            ULONG           Length;
        } Packet;
        struct {
            PLIST_ENTRY     Head;
            PLIST_ENTRY     Entry;
        } List;
        struct {
            PVOID           Start;
            ULONG           Offset;
            ULONG           Length;
        } Dma;
        DATA_BITS Data;
    };
} RCV_LOG;

#define CHAIN_PACKET_TAG 'CP'
#define UNCHAIN_PACKET_TAG 'UP'
#define ADD_HEAD_LIST_TAG 'HA'
#define ADD_TAIL_LIST_TAG 'TA'
#define REMOVE_HEAD_LIST_TAG 'HR'
#define REMOVE_ENTRY_TAG 'ER'
#define DMA_TAG  'MD'
#define DATA_TAG 'AD'
#define DATA2_TAG '2D'

#define NUM_RCV_LOG 256

ULONG   RcvLogIndex = 0;
RCV_LOG RcvLog[NUM_RCV_LOG];

BOOLEAN SyncGetRcvLogEntry(PVOID Context)
{
	DBGOUT((TEXT("==>SyncGetRcvLogEntry")));

    *(ULONG*)Context = RcvLogIndex++;
    RcvLogIndex &= NUM_RCV_LOG-1;
	DBGOUT((TEXT("<==SyncGetRcvLogEntry")));
    return TRUE;
}

ULONG __inline GetRcvLogEntry(IrDevice *thisDev)
{
    ULONG Entry;

	DBGOUT((TEXT("==>GetRcvLogEntry")));
    NdisAcquireSpinLock(&thisDev->QueueLock);
    NdisMSynchronizeWithInterrupt(&thisDev->interruptObj, SyncGetRcvLogEntry, &Entry);
    NdisReleaseSpinLock(&thisDev->QueueLock);
	DBGOUT((TEXT("<==GetRcvLogEntry")));
    return Entry;
}




#define LOG_InsertHeadList(d, h, e)         \
{                                           \
    ULONG i = GetRcvLogEntry(d);            \
    RcvLog[i].Tag = ADD_HEAD_LIST_TAG;      \
    RcvLog[i].Line = __LINE__;              \
    RcvLog[i].List.Head = (h);                   \
    RcvLog[i].List.Entry = (PLIST_ENTRY)(e);                  \
}

#define LOG_InsertTailList(d, h, e)         \
{                                           \
    ULONG i = GetRcvLogEntry(d);            \
    RcvLog[i].Tag = ADD_TAIL_LIST_TAG;      \
    RcvLog[i].Line = __LINE__;              \
    RcvLog[i].List.Head = (h);              \
    RcvLog[i].List.Entry = (PLIST_ENTRY)(e);             \
}

#define LOG_RemoveHeadList(d, h, e)         \
{                                           \
    ULONG i = GetRcvLogEntry(d);            \
    RcvLog[i].Tag = REMOVE_HEAD_LIST_TAG;      \
    RcvLog[i].Line = __LINE__;              \
    RcvLog[i].List.Head = (h);              \
    RcvLog[i].List.Entry = (PLIST_ENTRY)(e);             \
}

#define LOG_RemoveEntryList(d, e)           \
{                                           \
    ULONG i = GetRcvLogEntry(d);            \
    RcvLog[i].Tag = REMOVE_ENTRY_TAG;       \
    RcvLog[i].Line = __LINE__;              \
    RcvLog[i].List.Head = NULL;             \
    RcvLog[i].List.Entry = (PLIST_ENTRY)(e);             \
}

#define LOG_PacketChain(d, p)                                   \
{                                                               \
    PNDIS_BUFFER NdisBuffer;                                    \
    PVOID Address;                                              \
    ULONG Len;                                                  \
    ULONG i = GetRcvLogEntry(d);                                \
    RcvLog[i].Tag = CHAIN_PACKET_TAG;                           \
    RcvLog[i].Line = __LINE__;                                  \
    NdisQueryPacket((p), NULL, NULL, &NdisBuffer, NULL);        \
    NdisQueryBuffer(NdisBuffer, &Address, &Len);                \
    RcvLog[i].Packet.Packet = (p);                              \
    RcvLog[i].Packet.DmaBuffer = Address;                       \
    RcvLog[i].Packet.Length = Len;                              \
}

#define LOG_PacketUnchain(d, p)                                 \
{                                                               \
    PNDIS_BUFFER NdisBuffer;                                    \
    PVOID Address;                                              \
    ULONG Len;                                                  \
    ULONG i = GetRcvLogEntry(d);                                \
    RcvLog[i].Tag = UNCHAIN_PACKET_TAG;                         \
    RcvLog[i].Line = __LINE__;                                  \
    NdisQueryPacket((p), NULL, NULL, &NdisBuffer, NULL);        \
    NdisQueryBuffer(NdisBuffer, &Address, &Len);                \
    RcvLog[i].Packet.Packet = (p);                              \
    RcvLog[i].Packet.DmaBuffer = Address;                       \
    RcvLog[i].Packet.Length = Len;                              \
}

#define LOG_Dma(d)                                              \
{                                                               \
    ULONG i = GetRcvLogEntry(d);                                \
    RcvLog[i].Tag = DMA_TAG;                                    \
    RcvLog[i].Line = __LINE__;                                  \
    RcvLog[i].Dma.Start = (d)->rcvDmaBuffer;                    \
    RcvLog[i].Dma.Offset = (d)->rcvDmaOffset;                   \
    RcvLog[i].Dma.Length = (d)->rcvDmaSize;                     \
}

#define LOG_Data(d,s)                                           \
{                                                               \
    ULONG i = GetRcvLogEntry(d);                                \
    RcvLog[i].Tag = DATA_TAG;                                   \
    RcvLog[i].Line = ((USHORT)(s))&0xffff;                      \
    RcvLog[i].Data = *(DATA_BITS*)(s);                          \
}

#define LOG_Data2(d,s)                                           \
{                                                               \
    ULONG i = GetRcvLogEntry(d);                                \
    RcvLog[i].Tag = DATA2_TAG;                                   \
    RcvLog[i].Line = ((USHORT)(s))&0xffff;                      \
    RcvLog[i].Data = *(DATA_BITS*)(s);                          \
}

void DumpNdisPacket(PNDIS_PACKET Packet, UINT Line)
{
    UINT PhysBufCnt, BufCnt, TotLen, Len;
    PNDIS_BUFFER NdisBuffer;
    PVOID Address;

    DbgPrint("Badly formed NDIS packet at line %d\n", Line);

    NdisQueryPacket(Packet, &PhysBufCnt, &BufCnt, &NdisBuffer, &TotLen);

    DbgPrint("Packet:%08X  PhysBufCnt:%d BufCnt:%d TotLen:%d\n",
             Packet, PhysBufCnt, BufCnt, TotLen);

    while (NdisBuffer)
    {
        NdisQueryBuffer(NdisBuffer, &Address, &Len);

        DbgPrint("   Buffer:%08X Address:%08X Length:%d\n",
                 NdisBuffer, Address, Len);
        NdisGetNextBuffer(NdisBuffer, &NdisBuffer);
    }

    DbgBreakPoint();

}

#define VerifyNdisPacket(p, b) \
{                                                       \
    UINT BufCnt;                                        \
                                                        \
    NdisQueryPacket((p), NULL, &BufCnt, NULL, NULL);    \
    if (BufCnt>(b))                                     \
    {                                                   \
        DumpNdisPacket((p), __LINE__);                  \
    }                                                   \
}
#else
#define VerifyNdisPacket(p,b)
#define LOG_InsertHeadList(d, h, e)
#define LOG_InsertTailList(d, h, e)
#define LOG_RemoveHeadList(d, h, e)
#define LOG_RemoveEntryList(d, e)
#define LOG_PacketChain(d, p)
#define LOG_PacketUnchain(d, p)
#define LOG_Dma(d)
#define LOG_Data(d,s)
#define LOG_Data2(d,s)
#endif


#ifdef UNDER_CE
//
// Debugging information.
//

#ifdef DEBUG

DBGPARAM dpCurSettings =
{
        TEXT("NSCIrda"),
        {
            TEXT("Init"),       TEXT("SirMode"),
            TEXT("FirMode"),    TEXT("Tx"),
            TEXT("Rx"),         TEXT("TxTrace"),
            TEXT("Packet"),     TEXT("Isr"),
            TEXT("Dma"),        TEXT("Undefined"),
            TEXT("Stat"),       TEXT("Log"),
            TEXT("Buffer"),     TEXT("Msg"),
            TEXT("Warn"),       TEXT("Error")
        },
		0
//			((1 << 8) | (1 << 3) | (1 << 4))
//        0x00008000 | (1 << 8)
//		0xdfff
//		0xffff
//		((1 << 1) | (1 << 6) | (1 << 7) | (1 << 9) | (1 << 15))
};

#endif // DEBUG

PVOID g_pvDmaVirtualBase;

BOOL WINAPI
DllEntry(
    HANDLE hInstDll,
    DWORD  Op,
    LPVOID lpvReserved
    )
{
    ULONG nTmpVal;

	DBGOUT((TEXT("==>DllEntry")));
    switch (Op)
    {
        case DLL_PROCESS_ATTACH:

            DEBUGREGISTER((HMODULE)hInstDll);
            IRFIR_LOG_INIT();
            DEBUGMSG(ZONE_INIT, (TEXT("NscFir: DLL Process Attach.\r\n")));

            //
            // Windows CE. Allocate contiguous memory from drivers globals. See
            // externs.h.
            // Need to get virtual pointer to our DMA physical.
            //
        
            // Check to make sure that our buffer requirements have not changed.
            ASSERT((NUM_RCV_BUFS * RCV_BUFFER_SIZE) == 33024);
            ASSERT((RCV_BUFFER_SIZE + MAX_IRDA_DATA_SIZE * 8) == 35264);
            ASSERT(RCV_DMA_SIZE == 18504);

            g_pvDmaVirtualBase = VirtualAlloc(
                0, NSCIRDA_DMA_BUFFER_LEN, 
                MEM_RESERVE, PAGE_NOACCESS);
        
            if (g_pvDmaVirtualBase == NULL)
            {
                return (FALSE);
            }
        
            nTmpVal = VirtualCopy(
                g_pvDmaVirtualBase,
                (LPVOID)(NSCIRDA_DMA_BUFFER_BASE_PA | 0x80000000),
                NSCIRDA_DMA_BUFFER_LEN,
                PAGE_READWRITE | PAGE_NOCACHE);
        
            if (nTmpVal != TRUE)
            {
                return (FALSE);
            }
        
        	if(AllocateFirRegs() != TRUE)
			{
				return (FALSE);
			}

            break;

        case DLL_PROCESS_DETACH:

            DEBUGMSG(ZONE_INIT, (TEXT("NscFir: DLL Process Detach.\r\n")));

            // Free our virtual address.
            if (g_pvDmaVirtualBase)
            {
                VirtualFree(
                    g_pvDmaVirtualBase, 
                    0, 
                    MEM_RELEASE);

                g_pvDmaVirtualBase = NULL;
            }
        
        	FreeFirRegs();

            break;

        default:
            break;
    }

	DBGOUT((TEXT("<==DllEntry")));

    return (TRUE);
}

#endif // UNDER_CE

/*
 *************************************************************************
 *  MiniportCheckForHang
 *************************************************************************
 *
 *  Reports the state of the network interface card.
 *

⌨️ 快捷键说明

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