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

📄 pl011pdd.c

📁 ARM9基于WINDOWSCE的BSP源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
            
            // Next stop/cancel any activity
            StopDMAParams.ucChannelNumber = pUDma->ucRxDMAChannel;
            if(!KernelIoControl(IOCTL_HAL_STOP_DMA_TRANSFER,
                &StopDMAParams, sizeof(StopDMAParams),
                &StopDMAResult, sizeof(StopDMAResult), &dwRet))
            {
                DEBUGMSG( ZONE_ERROR, 
                    (TEXT("PDD_PowerOff: Error - DMA channel(Rx) stop failed\r\n")));
                //return FALSE; - Carry on regardless
            }
            StopDMAParams.ucChannelNumber = pUDma->ucTxDMAChannel;
            if(!KernelIoControl(IOCTL_HAL_STOP_DMA_TRANSFER,
                &StopDMAParams, sizeof(StopDMAParams),
                &StopDMAResult, sizeof(StopDMAResult), &dwRet))
            {
                DEBUGMSG( ZONE_ERROR, 
                    (TEXT("PDD_PowerOff: Error - DMA channel(Tx) stop failed\r\n")));
                //return FALSE; - Carry on regardless
            }
        }
    }
*/

    return PL011PowerOff(pPDDContext->pPL011);
}


BOOL PDD_PowerOn(PDD_CONTEXT *pPDDContext)
{
    if (pPDDContext == NULL)
        return FALSE;

    // Note: We could try and restart the DMA transfer from here (like the following code)
    //  But we are not allowed to call a system IOCTL during power up, so we will leave it 
    //  to the kernel.
/*    
    if (pPDDContext->DMA_Enable)
    {
        PUART_DMA_INFO pUDma = &(pPDDContext->uart_DMA_Info);
        
        if( pUDma->OpenCnt)
        {
            RESTART_DMA_PARAMS RestartDMAParams;
            RESTART_DMA_RESULT RestartDMAResult;
            DWORD   dwRet;
            
            // Restart the DMA (though any transfers should have been cancelled)
            RestartDMAParams.ucChannelNumber = pUDma->ucRxDMAChannel;
            if(!KernelIoControl(IOCTL_HAL_RESTART_DMA_TRANSFER,
                &RestartDMAParams, sizeof(RestartDMAParams),
                &RestartDMAResult, sizeof(RestartDMAResult), &dwRet))
            {
                DEBUGMSG( ZONE_ERROR, 
                    (TEXT("PDD_PowerOn: Error - DMA channel(Rx) restart failed\r\n")));
                //return FALSE; - Carry on regardless
            }
            RestartDMAParams.ucChannelNumber = pUDma->ucTxDMAChannel;
            if(!KernelIoControl(IOCTL_HAL_RESTART_DMA_TRANSFER,
                &RestartDMAParams, sizeof(RestartDMAParams),
                &RestartDMAResult, sizeof(RestartDMAResult), &dwRet))
            {
                DEBUGMSG( ZONE_ERROR, 
                    (TEXT("PDD_PowerOn: Error - DMA channel(Tx) restart failed\r\n")));
                //return FALSE; - Carry on regardless
            }
        }
    }
*/
    return PL011PowerOn(pPDDContext->pPL011);
}


VOID PDD_ClearDTR(PDD_CONTEXT *pPDDContext)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_ClearDTR(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011ClearDTR(pPDDContext->pPL011));

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_ClearDTR()")));
}


VOID PDD_SetDTR(PDD_CONTEXT *pPDDContext)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_SetDTR(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011SetDTR(pPDDContext->pPL011));

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_SetDTR()")));
}


VOID PDD_ClearRTS(PDD_CONTEXT *pPDDContext)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_ClearRTS(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011ClearRTS(pPDDContext->pPL011));

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_ClearRTS()")));
}


VOID PDD_SetRTS(PDD_CONTEXT *pPDDContext)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_SetRTS(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011SetRTS(pPDDContext->pPL011));

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_SetRTS()")));
}


BOOL PDD_EnableIR(PDD_CONTEXT *pPDDContext, ULONG BaudRate)
{
    BOOL fRC = FALSE;

    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_EnableIR(%#08x, %u)"), pPDDContext, BaudRate));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011SetBaudRate(pPDDContext->pPL011, BaudRate));

    EnterCriticalSection(&pPDDContext->cs);

    try
    {
    pPDDContext->fIRMode = TRUE;
    fRC = PL011SetOutputMode(pPDDContext->pPL011, pPDDContext->fIRMode, !pPDDContext->fIRMode);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        fRC = FALSE;
    }
    LeaveCriticalSection(&pPDDContext->cs);

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_EnableIR() %s"), SUCCEEDED_OR_FAILED(fRC)));

    return fRC;
}


BOOL PDD_DisableIR(PDD_CONTEXT *pPDDContext)
{
    BOOL fRC = FALSE;

    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_DisableIR(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    EnterCriticalSection(&pPDDContext->cs);
    try
    {
        pPDDContext->fIRMode = FALSE;
        fRC = PL011SetOutputMode(pPDDContext->pPL011, pPDDContext->fIRMode, !pPDDContext->fIRMode);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        fRC = FALSE;
    }

    LeaveCriticalSection(&pPDDContext->cs);

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_DisableIR() %s"), SUCCEEDED_OR_FAILED(fRC)));

    return fRC;
}


VOID PDD_ClearBreak(PDD_CONTEXT *pPDDContext)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_ClearBreak(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011ClearBreak(pPDDContext->pPL011));

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_ClearBreak()")));
}


VOID PDD_SetBreak(PDD_CONTEXT *pPDDContext)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_SetBreak(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011SetBreak(pPDDContext->pPL011));

    // NOTE: None of the serial port drivers, nor the MDD, ensure that the break condition is
    //        asserted for at least one complete frame transmission time. Applications must time
    //        the duration between SetCommBreak and ClearCommBreak to ensure expected behaviour.

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_SetBreak()")));
}


BOOL PDD_XmitComChar(PDD_CONTEXT *pPDDContext, UCHAR ComChar)
{
    BOOL fRC = FALSE;

    DEBUGMSG(ZONE_WRITE | ZONE_FUNCTION,
        (HEAD_TEXT("PDD_XmitComChar(%#08x, %#02x)"), pPDDContext, ComChar));

    VERIFY(PL011XmitComChar(pPDDContext->pPL011, ComChar, pPDDContext->hevTxReady));

    DEBUGMSG(ZONE_WRITE | ZONE_FUNCTION,
        (TAIL_TEXT("PDD_XmitComChar() %s"), SUCCEEDED_OR_FAILED(fRC)));

    return fRC;
}


ULONG PDD_GetStatus(PDD_CONTEXT *pPDDContext, LPCOMSTAT lpStat)
{
    // The return value should be -1 for failure, or else the actual accumulated errors flags
    //
    ULONG ulRC = -1;
    BOOL fCTSFlowOff;
    BOOL fDSRFlowOff;

    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_GetStatus(%#08x, %#08x)"), pPDDContext, lpStat));

    if ((pPDDContext == NULL) || (lpStat == NULL))
        goto exit_point;

    EnterCriticalSection(&pPDDContext->cs);

    try
    {
        // Save, for return, and clear the accumulated errors flags, thread-safely
        //
        ulRC = pPDDContext->fCommErrors;
        pPDDContext->fCommErrors = 0;

        // Take a snapshot of the PDD context's flow-state flags and un-block early
        //
        fCTSFlowOff = pPDDContext->fCTSFlowOff;
        fDSRFlowOff = pPDDContext->fDSRFlowOff;
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        ulRC = -1;
    }

    LeaveCriticalSection(&pPDDContext->cs);

    // The MDD fills in the COMSTAT's cbInQue and cbOutQue fields after we return
    //
    if (fCTSFlowOff)
        lpStat->fCtsHold = 1;
    else
        lpStat->fCtsHold = 0;

    if (fDSRFlowOff)
        lpStat->fDsrHold = 1;
    else
        lpStat->fDsrHold = 0;

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_GetStatus() %#08x"), ulRC));

    return ulRC;
}


VOID PDD_Reset(PDD_CONTEXT *pPDDContext)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_Reset(%#08x)"), pPDDContext));

    if (pPDDContext == NULL)
        goto exit_point;

    // Let's just draw attention if we get called; the MDD doesn't seem to use HWReset at all.
    //
    DEBUGCHK(FALSE);

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_Reset() %s"), SUCCEEDED_OR_FAILED(pPDDContext == NULL)));
}


VOID PDD_GetModemStatus(PDD_CONTEXT *pPDDContext, PULONG pModemStatus)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_GetModemStatus(%#08x, %#08x)"), pPDDContext, pModemStatus));

    if (pPDDContext == NULL)
        goto exit_point;

    VERIFY(PL011GetModemStatus(pPDDContext->pPL011, pModemStatus));

exit_point:

    DEBUGMSG(ZONE_FUNCTION,
        (TAIL_TEXT("PDD_GetModemStatus()")));
}


VOID PDD_GetCommProperties(PDD_CONTEXT *pPDDContext, LPCOMMPROP lpCommProp)
{
    DEBUGMSG(ZONE_FUNCTION,
        (HEAD_TEXT("PDD_GetCommProperties(%#08x, %#08x)"), pPDDContext, lpCommProp));

    if ((pPDDContext == NULL) || (lpCommProp == NULL))
        goto exit_point;

    EnterCriticalSection(&pPDDContext->cs);

    try
    {
    *lpCommProp = pPDDContext->CommProp;
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUT

⌨️ 快捷键说明

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