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

📄 serial.c

📁 优龙2410linux2.6.8内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* $Id: serial.c,v 1.20 2004/05/24 12:00:20 starvik Exp $ * * Serial port driver for the ETRAX 100LX chip * *    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003  Axis Communications AB * *    Many, many authors. Based once upon a time on serial.c for 16x50. * * $Log: serial.c,v $ * Revision 1.20  2004/05/24 12:00:20  starvik * Big merge of stuff from Linux 2.4 (e.g. manual mode for the serial port). * * Revision 1.19  2004/05/17 13:12:15  starvik * Kernel console hook * Big merge from Linux 2.4 still pending. * * Revision 1.18  2003/10/28 07:18:30  starvik * Compiles with debug info * * Revision 1.17  2003/07/04 08:27:37  starvik * Merge of Linux 2.5.74 * * Revision 1.16  2003/06/13 10:05:19  johana * Help the user to avoid trouble by: * Forcing mixed mode for status/control lines if not all pins are used. * * Revision 1.15  2003/06/13 09:43:01  johana * Merged in the following changes from os/linux/arch/cris/drivers/serial.c * + some minor changes to reduce diff. * * Revision 1.49  2003/05/30 11:31:54  johana * Merged in change-branch--serial9bit that adds CMSPAR support for sticky * parity (mark/space) * * Revision 1.48  2003/05/30 11:03:57  johana * Implemented rs_send_xchar() by disabling the DMA and writing manually. * Added e100_disable_txdma_channel() and e100_enable_txdma_channel(). * Fixed rs_throttle() and rs_unthrottle() to properly call rs_send_xchar * instead of setting info->x_char and check the CRTSCTS flag before * controlling the rts pin. * * Revision 1.14  2003/04/09 08:12:44  pkj * Corrected typo changes made upstream. * * Revision 1.13  2003/04/09 05:20:47  starvik * Merge of Linux 2.5.67 * * Revision 1.11  2003/01/22 06:48:37  starvik * Fixed warnings issued by GCC 3.2.1 * * Revision 1.9  2002/12/13 09:07:47  starvik * Alert user that RX_TIMEOUT_TICKS==0 doesn't work * * Revision 1.8  2002/12/11 13:13:57  starvik * Added arch/ to v10 specific includes * Added fix from Linux 2.4 in serial.c (flush_to_flip_buffer) * * Revision 1.7  2002/12/06 07:13:57  starvik * Corrected work queue stuff * Removed CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST * * Revision 1.6  2002/11/21 07:17:46  starvik * Change static inline to extern inline where otherwise outlined with gcc-3.2 * * Revision 1.5  2002/11/14 15:59:49  starvik * Linux 2.5 port of the latest serial driver from 2.4. The work queue stuff * probably doesn't work yet. * * Revision 1.42  2002/11/05 09:08:47  johana * Better implementation of rs_stop() and rs_start() that uses the XOFF * register to start/stop transmission. * change_speed() also initilises XOFF register correctly so that * auto_xoff is enabled when IXON flag is set by user. * This gives fast XOFF response times. * * Revision 1.41  2002/11/04 18:40:57  johana * Implemented rs_stop() and rs_start(). * Simple tests using hwtestserial indicates that this should be enough * to make it work. * * Revision 1.40  2002/10/14 05:33:18  starvik * RS-485 uses fast timers even if SERIAL_FAST_TIMER is disabled * * Revision 1.39  2002/09/30 21:00:57  johana * Support for CONFIG_ETRAX_SERx_DTR_RI_DSR_CD_MIXED where the status and * control pins can be mixed between PA and PB. * If no serial port uses MIXED old solution is used * (saves a few bytes and cycles). * control_pins struct uses masks instead of bit numbers. * Corrected dummy values and polarity in line_info() so * /proc/tty/driver/serial is now correct. * (the E100_xxx_GET() macros is really active low - perhaps not obvious) * * Revision 1.38  2002/08/23 11:01:36  starvik * Check that serial port is enabled in all interrupt handlers to avoid * restarts of DMA channels not assigned to serial ports * * Revision 1.37  2002/08/13 13:02:37  bjornw * Removed some warnings because of unused code * * Revision 1.36  2002/08/08 12:50:01  starvik * Serial interrupt is shared with synchronous serial port driver * * Revision 1.35  2002/06/03 10:40:49  starvik * Increased RS-485 RTS toggle timer to 2 characters * * Revision 1.34  2002/05/28 18:59:36  johana * Whitespace and comment fixing to be more like etrax100ser.c 1.71. * * Revision 1.33  2002/05/28 17:55:43  johana * RS-485 uses FAST_TIMER if enabled, and starts a short (one char time) * timer from tranismit_chars (interrupt context). * The timer toggles RTS in interrupt context when expired giving minimum * latencies. * * Revision 1.32  2002/05/22 13:58:00  johana * Renamed rs_write() to raw_write() and made it inline. * New rs_write() handles RS-485 if configured and enabled * (moved code from e100_write_rs485()). * RS-485 ioctl's uses copy_from_user() instead of verify_area(). * * Revision 1.31  2002/04/22 11:20:03  johana * Updated copyright years. * * Revision 1.30  2002/04/22 09:39:12  johana * RS-485 support compiles. * * Revision 1.29  2002/01/14 16:10:01  pkj * Allocate the receive buffers dynamically. The static 4kB buffer was * too small for the peaks. This means that we can get rid of the extra * buffer and the copying to it. It also means we require less memory * under normal operations, but can use more when needed (there is a * cap at 64kB for safety reasons). If there is no memory available * we panic(), and die a horrible death... * * Revision 1.28  2001/12/18 15:04:53  johana * Cleaned up write_rs485() - now it works correctly without padding extra * char. * Added sane default initialisation of rs485. * Added #ifdef around dummy variables. * * Revision 1.27  2001/11/29 17:00:41  pkj * 2kB seems to be too small a buffer when using 921600 bps, * so increase it to 4kB (this was already done for the elinux * version of the serial driver). * * Revision 1.26  2001/11/19 14:20:41  pkj * Minor changes to comments and unused code. * * Revision 1.25  2001/11/12 20:03:43  pkj * Fixed compiler warnings. * * Revision 1.24  2001/11/12 15:10:05  pkj * Total redesign of the receiving part of the serial driver. * Uses eight chained descriptors to write to a 4kB buffer. * This data is then serialised into a 2kB buffer. From there it * is copied into the TTY's flip buffers when they become available. * A lot of copying, and the sizes of the buffers might need to be * tweaked, but all in all it should work better than the previous * version, without the need to modify the TTY code in any way. * Also note that erroneous bytes are now correctly marked in the * flag buffers (instead of always marking the first byte). * * Revision 1.23  2001/10/30 17:53:26  pkj * * Set info->uses_dma to 0 when a port is closed. * * Mark the timer1 interrupt as a fast one (SA_INTERRUPT). * * Call start_flush_timer() in start_receive() if *   CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST is defined. * * Revision 1.22  2001/10/30 17:44:03  pkj * Use %lu for received and transmitted counters in line_info(). * * Revision 1.21  2001/10/30 17:40:34  pkj * Clean-up. The only change to functionality is that * CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS(=5) is used instead of * MAX_FLUSH_TIME(=8). * * Revision 1.20  2001/10/30 15:24:49  johana * Added char_time stuff from 2.0 driver. * * Revision 1.19  2001/10/30 15:23:03  johana * Merged with 1.13.2 branch + fixed indentation * and changed CONFIG_ETRAX100_XYS to CONFIG_ETRAX_XYZ * * Revision 1.18  2001/09/24 09:27:22  pkj * Completed ext_baud_table[] in cflag_to_baud() and cflag_to_etrax_baud(). * * Revision 1.17  2001/08/24 11:32:49  ronny * More fixes for the CONFIG_ETRAX_SERIAL_PORT0 define. * * Revision 1.16  2001/08/24 07:56:22  ronny * Added config ifdefs around ser0 irq requests. * * Revision 1.15  2001/08/16 09:10:31  bjarne * serial.c - corrected the initialization of rs_table, the wrong defines *            where used. *            Corrected a test in timed_flush_handler. *            Changed configured to enabled. * serial.h - Changed configured to enabled. * * Revision 1.14  2001/08/15 07:31:23  bjarne * Introduced two new members to the e100_serial struct. * configured - Will be set to 1 if the port has been configured in .config * uses_dma   - Should be set to 1 if the port uses DMA. Currently it is set  *              to 1 *              when a port is opened. This is used to limit the DMA interrupt *              routines to only manipulate DMA channels actually used by the *              serial driver. * * Revision 1.13.2.2  2001/10/17 13:57:13  starvik * Receiver was broken by the break fixes * * Revision 1.13.2.1  2001/07/20 13:57:39  ronny * Merge with new stuff from etrax100ser.c. Works but haven't checked stuff * like break handling. * * Revision 1.13  2001/05/09 12:40:31  johana * Use DMA_NBR and IRQ_NBR defines from dma.h and irq.h * * Revision 1.12  2001/04/19 12:23:07  bjornw * CONFIG_RS485 -> CONFIG_ETRAX_RS485 * * Revision 1.11  2001/04/05 14:29:48  markusl * Updated according to review remarks i.e. * -Use correct types in port structure to avoid compiler warnings * -Try to use IO_* macros whenever possible * -Open should never return -EBUSY * * Revision 1.10  2001/03/05 13:14:07  bjornw * Another spelling fix * * Revision 1.9  2001/02/23 13:46:38  bjornw * Spellling check * * Revision 1.8  2001/01/23 14:56:35  markusl * Made use of ser1 optional * Needed by USB * * Revision 1.7  2001/01/19 16:14:48  perf * Added kernel options for serial ports 234. * Changed option names from CONFIG_ETRAX100_XYZ to CONFIG_ETRAX_XYZ. * * Revision 1.6  2000/11/22 16:36:09  bjornw * Please marketing by using the correct case when spelling Etrax. * * Revision 1.5  2000/11/21 16:43:37  bjornw * Fixed so it compiles under CONFIG_SVINTO_SIM * * Revision 1.4  2000/11/15 17:34:12  bjornw * Added a timeout timer for flushing input channels. The interrupt-based * fast flush system should be easy to merge with this later (works the same * way, only with an irq instead of a system timer_list) * * Revision 1.3  2000/11/13 17:19:57  bjornw * * Incredibly, this almost complete rewrite of serial.c worked (at least *   for output) the first time. * *   Items worth noticing: * *      No Etrax100 port 1 workarounds (does only compile on 2.4 anyway now) *      RS485 is not ported (why can't it be done in userspace as on x86 ?) *      Statistics done through async_icount - if any more stats are needed, *      that's the place to put them or in an arch-dep version of it. *      timeout_interrupt and the other fast timeout stuff not ported yet *      There be dragons in this 3k+ line driver * * Revision 1.2  2000/11/10 16:50:28  bjornw * First shot at a 2.4 port, does not compile totally yet * * Revision 1.1  2000/11/10 16:47:32  bjornw * Added verbatim copy of rev 1.49 etrax100ser.c from elinux * * Revision 1.49  2000/10/30 15:47:14  tobiasa * Changed version number. * * Revision 1.48  2000/10/25 11:02:43  johana * Changed %ul to %lu in printf's * * Revision 1.47  2000/10/18 15:06:53  pkj * Compile correctly with CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST and * CONFIG_ETRAX_SERIAL_PROC_ENTRY together. * Some clean-up of the /proc/serial file. * * Revision 1.46  2000/10/16 12:59:40  johana * Added CONFIG_ETRAX_SERIAL_PROC_ENTRY for statistics and debug info. * * Revision 1.45  2000/10/13 17:10:59  pkj * Do not flush DMAs while flipping TTY buffers. * * Revision 1.44  2000/10/13 16:34:29  pkj * Added a delay in ser_interrupt() for 2.3ms when an error is detected. * We do not know why this delay is required yet, but without it the * irmaflash program does not work (this was the program that needed * the ser_interrupt() to be needed in the first place). This should not * affect normal use of the serial ports. * * Revision 1.43  2000/10/13 16:30:44  pkj * New version of the fast flush of serial buffers code. This time * it is localized to the serial driver and uses a fast timer to * do the work. * * Revision 1.42  2000/10/13 14:54:26  bennyo * Fix for switching RTS when using rs485 * * Revision 1.41  2000/10/12 11:43:44  pkj * Cleaned up a number of comments. * * Revision 1.40  2000/10/10 11:58:39  johana * Made RS485 support generic for all ports. * Toggle rts in interrupt if no delay wanted. * WARNING: No true transmitter empty check?? * Set d_wait bit when sending data so interrupt is delayed until * fifo flushed. (Fix tcdrain() problem) * * Revision 1.39  2000/10/04 16:08:02  bjornw * * Use virt_to_phys etc. for DMA addresses * * Removed CONFIG_FLUSH_DMA_FAST hacks * * Indentation fix * * Revision 1.38  2000/10/02 12:27:10  mattias * * added variable used when using fast flush on serial dma. *   (CONFIG_FLUSH_DMA_FAST) * * Revision 1.37  2000/09/27 09:44:24  pkj * Uncomment definition of SERIAL_HANDLE_EARLY_ERRORS. * * Revision 1.36  2000/09/20 13:12:52  johana * Support for CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS: *   Number of timer ticks between flush of receive fifo (1 tick = 10ms). *   Try 0-3 for low latency applications. Approx 5 for high load *   applications (e.g. PPP). Maybe this should be more adaptive some day... * * Revision 1.35  2000/09/20 10:36:08  johana * Typo in get_lsr_info() * * Revision 1.34  2000/09/20 10:29:59  johana * Let rs_chars_in_buffer() check fifo content as well. * get_lsr_info() might work now (not tested). * Easier to change the port to debug. * * Revision 1.33  2000/09/13 07:52:11  torbjore * Support RS485 * * Revision 1.32  2000/08/31 14:45:37  bjornw * After sending a break we need to reset the transmit DMA channel * * Revision 1.31  2000/06/21 12:13:29  johana * Fixed wait for all chars sent when closing port. * (Used to always take 1 second!) * Added shadows for directions of status/ctrl signals. * * Revision 1.30  2000/05/29 16:27:55  bjornw * Simulator ifdef moved a bit * * Revision 1.29  2000/05/09 09:40:30  mattias * * Added description of dma registers used in timeout_interrupt * * Removed old code * * Revision 1.28  2000/05/08 16:38:58  mattias * * Bugfix for flushing fifo in timeout_interrupt *   Problem occurs when bluetooth stack waits for a small number of bytes *   containing an event acknowledging free buffers in bluetooth HW *   As before, data was stuck in fifo until more data came on uart and *   flushed it up to the stack. * * Revision 1.27  2000/05/02 09:52:28  jonasd * Added fix for peculiar etrax behaviour when eop is forced on an empty * fifo. This is used when flashing the IRMA chip. Disabled by default. * * Revision 1.26  2000/03/29 15:32:02  bjornw * 2.0.34 updates * * Revision 1.25  2000/02/16 16:59:36  bjornw * * Receive DMA directly into the flip-buffer, eliminating an intermediary *   receive buffer and a memcpy. Will avoid some overruns. * * Error message on debug port if an overrun or flip buffer overrun occurs. * * Just use the first byte in the flag flip buffer for errors. * * Check for timeout on the serial ports only each 5/100 s, not 1/100. * * Revision 1.24  2000/02/09 18:02:28  bjornw * * Clear serial errors (overrun, framing, parity) correctly. Before, the *   receiver would get stuck if an error occurred and we did not restart *   the input DMA. * * Cosmetics (indentation, some code made into inlines) * * Some more debug options * * Actually shut down the serial port (DMA irq, DMA reset, receiver stop) *   when the last open is closed. Corresponding fixes in startup(). * * rs_close() "tx FIFO wait" code moved into right place, bug & -> && fixed *   and make a special case out of port 1 (R_DMA_CHx_STATUS is broken for that) * * e100_disable_rx/enable_rx just disables/enables the receiver, not RTS * * Revision 1.23  2000/01/24 17:46:19  johana * Wait for flush of DMA/FIFO when closing port. * * Revision 1.22  2000/01/20 18:10:23  johana * Added TIOCMGET ioctl to return modem status. * Implemented modem status/control that works with the extra signals * (DTR, DSR, RI,CD) as well. * 3 different modes supported: * ser0 on PB (Bundy), ser1 on PB (Lisa) and ser2 on PA (Bundy) * Fixed DEF_TX value that caused the serial transmitter pin (txd) to go to 0 when * closing the last filehandle, NASTY!. * Added break generation, not tested though! * Use SA_SHIRQ when request_irq() for ser2 and ser3 (shared with) par0 and par1. * You can't use them at the same time (yet..), but you can hopefully switch * between ser2/par0, ser3/par1 with the same kernel config. * Replaced some magic constants with defines * * */static char *serial_version = "$Revision: 1.20 $";#include <linux/config.h>

⌨️ 快捷键说明

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