📄 moxa.c
字号:
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 + -