📄 moxa.c
字号:
#else retval = -EAGAIN;#endif break; } if (!(ch->asyncflags & ASYNC_CALLOUT_ACTIVE) && !(ch->asyncflags & ASYNC_CLOSING) && (do_clocal || MoxaPortDCDON(ch->port))) break; if (signal_pending(current)) { retval = -ERESTARTSYS; break; } schedule(); } current->state = TASK_RUNNING; remove_wait_queue(&ch->open_wait, &wait); if (!tty_hung_up_p(filp)) ch->count++; ch->blocked_open--;#ifdef SERIAL_DEBUG_OPEN printk("block_til_ready after blocking: ttys%d, count = %d\n", ch->line, ch->count);#endif if (retval) return (retval); ch->asyncflags |= ASYNC_NORMAL_ACTIVE; return (0);}static void setup_empty_event(struct tty_struct *tty){ struct moxa_str *ch = tty->driver_data; unsigned long flags; save_flags(flags); cli(); ch->statusflags |= EMPTYWAIT; moxaEmptyTimer_on[ch->port] = 0; del_timer(&moxaEmptyTimer[ch->port]); moxaEmptyTimer[ch->port].expires = jiffies + HZ; moxaEmptyTimer_on[ch->port] = 1; add_timer(&moxaEmptyTimer[ch->port]); restore_flags(flags);}static void check_xmit_empty(unsigned long data){ struct moxa_str *ch; ch = (struct moxa_str *) data; moxaEmptyTimer_on[ch->port] = 0; del_timer(&moxaEmptyTimer[ch->port]); if (ch->tty && (ch->statusflags & EMPTYWAIT)) { if (MoxaPortTxQueue(ch->port) == 0) { ch->statusflags &= ~EMPTYWAIT; if ((ch->tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && ch->tty->ldisc.write_wakeup) (ch->tty->ldisc.write_wakeup) (ch->tty); wake_up_interruptible(&ch->tty->write_wait); return; } moxaEmptyTimer[ch->port].expires = jiffies + HZ; moxaEmptyTimer_on[ch->port] = 1; add_timer(&moxaEmptyTimer[ch->port]); } else ch->statusflags &= ~EMPTYWAIT;}static void shut_down(struct moxa_str *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 receive_data(struct moxa_str *ch){ struct tty_struct *tp; struct termios *ts; int i, count, rc, space; unsigned char *charptr, *flagptr; unsigned long flags; ts = 0; tp = ch->tty; if (tp) ts = tp->termios; /************************************************** if ( !tp || !ts || !(ts->c_cflag & CREAD) ) { *****************************************************/ if (!tp || !ts) { MoxaPortFlushData2(ch->port, 0); return; } space = TTY_FLIPBUF_SIZE - tp->flip.count; if (space <= 0) return; charptr = tp->flip.char_buf_ptr; flagptr = tp->flip.flag_buf_ptr; rc = tp->flip.count; save_flags(flags); cli(); count = MoxaPortReadData(ch->port, charptr, space); restore_flags(flags); for (i = 0; i < count; i++) *flagptr++ = 0; charptr += count; rc += count; tp->flip.count = rc; tp->flip.char_buf_ptr = charptr; tp->flip.flag_buf_ptr = flagptr; tty_schedule_flip(ch->tty);}#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_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 C320_KeyCode 0x320#define FixPage_addr 0x0000 /* starting addr of static page */#define DynPage_addr 0x2000 /* starting addr of dynamic page */#define Control_reg 0x1ff0 /* select page and reset control */#define HW_reset 0x80/* * Function Codes */#define FC_EnableCH 2#define FC_DisableCH 3#define FC_SetMode 5#define FC_LineControl 7#define FC_FlushQueue 10#define FC_SendBreak 11#define FC_StopBreak 12#define FC_SendXon 16#define FC_SetLineIrq 20#define FC_SetFlowCtl 21#define FC_SetXonXoff 25#define FC_ExtIQueue 27#define FC_ExtOQueue 28#define FC_ClrLineIrq 29#define FC_SetBaud 36#define FC_SetDataMode 41#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 Module_cnt (Config_base + 8)#define Module_no (Config_base + 10)#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 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 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#define MX_PARMARK 0xA0 #define MX_PARSPACE 0x20#define LowWater 128/* * 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 moxafunc2(unsigned long, int, ushort);static void wait_finish(unsigned long);static void wait_finish2(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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -