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

📄 moxa.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			if (ch->asyncflags & ASYNC_HUP_NOTIFY)				retval = -EAGAIN;			else				retval = -ERESTARTSYS;#else			retval = -EAGAIN;#endif			break;		}		if (!(ch->asyncflags & ASYNC_CLOSING) && (do_clocal ||						MoxaPortDCDON(ch->port)))			break;		if (signal_pending(current)) {			retval = -ERESTARTSYS;			break;		}		schedule();	}	set_current_state(TASK_RUNNING);	remove_wait_queue(&ch->open_wait, &wait);	spin_lock_irqsave(&moxa_lock, flags);	if (!tty_hung_up_p(filp))		ch->count++;	ch->blocked_open--;	spin_unlock_irqrestore(&moxa_lock, flags);	pr_debug("block_til_ready after blocking: ttys%d, count = %d\n",		ch->port, ch->count);	if (retval)		return (retval);	/* FIXME: review to see if we need to use set_bit on these */	ch->asyncflags |= ASYNC_NORMAL_ACTIVE;	return 0;}static void moxa_setup_empty_event(struct tty_struct *tty){	struct moxa_port *ch = tty->driver_data;	unsigned long flags;	spin_lock_irqsave(&moxa_lock, flags);	ch->statusflags |= EMPTYWAIT;	mod_timer(&moxa_ports[ch->port].emptyTimer, jiffies + HZ);	spin_unlock_irqrestore(&moxa_lock, flags);}static void moxa_check_xmit_empty(unsigned long data){	struct moxa_port *ch;	ch = (struct moxa_port *) data;	if (ch->tty && (ch->statusflags & EMPTYWAIT)) {		if (MoxaPortTxQueue(ch->port) == 0) {			ch->statusflags &= ~EMPTYWAIT;			tty_wakeup(ch->tty);			return;		}		mod_timer(&moxa_ports[ch->port].emptyTimer,				round_jiffies(jiffies + HZ));	} else		ch->statusflags &= ~EMPTYWAIT;}static void moxa_shut_down(struct moxa_port *ch){	struct tty_struct *tp;	if (!(ch->asyncflags & ASYNC_INITIALIZED))		return;	tp = ch->tty;	MoxaPortDisable(ch->port);	/*	 * If we're a modem control device and HUPCL is on, drop RTS & DTR.	 */	if (tp->termios->c_cflag & HUPCL)		MoxaPortLineCtrl(ch->port, 0, 0);	ch->asyncflags &= ~ASYNC_INITIALIZED;}static void moxa_receive_data(struct moxa_port *ch){	struct tty_struct *tp;	struct ktermios *ts;	unsigned long flags;	ts = NULL;	tp = ch->tty;	if (tp)		ts = tp->termios;	/**************************************************	if ( !tp || !ts || !(ts->c_cflag & CREAD) ) {	*****************************************************/	if (!tp || !ts) {		MoxaPortFlushData(ch->port, 0);		return;	}	spin_lock_irqsave(&moxa_lock, flags);	MoxaPortReadData(ch->port, tp);	spin_unlock_irqrestore(&moxa_lock, flags);	tty_schedule_flip(tp);}#define Magic_code	0x404/* *    System Configuration *//* *    for C218 BIOS initialization */#define C218_ConfBase	0x800#define C218_status	(C218_ConfBase + 0)	/* BIOS running status    */#define C218_diag	(C218_ConfBase + 2)	/* diagnostic status      */#define C218_key	(C218_ConfBase + 4)	/* WORD (0x218 for C218) */#define C218DLoad_len	(C218_ConfBase + 6)	/* WORD           */#define C218check_sum	(C218_ConfBase + 8)	/* BYTE           */#define C218chksum_ok	(C218_ConfBase + 0x0a)	/* BYTE (1:ok)            */#define C218_TestRx	(C218_ConfBase + 0x10)	/* 8 bytes for 8 ports    */#define C218_TestTx	(C218_ConfBase + 0x18)	/* 8 bytes for 8 ports    */#define C218_RXerr	(C218_ConfBase + 0x20)	/* 8 bytes for 8 ports    */#define C218_ErrFlag	(C218_ConfBase + 0x28)	/* 8 bytes for 8 ports    */#define C218_LoadBuf	0x0F00#define C218_KeyCode	0x218#define CP204J_KeyCode	0x204/* *    for C320 BIOS initialization */#define C320_ConfBase	0x800#define C320_LoadBuf	0x0f00#define STS_init	0x05	/* for C320_status        */#define C320_status	C320_ConfBase + 0	/* BIOS running status    */#define C320_diag	C320_ConfBase + 2	/* diagnostic status      */#define C320_key	C320_ConfBase + 4	/* WORD (0320H for C320) */#define C320DLoad_len	C320_ConfBase + 6	/* WORD           */#define C320check_sum	C320_ConfBase + 8	/* WORD           */#define C320chksum_ok	C320_ConfBase + 0x0a	/* WORD (1:ok)            */#define C320bapi_len	C320_ConfBase + 0x0c	/* WORD           */#define C320UART_no	C320_ConfBase + 0x0e	/* WORD           */#define C320_KeyCode	0x320#define FixPage_addr	0x0000	/* starting addr of static page  */#define DynPage_addr	0x2000	/* starting addr of dynamic page */#define C218_start	0x3000	/* starting addr of C218 BIOS prg */#define Control_reg	0x1ff0	/* select page and reset control */#define HW_reset	0x80/* *    Function Codes */#define FC_CardReset	0x80#define FC_ChannelReset 1	/* C320 firmware not supported */#define FC_EnableCH	2#define FC_DisableCH	3#define FC_SetParam	4#define FC_SetMode	5#define FC_SetRate	6#define FC_LineControl	7#define FC_LineStatus	8#define FC_XmitControl	9#define FC_FlushQueue	10#define FC_SendBreak	11#define FC_StopBreak	12#define FC_LoopbackON	13#define FC_LoopbackOFF	14#define FC_ClrIrqTable	15#define FC_SendXon	16#define FC_SetTermIrq	17	/* C320 firmware not supported */#define FC_SetCntIrq	18	/* C320 firmware not supported */#define FC_SetBreakIrq	19#define FC_SetLineIrq	20#define FC_SetFlowCtl	21#define FC_GenIrq	22#define FC_InCD180	23#define FC_OutCD180	24#define FC_InUARTreg	23#define FC_OutUARTreg	24#define FC_SetXonXoff	25#define FC_OutCD180CCR	26#define FC_ExtIQueue	27#define FC_ExtOQueue	28#define FC_ClrLineIrq	29#define FC_HWFlowCtl	30#define FC_GetClockRate 35#define FC_SetBaud	36#define FC_SetDataMode  41#define FC_GetCCSR      43#define FC_GetDataError 45#define FC_RxControl	50#define FC_ImmSend	51#define FC_SetXonState	52#define FC_SetXoffState	53#define FC_SetRxFIFOTrig 54#define FC_SetTxFIFOCnt 55#define FC_UnixRate	56#define FC_UnixResetTimer 57#define	RxFIFOTrig1	0#define	RxFIFOTrig4	1#define	RxFIFOTrig8	2#define	RxFIFOTrig14	3/* *    Dual-Ported RAM */#define DRAM_global	0#define INT_data	(DRAM_global + 0)#define Config_base	(DRAM_global + 0x108)#define IRQindex	(INT_data + 0)#define IRQpending	(INT_data + 4)#define IRQtable	(INT_data + 8)/* *    Interrupt Status */#define IntrRx		0x01	/* receiver data O.K.             */#define IntrTx		0x02	/* transmit buffer empty  */#define IntrFunc	0x04	/* function complete              */#define IntrBreak	0x08	/* received break         */#define IntrLine	0x10	/* line status change				   for transmitter                */#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 */struct mon_str {	int tick;	int rxcnt[MAX_PORTS];	int txcnt[MAX_PORTS];};#define 	DCD_changed	0x01#define 	DCD_oldstate	0x80static unsigned char moxaBuff[10240];static int moxaLowWaterChk;static int moxaCard;static struct mon_str moxaLog;static int moxaFuncTout = HZ / 2;static void moxafunc(void __iomem *, int, ushort);static void moxa_wait_finish(void __iomem *);static void moxa_low_water_check(void __iomem *);static int moxaloadbios(int, unsigned char __user *, int);static int moxafindcard(int);static int moxaload320b(int, unsigned char __user *, int);static int moxaloadcode(int, unsigned char __user *, int);static int moxaloadc218(int, void __iomem *, int);static int moxaloadc320(int, void __iomem *, int, int *);/***************************************************************************** *	Driver level functions: 					     * *	1. MoxaDriverInit(void);					     * *	2. MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port);   * *	3. MoxaDriverPoll(void);					     * *****************************************************************************/void MoxaDriverInit(void){	struct moxa_port *p;	unsigned int i;	moxaFuncTout = HZ / 2;	/* 500 mini-seconds */	moxaCard = 0;	moxaLog.tick = 0;	moxaLowWaterChk = 0;	for (i = 0; i < MAX_PORTS; i++) {		p = &moxa_ports[i];		p->chkPort = 0;		p->lowChkFlag = 0;		p->lineCtrl = 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 dl_str {	char __user *buf;	int len;	int cardno;};static struct dl_str dltmp;void MoxaPortFlushData(int port, int mode){	void __iomem *ofsAddr;	if ((mode < 0) || (mode > 2))		return;	ofsAddr = moxa_ports[port].tableAddr;	moxafunc(ofsAddr, FC_FlushQueue, mode);	if (mode != 1) {		moxa_ports[port].lowChkFlag = 0;		moxa_low_water_check(ofsAddr);	}}int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port)

⌨️ 快捷键说明

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