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