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

📄 nsc.c

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

VOID DisplayRegs()
{
UCHAR bank;
UCHAR imstcr;

//		RETAILMSG(1,(TEXT("---------INTC---------\r\n")));
//		RETAILMSG(1,(TEXT("pNIMR=	%8x\r\n"), READ_REGISTER_USHORT(pNIMR)));
//		RETAILMSG(1,(TEXT("---------PMSC---------\r\n")));
//		RETAILMSG(1,(TEXT("pSMSCR=	%8x\r\n"), READ_REGISTER_USHORT(pSMSCR)));
//		RETAILMSG(1,(TEXT("pSCONFR=	%8x\r\n"), READ_REGISTER_USHORT(pSCONFR)));
//		RETAILMSG(1,(TEXT("pSPLLCR=	%8x\r\n"), READ_REGISTER_USHORT(pSPLLCR)));
//		RETAILMSG(1,(TEXT("pSRR=	%8x\r\n"), READ_REGISTER_USHORT(pSRR)));
//		RETAILMSG(1,(TEXT("--------UART Register of FIR Portion----------\r\n")));
//		RETAILMSG(1,(TEXT("pIrIER=	%8x\r\n"), READ_REGISTER_UCHAR(pIrIER)));
//		RETAILMSG(1,(TEXT("pIrIIR=	%8x\r\n"), READ_REGISTER_UCHAR(pIrIIR)));
//		RETAILMSG(1,(TEXT("pIrLCR=	%8x\r\n"), READ_REGISTER_UCHAR(pIrLCR)));
//		RETAILMSG(1,(TEXT("pIrMCR=	%8x\r\n"), READ_REGISTER_UCHAR(pIrMCR)));
//		RETAILMSG(1,(TEXT("---------FIR Controller Register---------\r\n")));
		RETAILMSG(1,(TEXT("pISIRR=	%8x\r\n"), READ_REGISTER_UCHAR(pISIRR)));
		RETAILMSG(1,(TEXT("pIFIRCR=	%8x\r\n"), READ_REGISTER_UCHAR(pIFIRCR)));
		RETAILMSG(1,(TEXT("pITMCR=	%8x\r\n"), READ_REGISTER_UCHAR(pITMCR)));
		bank = imstcr = READ_REGISTER_UCHAR(pIMSTCR);
		bank &= CC_FIR_IMSTCR_RST_BANK;
		WRITE_REGISTER_UCHAR(pIMSTCR, bank);//bank0
		RETAILMSG(1,(TEXT("---------BANK0---------\r\n")));
		RETAILMSG(1,(TEXT("pIMSTCR=	%8x\r\n"), READ_REGISTER_UCHAR(pIMSTCR)));
		RETAILMSG(1,(TEXT("pITC1R=	%8x\r\n"), READ_REGISTER_UCHAR(pITC1R)));
		RETAILMSG(1,(TEXT("pITC2R=	%8x\r\n"), READ_REGISTER_UCHAR(pITC2R)));
		RETAILMSG(1,(TEXT("pIRCR=	%8x\r\n"), READ_REGISTER_UCHAR(pIRCR)));
		WRITE_REGISTER_UCHAR(pIMSTCR, bank|CC_FIR_IMSTCR_BANK1);//bank1
		RETAILMSG(1,(TEXT("---------BANK1---------\r\n")));
		RETAILMSG(1,(TEXT("pIFAR=	%8x\r\n"), READ_REGISTER_UCHAR(pIFAR)));
		RETAILMSG(1,(TEXT("pIRBCLR=	%8x\r\n"), READ_REGISTER_UCHAR(pIRBCLR)));
		RETAILMSG(1,(TEXT("pIRBCHR=	%8x\r\n"), READ_REGISTER_UCHAR(pIRBCHR)));
		RETAILMSG(1,(TEXT("pIRRFPLR=	%8x\r\n"), READ_REGISTER_UCHAR(pIRRFPLR)));
		RETAILMSG(1,(TEXT("pIRRFPHR=	%8x\r\n"), READ_REGISTER_UCHAR(pIRRFPHR)));
		RETAILMSG(1,(TEXT("pITBCLR=	%8x\r\n"), READ_REGISTER_UCHAR(pITBCLR)));
		RETAILMSG(1,(TEXT("pITBCHR=	%8x\r\n"), READ_REGISTER_UCHAR(pITBCHR)));
		WRITE_REGISTER_UCHAR(pIMSTCR, bank|CC_FIR_IMSTCR_BANK2);//bank2
		RETAILMSG(1,(TEXT("---------BANK2---------\r\n")));
		RETAILMSG(1,(TEXT("pIIRC1R=	%8x\r\n"), READ_REGISTER_UCHAR(pIIRC1R)));
		RETAILMSG(1,(TEXT("pIIRTCR=	%8x\r\n"), READ_REGISTER_UCHAR(pIIRTCR)));
		RETAILMSG(1,(TEXT("pIIRC2R=	%8x\r\n"), READ_REGISTER_UCHAR(pIIRC2R)));
		RETAILMSG(1,(TEXT("pITMR=	%8x\r\n"), READ_REGISTER_UCHAR(pITMR)));
		RETAILMSG(1,(TEXT("pIIRC3R=	%8x\r\n"), READ_REGISTER_UCHAR(pIIRC3R)));
		WRITE_REGISTER_UCHAR(pIMSTCR, imstcr);
/*		RETAILMSG(1,(TEXT("---------DMAC---------\r\n")));
		RETAILMSG(1,(TEXT("pSAR0=	%8x\r\n"), READ_REGISTER_ULONG(pSAR0)));
		RETAILMSG(1,(TEXT("pDAR0=	%8x\r\n"), READ_REGISTER_ULONG(pDAR0)));
		RETAILMSG(1,(TEXT("pDMATCR0=	%8x\r\n"), READ_REGISTER_ULONG(pDMATCR0)));
		RETAILMSG(1,(TEXT("pCHCR0=	%8x\r\n"), READ_REGISTER_ULONG(pCHCR0)));
		RETAILMSG(1,(TEXT("pDMAOR=	%8x\r\n"), READ_REGISTER_ULONG(pDMAOR)));
*/
}

VOID SetRegs()
{
WRITE_REGISTER_UCHAR(pIrMCR, READ_REGISTER_UCHAR(pIrMCR)|SERIAL_MCR_IRQ_ENABLE);
WRITE_REGISTER_UCHAR(pIrLCR, SERIAL_8_DATA | SERIAL_1_STOP | SERIAL_NONE_PARITY);
}

//
// 1999-Oct-22 cea  Modified to use the HDSL-3600 IrDA transceiver
//
VOID SetFirMode()
{
	UCHAR imstcr;

	WRITE_REGISTER_UCHAR(pISIRR ,0x00); // Select FIR mode

	WRITE_REGISTER_UCHAR(pIFIRCR, READ_REGISTER_UCHAR(pIFIRCR) | CC_FIR_IFIRCR_TMODE);//Select IBM-like transceiver mode
	imstcr = READ_REGISTER_UCHAR(pIMSTCR);
	WRITE_REGISTER_UCHAR(pIMSTCR, (imstcr & CC_FIR_IMSTCR_RST_BANK) | CC_FIR_IMSTCR_BANK2);//Select Bank2

	WRITE_REGISTER_UCHAR(pIIRTCR, READ_REGISTER_UCHAR(pIIRTCR) | CC_FIR_IIRTCR_MODSEL);//MODESEL pin to HIGH

	WRITE_REGISTER_UCHAR(pIMSTCR, imstcr);//Select original Bank
}

//
// 1999-Oct-22 cea  Modified to use the HDSL-3600 IrDA transceiver
//
VOID SetSirMode()
{
	UCHAR imstcr;

	// The CC must be in FIR mode to change the state of the MODESEL pin
	WRITE_REGISTER_UCHAR(pISIRR ,0x00); // Select FIR mode

	WRITE_REGISTER_UCHAR(pIFIRCR, READ_REGISTER_UCHAR(pIFIRCR) | CC_FIR_IFIRCR_TMODE);//Select IBM-like transceiver mode
	imstcr = READ_REGISTER_UCHAR(pIMSTCR);
	WRITE_REGISTER_UCHAR(pIMSTCR, (imstcr & CC_FIR_IMSTCR_RST_BANK) | CC_FIR_IMSTCR_BANK2);//Select Bank2

	WRITE_REGISTER_UCHAR(pIIRTCR, READ_REGISTER_UCHAR(pIIRTCR) & ~CC_FIR_IIRTCR_MODSEL);//MODESEL pin to LOW
	
	WRITE_REGISTER_UCHAR(pIMSTCR, imstcr);//Select original Bank

	WRITE_REGISTER_UCHAR(pISIRR ,CC_FIR_ISIRR_SIRMOD); // Select SIR mode
}

#ifdef OUTMSG
void DumpNdisPacket(PNDIS_PACKET Packet, UINT Line)
{
    UINT PhysBufCnt, BufCnt, TotLen, Len,i;
    PNDIS_BUFFER NdisBuffer;
    PVOID Address;
    UCHAR buf[35],buf2[35];

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

//	RETAILMSG(1,(TEXT("Packet:%08X  PhysBufCnt:%d BufCnt:%d TotLen:%d\n"),Packet, PhysBufCnt, BufCnt, TotLen));

    while (NdisBuffer)
    {
		for(i=0;i<35;i++){
			buf[i]=buf2[i]=0xff;
		}
    
        NdisQueryBuffer(NdisBuffer, &Address, &Len);
//		RETAILMSG(1,(TEXT("   Buffer:%08X Address:%08X Length:%d\n"),NdisBuffer, Address, Len));
		for(i=0;i<Len;i++){
			buf[i]= *((UCHAR*)((long)Address + i));
			if( *((UCHAR*)((long)Address + i)) != 0x00 ){
				buf2[i]= *((UCHAR*)((long)Address + i));
			}
		}

		if(Len <= 2){
			RETAILMSG(1,(TEXT("Length:%d  0x%x[%c]0x%x[%c]\r\n"),Len,buf[0],buf2[0],buf[1],buf2[1]));
		}else 
		if(Len > 2 && Len <= 10){
			RETAILMSG(1,(TEXT("Length:%d  0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]\r\n")
			,Len,buf[0],buf2[0],buf[1],buf2[1],buf[2],buf2[2],buf[3],buf2[3],buf[4],buf2[4],buf[5],buf2[5],buf[6],buf2[6],buf[7],buf2[7],buf[8],buf2[8],buf[9],buf2[9]));
		}else
		if(Len > 10 && Len <= 20){
			RETAILMSG(1,(TEXT("Length:%d  0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]\r\n")
			,Len
			,buf[0],buf2[0],buf[1],buf2[1],buf[2],buf2[2],buf[3],buf2[3],buf[4],buf2[4],buf[5],buf2[5],buf[6],buf2[6],buf[7],buf2[7],buf[8],buf2[8],buf[9],buf2[9]
			,buf[10],buf2[10],buf[11],buf2[11],buf[12],buf2[12],buf[13],buf2[13],buf[14],buf2[14],buf[15],buf2[15],buf[16],buf2[16],buf[17],buf2[17],buf[18],buf2[18],buf[19],buf2[19]));
		}else
		if(Len > 20 && Len <= 35){
			RETAILMSG(1,(TEXT("Length:%d  0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]\r\n")
			,Len
			,buf[0],buf2[0],buf[1],buf2[1],buf[2],buf2[2],buf[3],buf2[3],buf[4],buf2[4],buf[5],buf2[5],buf[6],buf2[6],buf[7],buf2[7],buf[8],buf2[8],buf[9],buf2[9]
			,buf[10],buf2[10],buf[11],buf2[11],buf[12],buf2[12],buf[13],buf2[13],buf[14],buf2[14],buf[15],buf2[15],buf[16],buf2[16],buf[17],buf2[17],buf[18],buf2[18],buf[19],buf2[19]
			,buf[20],buf2[20],buf[21],buf2[21],buf[22],buf2[22],buf[23],buf2[23],buf[24],buf2[24],buf[25],buf2[25],buf[26],buf2[26],buf[27],buf2[27],buf[28],buf2[28],buf[29],buf2[29]
			,buf[30],buf2[30],buf[31],buf2[31],buf[32],buf2[32],buf[33],buf2[33],buf[34],buf2[34]));
		}

        NdisGetNextBuffer(NdisBuffer, &NdisBuffer);
    }
}
#endif


BOOLEAN MiniportCheckForHang(NDIS_HANDLE MiniportAdapterContext)
{
/******************************************************************************
 * Modification Done by Maneesh Gupta
 *
 * Debug Messages has been removed 
 *****************************************************************************/
#if 0
		LOG(TEXT("==> MiniportCheckForHang"), 0);
    DBGOUT((TEXT("==> MiniportCheckForHang(0x%x)\r\n"),
            (UINT)MiniportAdapterContext));
    LOG(TEXT("<== MiniportCheckForHang"), 1);
    DBGOUT((TEXT("<== MiniportCheckForHang(0x%x)\r\n"),
            (UINT)MiniportAdapterContext));
#endif 0
/******************************************************************************
 * End of modification Done by Maneesh Gupta
 *****************************************************************************/
    return FALSE;
	
}


/*
 *************************************************************************
 *  MiniportDisableInterrupt
 *************************************************************************
 *
 *  Disables the NIC from generating interrupts.
 *
 */
VOID MiniportDisableInterrupt(NDIS_HANDLE MiniportAdapterContext)
{
    IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);

    LOG(TEXT("==> MiniportDisableInterrupt"), 0);
    DBGOUT((TEXT("==> MiniportDisableInterrupt(0x%x)"),

        (UINT)MiniportAdapterContext));
    if (!thisDev->resourcesReleased){
        thisDev->intEnabled = FALSE;
 
		SetCOMInterrupts(thisDev, FALSE);

    }

    LOG(TEXT("<== MiniportDisableInterrupt"), 1);
    DBGOUT((TEXT("<== MiniportDisableInterrupt(0x%x)"),
        (UINT)MiniportAdapterContext));
}


/*
 *************************************************************************
 *  MiniportEnableInterrupt
 *************************************************************************
 *
 *  Enables the IR card to generate interrupts.
 *
 */
VOID MiniportEnableInterrupt(IN NDIS_HANDLE MiniportAdapterContext)
{
    IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);

    LOG(TEXT("==> MiniportEnableInterrupt"), 0);
    DBGOUT((TEXT("==> MiniportEnableInterrupt(0x%x)"),
            (UINT)MiniportAdapterContext));
    if (!thisDev->resourcesReleased){
        thisDev->intEnabled = TRUE;

		SetCOMInterrupts(thisDev, TRUE);

    }
    LOG(TEXT("<== MiniportEnableInterrupt"), 1);
    DBGOUT((TEXT("<== MiniportEnableInterrupt(0x%x)"),
            (UINT)MiniportAdapterContext));
}


/*
 *************************************************************************
 *  MiniportHalt
 *************************************************************************
 *
 *  Halts the network interface card.
 *
 */
VOID MiniportHalt(IN NDIS_HANDLE MiniportAdapterContext)
{
    IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);

    LOG(TEXT("==> MiniportHalt"), 0);
    DBGOUT((TEXT("==> MiniportHalt(0x%x)"), (UINT)MiniportAdapterContext));

    /*
     *  Remove this device from our global list
     */

    if (thisDev == firstIrDevice){
        firstIrDevice = firstIrDevice->next;
    }
    else {
        IrDevice *dev;
        for (dev = firstIrDevice; dev && (dev->next != thisDev);
            dev = dev->next){}
        if (dev) {
            dev->next = dev->next->next;
        }
        else {
            /*
             * Don't omit this error check.  I've seen NDIS call
             * MiniportHalt with a bogus context when the system
             * gets corrupted.
             */
            LOG(TEXT("Error: Bad context in MiniportHalt"), 0);
            DBGERR((TEXT("Bad context in MiniportHalt")));
            return;
        }
    }


    /*
     *  Now destroy the device object.
     */
    NSC_Shutdown(thisDev);
    DoClose(thisDev);
    NdisMDeregisterIoPortRange(thisDev->ndisAdapterHandle,
                               thisDev->portInfo.ioBase, 8, (PVOID)thisDev->mappedPortRange);
    FreeDevice(thisDev);
    LOG(TEXT("<== MiniportHalt"), 1);
    DBGOUT((TEXT("<== MiniportHalt(0x%x)"), (UINT)MiniportAdapterContext));
}


/*
 *************************************************************************
 *  MiniportSyncHandleInterrupt
 *************************************************************************
 *
 * This function is called from MiniportHandleInterrupt via
 * NdisMSynchronizeWithInterrupt to synchronize with MiniportISR.  This is
 * required because the deferred procedure call (MiniportHandleInterrupt)
 * shares data with MiniportISR but cannot achieve mutual exclusion with a
 * spinlock because ISR's are not allowed to acquire spinlocks.
 * This function should be called WITH DEVICE LOCK HELD, however, to
 * synchronize with the rest of the miniport code (besides the ISR).
 * The device's IRQ is masked out in the PIC while this function executes,
 * so don't make calls up the stack.
 */  
BOOLEAN MiniportSyncHandleInterrupt(PVOID MiniportAdapterContext)
{
    IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);

    // QueueLock should be held.

    LOG(TEXT("==> MiniportSyncHandleInterrupt"), 0);
    DBGOUT((TEXT("==> MiniportSyncHandleInterrupt(0x%x)"),
            (UINT)MiniportAdapterContext));

#if 0 // Since we're using queues, this function doesn't really do anything.
    /*
     *  Update .firstRcvBufIndex and .lastRcvBufIndex.
     */
    while ((thisDev->firstRcvBufIndex != NO_BUF_INDEX) &&
           (thisDev->rcvBufs[thisDev->firstRcvBufIndex].state ==
            STATE_FREE)) {

        if (thisDev->firstRcvBufIndex == thisDev->lastRcvBufIndex) {
            thisDev->firstRcvBufIndex =
            thisDev->lastRcvBufIndex = NO_BUF_INDEX;
        }
        else {
            thisDev->firstRcvBufIndex =
            NEXT_RCV_BUF_INDEX(thisDev->firstRcvBufIndex);
        }
    }
#endif

    LOG(TEXT("<== MiniportSyncHandleInterrupt"), 1);
    DBGOUT((TEXT("<== MiniportSyncHandleInterrupt(0x%x)"),
            (UINT)MiniportAdapterContext));
    return TRUE;
}

void InterlockedInsertBufferSorted(PLIST_ENTRY Head,
                                   rcvBuffer *rcvBuf,
                                   PNDIS_SPIN_LOCK Lock)
{
    PLIST_ENTRY ListEntry;

	DBGOUT((TEXT("==>InterlockedInsertBufferSorted")));
    NdisAcquireSpinLock(Lock);
    if (IsListEmpty(Head))
    {
        InsertHeadList(Head, &rcvBuf->listEntry);
    }
    else
    {
        BOOLEAN EntryInserted = FALSE;
        for (ListEntry = Head->Flink;
             ListEntry != Head;
             ListEntry = ListEntry->Flink)
        {
            rcvBuffer *temp = CONTAINING_RECORD(ListEntry,
                                                rcvBuffer,
                                                listEntry);
            if (temp->dataBuf > rcvBuf->dataBuf)
            {
                // We found one that comes after ours.  
                // We need to insert before it

                InsertTailList(ListEntry, &rcvBuf->listEntry);
                EntryInserted = TRUE;
                break;
            }
        }
        if (!EntryInserted)
        {
            // We didn't find an entry on the last who's address was later
            // than our buffer.  We go at the end.
            InsertTailList(Head, &rcvBuf->listEntry);
        }
    }
    NdisReleaseSpinLock(Lock);

	DBGOUT((TEXT("<==InterlockedInsertBufferSorted")));
}

/*
 *************************************************************************
 *  DeliverFullBuffers
 *************************************************************************
 *
 *  Deliver received packets to the protocol.
 *  Return TRUE if delivered at least one frame.

⌨️ 快捷键说明

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