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

📄 scif_cmn.c

📁 WinCE5.0BSP for Renesas SH7770
💻 C
📖 第 1 页 / 共 3 页
字号:

    DEBUGMSG (ZONE_THREAD, (TEXT("-SCIF_RxIntr - rx'ed %d, dropped %d.\r\n"),
                  *pBufflen,
                  pHWHead->DroppedBytes));

    RetVal = pHWHead->DroppedBytes;
    pHWHead->DroppedBytes = 0;

    return RetVal;
}

//
// @doc OEM
// @func ULONG | SCIF_LineIntr | This routine is called from the MDD
//   whenever INTR_LINE is returned by SCIF_GetInterruptType.
// 
// @rdesc None
//
VOID
SCIF_LineIntr(
    PVOID pHead                // Hardware Head
    )
{
    PSCIF_INFO   pHWHead	= (PSCIF_INFO)pHead;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_LineIntr 0x%X\r\n"), pHead));

    ReadStatus( pHWHead );

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_LineIntr 0x%X\r\n"), pHead));
}

//
// @doc OEM
// @func ULONG | SCIF_OtherIntr | This routine is called from the MDD
//   whenever INTR_MODEM is returned by SCIF_GetInterruptType.
// 
// @rdesc None
//
VOID
SCIF_OtherIntr(
    PVOID pHead                // Hardware Head
    )
{
    PSCIF_INFO   pHWHead	= (PSCIF_INFO)pHead;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_OtherIntr 0x%X\r\n"), pHead));

    ReadModemStatus( pHWHead );

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_OtherIntr 0x%X\r\n"), pHead));
}



//
// @doc OEM
// @func	ULONG | SCIF_Reset | Perform any operations associated
//   with a device reset
//
// @rdesc	None.
//
VOID
SCIF_Reset(
    PVOID   pHead	// @parm PVOID returned by HWInit.
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_Reset 0x%X\r\n"), pHead));

    memset(&pHWHead->Status, 0, sizeof(COMSTAT));

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_Reset 0x%X\r\n"), pHead));
}

//
// @doc OEM
// @func	VOID | SCIF_GetModemStatus | Retrieves modem status.
//
// @rdesc	None.
//
VOID
SCIF_GetModemStatus(
    PVOID   pHead,	    // @parm PVOID returned by HWInit.
    PULONG  pModemStatus    // @parm PULONG passed in by user.
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    USHORT	MSR;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_GetModemStatus 0x%X\r\n"), pHead));

    MSR = ReadModemStatus( pHWHead );

    *pModemStatus = pHWHead->ModemStatus;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_GetModemStatus 0x%X\r\n"), pHead));
    return;
}

//
// @doc OEM
// @func	VOID | SCIF_PurgeComm | Purge RX and/or TX
// 
// @rdesc	None.
//

VOID
SCIF_PurgeComm(
    PVOID   pHead,	    // @parm PVOID returned by HWInit.
    DWORD   fdwAction	    // @parm Action to take. 
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    USHORT	FCR;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_PurgeComm 0x%X\r\n"), pHead));

    try
    {
        FCR = READ_REGISTER_USHORT(pHWHead -> pFCR);
        if ( fdwAction & PURGE_TXCLEAR )
        {
            WRITE_REGISTER_USHORT(pHWHead -> pFCR, FCR | SCIF_FCR_TFRST);
            WRITE_REGISTER_USHORT(pHWHead -> pFCR, FCR);
        }

        if ( fdwAction & PURGE_RXCLEAR )
        {
            WRITE_REGISTER_USHORT(pHWHead -> pFCR, FCR | SCIF_FCR_RFRST);
            WRITE_REGISTER_USHORT(pHWHead -> pFCR, FCR);
        }
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Just exit
    }
    
    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_PurgeComm 0x%X\r\n"), pHead));
    return;
}

