📄 at91dbgu.c
字号:
/* set the new mode */ if( newMode == SIO_MODE_INT ) pChan->intrmode = TRUE; else pChan->intrmode = FALSE; if ( pChan->intrmode ) { /* * TX int still not enabled */ pChan->regs->DBGU_CR = DBGU_CR_RX_ENA | DBGU_CR_TX_DIS | DBGU_CR_RESET_STATUS;
pChan->regs->DBGU_IER = DBGU_IE_DR_TXRDY | DBGU_IE_DR_RXRDY | DBGU_IE_DR_FRAME | DBGU_IE_DR_PARE| DBGU_IE_DR_OVRE;/* intEable( pChan ->level );*/ } else { /* * disable all interrupts */ pChan->regs->DBGU_IDR = 0xFFFFFFFF;
pChan->regs->DBGU_CR = DBGU_CR_RX_ENA | DBGU_CR_TX_ENA | DBGU_CR_RESET_STATUS;
/* intDisable( pChan ->level );*/ } return (OK);}/********************************************************************************* sndsHup - hang up the modem control lines ** Resets the RTS and DTR signals.** RETURNS: OK*/LOCAL STATUS AT91DBGUHup ( AT91_DBGU_CHAN * pChan /* pointer to channel */ ){/* FAST int oldlevel; / * current interrupt level mask * / oldlevel = intLock (); / * set RTS and DTR low * // * SNDS_REG_WRITE(pChan, SNDS_USTAT, USTAT_DTR_LOW); * / intUnlock (oldlevel);*/ return (OK);} /********************************************************************************* sndsOpen - Set the modem control lines ** Set the modem control lines(RTS, DTR) TRUE if not already set. ** RETURNS: OK*/LOCAL STATUS AT91DBGUOpen ( AT91_DBGU_CHAN * pChan /* pointer to channel */ ){/* FAST int oldlevel; / * current interrupt level mask * / oldlevel = intLock (); / * set RTS and DTR active * // * SNDS_REG_WRITE(pChan, SNDS_USTAT, USTAT_DTR_HIGH); * / intUnlock (oldlevel);*/ return (OK);}/******************************************************************************** sndsOptSet - 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 AT91DBGUOptSet ( AT91_DBGU_CHAN * pChan, /* channel */ UINT32 newOpts /* new options */ ){ UINT32 umode = DBGU_MR_TEST_NORMAL_MODE; UINT32 paritybits = DBGU_MR_PARITY_NONE; UINT32 rcvrEnable = DBGU_CR_RX_ENA; int lvl; if (pChan == NULL || newOpts & 0xffffff00) return EIO; /* do nothing if options already set */ if (pChan->options == newOpts) return OK; /* decode individual request elements */ switch ( newOpts & (PARENB|PARODD) ) { case PARENB|PARODD: /* enable odd parity */ paritybits = DBGU_MR_PARITY_ODD; break; case PARENB: /* enable even parity */ paritybits = DBGU_MR_PARITY_EVEN; break; case PARODD: /* invalid mode, not normally used. */ break; default: case 0: paritybits = DBGU_MR_PARITY_NONE; break; } if ( (newOpts & CREAD) == 0 ) rcvrEnable = DBGU_CR_RX_DIS; lvl = intLock (); /* * Reset the device according to dataBits, stopBits, hdweFlowCtrl, * rcvrEnable, and parity selections. */ pChan ->regs->DBGU_CR = rcvrEnable; pChan ->regs->DBGU_MR = (AT91_REG)( umode | paritybits ); intUnlock (lvl); pChan->options = newOpts; return (OK);}/********************************************************************************* sndsIoctl - 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 STATUS AT91DBGUSetNewBaudRate( AT91_DBGU_CHAN * pChan, UINT32 baud ){ int oldlevel; UINT32 count = ( MASTER_CLK + baud*8 )/(16*baud); if( count > 1 ) { pChan->baudRate = baud; oldlevel = intLock (); pChan ->regs ->DBGU_BRGR = count; intUnlock (oldlevel); } return (OK);}LOCAL int AT91DBGUIoctl ( SIO_CHAN * pSioChan, /* device to control */ int request, /* request code */ void * someArg /* some argument */ ){ AT91_DBGU_CHAN *pChan = ( AT91_DBGU_CHAN * )pSioChan; int oldlevel; /* current interrupt level mask */ int arg = (int)someArg; DBGU_S* udev = pChan ->regs; switch (request) { case SIO_BAUD_SET: /* * like unix, a baud request for 0 is really a request to * hangup. */ if (arg == 0) return AT91DBGUHup (pChan); /* * Set the baud rate. Return EIO for an invalid baud rate, or * OK on success. */ if (arg < AT91DBGU_BAUD_MIN || arg > AT91DBGU_BAUD_MAX ) { return (EIO); } /* Calculate the baud rate constant for the new baud rate */ switch(arg) { case 1200: case 2400: case 4800: case 9600: case 19200: case 38400: case 57600: case 115200: case 230400: case 460800: return ( AT91DBGUSetNewBaudRate( pChan, arg ) ); default: } return(OK); case SIO_BAUD_GET: /* Get the baud rate and return OK */ *(int *)arg = pChan->baudRate; return (OK); case SIO_MODE_SET: /* * Set the mode (e.g., to interrupt or polled). Return OK * or EIO for an unknown or unsupported mode. */ return ( AT91DBGUModeSet (pChan, arg) ); case SIO_MODE_GET: /* Get the current mode and return OK. */ if( pChan ->intrmode ) *(int *)arg = SIO_MODE_INT; else *(int *)arg = SIO_MODE_POLL; 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 ( AT91DBGUOptSet (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); case SIO_HUP: /* check if hupcl option is enabled */ if ( pChan->options & HUPCL ) return ( AT91DBGUHup (pChan) ); return (OK); case SIO_OPEN: return ( AT91DBGUOpen (pChan) ); /* always open */ default: return (ENOSYS); } return (ENOSYS);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -