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

📄 tubio.h

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 H
字号:
/* *  IBM/3270 Driver -- Copyright (C) 2000 UTS Global LLC * *  tubio.h -- All-Purpose header file * * * * * *  Author:  Richard Hitt */#include <linux/config.h>#include <linux/module.h>#include <linux/version.h>#include <linux/major.h>#ifndef IBM_TTY3270_MAJOR#  define IBM_TTY3270_MAJOR 212#endif /* IBM_TTY3270_MAJOR */#ifndef IBM_FS3270_MAJOR#  define IBM_FS3270_MAJOR 213#endif /* IBM_FS3270_MAJOR */#include <linux/slab.h>#include <asm/irq.h>#include <asm/io.h>#include <asm/idals.h>#include <linux/console.h>#include <linux/interrupt.h>#include <asm/ebcdic.h>#include <asm/uaccess.h>#include <linux/proc_fs.h>#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0))#include <linux/devfs_fs_kernel.h>#endif#define TUB(x) (('3'<<8)|(x))#define TUBICMD TUB(3)#define TUBOCMD TUB(4)#define TUBGETI TUB(7)#define TUBGETO TUB(8)#define TUBSETMOD TUB(12)#define TUBGETMOD TUB(13)#define TIOPOLL TUB(32)#define TIOPOKE TUB(33)#define TIONPOKE TUB(34)#define TIOTNORM TUB(35)/* Local Channel Commands */#define TC_WRITE   0x01#define TC_EWRITE  0x05#define TC_READMOD 0x06#define TC_EWRITEA 0x0d#define TC_WRITESF 0x11/* Buffer Control Orders */#define TO_SF 0x1d#define TO_SBA 0x11#define TO_IC 0x13#define TO_PT 0x05#define TO_RA 0x3c#define TO_SFE 0x29#define TO_EUA 0x12#define TO_MF 0x2c#define TO_SA 0x28/* Field Attribute Bytes */#define TF_INPUT 0x40           /* Visible input */#define TF_INPUTN 0x4c          /* Invisible input */#define TF_INMDT 0xc1           /* Visible, Set-MDT */#define TF_LOG 0x60#define TF_STAT 0x60/* Character Attribute Bytes */#define TAT_RESET 0x00#define TAT_FIELD 0xc0#define TAT_EXTHI 0x41#define TAT_COLOR 0x42#define TAT_CHARS 0x43#define TAT_TRANS 0x46/* Extended-Highlighting Bytes */#define TAX_RESET 0x00#define TAX_BLINK 0xf1#define TAX_REVER 0xf2#define TAX_UNDER 0xf4/* Reset value */#define TAR_RESET 0x00/* Color values */#define TAC_RESET 0x00#define TAC_BLUE 0xf1#define TAC_RED 0xf2#define TAC_PINK 0xf3#define TAC_GREEN 0xf4#define TAC_TURQ 0xf5#define TAC_YELLOW 0xf6#define TAC_WHITE 0xf7#define TAC_DEFAULT 0x00/* Write Control Characters */#define TW_NONE 0x40            /* No particular action */#define TW_KR 0xc2              /* Keyboard restore */#define TW_PLUSALARM 0x04       /* Add this bit for alarm *//* Attention-ID (AID) Characters */#define TA_CLEAR 0x6d#define TA_PA2 0x6e#define TA_ENTER 0x7d/* more to come */#define MIN(a, b) ((a) < (b)? (a): (b))#define TUB_BUFADR(adr, cpp) \	tty3270_tub_bufadr(tubp, adr, cpp)#define TUB_EBCASC(addr, nr) codepage_convert(tub_ebcasc, addr, nr)#define TUB_ASCEBC(addr, nr) codepage_convert(tub_ascebc, addr, nr)/* * * General global values for the tube driver * */enum tubmode {	TBM_LN,                 /* Line mode */	TBM_FS,                 /* Fullscreen mode */	TBM_FSLN                /* Line mode shelled out of fullscreen */};enum tubstat {              /* normal-mode status */	TBS_RUNNING,            /* none of the following */	TBS_MORE,               /* timed "MORE..." in status */	TBS_HOLD                /* untimed "HOLDING" in status */};enum tubcmd {           /* normal-mode actions to do */	TBC_CONOPEN,		/* Erase-write the console */	TBC_OPEN,               /* Open the tty screen */	TBC_UPDATE,             /* Add lines to the log, clear cmdline */	TBC_UPDLOG,             /* Add lines to log */	TBC_KRUPDLOG,           /* Add lines to log, reset kbd */	TBC_CLEAR,              /* Build screen from scratch */	TBC_CLRUPDLOG,          /* Do log & status, not cmdline */	TBC_UPDSTAT,            /* Do status update only */	TBC_CLRINPUT,           /* Clear input area only */	TBC_UPDINPUT            /* Update input area only */};enum tubwhat {          /* echo what= proc actions */	TW_BOGUS,               /* Nothing at all */	TW_CONFIG               /* Output configuration info */};#define TUBMAXMINS      256#define TUB_DEV MKDEV(IBM_FS3270_MAJ, 0)        /* Generic /dev/3270/tub */#define _GEOM_ROWS 24#define _GEOM_COLS 80#define GEOM_ROWS (tubp->geom_rows)#define GEOM_COLS (tubp->geom_cols)#define GEOM_MAXROWS 127#define GEOM_MAXCOLS 132#define GEOM_INPLEN (GEOM_COLS * 2 - 20)#define GEOM_MAXINPLEN (GEOM_MAXCOLS * 2 - 20)#define GEOM_INPUT (GEOM_COLS * (GEOM_ROWS - 2) - 1)  /* input atr posn */#define GEOM_STAT (GEOM_INPUT + 1 + GEOM_INPLEN)#define GEOM_LOG   (GEOM_COLS * GEOM_ROWS - 1)   /* log atr posn */#define TS_RUNNING "Linux Running     "#define TS_MORE    "Linux More...     "#define DEFAULT_SCROLLTIME 5#define TS_HOLD    "Linux Holding     "/* data length used by tty3270_set_status_area: SBA (3), SF (2), data */#define TS_LENGTH (sizeof TS_RUNNING + 3 + 2)typedef struct {	int aid;                        /* What-to-do flags */	char *string;                   /* Optional input string */} aid_t;#define AIDENTRY(ch, tubp)  (&((tubp)->tty_aid[(ch) & 0x3f]))/* For TUBGETMOD and TUBSETMOD.  Should include. */typedef struct tubiocb {	short model;	short line_cnt;	short col_cnt;	short pf_cnt;	short re_cnt;	short map;} tubiocb_t;/* Flags that go in int aid, above */#define TA_CLEARKEY     0x01            /* Key does hardware CLEAR */#define TA_SHORTREAD    0x02            /* Key does hardware shortread *//* If both are off, key does hardware Read Modified. */#define TA_DOENTER      0x04            /* Treat key like ENTER */#define TA_DOSTRING     0x08            /* Use string and ENTER */#define TA_DOSTRINGD    0x10            /* Display string & set MDT */#define TA_CLEARLOG     0x20            /* Make key cause clear of log *//* * Tube driver buffer control block */typedef struct bcb_s {	char	*bc_buf;		/* Pointer to buffer */	int	bc_len;			/* Length of buffer */	int	bc_cnt;			/* Count of bytes buffered */	int	bc_wr;			/* Posn to write next byte into */	int	bc_rd;			/* Posn to read next byte from */} bcb_t;typedef struct tub_s {	int             minor;	int             irq;	int             irqrc;	int             devno;	int             geom_rows;	int             geom_cols;	tubiocb_t       tubiocb;	int             lnopen;	int             fsopen;	int             icmd;	int             ocmd;	devstat_t       devstat;	ccw1_t          rccw;	ccw1_t          wccw;	addr_t		*wbuf;	int             cswl;	void            (*intv)(struct tub_s *, devstat_t *);#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))	struct wait_queue	*waitq;#else	wait_queue_head_t waitq;#endif	int             dstat;	sense_t         sense;	enum tubmode    mode;	enum tubstat    stat;	enum tubcmd     cmd;	int             flags;		/* See below for values */	struct tq_struct tqueue;	/* Stuff for fs-driver support */	pid_t           fs_pid;         /* Pid if TBM_FS */	/* Stuff for tty-driver support */	struct tty_struct *tty;	char *tty_input;		/* tty input area */	int tty_inattr;         	/* input-area field attribute */#define TTY_OUTPUT_SIZE 1024	bcb_t tty_bcb;			/* Output buffer control info */	int tty_oucol;                  /* Kludge */	int tty_nextlogx;               /* next screen-log position */	int tty_savecursor;		/* saved cursor position */	int tty_scrolltime;             /* scrollforward wait time, sec */	struct timer_list tty_stimer;   /* timer for scrolltime */	aid_t tty_aid[64];              /* Aid descriptors */	int tty_aidinit;                /* Boolean */	int tty_showaidx;               /* Last aid x to set_aid */	int tty_14bitadr;               /* 14-bit bufadrs okay */#define MAX_TTY_ESCA 24			/* Set-Attribute-Order array */	char tty_esca[MAX_TTY_ESCA];	/* SA array */	int tty_escx;			/* Current index within it */	/* For command recall --- */	char *(*tty_rclbufs)[];         /* Array of ptrs to recall bufs */	int tty_rclk;                   /* Size of array tty_rclbufs */	int tty_rclp;                   /* Index for most-recent cmd */	int tty_rclb;                   /* Index for backscrolling */	/* Work area to contain the hardware write stream */	char (*ttyscreen)[];            /* ptr to data stream area */	int ttyscreenl;			/* its length */	ccw1_t ttyccw;} tub_t;/* values for flags: */#define	TUB_WORKING	0x0001#define	TUB_BHPENDING	0x0002#define	TUB_RDPENDING	0x0004#define	TUB_ALARM	0x0008#define	TUB_SCROLLTIMING  0x0010#define	TUB_ATTN	0x0020#define	TUB_IACTIVE	0x0040#define	TUB_SIZED	0x0080#define	TUB_EXPECT_DE	0x0100#define	TUB_UNSOL_DE	0x0200#define	TUB_OPEN_STET	0x0400		/* No screen clear on open */#define	TUB_UE_BUSY	0x0800#define	TUB_INPUT_HACK	0x1000		/* Early init of command line */#ifdef CONFIG_TN3270_CONSOLE/* * Extra stuff for 3270 console support */#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))#define	S390_CONSOLE_DEV MKDEV(TTY_MAJOR, 64)#else#define	S390_CONSOLE_DEV MKDEV(TTYAUX_MAJOR, 1)#endifextern int tub3270_con_devno;extern char (*tub3270_con_output)[];extern int tub3270_con_outputl;extern int tub3270_con_ouwr;extern int tub3270_con_oucount;extern int tub3270_con_irq;extern tub_t *tub3270_con_tubp;extern struct tty_driver tty3270_con_driver;#endif /* CONFIG_TN3270_CONSOLE */extern int tubnummins;extern tub_t *(*tubminors)[TUBMAXMINS];extern tub_t *(*(*tubirqs)[256])[256];extern unsigned char tub_ascebc[256];extern unsigned char tub_ebcasc[256];extern unsigned char tub_ebcgraf[64];extern int tubdebug;extern int fs3270_major;extern int tty3270_major;extern int tty3270_proc_misc;extern enum tubwhat tty3270_proc_what;extern struct tty_driver tty3270_driver;#ifdef CONFIG_DEVFS_FSextern devfs_handle_t fs3270_devfs_dir;extern void fs3270_devfs_register(tub_t *);extern void fs3270_devfs_unregister(tub_t *);#endif#ifndef spin_trylock_irqsave#define spin_trylock_irqsave(lock, flags) \({ \	int success; \	__save_flags(flags); \	__cli(); \	success = spin_trylock(lock); \	if (success == 0) \		__restore_flags(flags); \	success; \})#endif /* if not spin_trylock_irqsave */#ifndef s390irq_spin_trylock_irqsave#define s390irq_spin_trylock_irqsave(irq, flags) \	spin_trylock_irqsave(&(ioinfo[irq]->irq_lock), flags)#endif /* if not s390irq_spin_trylock_irqsave */#define TUBLOCK(irq, flags) \	s390irq_spin_lock_irqsave(irq, flags)#define TUBTRYLOCK(irq, flags) \	s390irq_spin_trylock_irqsave(irq, flags)#define TUBUNLOCK(irq, flags) \	s390irq_spin_unlock_irqrestore(irq, flags)/* * Find tub_t * given fullscreen device's irq (subchannel number) */extern tub_t *tubfindbyirq(int);#define IRQ2TUB(irq) tubfindbyirq(irq)/* * Find tub_t * given fullscreen device's inode pointer * This algorithm takes into account /dev/3270/tub. */static inline tub_t *INODE2TUB(struct inode *ip){	unsigned int minor = MINOR(ip->i_rdev);	tub_t *tubp = NULL;	if (minor == 0 && current->tty != NULL) {#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))#ifdef CONFIG_TN3270_CONSOLE		if (tub3270_con_tubp != NULL &&		    current->tty->device == S390_CONSOLE_DEV)			minor = tub3270_con_tubp->minor;		else#endif#endif		if (MAJOR(current->tty->device) == IBM_TTY3270_MAJOR)			minor = MINOR(current->tty->device);	}	if (minor <= tubnummins && minor > 0)		tubp = (*tubminors)[minor];	return tubp;}/* * Find tub_t * given non-fullscreen (tty) device's tty_struct pointer */static inline tub_t *TTY2TUB(struct tty_struct *tty){	unsigned int minor = MINOR(tty->device);	tub_t *tubp = NULL;#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))#ifdef CONFIG_TN3270_CONSOLE	if (tty->device == S390_CONSOLE_DEV)		tubp = tub3270_con_tubp;	else#endif#endif	if (minor <= tubnummins && minor > 0)		tubp = (*tubminors)[minor];	return tubp;}extern void tub_inc_use_count(void);extern void tub_dec_use_count(void);extern int tub3270_movedata(bcb_t *, bcb_t *, int);#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))extern int tubmakemin(int, dev_info_t *);#elseextern int tubmakemin(int, s390_dev_info_t *);#endifextern int tub3270_con_copy(tub_t *);extern int tty3270_rcl_init(tub_t *);extern int tty3270_rcl_set(tub_t *, char *, int);extern void tty3270_rcl_fini(tub_t *);extern int tty3270_rcl_get(tub_t *, char *, int, int);extern void tty3270_rcl_put(tub_t *, char *, int);extern void tty3270_rcl_sync(tub_t *);extern void tty3270_rcl_purge(tub_t *);extern int tty3270_rcl_resize(tub_t *, int);extern int tty3270_size(tub_t *, long *);extern int tty3270_aid_init(tub_t *);extern void tty3270_aid_fini(tub_t *);extern void tty3270_aid_reinit(tub_t *);extern int tty3270_aid_get(tub_t *, int, int *, char **);extern int tty3270_aid_set(tub_t *, char *, int);extern int tty3270_build(tub_t *);extern void tty3270_scl_settimer(tub_t *);extern void tty3270_scl_resettimer(tub_t *);extern int tty3270_scl_set(tub_t *, char *, int);extern int tty3270_scl_init(tub_t *tubp);extern void tty3270_scl_fini(tub_t *tubp);

⌨️ 快捷键说明

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