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

📄 serial.c

📁 linux平台上的开放源代码的网络摄像机程序.实现视频捕捉,传输以及云台控制等.非常具有参考价值.
💻 C
📖 第 1 页 / 共 5 页
字号:
/* $Id: serial.c,v 1.27 2001/11/29 17:00:41 pkj Exp $ * * Serial port driver for the ETRAX 100LX chip * *      Copyright (C) 1998, 1999, 2000, 2001  Axis Communications AB * *      Many, many authors. Based once upon a time on serial.c for 16x50. * * $Log: serial.c,v $ * 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 cant 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.27 $";#include <linux/config.h>#include <linux/version.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/signal.h>#include <linux/sched.h>#include <linux/timer.h>#include <linux/interrupt.h>#include <linux/tty.h>#include <linux/tty_flip.h>#include <linux/major.h>#include <linux/string.h>#include <linux/fcntl.h>#include <linux/mm.h>#include <linux/slab.h>#if (LINUX_VERSION_CODE >= 131343)#include <linux/init.h>#endif#if (LINUX_VERSION_CODE >= 131336)#include <asm/uaccess.h>#endif#include <linux/kernel.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/system.h>#include <asm/segment.h>#include <asm/bitops.h>#include <asm/delay.h>#include <asm/svinto.h>/* non-arch dependant serial structures are in linux/serial.h */#include <linux/serial.h>/* while we keep our own stuff (struct e100_serial) in a local .h file */#include "serial.h"/* * All of the compatibilty code so we can compile serial.c against * older kernels is hidden in serial_compat.h */#if defined(LOCAL_HEADERS) || (LINUX_VERSION_CODE < 0x020317) /* 2.3.23 */#include "serial_compat.h"#endif#define _INLINE_ inlinestatic DECLARE_TASK_QUEUE(tq_serial);struct tty_driver serial_driver, callout_driver;static int serial_refcount;/* serial subtype definitions */#ifndef SERIAL_TYPE_NORMAL#define SERIAL_TYPE_NORMAL	1#define SERIAL_TYPE_CALLOUT	2#endif/* number of characters left in xmit buffer before we ask for more */#define WAKEUP_CHARS 256//#define SERIAL_DEBUG_INTR//#define SERIAL_DEBUG_OPEN //#define SERIAL_DEBUG_FLOW//#define SERIAL_DEBUG_DATA//#define SERIAL_DEBUG_THROTTLE//#define SERIAL_DEBUG_IO  /* Debug for Extra control and status pins */#define SERIAL_DEBUG_LINE 0 /* What serport we want to debug *//* Enable this to use serial interrupts to handle when you   expect the first received event on the serial port to   be an error, break or similar. Used to be able to flash IRMA   from eLinux */#define SERIAL_HANDLE_EARLY_ERRORS#define TTY_THROTTLE_LIMIT (TTY_FLIPBUF_SIZE/10)#define SERIAL_RECV_SIZE      4096#define SERIAL_DESCR_BUF_SIZE 512/* Add an x here to log a lot of timer stuff */#define TIMERD(x)#define DEBUG_LOG(line, string, value)#ifndef CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS/* Default number of timer ticks before flushing rx fifo  * When using "little data, low latency applications: use 0 * When using "much data applications (PPP)" use ~5 */#define CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS 5 #endifstatic void change_speed(struct e100_serial *info);static void rs_wait_until_sent(struct tty_struct *tty, int timeout);static int rs_write(struct tty_struct * tty, int from_user,                    const unsigned char *buf, int count);// #define DEF_BAUD 0x99   /* 115.2 kbit/s */// #define DEF_BAUD 0x66   /* 19.2 kbit/s */#define STD_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)#define DEF_RX 0x20  /* or SERIAL_CTRL_W >> 8 *//* Default value of tx_ctrl register: has txd(bit 7)=1 (idle) as default */#define DEF_TX 0x80  /* or SERIAL_CTRL_B *//* offsets from R_SERIALx_CTRL */#define REG_DATA 0#define REG_TR_DATA 0#define REG_STATUS 1#define REG_TR_CTRL 1#define REG_REC_CTRL 2#define REG_BAUD 3#define REG_XOFF 4  /* this is a 32 bit register *//* The bitfields are the same for all serial ports */#define SER_RXD_MASK         IO_MASK(R_SERIAL0_STATUS, rxd)#define SER_DATA_AVAIL_MASK  IO_MASK(R_SERIAL0_STATUS, data_avail)#define SER_FRAMING_ERR_MASK IO_MASK(R_SERIAL0_STATUS, framing_err)#define SER_PAR_ERR_MASK     IO_MASK(R_SERIAL0_STATUS, par_err)#define SER_OVERRUN_MASK     IO_MASK(R_SERIAL0_STATUS, overrun)#define SER_ERROR_MASK (SER_OVERRUN_MASK | SER_PAR_ERR_MASK | SER_FRAMING_ERR_MASK)/* Values for info->errorcode */#define ERRCODE_SET_BREAK    (TTY_BREAK)#define ERRCODE_INSERT        0x100#define ERRCODE_INSERT_BREAK (ERRCODE_INSERT | TTY_BREAK)#define FORCE_EOP(info)  *R_SET_EOP = 1U << info->iseteop;/* * General note regarding the use of IO_* macros in this file:  * * We will use the bits defined for DMA channel 6 when using various * IO_* macros (e.g. IO_STATE, IO_MASK, IO_EXTRACT) and _assume_ they are * the same for all channels (which of course they are). * * We will also use the bits defined for serial port 0 when writing commands * to the different ports, as these bits too are the same for all ports. *//* this is the data for the four serial ports in the etrax100 *//*  DMA2(ser2), DMA4(ser3), DMA6(ser0) or DMA8(ser1) *//* R_DMA_CHx_CLR_INTR, R_DMA_CHx_FIRST, R_DMA_CHx_CMD */static struct e100_serial rs_table[] = {	{ CONFIG_SERIAL0_BAUD_XX, (unsigned char *)R_SERIAL0_CTRL, 1U << 12, /* uses DMA 6 and 7 */	  R_DMA_CH6_CLR_INTR, R_DMA_CH6_FIRST, R_DMA_CH6_CMD,	  R_DMA_CH6_STATUS, R_DMA_CH6_HWSW, R_DMA_CH6_DESCR,	  R_DMA_CH7_CLR_INTR, R_DMA_CH7_FIRST, R_DMA_CH7_CMD,	  R_DMA_CH7_STATUS, R_DMA_CH7_HWSW, R_DMA_CH7_DESCR,	  STD_FLAGS, DEF_RX, DEF_TX, 2,#ifdef CONFIG_ETRAX_SERIAL_PORT0          1#else          0#endif},  /* ttyS0 */#ifndef CONFIG_SVINTO_SIM	{ CONFIG_SERIAL1_BAUD_XX, (unsigned char *)R_SERIAL1_CTRL, 1U << 16, /* uses DMA 8 and 9 */	  R_DMA_CH8_CLR_INTR, R_DMA_CH8_FIRST, R_DMA_CH8_CMD,	  R_DMA_CH8_STATUS, R_DMA_CH8_HWSW, R_DMA_CH8_DESCR,	  R_DMA_CH9_CLR_INTR, R_DMA_CH9_FIRST, R_DMA_CH9_CMD,	  R_DMA_CH9_STATUS, R_DMA_CH9_HWSW, R_DMA_CH9_DESCR,	  STD_FLAGS, DEF_RX, DEF_TX, 3 ,#ifdef CONFIG_ETRAX_SERIAL_PORT1

⌨️ 快捷键说明

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