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

📄 moxa.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#define IntrIntr	0x20	/* received INTR code             */#define IntrQuit	0x40	/* received QUIT code             */#define IntrEOF 	0x80	/* received EOF code              */#define IntrRxTrigger 	0x100	/* rx data count reach tigger value */#define IntrTxTrigger 	0x200	/* tx data count below trigger value */#define Magic_no	(Config_base + 0)#define Card_model_no	(Config_base + 2)#define Total_ports	(Config_base + 4)#define Module_cnt	(Config_base + 8)#define Module_no	(Config_base + 10)#define Timer_10ms	(Config_base + 14)#define Disable_IRQ	(Config_base + 20)#define TMS320_PORT1	(Config_base + 22)#define TMS320_PORT2	(Config_base + 24)#define TMS320_CLOCK	(Config_base + 26)/* *    DATA BUFFER in DRAM */#define Extern_table	0x400	/* Base address of the external table				   (24 words *    64) total 3K bytes				   (24 words * 128) total 6K bytes */#define Extern_size	0x60	/* 96 bytes                       */#define RXrptr		0x00	/* read pointer for RX buffer     */#define RXwptr		0x02	/* write pointer for RX buffer    */#define TXrptr		0x04	/* read pointer for TX buffer     */#define TXwptr		0x06	/* write pointer for TX buffer    */#define HostStat	0x08	/* IRQ flag and general flag      */#define FlagStat	0x0A#define FlowControl	0x0C	/* B7 B6 B5 B4 B3 B2 B1 B0              */					/*  x  x  x  x  |  |  |  |            */					/*              |  |  |  + CTS flow   */					/*              |  |  +--- RTS flow   */					/*              |  +------ TX Xon/Xoff */					/*              +--------- RX Xon/Xoff */#define Break_cnt	0x0E	/* received break count   */#define CD180TXirq	0x10	/* if non-0: enable TX irq        */#define RX_mask 	0x12#define TX_mask 	0x14#define Ofs_rxb 	0x16#define Ofs_txb 	0x18#define Page_rxb	0x1A#define Page_txb	0x1C#define EndPage_rxb	0x1E#define EndPage_txb	0x20#define Data_error	0x22#define RxTrigger	0x28#define TxTrigger	0x2a#define rRXwptr 	0x34#define Low_water	0x36#define FuncCode	0x40#define FuncArg 	0x42#define FuncArg1	0x44#define C218rx_size	0x2000	/* 8K bytes */#define C218tx_size	0x8000	/* 32K bytes */#define C218rx_mask	(C218rx_size - 1)#define C218tx_mask	(C218tx_size - 1)#define C320p8rx_size	0x2000#define C320p8tx_size	0x8000#define C320p8rx_mask	(C320p8rx_size - 1)#define C320p8tx_mask	(C320p8tx_size - 1)#define C320p16rx_size	0x2000#define C320p16tx_size	0x4000#define C320p16rx_mask	(C320p16rx_size - 1)#define C320p16tx_mask	(C320p16tx_size - 1)#define C320p24rx_size	0x2000#define C320p24tx_size	0x2000#define C320p24rx_mask	(C320p24rx_size - 1)#define C320p24tx_mask	(C320p24tx_size - 1)#define C320p32rx_size	0x1000#define C320p32tx_size	0x1000#define C320p32rx_mask	(C320p32rx_size - 1)#define C320p32tx_mask	(C320p32tx_size - 1)#define Page_size	0x2000#define Page_mask	(Page_size - 1)#define C218rx_spage	3#define C218tx_spage	4#define C218rx_pageno	1#define C218tx_pageno	4#define C218buf_pageno	5#define C320p8rx_spage	3#define C320p8tx_spage	4#define C320p8rx_pgno	1#define C320p8tx_pgno	4#define C320p8buf_pgno	5#define C320p16rx_spage 3#define C320p16tx_spage 4#define C320p16rx_pgno	1#define C320p16tx_pgno	2#define C320p16buf_pgno 3#define C320p24rx_spage 3#define C320p24tx_spage 4#define C320p24rx_pgno	1#define C320p24tx_pgno	1#define C320p24buf_pgno 2#define C320p32rx_spage 3#define C320p32tx_ofs	C320p32rx_size#define C320p32tx_spage 3#define C320p32buf_pgno 1/* *    Host Status */#define WakeupRx	0x01#define WakeupTx	0x02#define WakeupBreak	0x08#define WakeupLine	0x10#define WakeupIntr	0x20#define WakeupQuit	0x40#define WakeupEOF	0x80	/* used in VTIME control */#define WakeupRxTrigger	0x100#define WakeupTxTrigger	0x200/* *    Flag status */#define Rx_over		0x01#define Xoff_state	0x02#define Tx_flowOff	0x04#define Tx_enable	0x08#define CTS_state	0x10#define DSR_state	0x20#define DCD_state	0x80/* *    FlowControl */#define CTS_FlowCtl	1#define RTS_FlowCtl	2#define Tx_FlowCtl	4#define Rx_FlowCtl	8#define IXM_IXANY	0x10#define LowWater	128#define DTR_ON		1#define RTS_ON		2#define CTS_ON		1#define DSR_ON		2#define DCD_ON		8/* mode definition */#define	MX_CS8		0x03#define	MX_CS7		0x02#define	MX_CS6		0x01#define	MX_CS5		0x00#define	MX_STOP1	0x00#define	MX_STOP15	0x04#define	MX_STOP2	0x08#define	MX_PARNONE	0x00#define	MX_PAREVEN	0x40#define	MX_PARODD	0xC0/* *    Query */#define QueryPort	MAX_PORTSstruct mon_str {	int tick;	int rxcnt[MAX_PORTS];	int txcnt[MAX_PORTS];};typedef struct mon_str mon_st;#define 	DCD_changed	0x01#define 	DCD_oldstate	0x80static unsigned char moxaBuff[10240];static unsigned long moxaIntNdx[MAX_BOARDS];static unsigned long moxaIntPend[MAX_BOARDS];static unsigned long moxaIntTable[MAX_BOARDS];static char moxaChkPort[MAX_PORTS];static char moxaLineCtrl[MAX_PORTS];static unsigned long moxaTableAddr[MAX_PORTS];static long moxaCurBaud[MAX_PORTS];static char moxaDCDState[MAX_PORTS];static char moxaLowChkFlag[MAX_PORTS];static int moxaLowWaterChk;static int moxaCard;static mon_st moxaLog;static int moxaFuncTout;static ushort moxaBreakCnt[MAX_PORTS];static void moxadelay(int);static void moxafunc(unsigned long, int, ushort);static void wait_finish(unsigned long);static void low_water_check(unsigned long);static int moxaloadbios(int, unsigned char *, int);static int moxafindcard(int);static int moxaload320b(int, unsigned char *, int);static int moxaloadcode(int, unsigned char *, int);static int moxaloadc218(int, unsigned long, int);static int moxaloadc320(int, unsigned long, int, int *);/***************************************************************************** *	Driver level functions: 					     * *	1. MoxaDriverInit(void);					     * *	2. MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port);   * *	3. MoxaDriverPoll(void);					     * *****************************************************************************/void MoxaDriverInit(void){	int i;	moxaFuncTout = HZ / 2;	/* 500 mini-seconds */	moxaCard = 0;	moxaLog.tick = 0;	moxaLowWaterChk = 0;	for (i = 0; i < MAX_PORTS; i++) {		moxaChkPort[i] = 0;		moxaLowChkFlag[i] = 0;		moxaLineCtrl[i] = 0;		moxaLog.rxcnt[i] = 0;		moxaLog.txcnt[i] = 0;	}}#define	MOXA		0x400#define MOXA_GET_IQUEUE 	(MOXA + 1)	/* get input buffered count */#define MOXA_GET_OQUEUE 	(MOXA + 2)	/* get output buffered count */#define MOXA_INIT_DRIVER	(MOXA + 6)	/* moxaCard=0 */#define MOXA_LOAD_BIOS		(MOXA + 9)	/* download BIOS */#define MOXA_FIND_BOARD		(MOXA + 10)	/* Check if MOXA card exist? */#define MOXA_LOAD_C320B		(MOXA + 11)	/* download 320B firmware */#define MOXA_LOAD_CODE		(MOXA + 12)	/* download firmware */#define MOXA_GETDATACOUNT       (MOXA + 23)#define MOXA_GET_IOQUEUE	(MOXA + 27)#define MOXA_FLUSH_QUEUE	(MOXA + 28)#define MOXA_GET_CONF		(MOXA + 35)	/* configuration */#define MOXA_GET_MAJOR          (MOXA + 63)#define MOXA_GET_CUMAJOR        (MOXA + 64)#define MOXA_GETMSTATUS         (MOXA + 65)struct moxaq_str {	int inq;	int outq;};struct dl_str {	char *buf;	int len;	int cardno;};static struct moxaq_str temp_queue[MAX_PORTS];static struct dl_str dltmp;void MoxaPortFlushData(int port, int mode){	unsigned long ofsAddr;	if ((mode < 0) || (mode > 2))		return;	ofsAddr = moxaTableAddr[port];	moxafunc(ofsAddr, FC_FlushQueue, mode);	if (mode != 1) {		moxaLowChkFlag[port] = 0;		low_water_check(ofsAddr);	}}int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port){	int i;	int status;	int MoxaPortTxQueue(int), MoxaPortRxQueue(int);	if (port == QueryPort) {		if ((cmd != MOXA_GET_CONF) && (cmd != MOXA_INIT_DRIVER) &&		    (cmd != MOXA_LOAD_BIOS) && (cmd != MOXA_FIND_BOARD) && (cmd != MOXA_LOAD_C320B) &&		 (cmd != MOXA_LOAD_CODE) && (cmd != MOXA_GETDATACOUNT) &&		  (cmd != MOXA_GET_IOQUEUE) && (cmd != MOXA_GET_MAJOR) &&		    (cmd != MOXA_GET_CUMAJOR) && (cmd != MOXA_GETMSTATUS))			return (-EINVAL);	}	switch (cmd) {	case MOXA_GET_CONF:		if(copy_to_user((void *)arg, &moxa_boards, MAX_BOARDS * sizeof(moxa_board_conf)))			return -EFAULT;		return (0);	case MOXA_INIT_DRIVER:		if ((int) arg == 0x404)			MoxaDriverInit();		return (0);	case MOXA_GETDATACOUNT:		moxaLog.tick = jiffies;		if(copy_to_user((void *)arg, &moxaLog, sizeof(mon_st)))			return -EFAULT;		return (0);	case MOXA_FLUSH_QUEUE:		MoxaPortFlushData(port, arg);		return (0);	case MOXA_GET_IOQUEUE:		for (i = 0; i < MAX_PORTS; i++) {			if (moxaChkPort[i]) {				temp_queue[i].inq = MoxaPortRxQueue(i);				temp_queue[i].outq = MoxaPortTxQueue(i);			}		}		if(copy_to_user((void *)arg, temp_queue, sizeof(struct moxaq_str) * MAX_PORTS))			return -EFAULT;		return (0);	case MOXA_LOAD_BIOS:		if(copy_from_user(&dltmp, (void *)arg, sizeof(struct dl_str)))			return -EFAULT;		i = moxaloadbios(dltmp.cardno, dltmp.buf, dltmp.len);		return (i);	case MOXA_FIND_BOARD:		if(copy_from_user(&dltmp, (void *)arg, sizeof(struct dl_str)))			return -EFAULT;		return moxafindcard(dltmp.cardno);	case MOXA_LOAD_C320B:		if(copy_from_user(&dltmp, (void *)arg, sizeof(struct dl_str)))			return -EFAULT;		moxaload320b(dltmp.cardno, dltmp.buf, dltmp.len);		return (0);	case MOXA_LOAD_CODE:		if(copy_from_user(&dltmp, (void *)arg, sizeof(struct dl_str)))			return -EFAULT; 		i = moxaloadcode(dltmp.cardno, dltmp.buf, dltmp.len);		if (i == -1)			return (-EFAULT);		return (i);	case MOXA_GET_OQUEUE:		i = MoxaPortTxQueue(port);		return put_user(i, (unsigned long *) arg);	case MOXA_GET_IQUEUE:		i = MoxaPortRxQueue(port);		return put_user(i, (unsigned long *) arg);	case MOXA_GET_MAJOR:		if(copy_to_user((void *)arg, &ttymajor, sizeof(int)))			return -EFAULT;		return 0;	case MOXA_GET_CUMAJOR:		if(copy_to_user((void *)arg, &calloutmajor, sizeof(int)))			return -EFAULT;		return 0;	case MOXA_GETMSTATUS:		for (i = 0; i < MAX_PORTS; i++) {			GMStatus[i].ri = 0;			GMStatus[i].dcd = 0;			GMStatus[i].dsr = 0;			GMStatus[i].cts = 0;			if (!moxaChkPort[i]) {				continue;			} else {				status = MoxaPortLineStatus(moxaChannels[i].port);				if (status & 1)					GMStatus[i].cts = 1;				if (status & 2)					GMStatus[i].dsr = 1;				if (status & 4)					GMStatus[i].dcd = 1;			}			if (!moxaChannels[i].tty || !moxaChannels[i].tty->termios)				GMStatus[i].cflag = moxaChannels[i].normal_termios.c_cflag;			else				GMStatus[i].cflag = moxaChannels[i].tty->termios->c_cflag;		}		if(copy_to_user((void *)arg, GMStatus, sizeof(struct mxser_mstatus) * MAX_PORTS))			return -EFAULT;		return 0;	}	return (-ENOIOCTLCMD);}int MoxaDriverPoll(void){	register ushort temp;	register int card;	unsigned long ip, ofsAddr;	int port, p, ports;	if (moxaCard == 0)		return (-1);	for (card = 0; card < MAX_BOARDS; card++) {		if ((ports = moxa_boards[card].numPorts) == 0)			continue;		if (readb(moxaIntPend[card]) == 0xff) {			ip = moxaIntTable[card] + readb(moxaIntNdx[card]);			p = card * MAX_PORTS_PER_BOARD;			ports <<= 1;			for (port = 0; port < ports; port += 2, p++) {				if ((temp = readw(ip + port)) != 0) {					writew(0, ip + port);					ofsAddr = moxaTableAddr[p];					if (temp & IntrTx)						writew(readw(ofsAddr + HostStat) & ~WakeupTx, ofsAddr + HostStat);					if (temp & IntrBreak) {						moxaBreakCnt[p]++;					}					if (temp & IntrLine) {						if (readb(ofsAddr + FlagStat) & DCD_state) {							if ((moxaDCDState[p] & DCD_oldstate) == 0)								moxaDCDState[p] = (DCD_oldstate |										   DCD_changed);						} else {							if (moxaDCDState[p] & DCD_oldstate)								moxaDCDState[p] = DCD_changed;						}					}				}			}			writeb(0, moxaIntPend[card]);		}		if (moxaLowWaterChk) {			p = card * MAX_PORTS_PER_BOARD;			for (port = 0; port < ports; port++, p++) {				if (moxaLowChkFlag[p]) {					moxaLowChkFlag[p] = 0;					ofsAddr = moxaTableAddr[p];					low_water_check(ofsAddr);				}			}		}	}	moxaLowWaterChk = 0;	return (0);}/***************************************************************************** *	Card level function:						     * *	1. MoxaPortsOfCard(int cardno); 				     * *****************************************************************************/int MoxaPortsOfCard(int cardno){	if (moxa_boards[cardno].boardType == 0)		return (0);	return (moxa_boards[cardno].numPorts);}/***************************************************************************** *	Port level functions:						     * *	1.  MoxaPortIsValid(int port);					     * *	2.  MoxaPortEnable(int port);					     * *	3.  MoxaPortDisable(int port);					     * *	4.  MoxaPortGetMaxBaud(int port);				     * *	5.  MoxaPortGetCurBaud(int port);				     * *	6.  MoxaPortSetBaud(int port, long baud);			     * *	7.  MoxaPortSetMode(int port, int databit, int stopbit, int parity); * *	8.  MoxaPortSetTermio(int port, unsigned char *termio); 	     *

⌨️ 快捷键说明

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