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

📄 bvd_ser_pdd.c

📁 PXA27X_CAYMAN BSP from CAYMAN board
💻 C
📖 第 1 页 / 共 2 页
字号:
    // 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 + -