//
// @doc OEM
// @func	BOOL | SCIF_XmitComChar | Transmit a char immediately
// 
// @rdesc	TRUE if succesful
//
BOOL
SCIF_XmitComChar(
    PVOID   pHead,    // @parm PVOID returned by HWInit.
    UCHAR   ComChar   // @parm Character to transmit. 
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    
    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_XmitComChar 0x%X\r\n"), pHead));

     // Get critical section, then transmit when buffer empties
    DEBUGMSG (ZONE_WRITE, (TEXT("XmitComChar wait for CritSec %x.\r\n"),
                           &(pHWHead->TransmitCritSec)));
    EnterCriticalSection(&(pHWHead->TransmitCritSec));
    DEBUGMSG (ZONE_WRITE, (TEXT("XmitComChar got CritSec %x.\r\n"),
                           &(pHWHead->TransmitCritSec)));
    try
    {
        while( TRUE )  // We know THR will eventually empty
        {
            if ( READ_REGISTER_USHORT(pHWHead -> pFSR) & SCIF_SSR_TDFE ){
                WRITE_REGISTER_UCHAR(pHWHead -> pFTDR, ComChar);
                DEBUGMSG (ZONE_WRITE, (TEXT("XmitComChar wrote x%X\r\n"),
                                         ComChar));
                break;
            }

            // If we couldn't write the data yet, then wait for a
            // TXINTR to come in and try it again.
            
            // Enable xmit intr.
            WRITE_REGISTER_USHORT(pHWHead -> pSCR, READ_REGISTER_USHORT(pHWHead -> pSCR) | SCIF_SCR_TIE);
             // Wait until the txintr has signalled.
            DEBUGMSG (ZONE_WRITE, (TEXT("XmitComChar WaitIntr x%X\r\n"),
                                     pHWHead->FlushDone));
            WaitForSingleObject(pHWHead->FlushDone, (ULONG)1000);
        }
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Just exit
    }
    
    LeaveCriticalSection(&(pHWHead->TransmitCritSec));
    DEBUGMSG (ZONE_WRITE, (TEXT("XmitComChar released CritSec %x.\r\n"),
                           &(pHWHead->TransmitCritSec)));
    
    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_XmitComChar 0x%X\r\n"), pHead));
    
    return TRUE;
}

//
// @doc OEM
// @func	BOOL | SCIF_PowerOff | Perform powerdown sequence.
// 
// @rdesc	TRUE if succesful
//
BOOL
SCIF_PowerOff(
    PVOID   pHead	    // @parm	PVOID returned by HWInit.
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;

    pHWHead -> SMR = READ_REGISTER_USHORT(pHWHead -> pSMR);
    pHWHead -> BRR = READ_REGISTER_USHORT(pHWHead -> pBRR);
    pHWHead -> SCR = READ_REGISTER_USHORT(pHWHead -> pSCR);
    pHWHead -> FCR = READ_REGISTER_USHORT(pHWHead -> pFCR);
    pHWHead -> BRGDL = READ_REGISTER_USHORT(pHWHead -> pBRGDL);
    pHWHead -> BRGCKS = READ_REGISTER_USHORT(pHWHead -> pBRGCKS);
    if ( pHWHead -> pSCSMR )
        pHWHead -> SCSMR = (USHORT)READ_REGISTER_ULONG(pHWHead -> pSCSMR);

    SerSetOutputMode( pHWHead, FALSE, FALSE );

    return TRUE;
}

//
// @doc OEM
// @func	BOOL | SCIF_PowerOn | Perform poweron sequence.
// 
// @rdesc	TRUE if succesful
//
BOOL
SCIF_PowerOn(
    PVOID   pHead	    // @parm	PVOID returned by HWInit.
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    DWORD	dcr_value;

    WRITE_REGISTER_USHORT(pHWHead -> pFCR, pHWHead -> FCR);
    WRITE_REGISTER_USHORT(pHWHead -> pBRGDL, pHWHead -> BRGDL);
    WRITE_REGISTER_USHORT(pHWHead -> pBRGCKS, pHWHead -> BRGCKS);
    WRITE_REGISTER_USHORT(pHWHead -> pSMR, pHWHead -> SMR);
    WRITE_REGISTER_USHORT(pHWHead -> pBRR, pHWHead -> BRR);
    WRITE_REGISTER_USHORT(pHWHead -> pSCR, pHWHead -> SCR);
    if ( pHWHead -> pSCSMR )
        WRITE_REGISTER_ULONG(pHWHead -> pSCSMR, pHWHead -> SCSMR);

     // And we didn't save the Divisor Reg, so set baud rate
    SCIF_SetBaudRate( pHWHead, pHWHead->dcb.BaudRate );

    pHWHead->ulReceiveDmaBufferPointer = 0;

    dcr_value = DCR_DPDS_8BIT		|
                DCR_DDRMD_MODULE	|
                DCR_DPDAM_FIX	 	|
		DCR_DMDL_MEMORY		|
		DCR_SPDS_8BIT		|
		DCR_SDRMD_MODULE	|
		DCR_SPDAM_FIX		|
		DCR_SMDL_PERIPHERAL	|
		DCR_DIP_2PAGE		|
		DCR_ACMD_ENABLE		|
		DCR_CT_ENABLE		|
		DCR_PKMD_DISABLE	|
		DCR_BTMD_DISABLE	|
		DCR_DTAU_BYTE		|
		DCR_DTAC_DISABLE	|
		DCR_DTAMD_DTAC		;

    dma_SetPage(pHWHead -> pRxDma, 0, pHWHead -> ulRxDmaRegBase,
					   pHWHead -> ulRxDmaBuffBase1,  pHWHead -> ulRxDmaBuffSize);
    dma_SetPage(pHWHead -> pRxDma, 1, pHWHead -> ulRxDmaRegBase,
					   pHWHead -> ulRxDmaBuffBase2,  pHWHead -> ulRxDmaBuffSize); 
    dma_SetPort(pHWHead -> pRxDma, pHWHead -> dwRxDmaPort);
    dma_SetControl(pHWHead -> pRxDma, dcr_value);
    dma_SetCommand(pHWHead -> pRxDma, DCMDR_DMEN);

#if (SH7770_REVISION == SH7770_1STCUT)
		WRITE_REGISTER_USHORT(pHWHead -> pSCR,
				 SCIF_SCR_TOIE|SCIF_SCR_TE|SCIF_SCR_RE|SCIF_SCR_REIE|SCIF_SCR_CKE_2|SCIF_SCR_RIE);
#else
		WRITE_REGISTER_USHORT(pHWHead -> pSCR,
				 SCIF_SCR_TOIE|SCIF_SCR_TE|SCIF_SCR_RE|SCIF_SCR_REIE|SCIF_SCR_CKE_2);
#endif

    dma_InterruptEnable(pHWHead -> pRxDma);

    return TRUE;
}

//
// @doc OEM
// @func	BOOL | SCIF_SetDCB | Sets new values for DCB.  This
// routine gets a DCB from the MDD.  It must then compare
// this to the current DCB, and if any fields have changed take
// appropriate action.
// 
// @rdesc	ULONG
//
ULONG
SCIF_SetDCB(
    PVOID   pHead,	    // @parm	PVOID returned by HWInit.
    LPDCB   lpDCB       // @parm    Pointer to DCB structure
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    ULONG	ret = TRUE;
    
    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_SetDCB 0x%X\r\n"), pHead));

	while( !(READ_REGISTER_USHORT(pHWHead -> pFSR) & SCIF_SSR_TEND) );

     // If the device is open, scan for changes and do whatever
     // is needed for the changed fields.  if the device isn't
     // open yet, just save the DCB for later use by the open.
    if( pHWHead->OpenCount )
    {
         // Note, fparity just says whether we should check
         // receive parity.  And the 16550 won't let us NOT
         // check parity if we generate it.  So this field
         // has no effect on the hardware.

		DEBUGMSG (ZONE_FUNCTION, (TEXT(" SCIF_SetDCB SetBaudRate[%d]-->[%d]\r\n"), pHWHead->dcb.BaudRate,lpDCB->BaudRate));
		DEBUGMSG (ZONE_FUNCTION, (TEXT(" SCIF_SetDCB SetByteSize[%d]-->[%d]\r\n"), pHWHead->dcb.ByteSize,lpDCB->ByteSize));
		DEBUGMSG (ZONE_FUNCTION, (TEXT(" SCIF_SetDCB SetParity[%d]-->[%d]\r\n"), pHWHead->dcb.Parity,lpDCB->Parity));
		DEBUGMSG (ZONE_FUNCTION, (TEXT(" SCIF_SetDCB SetStopBits[%d]-->[%d]\r\n"), pHWHead->dcb.StopBits,lpDCB->StopBits));

        if( lpDCB->BaudRate != pHWHead->dcb.BaudRate )
        {
            ret = SCIF_SetBaudRate( pHWHead, lpDCB->BaudRate );
        }
    
        if( lpDCB->ByteSize != pHWHead->dcb.ByteSize )
        {
            ret = SCIF_SetByteSize( pHWHead, lpDCB->ByteSize );
        }
    
        if( lpDCB->Parity != pHWHead->dcb.Parity )
        {
            ret = SCIF_SetParity( pHWHead, lpDCB->Parity );
        }
    
        if( lpDCB->StopBits != pHWHead->dcb.StopBits )
        {
            ret = SCIF_SetStopBits( pHWHead, lpDCB->StopBits );
        }

         // Don't worry about fOutxCtsFlow.  It is a flag which
         // will be examined every time we load the TX buffer.
         // No special action required here.
    }
    
     // Now that we have done the right thing, store this DCB
    pHWHead->dcb = *lpDCB;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_SetDCB 0x%X\r\n"), pHead));

    return ret;
}

//
// @doc OEM
// @func	BOOL | SCIF_SetCommTimeouts | Sets new values for the
// CommTimeouts structure. routine gets a DCB from the MDD.  It
// must then compare this to the current DCB, and if any fields
// have changed take appropriate action.
// 
// @rdesc	ULONG
//
ULONG
SCIF_SetCommTimeouts(
    PVOID   pHead,	    // @parm	PVOID returned by HWInit.
    LPCOMMTIMEOUTS   lpCommTimeouts // @parm Pointer to CommTimeout structure
    )
{
    PSCIF_INFO pHWHead = (PSCIF_INFO)pHead;
    ULONG retval = 0;
    
    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("+SCIF_SetCommTimeout 0x%X\r\n"), pHead));

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT(" SCIF_SetCommTimeouts (%d,%d,%d,%d,%d)\r\n"),
               ((COMMTIMEOUTS *)lpCommTimeouts)->ReadIntervalTimeout,
               ((COMMTIMEOUTS *)lpCommTimeouts)->ReadTotalTimeoutMultiplier,
               ((COMMTIMEOUTS *)lpCommTimeouts)->ReadTotalTimeoutConstant,
               ((COMMTIMEOUTS *)lpCommTimeouts)->WriteTotalTimeoutMultiplier,
               ((COMMTIMEOUTS *)lpCommTimeouts)->WriteTotalTimeoutConstant));

     // OK, first check for any changes and act upon them
    if( lpCommTimeouts->WriteTotalTimeoutMultiplier !=
        pHWHead->CommTimeouts.WriteTotalTimeoutMultiplier )
    {
    }
    
     // Now that we have done the right thing, store this DCB
    pHWHead->CommTimeouts = *lpCommTimeouts;

    DEBUGMSG (ZONE_FUNCTION,
              (TEXT("-SCIF_SetCommTimeout 0x%X\r\n"), pHead));

    return retval;
}

//
//  @doc OEM
//  @func	BOOL | SCIF_Ioctl | Device IO control routine.  
//  @parm DWORD | dwOpenData | value returned from COM_Open call
//	@parm DWORD | dwCode | io control code to be performed
//	@parm PBYTE | pBufIn | input data to the device
//	@parm DWORD | dwLenIn | number of bytes being passed in
//	@parm PBYTE | pBufOut | output data from the device
//	@parm DWORD | dwLenOut |maximum number of bytes to receive from device
//	@parm PDWORD | pdwActualOut | actual number of bytes received from device
//
//	@rdesc		Returns TRUE for success, FALSE for failure
//
//  @remark  The MDD will pass any unrecognized IOCTLs through to this function.
//
BOOL
SCIF_Ioctl(PVOID pHead,
           DWORD dwCode,
           PBYTE pBufIn,
           DWORD dwLenIn,
           PBYTE pBufOut,
           DWORD dwLenOut,
           PDWORD pdwActualOut)
{
    BOOL RetVal = TRUE;
    DEBUGMSG (ZONE_FUNCTION, (TEXT("+SCIF_Ioctl 0x%X\r\n"), pHead));
    switch (dwCode) {

        // Currently, no defined IOCTLs
        default:
            RetVal = FALSE;
            DEBUGMSG (ZONE_FUNCTION, (TEXT(" Unsupported ioctl 0x%X\r\n"), dwCode));
            break;            
	}
    DEBUGMSG (ZONE_FUNCTION, (TEXT("-SCIF_Ioctl 0x%X\r\n"), pHead));
    return RetVal;
}

/*
 @doc OEM
 @func	VOID | SCIF_GetCommProperties | Retrieves Comm Properties.
 *
 @rdesc	None.
 */
VOID
SCIF_GetCommProperties(
    PVOID	pHead,	    // @parm PVOID returned by SerInit. 
    LPCOMMPROP	pCommProp   // @parm Pointer to receive COMMPROP structure. 
    )
{
    PSCIF_INFO	pHWHead = (PSCIF_INFO)pHead;

    *pCommProp = pHWHead->CommProp;
    return;
}

⌨️ 快捷键说明

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