📄 mxser.c
字号:
/* * mxser.c -- MOXA Smartio/Industio family multiport serial driver. * * Copyright (C) 1999-2001 Moxa Technologies (support@moxa.com.tw). * * This code is loosely based on the Linux serial driver, written by * Linus Torvalds, Theodore T'so and others. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or* (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Original release 10/26/00 * * 02/06/01 Support MOXA Industio family boards. * 02/06/01 Support TIOCGICOUNT. * 02/06/01 Fix the problem for connecting to serial mouse. * 02/06/01 Fix the problem for H/W flow control. * 02/06/01 Fix the compling warning when CONFIG_PCI * don't be defined. */#ifdef MODVERSIONS#ifndef MODULE#define MODULE#endif#endif#ifdef MODULE#include <linux/config.h>#ifdef MODVERSIONS#include <linux/modversions.h>#endif#include <linux/module.h>#else#define MOD_INC_USE_COUNT#define MOD_DEC_USE_COUNT#endif#include <linux/version.h>#include <linux/autoconf.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/serial.h>#include <linux/serial_reg.h>#include <linux/major.h>#include <linux/string.h>#include <linux/fcntl.h>#include <linux/ptrace.h>#include <linux/ioport.h>#include <linux/mm.h>#include <linux/smp_lock.h>#include <linux/delay.h>#include <asm/system.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/segment.h>#include <asm/bitops.h>#define VERSION_CODE(ver,rel,seq) ((ver << 16) | (rel << 8) | seq)#include "mxser.h"#ifdef CONFIG_PCI#include <linux/pci.h>#endif#define MXSER_VERSION "1.8"#define MXSERMAJOR 30#define MXSERCUMAJOR 35#ifdef CONFIG_PCI#if (LINUX_VERSION_CODE < VERSION_CODE(2,1,0))#include <linux/bios32.h>#endif#include <linux/pci.h>#endif /* ENABLE_PCI */#if (LINUX_VERSION_CODE < VERSION_CODE(2,1,0))#define copy_from_user memcpy_fromfs#define copy_to_user memcpy_tofs#define put_to_user(arg1, arg2) put_fs_long(arg1, (unsigned long *)arg2)#define get_from_user(arg1, arg2) arg1 = get_fs_long((unsigned long *)arg2)#define schedule_timeout(x) {current->timeout = jiffies + (x); schedule();}#define signal_pending(x) ((x)->signal & ~(x)->blocked)#else#include <asm/uaccess.h>#define put_to_user(arg1, arg2) put_user(arg1, (unsigned long *)arg2)#define get_from_user(arg1, arg2) get_user(arg1, (unsigned int *)arg2)#endif#define MXSER_EVENT_TXLOW 1#define MXSER_EVENT_HANGUP 2#define SERIAL_DO_RESTART#define MXSER_BOARDS 4 /* Max. boards */#define MXSER_PORTS 32 /* Max. ports */#define MXSER_PORTS_PER_BOARD 8 /* Max. ports per board*/#define MXSER_ISR_PASS_LIMIT 256#define MXSER_ERR_IOADDR -1#define MXSER_ERR_IRQ -2#define MXSER_ERR_IRQ_CONFLIT -3#define MXSER_ERR_VECTOR -4#define SERIAL_TYPE_NORMAL 1#define SERIAL_TYPE_CALLOUT 2#define WAKEUP_CHARS 256#define UART_MCR_AFE 0x20#define UART_LSR_SPECIAL 0x1E#define MX_LOCK_INIT() unsigned long flags#define MX_LOCK(lock) spin_lock_irqsave(lock, flags)#define MX_UNLOCK(lock) spin_unlock_irqrestore(lock, flags)#if (LINUX_VERSION_CODE < VERSION_CODE(2,6,0))#define PORTNO(x) (MINOR((x)->device) - (x)->driver.minor_start)#else#define PORTNO(x) ((x)->index)#endif#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|IXON|IXOFF))#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT)#ifndef MIN#define MIN(a,b) ((a) < (b) ? (a) : (b))#endif/* * Define the Moxa PCI vendor and device IDs. */#ifndef PCI_VENDOR_ID_MOXA#define PCI_VENDOR_ID_MOXA 0x1393#endif#ifndef PCI_DEVICE_ID_C168#define PCI_DEVICE_ID_C168 0x1680#endif#ifndef PCI_DEVICE_ID_C104#define PCI_DEVICE_ID_C104 0x1040#endif#ifndef PCI_DEVICE_ID_CP132#define PCI_DEVICE_ID_CP132 0x1320#endif#ifndef PCI_DEVICE_ID_CP114#define PCI_DEVICE_ID_CP114 0x1141#endif#ifndef PCI_DEVICE_ID_CT114#define PCI_DEVICE_ID_CT114 0x1140#endif#ifndef PCI_DEVICE_ID_CP102#define PCI_DEVICE_ID_CP102 0x1020#endif#ifndef PCI_DEVICE_ID_CP104U#define PCI_DEVICE_ID_CP104U 0x1041#endif#ifndef PCI_DEVICE_ID_CP168U#define PCI_DEVICE_ID_CP168U 0x1681#endif#ifndef PCI_DEVICE_ID_CP132U#define PCI_DEVICE_ID_CP132U 0x1321#endif#ifndef PCI_DEVICE_ID_CP134U#define PCI_DEVICE_ID_CP134U 0x1340#endif#ifndef PCI_DEVICE_ID_CP104JU#define PCI_DEVICE_ID_CP104JU 0x1042#endif#ifndef PCI_DEVICE_ID_CP118U#define PCI_DEVICE_ID_CP118U 0x1180#endif#ifndef PCI_DEVICE_ID_CP102UL#define PCI_DEVICE_ID_CP102UL 0x1021#endif#ifndef PCI_DEVICE_ID_CP102U#define PCI_DEVICE_ID_CP102U 0x1022#endif#ifndef PCI_DEVICE_ID_RC7000#define PCI_DEVICE_ID_RC7000 0x0001#endif#define C168_ASIC_ID 1#define C104_ASIC_ID 2#define C102_ASIC_ID 0xB#define CI132_ASIC_ID 4#define CI134_ASIC_ID 3#define CI104J_ASIC_ID 5enum { MXSER_BOARD_C168_ISA = 1, MXSER_BOARD_C104_ISA, MXSER_BOARD_CI104J, MXSER_BOARD_C168_PCI, MXSER_BOARD_C104_PCI, MXSER_BOARD_C102_ISA, MXSER_BOARD_CI132, MXSER_BOARD_CI134, MXSER_BOARD_CP132, MXSER_BOARD_CP114, MXSER_BOARD_CT114, MXSER_BOARD_CP102, MXSER_BOARD_CP104U, MXSER_BOARD_CP168U, MXSER_BOARD_CP132U, MXSER_BOARD_CP134U, MXSER_BOARD_CP104JU, MXSER_BOARD_RC7000, MXSER_BOARD_CP118U, MXSER_BOARD_CP102UL, MXSER_BOARD_CP102U,};static char *mxser_brdname[] = { "C168 series", "C104 series", "CI-104J series", "C168H/PCI series", "C104H/PCI series", "C102 series", "CI-132 series", "CI-134 series", "CP-132 series", "CP-114 series", "CT-114 series", "CP-102 series", "CP-104U series", "CP-168U series", "CP-132U series", "CP-134U series", "CP-104JU series", "Moxa UC7000 Serial", "CP-118U series", "CP-102UL series", "CP-102U series",};static int mxser_numports[] = { 8, // C168-ISA 4, // C104-ISA 4, // CI104J 8, // C168-PCI 4, // C104-PCI 2, // C102-ISA 2, // CI132 4, // CI134 2, // CP132 4, // CP114 4, // CT114 2, // CP102 4, // CP104U 8, // CP168U 2, // CP132U 4, // CP134U 4, // CP104JU 8, // RC7000 8, // CP118U 2, // CP102UL 2, // CP102U};/* * MOXA ioctls */#define MOXA 0x400#define MOXA_GETDATACOUNT (MOXA + 23)#define MOXA_GET_CONF (MOXA + 35)#define MOXA_DIAGNOSE (MOXA + 50)#define MOXA_CHKPORTENABLE (MOXA + 60)#define MOXA_HighSpeedOn (MOXA + 61)#define MOXA_GET_MAJOR (MOXA + 63)#define MOXA_GET_CUMAJOR (MOXA + 64)#define MOXA_GETMSTATUS (MOXA + 65)// following add by Victor Yu. 01-05-2004#define MOXA_SET_OP_MODE (MOXA + 66)#define MOXA_GET_OP_MODE (MOXA + 67)#define RS232_MODE 0#define RS485_2WIRE_MODE 1#define RS422_MODE 2#define RS485_4WIRE_MODE 3#define OP_MODE_MASK 3// above add by Victor Yu. 01-05-2004#define TTY_THRESHOLD_THROTTLE 128#define LO_WATER (TTY_FLIPBUF_SIZE)#define HI_WATER (TTY_FLIPBUF_SIZE*2*3/4)// added by James. 03-11-2004.#define MOXA_SDS_GETICOUNTER (MOXA + 68)#define MOXA_SDS_RSTICOUNTER (MOXA + 69)// (above) added by James.#define MOXA_ASPP_OQUEUE (MOXA + 70)#define MOXA_ASPP_SETBAUD (MOXA + 71)#define MOXA_ASPP_GETBAUD (MOXA + 72)#define MOXA_ASPP_MON (MOXA + 73)#define MOXA_ASPP_LSTATUS (MOXA + 74)#define MOXA_ASPP_MON_EXT (MOXA + 75)#define MOXA_SET_BAUD_METHOD (MOXA + 76)#define NPPI_NOTIFY_PARITY 0x01#define NPPI_NOTIFY_FRAMING 0x02#define NPPI_NOTIFY_HW_OVERRUN 0x04#define NPPI_NOTIFY_SW_OVERRUN 0x08#define NPPI_NOTIFY_BREAK 0x10#define NPPI_NOTIFY_CTSHOLD 0x01 // Tx hold by CTS low#define NPPI_NOTIFY_DSRHOLD 0x02 // Tx hold by DSR low#define NPPI_NOTIFY_XOFFHOLD 0x08 // Tx hold by Xoff received#define NPPI_NOTIFY_XOFFXENT 0x10 // Xoff Sent#define UART_TYPE_NUM 2unsigned int Gmoxa_uart_id[UART_TYPE_NUM]= { MOXA_MUST_MU150_HWID, MOXA_MUST_MU860_HWID};// This is only for PCI#define UART_INFO_NUM 3struct mxpciuart_info{ int type; int tx_fifo; int rx_fifo; int xmit_fifo_size; int rx_high_water; int rx_trigger; int rx_low_water; long max_baud;};struct mxpciuart_info Gpci_uart_info[UART_INFO_NUM] = { {MOXA_OTHER_UART, 16, 16, 16, 14, 14, 1, 921600L}, {MOXA_MUST_MU150_HWID, 64, 64, 64, 48, 48, 16, 230400L}, {MOXA_MUST_MU860_HWID, 128, 128, 128, 96, 96, 32, 921600L}};#ifdef CONFIG_PCI#ifndef PCI_ANY_ID#define PCI_ANY_ID (~0)#endif#if (LINUX_VERSION_CODE < VERSION_CODE(2,6,0))typedef struct { unsigned short vendor; unsigned short device; unsigned short driver_data;} mxser_pciinfo;static mxser_pciinfo mxser_pcibrds[] = { {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_C168 ,MXSER_BOARD_C168_PCI}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_C104 ,MXSER_BOARD_C104_PCI}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP132 ,MXSER_BOARD_CP132}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP114 ,MXSER_BOARD_CP114}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CT114 ,MXSER_BOARD_CT114}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP102 ,MXSER_BOARD_CP102}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP104U ,MXSER_BOARD_CP104U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP168U ,MXSER_BOARD_CP168U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP132U ,MXSER_BOARD_CP132U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP134U ,MXSER_BOARD_CP134U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP104JU ,MXSER_BOARD_CP104JU}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_RC7000 ,MXSER_BOARD_RC7000}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP118U ,MXSER_BOARD_CP118U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP102UL ,MXSER_BOARD_CP102UL}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP102U ,MXSER_BOARD_CP102U}, {0}}; #elsestatic struct pci_device_id mxser_pcibrds[] = { {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_C168 ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_C168_PCI}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_C104 ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_C104_PCI}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP132 ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP132}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP114 ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP114}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CT114 ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CT114}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP102 ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP102}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP104U ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP104U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP168U ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP168U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP132U ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP132U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP134U ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP134U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP104JU ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP104JU}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_RC7000 ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_RC7000}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP118U ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP118U}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP102UL ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP102UL}, {PCI_VENDOR_ID_MOXA,PCI_DEVICE_ID_CP102U ,PCI_ANY_ID, PCI_ANY_ID, 0, 0,MXSER_BOARD_CP102U}, {0}};MODULE_DEVICE_TABLE(pci, mxser_pcibrds);#endif#endiftypedef struct _moxa_pci_info { unsigned short busNum; unsigned short devNum;struct pci_dev *pdev; // add by Victor Yu. 06-23-2003} moxa_pci_info;static int ioaddr[MXSER_BOARDS]={0,0,0,0};static int ttymajor=MXSERMAJOR;static int calloutmajor=MXSERCUMAJOR;static int verbose=0;#ifdef MODULE/* Variables for insmod */# if (LINUX_VERSION_CODE > VERSION_CODE(2,1,11))MODULE_AUTHOR("Casper Yang");MODULE_DESCRIPTION("MOXA Smartio/Industio Family Multiport Board Device Driver");MODULE_PARM(ioaddr, "1-4i");MODULE_PARM(ttymajor, "i");MODULE_PARM(calloutmajor, "i");MODULE_PARM(verbose, "i");#ifdef MODULE_LICENSEMODULE_LICENSE("GPL");#endif# endif#endif /* MODULE */struct mxser_log { int tick; unsigned long rxcnt[MXSER_PORTS];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -