📄 bvd_ser_pdd.c
字号:
// Free the HWObj
LocalFree(pHWHead->pHWObj);
// And now free the SER_PDD_INFO structure.
LocalFree(pHWHead);
return(TRUE);
}
/*
@doc OEM
@func VOID | XSC1_SerPDDGetCommProperties | Retrieves Comm Properties.
*
@rdesc None.
*/
static VOID XSC1_SerPDDGetCommProperties(PVOID pHead,LPCOMMPROP pCommProp)
{
PSER_PDD_INFO pHWHead = (PSER_PDD_INFO)pHead;
DEBUGMSG(ZONE_FUNCTION,(TEXT("XSC1_SerPDDGetCommProperties\r\n")));
*pCommProp = pHWHead->CommProp;
return;
}
/*
@doc OEM
@func VOID | XSC1_SerPDDSetBaudRate |
* This routine sets the baud rate of the device.
* Not exported to users, only to driver.
*
@rdesc None.
*/
static BOOL XSC1_SerPDDSetBaudRate(
PVOID pHead, // @parm PVOID returned by SerPDDInit
ULONG BaudRate // @parm ULONG representing decimal baud rate.
)
{
PSER_PDD_INFO pHWHead = (PSER_PDD_INFO)pHead;
DEBUGMSG(ZONE_FUNCTION,(TEXT("+XSC1_SerPDDSetBaudRate\r\n")));
// The baud rate table is the same for both
// normal serial and IR modes.
return(HW_XSC1_SetBaudRate(pHead,BaudRate));
}
/*
@doc OEM
@func BOOL | XSC1_SerPDDPowerOff |
* Called by driver to turn off power to serial port.
* Not exported to users, only to driver.
*
@rdesc This routine returns a status.
*/
static BOOL XSC1_SerPDDPowerOff(PVOID pHead)
{
PSER_PDD_INFO pHWHead = (PSER_PDD_INFO)pHead;
DEBUGMSG(ZONE_FUNCTION,(TEXT("+XSC1_SerPDDPowerOff\r\n")));
//Power down the UART
HW_XSC1_PowerOff(pHWHead);
return(TRUE);
}
/*
@doc OEM
@func BOOL | XSC1_SerPDDPowerOn |
* Called by driver to turn on power to serial port.
* Not exported to users, only to driver.
*
@rdesc This routine returns a status.
*/
static BOOL XSC1_SerPDDPowerOn(PVOID pHead)
{
PSER_PDD_INFO pHWHead = (PSER_PDD_INFO)pHead;
DEBUGMSG(ZONE_FUNCTION,(TEXT("+XSC1_SerPDDPowerOn\r\n")));
// Power up the UART
HW_XSC1_PowerOn(pHWHead);
return(TRUE);
}
/*
*
@doc OEM
@func BOOL | XSC1_SerPDDEnableIR | This routine enables ir.
* Not exported to users, only to driver.
*
@rdesc Returns TRUE if successful, FALSEotherwise.
*/
static BOOL XSC1_SerPDDEnableIR(PVOID pHead,ULONG BaudRate)
{
PSER_PDD_INFO pHWHead = (PSER_PDD_INFO)pHead;
DEBUGMSG(ZONE_FUNCTION,(TEXT("+XSC1_SerPDDEnableIR\r\n")));
// Not sure why he passes baudRate when its already in our
// pHWHead. So I'll ignore it and use the one in our struct.
pHWHead->fIRMode = TRUE;
XSC1_SerPDDSetOutputMode(pHWHead,pHWHead->fIRMode,!pHWHead->fIRMode);
return(TRUE);
}
/*
*
@doc OEM
@func BOOL | XSC1_SerPDDDisableIR | This routine disable the ir.
* Not exported to users, only to driver.
*
@rdesc Returns TRUE if successful, FALSEotherwise.
*/
static BOOL XSC1_SerPDDDisableIR(PVOID pHead)
{
PSER_PDD_INFO pHWHead = (PSER_PDD_INFO)pHead;
DEBUGMSG(ZONE_FUNCTION,(TEXT("+XSC1_SerPDDDisableIR\r\n")));
pHWHead->fIRMode = FALSE;
XSC1_SerPDDSetOutputMode(pHWHead,pHWHead->fIRMode,!pHWHead->fIRMode);
return(TRUE);
}
/*
@doc OEM
@func BOOL | XSC1_SerPDDOpen | This routine is called when the port is opened.
* Not exported to users, only to driver.
*
@rdesc Returns TRUE if successful, FALSEotherwise.
*/
static BOOL XSC1_SerPDDOpen(PVOID pHead)
{
PSER_PDD_INFO pHWHead = (PSER_PDD_INFO)pHead;
DEBUGMSG(ZONE_FUNCTION,(TEXT("+XSC1_SerPDDOpen(irmode=0x%x)\r\n"), pHWHead->fIRMode));
// Disallow multiple simultaneous opens
if (pHWHead->cOpenCount)
return(FALSE);
//Debug serial on FFUART is disabled if product serial on FFUART is enabled
pHWHead->cOpenCount++;
DEBUGMSG(ZONE_OPEN,(TEXT("XSC1_SerPDDOpen - OpenCount 0x%x\r\n"),pHWHead->cOpenCount));
//Specifying the ChipID.
pHWHead->hwSer.ChipID = CHIP_ID_BULVERDE ;
// Configures Cotulla's UART for default behaviour.
DEBUGMSG(ZONE_OPEN,(TEXT("XSC1_SerPDDOpen - Calling HW_XSC1Open\r\n")));
HW_XSC1_Open(pHWHead);
// Why modifying pHWHead->fIRMode? Normal serial or IR mode chosen in XSC1_SerPDDInit_
// pHWHead->fIRMode = FALSE; // Select wired by default
// Enabling UART unit and choosing IR mode , if desired, now.
// Normal serial is the default mode.
DEBUGMSG(ZONE_OPEN,(TEXT("XSC1_SerPDDOpen - Calling XSC1_SerPDDSetOutputMode to enable Uart 0x%x Serial:0x%x IR :0x%x \r\n"),
pHWHead->dwIOBase, !pHWHead->fIRMode, pHWHead->fIRMode));
XSC1_SerPDDSetOutputMode(pHWHead,pHWHead->fIRMode,!pHWHead->fIRMode);
//At this point, UART Unit is enabled but IRQ is disabled. So, enable IRQ.
//DEBUGMSG(1,(TEXT("**********XSC1_SerPDDOpen - Enabling Interrupt on Uart 0x%x\r\n"),pHWHead->dwIOBase));
DEBUGMSG(ZONE_OPEN,(TEXT("XSC1_SerPDDOpen - Enabling Interrupt on Uart 0x%x\r\n"),pHWHead->dwIOBase));
switch (pHWHead->dwIOBase)
{
// mask irq
case FFUART_BASE_U_VIRTUAL:
//Unmask the interrupt
INTC_FFUART_INT_EN(pHWHead->pINTCReg->icmr);
//Select IRQ
INTC_FFUART_INT_DIS(pHWHead->pINTCReg->iclr);
break;
case BTUART_BASE_U_VIRTUAL:
//Unmask the interrupt
INTC_BTUART_INT_EN(pHWHead->pINTCReg->icmr);
//Select IRQ
INTC_BTUART_INT_DIS(pHWHead->pINTCReg->iclr);
break;
case STUART_BASE_U_VIRTUAL:
//Unmask the interrupt
INTC_STUART_INT_EN(pHWHead->pINTCReg->icmr);
//Select IRQ
INTC_STUART_INT_DIS(pHWHead->pINTCReg->iclr);
break;
}
return(TRUE);
}
//
//
// XSC1_EnableIRTranceiver:
//
// Enable UART also here.
//
//
//
void XSC1_EnableIRTranceiver(PSER_PDD_INFO pHWHead,BOOL bHighSpeed)
{
//By default, turn on receiver and disable transmitter.
HW_XSC1_Enable_IR_Rx_Tx(pHWHead,TRUE, FALSE);
}
/*
*
@doc OEM
@func PVOID | XSC1_SerPDDInitIR |
* Called by MDD to initialize the UART for IR mode.
* Not exported to users, only to driver.
* Wrapper routine to call XSC1_SerPDDInit_ for IR.
*
@rdesc This routine returns a pointer to SER_PDD_INFO.
*/
PVOID XSC1_SerPDDInitIR(ULONG Identifier,PVOID pMddHead, PHWOBJ pHWObj)
{
DEBUGMSG(ZONE_FUNCTION,(TEXT("XSC1_SerPDDInitIR\r\n")));
//Use the pHWObj to retrieve values from instead of using the registry
//Call XSC1_SerPDDInit_ for IR
return(XSC1_SerPDDInit_(TRUE, Identifier, pMddHead, pHWObj));
}
/*
@doc OEM
@func PVOID | XSC1_SerPDDInitSerial |
* Called by MDD to initialize the serial port.
* Not exported to users, only to driver.
* Wrapper routine to call XSC1_SerPDDInit_ for normal serial.
*
@rdesc This routine returns a pointer to SER_PDD_INFO.
*/
PVOID XSC1_SerPDDInitSerial(ULONG Identifier,PVOID pMddHead, PHWOBJ pHWObj)
{
DEBUGMSG(ZONE_FUNCTION,(TEXT("XSC1_SerPDDInitSerial\r\n")));
//Use the pHWObj to retrieve values from instead of using the registry
//Call XSC1_SerPDDInit_ for normal serial.
return(XSC1_SerPDDInit_(FALSE, Identifier, pMddHead, pHWObj));
}
//
// @doc OEM
// @func void | XSC1_SerPDD_IR_ClearDtr | This routine clears DTR.
//
// @rdesc None.
//
// Note: For STUART, it is a stub routine.
// This routine is an artifact of this implementation.
VOID
XSC1_SerPDD_IR_ClearDTR(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
DEBUGMSG (ZONE_FUNCTION, (TEXT("XSC1_SerPDD_IR_ClearDTR\r\n")));
}
//
// @doc OEM
// @func VOID | XSC1_SerPDD_IR_SetDTR | This routine sets DTR.
//
// @rdesc None.
//
// Note: For STUART, it is a stub routine.
// This routine is an artifact of this implementation.
VOID
XSC1_SerPDD_IR_SetDTR(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
DEBUGMSG (ZONE_FUNCTION, (TEXT("XSC1_SerPDD_IR_SetDTR\r\n")));
}
//
// @doc OEM
// @func VOID | XSC1_SerPDD_IR_ClearRTS | This routine clears RTS.
//
// @rdesc None.
//
//Note: For STUART, it is a stub routine.
// This routine is an artifact of this implementation.
VOID
XSC1_SerPDD_IR_ClearRTS(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
DEBUGMSG (ZONE_FUNCTION, (TEXT("-XSC1_SerPDD_IR_ClearRTS\r\n")));
}
//
// @doc OEM
// @func VOID | XSC1_SerPDD_IR_SetRTS | This routine sets RTS.
//
// @rdesc None.
//
//Note: For STUART, it is a stub routine.
// This routine is an artifact of this implementation.
VOID
XSC1_SerPDD_IR_SetRTS(
PVOID pHead // @parm PVOID returned by HWinit.
)
{
DEBUGMSG (ZONE_FUNCTION, (TEXT("XSC1_SerPDD_IR_SetRTS\r\n")));
}
//
// @doc OEM
// @func ULONG | XSC1_SerPDD_IR_ModemIntr | This routine is called from the MDD
// whenever INTR_MODEM is returned by HW_XSC1_GetInterruptType.
//
// @rdesc None
//
//Note: For STUART, it is a stub routine.
// This routine is an artifact of this implementation.
VOID
XSC1_SerPDD_IR_ModemIntr(
PVOID pHead // Hardware Head
)
{
DEBUGMSG (0,(TEXT("XSC1_SerPDD_IR_ModemIntr\r\n")));
}
// HW_VTBL for normal serial
const HW_VTBL XSC1_SerVTbl =
{
XSC1_SerPDDInitSerial,
HW_XSC1_PostInit,
XSC1_SerPDDDeinit,
XSC1_SerPDDOpen,
XSC1_SerPDDClose,
HW_XSC1_GetInterruptType,
HW_XSC1_RxIntr,
HW_XSC1_TxIntrEx,
HW_XSC1_ModemIntr,
HW_XSC1_LineIntr,
HW_XSC1_GetRxBufferSize,
XSC1_SerPDDPowerOff,
XSC1_SerPDDPowerOn,
HW_XSC1_ClearDTR,
HW_XSC1_SetDTR,
HW_XSC1_ClearRTS,
HW_XSC1_SetRTS,
XSC1_SerPDDEnableIR,
XSC1_SerPDDDisableIR,
HW_XSC1_ClearBreak,
HW_XSC1_SetBreak,
HW_XSC1_XmitComChar,
HW_XSC1_GetStatus,
HW_XSC1_Reset,
HW_XSC1_GetModemStatus,
XSC1_SerPDDGetCommProperties,
HW_XSC1_PurgeComm,
HW_XSC1_SetDCB,
HW_XSC1_SetCommTimeouts,
HW_XSC1_Ioctl
};
// HW_VTBL for IR
const HW_VTBL XSC1_IRVTbl =
{
XSC1_SerPDDInitIR,
HW_XSC1_PostInit,
XSC1_SerPDDDeinit,
XSC1_SerPDDOpen,
XSC1_SerPDDClose,
HW_XSC1_GetInterruptType,
HW_XSC1_RxIntr,
HW_XSC1_TxIntrEx,
XSC1_SerPDD_IR_ModemIntr,
HW_XSC1_LineIntr,
HW_XSC1_GetRxBufferSize,
XSC1_SerPDDPowerOff,
XSC1_SerPDDPowerOn,
XSC1_SerPDD_IR_ClearDTR,
XSC1_SerPDD_IR_SetDTR,
XSC1_SerPDD_IR_ClearRTS,
XSC1_SerPDD_IR_SetRTS,
XSC1_SerPDDEnableIR,
XSC1_SerPDDDisableIR,
HW_XSC1_ClearBreak,
HW_XSC1_SetBreak,
HW_XSC1_XmitComChar,
HW_XSC1_GetStatus,
HW_XSC1_Reset,
HW_XSC1_GetModemStatus,
XSC1_SerPDDGetCommProperties,
HW_XSC1_PurgeComm,
HW_XSC1_SetDCB,
HW_XSC1_SetCommTimeouts,
HW_XSC1_Ioctl
};
//HW_VTBL for serial modem card
extern const HW_VTBL SerCardIoVTbl;
//HWOBJ for FFUART product serial
HWOBJ SerObj1 =
{
THREAD_AT_INIT,
SYSINTR_SERIAL,
(PHW_VTBL) &XSC1_SerVTbl
};
//HWOBJ for BTUART product serial
HWOBJ SerObj2 =
{
THREAD_AT_INIT,
SYSINTR_SERIAL2,
(PHW_VTBL) &XSC1_SerVTbl
};
//HWOBJ for IR
HWOBJ IRObj1 =
{
THREAD_AT_OPEN,
SYSINTR_IR,
(PHW_VTBL) &XSC1_IRVTbl
};
//HWOBJ for serial modem card
HWOBJ SerCardObj = {
THREAD_IN_PDD,
0,
(PHW_VTBL) &SerCardIoVTbl
};
/*
@doc OEM
@func PHWOBJ | GetSerialObject |
* Called by MDD to get HWOBJ for the input DeviceArrayIndex.
* Not exported to users, only to driver.
*
@rdesc PHWOBJ
*
* GetSerialObj : The purpose of this function is to allow multiple PDDs to be
* linked with a single MDD creating a multiport driver. In such a driver, the
* MDD must be able to determine the correct vtbl and associated parameters for
* each PDD. Immediately prior to calling HWInit, the MDD calls GetSerialObject
* to get the correct function pointers and parameters.
*
*
*/
PHWOBJ GetSerialObject(DWORD DeviceArrayIndex)
{
//FFUART's DeviceArrayIndex is zero in the registry.
if (0 == DeviceArrayIndex)
return(&SerObj1);
//STUART's DeviceArrayIndex is four in the registry
else if ( 4 == DeviceArrayIndex)
return (&IRObj1);
//External modem
else if ( 1 == DeviceArrayIndex)
return (&SerCardObj);
//BTUART's DeviceArrayIndex is two in the registry.
if (2 == DeviceArrayIndex)
return(&SerObj2);
else
return(NULL);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -