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

📄 pl010com.c

📁 EP931X系列的WinCE串口驱动源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 @doc OEM
 @func ULONG | SerClose | This routine closes the device identified by the PVOID returned by SerInit.
 *  Not exported to users, only to driver.
 *
 @rdesc The return value is 0.
 */
static
ULONG
SerClose(
        PVOID   pHead   // @parm PVOID returned by SerInit.
        )
{
    PSER_INFO   pHWHead = (PSER_INFO)pHead;
    ULONG  uTries;
    PAMBA_UART_INFO pSerAMBA  = &(((PSER_INFO)pHead)->serAMBA);

    DEBUGMSG (ZONE_CLOSE,(TEXT("+SerClose\r\n")));
    if ( pHWHead->cOpenCount ) {
        DEBUGMSG (ZONE_CLOSE, 
                  (TEXT("SerClose, closing device\r\n")));
        pHWHead->cOpenCount--;

        // while we are still transmitting, sleep.
        uTries = 0;
        while(uTries++ < 100 && (INB(pSerAMBA, pUART_FR) & AMBA_UARTFR_BUSY))
        {
            DEBUGMSG (ZONE_CLOSE, 
                      (TEXT("SerClose, TX in progress, IER 0x%X, LSR 0x%X\r\n"),
                       *pHWHead->ser16550.pIER, pHWHead->ser16550.LSR));
            Sleep(10);
        }

        // When the device is closed, we power it down.
        DEBUGMSG (ZONE_CLOSE, 
                  (TEXT("SerClose - Powering down UART\r\n")));
        pHWHead->fIRMode  = FALSE;  
        SerSetOutputMode(pHWHead, FALSE, FALSE );

        DEBUGMSG (ZONE_CLOSE, (TEXT("SerClose - Calling SL_Close\r\n")));
        SL_Close( pHWHead );
    }

    DEBUGMSG (ZONE_CLOSE,(TEXT("-SerClose\r\n")));
    return (0);
}

/*
 @doc OEM 
 @func PVOID | SerDeinit | Deinitializes device identified by argument.
 *  This routine frees any memory allocated by SerInit.
 *
 */
static
BOOL
SerDeinit(
         PVOID   pHead   // @parm PVOID returned by SerInit.
         )
{
    PSER_INFO   pHWHead = (PSER_INFO)pHead;

    if ( !pHWHead )
        return (FALSE);

    // Make sure device is closed before doing DeInit
    if ( pHWHead->cOpenCount )
        SerClose( pHead );

    // Free the HWObj
    LocalFree(pHWHead->pHWObj);

    
    // And now free the SER_INFO structure.
    LocalFree(pHWHead);

    return (TRUE);
}

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

    *pCommProp = pHWHead->CommProp;
    return;
}


/*
 @doc OEM
 @func VOID | SerSetBaudRate |
 * This routine sets the baud rate of the device.
 *  Not exported to users, only to driver.
 *
 @rdesc None.
 */
static
BOOL
SerSetBaudRate(
              PVOID   pHead,  // @parm     PVOID returned by SerInit
              ULONG   BaudRate    // @parm     ULONG representing decimal baud rate.
              )
{
    PSER_INFO   pHWHead = (PSER_INFO)pHead;

    // If we are running in IR mode, try to set the IR baud
    // first, since it supports a subset of the rates supported
    // by the UART.  If we fail setting the IR rate, then
    // return an error and leave the UART alone.
    if ( pHWHead->fIRMode ) {
        if ( ! SerSetIRBaudRate( pHWHead, BaudRate ) ) {
            DEBUGMSG (ZONE_ERROR, 
                      (TEXT("Unsupported IR BaudRate\r\n")));
            // We should return an error, but vtbl doesn't expect one
            return (FALSE); 
        }
    }

    // Now set buadrate on the UART
    return ( SL_SetBaudRate( pHead, BaudRate ) );    
}

/*
 @doc OEM
 @func BOOL | SerPowerOff |
 *  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
SerPowerOff(
           PVOID   pHead       // @parm PVOID returned by SerInit.
           )
{
    PSER_INFO   pHWHead = (PSER_INFO)pHead;

    // First, power down the UART
    SL_PowerOff( pHWHead );

    // And then disable our IR and 9 Pin interface
    SerSetOutputMode( pHWHead, FALSE, FALSE );

    return (TRUE);
}

/*
 @doc OEM
 @func BOOL | SerPowerOn |
 *  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
SerPowerOn(
          PVOID   pHead       // @parm  PVOID returned by SerInit.
          )
{
    PSER_INFO   pHWHead = (PSER_INFO)pHead;

    // First, power up the UART
    SL_PowerOn( pHWHead );

    // And then enable our IR interface (if needed)
    SerSetOutputMode( pHWHead, pHWHead->fIRMode, !pHWHead->fIRMode );
    return (TRUE);
}

/*
 @doc OEM
 @func BOOL | SerEnableIR | This routine enables ir.
 *  Not exported to users, only to driver.
 *
 @rdesc Returns TRUE if successful, FALSEotherwise.
 */
