📄 pl011pdd.c
字号:
// 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 + -