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