static
BOOL
SerEnableIR(
           PVOID   pHead, // @parm PVOID returned by Serinit.
           ULONG   BaudRate  // @parm PVOID returned by HWinit.
           )
{
    PSER_INFO   pHWHead = (PSER_INFO)pHead;

    pHWHead->fIRMode  = TRUE;
    SerSetOutputMode( pHWHead, pHWHead->fIRMode, !pHWHead->fIRMode );
    return (TRUE);
}

/*
 @doc OEM
 @func BOOL | SerDisableIR | This routine disable the ir.
 *  Not exported to users, only to driver.
 *
 @rdesc Returns TRUE if successful, FALSEotherwise.
 */
static
BOOL
SerDisableIR(
            PVOID   pHead /*@parm PVOID returned by Serinit. */
            )
{
    PSER_INFO   pHWHead = (PSER_INFO)pHead;

    pHWHead->fIRMode  = FALSE;
    SerSetOutputMode( pHWHead, pHWHead->fIRMode, !pHWHead->fIRMode );
    return (TRUE);
}

/*
 @doc OEM
 @func BOOL | SerOpen | This routine is called when the port is opened.
 *  Not exported to users, only to driver.
 *
 @rdesc Returns TRUE if successful, FALSEotherwise.
 */
static
BOOL
SerOpen(
       PVOID   pHead /*@parm PVOID returned by Serinit. */
       )
{

    PSER_INFO   pHWHead = (PSER_INFO)pHead;

    // Disallow multiple simultaneous opens
    if ( pHWHead->cOpenCount )
        return (FALSE);

    pHWHead->cOpenCount++;

    DEBUGMSG (ZONE_OPEN,
              (TEXT("SerOpen - Selecting Non IR Mode\r\n")));
    pHWHead->fIRMode  = FALSE;   // Select wired by default
    SerSetOutputMode(pHWHead, pHWHead->fIRMode, !pHWHead->fIRMode );  

    // NOTE: - If we wanted to support 16450s, we'll could dynamically
    // identify them here.
    pHWHead->ser16550.ChipID = CHIP_ID_16550;

    // Init 16550 info
    DEBUGMSG (ZONE_OPEN, (TEXT("SerOpen - Calling SL_Open\r\n")));
    SL_Open( pHWHead );

    return (TRUE);
}

const
HW_VTBL IoVTbl = {
    SerInit,
    SL_PostInit,
    SerDeinit,
    SerOpen,
    SerClose,
    SL_GetInterruptType,
    SL_RxIntr,
    SL_TxIntrEx,
    SL_ModemIntr,
    SL_LineIntr,
    SL_GetRxBufferSize,
    SerPowerOff,
    SerPowerOn,
    SL_ClearDTR,
    SL_SetDTR,
    SL_ClearRTS,
    SL_SetRTS,
    SerEnableIR,
    SerDisableIR,
    SL_ClearBreak,
    SL_SetBreak,
    SL_XmitComChar,
    SL_GetStatus,
    SL_Reset,
    SL_GetModemStatus,
    SerGetCommProperties,
    SL_PurgeComm,
    SL_SetDCB,
    SL_SetCommTimeouts,
    };

extern const HW_VTBL SerCardIoVTbl;

// 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
               )
{
    PHWOBJ pSerObj;

    // Unlike many other serial samples, we do not have a statically allocated
    // array of HWObjs.  Instead, we allocate a new HWObj for each instance
    // of the driver.  The MDD will always call GetSerialObj/HWInit/HWDeinit in
    // that order, so we can do the alloc here and do any subsequent free in
    // HWDeInit.

    // Allocate space for the HWOBJ.
    pSerObj = (PHWOBJ)LocalAlloc( LMEM_ZEROINIT|LMEM_FIXED ,
                                  sizeof(HWOBJ) );
    if ( !pSerObj )
        return (NULL);

    // Fill in the HWObj structure that we just allocated.

    pSerObj->BindFlags = THREAD_AT_OPEN;     // Have MDD create thread when device is first opened.
    pSerObj->dwIntID = 0;                    // SysIntr is filled in at init time
    pSerObj->pFuncTbl = (HW_VTBL *) &IoVTbl; // Return pointer to appropriate functions

    // Now return this structure to the MDD.
    return (pSerObj);
}

⌨️ 快捷键说明

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