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

📄 s3c44bsio.c

📁 vxworks bsp,s3c2410的vxworks开发资料
💻 C
📖 第 1 页 / 共 2 页
字号:
    if ((newMode != SIO_MODE_POLL) && (newMode != SIO_MODE_INT))        return (EIO);    /* Don't enter interrupt mode unless it is allowed. */    if ((newMode == SIO_MODE_INT) && (!s3c44bIntrMode)) {        return (EIO);        }        /* set the new mode */    pChan->mode = newMode;    if (pChan->mode == SIO_MODE_INT)        {              /*  S3C44B_SIO_REG_READ(pChan, S3C44B_UCON, temp);*/        temp = 0; /* &=UCON_RX_TX_RESET; */   /**Reset RX and TX mode bits*//*        temp |= (UCON_RX|UCON_TX|UCON_RXTIMOUT_EN);  |UCON_TXINT_TYPE|UCON_RXSTAT_EN);*/         temp |= (UCON_RX|UCON_TX|UCON_RXTIMOUT_EN);         S3C44B_SIO_REG_WRITE(pChan,S3C44B_UCON, temp);      intEnable(pChan->intLevelRx);             }    else        {      /*  S3C44B_SIO_REG_READ(pChan, S3C44B_UCON, temp);*/        temp = 0; /* &=UCON_RX_TX_RESET; */   /**Reset RX and TX mode bits*/     /*   temp |= (UCON_RX|UCON_TX|UCON_RXTIMOUT_EN);  |UCON_TXINT_TYPE|UCON_RXSTAT_EN);*/    /* temp |= (UCON_RX|UCON_RXTIMOUT_EN);  */        S3C44B_SIO_REG_WRITE(pChan,S3C44B_UCON, temp);        intDisable (pChan->intLevelTx);        intDisable (pChan->intLevelRx);        }        return (OK);    }/********************************************************************************* s3c44bHup - hang up the modem control lines ** Resets the RTS and DTR signals.** RETURNS: OK*/LOCAL STATUS s3c44bHup    (    S3C44B_CHAN * pChan     /* pointer to channel */    )    {    UINT32 status;     /* disable tx */   S3C44B_REG_READW (((UINT32)(pChan->regs)+S3C44B_UCON), status);   status &= 0xfff3;      S3C44B_REG_WRITEW(((UINT32)(pChan->regs)+S3C44B_UCON), status);      return (OK);    }    /********************************************************************************* s3c44bOpen - Set the modem control lines ** Set the modem control lines(RTS, DTR) TRUE if not already set.  ** RETURNS: OK*/LOCAL STATUS s3c44bOpen    (    S3C44B_CHAN * pChan     /* pointer to channel */    )    {/*    UINT32 temp,i;    int num;      UINT32 status;*/       return (OK);     }/******************************************************************************** s3c33bOptSet - set hardware options** This routine sets up the hardware according to the specified option* argument.  If the hardware cannot support a particular option value, then* it should ignore that portion of the request.** RETURNS: OK upon success, or EIO for invalid arguments.*/LOCAL int s3c33bOptSet    (    S3C44B_CHAN * pChan,        /* channel */    uint_t    newOpts              /* new options */    )    {            UINT8 dataBits = 0x03;    UINT8 stopBits = 0x00;    BOOL hdweFlowCtrl=TRUE;    BOOL rcvrEnable = TRUE;        UINT8 temp=PARITY_NONE;    UINT32 result;        if (pChan == NULL || newOpts & 0xffffff00)    return EIO;    /* do nothing if options already set */    if (pChan->options == newOpts)    return OK;    /* ignore requests for unsupported options */    /* decode individual request elements */    switch (newOpts & CSIZE)    {    case CS5:        dataBits = 0x00; break;    case CS6:        dataBits = 0x01; break;    case CS7:        dataBits = 0x02; break;    default:    case CS8:        dataBits = 0x03; break;    }    if (newOpts & STOPB)        stopBits = 0x04;    else        stopBits = 0x00;    switch (newOpts & (PARENB|PARODD))    {    case PARENB|PARODD:        /* enable odd parity */            temp=PARITY_ODD;        break;    case PARENB:        /* enable even parity */        temp=PARITY_EVEN;         break;    case PARODD:        /* invalid mode, not normally used. */        break;    default:    case 0:        temp=PARITY_NONE ;/* no parity */        break;    }    if (newOpts & CLOCAL)    {        /* clocal disables hardware flow control */        hdweFlowCtrl = FALSE;    }    if ((newOpts & CREAD) == 0)        rcvrEnable = FALSE;    /*     * Reset the device according to dataBits, stopBits, hdweFlowCtrl,     * rcvrEnable, and parity selections.     */        S3C44B_SIO_REG_READ(pChan, S3C44B_ULCON, result);        S3C44B_SIO_REG_WRITE(pChan,S3C44B_ULCON,(result|dataBits|temp|stopBits));        pChan->options = newOpts;    return (OK);    }/********************************************************************************* s3c44bIoctl - special device control** This routine handles the IOCTL messages from the user. It supports commands * to get/set baud rate, mode(INT,POLL), hardware options(parity, number of * data bits) and modem control(RTS/CTS and DTR/DSR handshakes).* The ioctl commands SIO_HUP and SIO_OPEN are used to implement the HUPCL(hang* up on last close) function.** As on a UNIX system, requesting a baud rate of zero is translated into* a hangup request.  The DTR and RTS lines are dropped.  This should cause* a connected modem to drop the connection.  The SIO_HUP command will only* hangup if the HUPCL option is active.  The SIO_OPEN function will raise* DTR and RTS lines whenever it is called. Use the BAUD_RATE=0 function* to hangup when HUPCL is not active.** The CLOCAL option will disable hardware flow control.  When selected,* hardware flow control is not used.  When not selected hardware flow control* is based on the RTS/CTS signals.  CTS is the clear to send input* from the other end.  It must be true for this end to begin sending new* characters.  In most drivers, the RTS signal will be assumed to be connected* to the opposite end's CTS signal and can be used to control output from* the other end.  Raising RTS asserts CTS at the other end and the other end* can send data.  Lowering RTS de-asserts CTS and the other end will stop* sending data. (This is non-EIA defined use of RTS).** RETURNS: OK on success, ENOSYS on unsupported request, EIO on failed* request.*/LOCAL int s3c44bIoctl    (    SIO_CHAN *    pSioChan,        /* device to control */    int        request,        /* request code */    void *    someArg            /* some argument */    )    {    S3C44B_CHAN *pChan = (S3C44B_CHAN *) pSioChan;       int     oldlevel;        /* current interrupt level mask */    int     arg = (int)someArg;            switch (request)    {    case SIO_BAUD_SET:        /*         * like unix, a baud request for 0 is really a request to         * hangup.         */        if (arg == 0)        return s3c44bHup (pChan);        /*         * Set the baud rate. Return EIO for an invalid baud rate, or         * OK on success.         */        if (arg < S3C44B_BAUD_MIN || arg > S3C44B_BAUD_MAX)            {        return (EIO);            }        /* Calculate the baud rate constant for the new baud rate */            switch(arg)                {                case 1200:                    /* disable interrupts during chip access */                    oldlevel = intLock ();                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_1200);                    intUnlock (oldlevel);                    pChan->baudRate=arg;                    return (OK);                case 2400:                    /* disable interrupts during chip access */                    oldlevel = intLock ();                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_2400);                    intUnlock (oldlevel);                    pChan->baudRate=arg;                    return (OK);                case 4800:                    /* disable interrupts during chip access */                    oldlevel = intLock ();                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_4800);                    intUnlock (oldlevel);                    pChan->baudRate=arg;                    return (OK);                case 9600:                    /* disable interrupts during chip access */                    oldlevel = intLock ();                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_9600);                    intUnlock (oldlevel);                    pChan->baudRate=arg;                    return (OK);                case 19200:                    /* disable interrupts during chip access */                    oldlevel = intLock ();                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_19200);                    intUnlock (oldlevel);                    pChan->baudRate=arg;                    return (OK);                case 38400:                    /* disable interrupts during chip access */                    oldlevel = intLock ();                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_38400);                    intUnlock (oldlevel);                    pChan->baudRate=arg;                    return (OK);                case 57600:                    /* disable interrupts during chip access */                    oldlevel = intLock ();                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_57600);                    intUnlock (oldlevel);                    pChan->baudRate=arg;                    return (OK);                case 115200:                    /* disable interrupts during chip access *//*                    oldlevel = intLock ();*/                    S3C44B_SIO_REG_WRITE(pChan,S3C44B_UBRDIV,S3C44B_BRDV_115200);/*                    intUnlock (oldlevel);*/                    pChan->baudRate=arg;                    return (OK);                default:                    return(EIO);                }            break;    case SIO_BAUD_GET:            /* Get the baud rate and return OK */            *(int *)arg = pChan->baudRate;            break;    case SIO_MODE_SET:        /*         * Set the mode (e.g., to interrupt or polled). Return OK         * or EIO for an unknown or unsupported mode.         */        return (s3c44bModeSet (pChan, arg));    case SIO_MODE_GET:                    /* Get the current mode and return OK.  */        *(int *)arg = pChan->mode;        return (OK);    case SIO_AVAIL_MODES_GET:        /* Get the available modes and return OK.  */        *(int *)arg = SIO_MODE_INT | SIO_MODE_POLL;         return (OK);    case SIO_HW_OPTS_SET:        /*         * Optional command to set the hardware options (as defined         * in sioLib.h).         * Return OK, or ENOSYS if this command is not implemented.         * Note: several hardware options are specified at once.         * This routine should set as many as it can and then return         * OK. The SIO_HW_OPTS_GET is used to find out which options         * were actually set.         */                return (s3c33bOptSet (pChan, arg));    case SIO_HW_OPTS_GET:        /*         * Optional command to get the hardware options (as defined         * in sioLib.h). Return OK or ENOSYS if this command is not         * implemented.  Note: if this command is unimplemented, it         * will be assumed that the driver options are CREAD | CS8         * (e.g., eight data bits, one stop bit, no parity, ints enabled).         */        *(int *)arg = pChan->options;        return (OK);#if 0    case SIO_HUP:            /* check if hupcl option is enabled */            if (pChan->options & HUPCL)                 return (s3c44bHup (pChan));            return (OK);#endif    case SIO_OPEN:                        return (s3c44bOpen (pChan)); /* always open */    default:        return (ENOSYS);            }    return (ENOSYS);    }/********************************************************************************* dummyCallback - dummy callback routine** RETURNS: ERROR.*/LOCAL STATUS dummyTxCallback (void *txarg, char* txChar)    {    return (ERROR);    }LOCAL void dummyRxCallback (void *rxarg, char rxChar)    {        return ;        }

⌨️ 快捷键说明

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