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

📄 mxser.c

📁 MOXA 串口驱动编程
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *          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 + -