tubio.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  IBM/3270 Driver -- Copyright (C) 2000 UTS Global LLC
  3.  *
  4.  *  tubio.h -- All-Purpose header file
  5.  *
  6.  *
  7.  *
  8.  *
  9.  *
  10.  *  Author:  Richard Hitt
  11.  */
  12. #include <linux/config.h>
  13. #include <linux/module.h>
  14. #include <linux/version.h>
  15. #include <linux/major.h>
  16. #ifndef IBM_TTY3270_MAJOR
  17. #  define IBM_TTY3270_MAJOR 212
  18. #endif /* IBM_TTY3270_MAJOR */
  19. #ifndef IBM_FS3270_MAJOR
  20. #  define IBM_FS3270_MAJOR 213
  21. #endif /* IBM_FS3270_MAJOR */
  22. #include <linux/slab.h>
  23. #include <asm/irq.h>
  24. #include <asm/io.h>
  25. #include <asm/idals.h>
  26. #include <linux/console.h>
  27. #include <linux/interrupt.h>
  28. #include <asm/ebcdic.h>
  29. #include <asm/uaccess.h>
  30. #include <linux/proc_fs.h>
  31. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0))
  32. #include <linux/devfs_fs_kernel.h>
  33. #endif
  34. #define TUB(x) (('3'<<8)|(x))
  35. #define TUBICMD TUB(3)
  36. #define TUBOCMD TUB(4)
  37. #define TUBGETI TUB(7)
  38. #define TUBGETO TUB(8)
  39. #define TUBSETMOD TUB(12)
  40. #define TUBGETMOD TUB(13)
  41. #define TIOPOLL TUB(32)
  42. #define TIOPOKE TUB(33)
  43. #define TIONPOKE TUB(34)
  44. #define TIOTNORM TUB(35)
  45. /* Local Channel Commands */
  46. #define TC_WRITE   0x01
  47. #define TC_EWRITE  0x05
  48. #define TC_READMOD 0x06
  49. #define TC_EWRITEA 0x0d
  50. #define TC_WRITESF 0x11
  51. /* Buffer Control Orders */
  52. #define TO_SF 0x1d
  53. #define TO_SBA 0x11
  54. #define TO_IC 0x13
  55. #define TO_PT 0x05
  56. #define TO_RA 0x3c
  57. #define TO_SFE 0x29
  58. #define TO_EUA 0x12
  59. #define TO_MF 0x2c
  60. #define TO_SA 0x28
  61. /* Field Attribute Bytes */
  62. #define TF_INPUT 0x40           /* Visible input */
  63. #define TF_INPUTN 0x4c          /* Invisible input */
  64. #define TF_INMDT 0xc1           /* Visible, Set-MDT */
  65. #define TF_LOG 0x60
  66. #define TF_STAT 0x60
  67. /* Character Attribute Bytes */
  68. #define TAT_RESET 0x00
  69. #define TAT_FIELD 0xc0
  70. #define TAT_EXTHI 0x41
  71. #define TAT_COLOR 0x42
  72. #define TAT_CHARS 0x43
  73. #define TAT_TRANS 0x46
  74. /* Extended-Highlighting Bytes */
  75. #define TAX_RESET 0x00
  76. #define TAX_BLINK 0xf1
  77. #define TAX_REVER 0xf2
  78. #define TAX_UNDER 0xf4
  79. /* Reset value */
  80. #define TAR_RESET 0x00
  81. /* Color values */
  82. #define TAC_RESET 0x00
  83. #define TAC_BLUE 0xf1
  84. #define TAC_RED 0xf2
  85. #define TAC_PINK 0xf3
  86. #define TAC_GREEN 0xf4
  87. #define TAC_TURQ 0xf5
  88. #define TAC_YELLOW 0xf6
  89. #define TAC_WHITE 0xf7
  90. #define TAC_DEFAULT 0x00
  91. /* Write Control Characters */
  92. #define TW_NONE 0x40            /* No particular action */
  93. #define TW_KR 0xc2              /* Keyboard restore */
  94. #define TW_PLUSALARM 0x04       /* Add this bit for alarm */
  95. /* Attention-ID (AID) Characters */
  96. #define TA_CLEAR 0x6d
  97. #define TA_PA2 0x6e
  98. #define TA_ENTER 0x7d
  99. /* more to come */
  100. #define MIN(a, b) ((a) < (b)? (a): (b))
  101. #define TUB_BUFADR(adr, cpp) 
  102. tty3270_tub_bufadr(tubp, adr, cpp)
  103. #define TUB_EBCASC(addr, nr) codepage_convert(tub_ebcasc, addr, nr)
  104. #define TUB_ASCEBC(addr, nr) codepage_convert(tub_ascebc, addr, nr)
  105. /*
  106.  *
  107.  * General global values for the tube driver
  108.  *
  109.  */
  110. enum tubmode {
  111. TBM_LN,                 /* Line mode */
  112. TBM_FS,                 /* Fullscreen mode */
  113. TBM_FSLN                /* Line mode shelled out of fullscreen */
  114. };
  115. enum tubstat {              /* normal-mode status */
  116. TBS_RUNNING,            /* none of the following */
  117. TBS_MORE,               /* timed "MORE..." in status */
  118. TBS_HOLD                /* untimed "HOLDING" in status */
  119. };
  120. enum tubcmd {           /* normal-mode actions to do */
  121. TBC_CONOPEN, /* Erase-write the console */
  122. TBC_OPEN,               /* Open the tty screen */
  123. TBC_UPDATE,             /* Add lines to the log, clear cmdline */
  124. TBC_UPDLOG,             /* Add lines to log */
  125. TBC_KRUPDLOG,           /* Add lines to log, reset kbd */
  126. TBC_CLEAR,              /* Build screen from scratch */
  127. TBC_CLRUPDLOG,          /* Do log & status, not cmdline */
  128. TBC_UPDSTAT,            /* Do status update only */
  129. TBC_CLRINPUT,           /* Clear input area only */
  130. TBC_UPDINPUT            /* Update input area only */
  131. };
  132. enum tubwhat {          /* echo what= proc actions */
  133. TW_BOGUS,               /* Nothing at all */
  134. TW_CONFIG               /* Output configuration info */
  135. };
  136. #define TUBMAXMINS      256
  137. #define TUB_DEV MKDEV(IBM_FS3270_MAJ, 0)        /* Generic /dev/3270/tub */
  138. #define _GEOM_ROWS 24
  139. #define _GEOM_COLS 80
  140. #define GEOM_ROWS (tubp->geom_rows)
  141. #define GEOM_COLS (tubp->geom_cols)
  142. #define GEOM_MAXROWS 127
  143. #define GEOM_MAXCOLS 132
  144. #define GEOM_INPLEN (GEOM_COLS * 2 - 20)
  145. #define GEOM_MAXINPLEN (GEOM_MAXCOLS * 2 - 20)
  146. #define GEOM_INPUT (GEOM_COLS * (GEOM_ROWS - 2) - 1)  /* input atr posn */
  147. #define GEOM_STAT (GEOM_INPUT + 1 + GEOM_INPLEN)
  148. #define GEOM_LOG   (GEOM_COLS * GEOM_ROWS - 1)   /* log atr posn */
  149. #define TS_RUNNING "Linux Running     "
  150. #define TS_MORE    "Linux More...     "
  151. #define DEFAULT_SCROLLTIME 5
  152. #define TS_HOLD    "Linux Holding     "
  153. /* data length used by tty3270_set_status_area: SBA (3), SF (2), data */
  154. #define TS_LENGTH (sizeof TS_RUNNING + 3 + 2)
  155. typedef struct {
  156. int aid;                        /* What-to-do flags */
  157. char *string;                   /* Optional input string */
  158. } aid_t;
  159. #define AIDENTRY(ch, tubp)  (&((tubp)->tty_aid[(ch) & 0x3f]))
  160. /* For TUBGETMOD and TUBSETMOD.  Should include. */
  161. typedef struct tubiocb {
  162. short model;
  163. short line_cnt;
  164. short col_cnt;
  165. short pf_cnt;
  166. short re_cnt;
  167. short map;
  168. } tubiocb_t;
  169. /* Flags that go in int aid, above */
  170. #define TA_CLEARKEY     0x01            /* Key does hardware CLEAR */
  171. #define TA_SHORTREAD    0x02            /* Key does hardware shortread */
  172. /* If both are off, key does hardware Read Modified. */
  173. #define TA_DOENTER      0x04            /* Treat key like ENTER */
  174. #define TA_DOSTRING     0x08            /* Use string and ENTER */
  175. #define TA_DOSTRINGD    0x10            /* Display string & set MDT */
  176. #define TA_CLEARLOG     0x20            /* Make key cause clear of log */
  177. /*
  178.  * Tube driver buffer control block
  179.  */
  180. typedef struct bcb_s {
  181. char *bc_buf; /* Pointer to buffer */
  182. int bc_len; /* Length of buffer */
  183. int bc_cnt; /* Count of bytes buffered */
  184. int bc_wr; /* Posn to write next byte into */
  185. int bc_rd; /* Posn to read next byte from */
  186. } bcb_t;
  187. typedef struct tub_s {
  188. int             minor;
  189. int             irq;
  190. int             irqrc;
  191. int             devno;
  192. int             geom_rows;
  193. int             geom_cols;
  194. tubiocb_t       tubiocb;
  195. int             lnopen;
  196. int             fsopen;
  197. int             icmd;
  198. int             ocmd;
  199. devstat_t       devstat;
  200. ccw1_t          rccw;
  201. ccw1_t          wccw;
  202. addr_t *wbuf;
  203. int             cswl;
  204. void            (*intv)(struct tub_s *, devstat_t *);
  205. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
  206. struct wait_queue *waitq;
  207. #else
  208. wait_queue_head_t waitq;
  209. #endif
  210. int             dstat;
  211. sense_t         sense;
  212. enum tubmode    mode;
  213. enum tubstat    stat;
  214. enum tubcmd     cmd;
  215. int             flags; /* See below for values */
  216. struct tq_struct tqueue;
  217. /* Stuff for fs-driver support */
  218. pid_t           fs_pid;         /* Pid if TBM_FS */
  219. /* Stuff for tty-driver support */
  220. struct tty_struct *tty;
  221. char *tty_input; /* tty input area */
  222. int tty_inattr;          /* input-area field attribute */
  223. #define TTY_OUTPUT_SIZE 1024
  224. bcb_t tty_bcb; /* Output buffer control info */
  225. int tty_oucol;                  /* Kludge */
  226. int tty_nextlogx;               /* next screen-log position */
  227. int tty_savecursor; /* saved cursor position */
  228. int tty_scrolltime;             /* scrollforward wait time, sec */
  229. struct timer_list tty_stimer;   /* timer for scrolltime */
  230. aid_t tty_aid[64];              /* Aid descriptors */
  231. int tty_aidinit;                /* Boolean */
  232. int tty_showaidx;               /* Last aid x to set_aid */
  233. int tty_14bitadr;               /* 14-bit bufadrs okay */
  234. #define MAX_TTY_ESCA 24 /* Set-Attribute-Order array */
  235. char tty_esca[MAX_TTY_ESCA]; /* SA array */
  236. int tty_escx; /* Current index within it */
  237. /* For command recall --- */
  238. char *(*tty_rclbufs)[];         /* Array of ptrs to recall bufs */
  239. int tty_rclk;                   /* Size of array tty_rclbufs */
  240. int tty_rclp;                   /* Index for most-recent cmd */
  241. int tty_rclb;                   /* Index for backscrolling */
  242. /* Work area to contain the hardware write stream */
  243. char (*ttyscreen)[];            /* ptr to data stream area */
  244. int ttyscreenl; /* its length */
  245. ccw1_t ttyccw;
  246. } tub_t;
  247. /* values for flags: */
  248. #define TUB_WORKING 0x0001
  249. #define TUB_BHPENDING 0x0002
  250. #define TUB_RDPENDING 0x0004
  251. #define TUB_ALARM 0x0008
  252. #define TUB_SCROLLTIMING  0x0010
  253. #define TUB_ATTN 0x0020
  254. #define TUB_IACTIVE 0x0040
  255. #define TUB_SIZED 0x0080
  256. #define TUB_EXPECT_DE 0x0100
  257. #define TUB_UNSOL_DE 0x0200
  258. #define TUB_OPEN_STET 0x0400 /* No screen clear on open */
  259. #define TUB_UE_BUSY 0x0800
  260. #define TUB_INPUT_HACK 0x1000 /* Early init of command line */
  261. #ifdef CONFIG_TN3270_CONSOLE
  262. /*
  263.  * Extra stuff for 3270 console support
  264.  */
  265. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
  266. #define S390_CONSOLE_DEV MKDEV(TTY_MAJOR, 64)
  267. #else
  268. #define S390_CONSOLE_DEV MKDEV(TTYAUX_MAJOR, 1)
  269. #endif
  270. extern int tub3270_con_devno;
  271. extern char (*tub3270_con_output)[];
  272. extern int tub3270_con_outputl;
  273. extern int tub3270_con_ouwr;
  274. extern int tub3270_con_oucount;
  275. extern int tub3270_con_irq;
  276. extern tub_t *tub3270_con_tubp;
  277. extern struct tty_driver tty3270_con_driver;
  278. #endif /* CONFIG_TN3270_CONSOLE */
  279. extern int tubnummins;
  280. extern tub_t *(*tubminors)[TUBMAXMINS];
  281. extern tub_t *(*(*tubirqs)[256])[256];
  282. extern unsigned char tub_ascebc[256];
  283. extern unsigned char tub_ebcasc[256];
  284. extern unsigned char tub_ebcgraf[64];
  285. extern int tubdebug;
  286. extern int fs3270_major;
  287. extern int tty3270_major;
  288. extern int tty3270_proc_misc;
  289. extern enum tubwhat tty3270_proc_what;
  290. extern struct tty_driver tty3270_driver;
  291. #ifdef CONFIG_DEVFS_FS
  292. extern devfs_handle_t fs3270_devfs_dir;
  293. extern void fs3270_devfs_register(tub_t *);
  294. extern void fs3270_devfs_unregister(tub_t *);
  295. #endif
  296. #ifndef spin_trylock_irqsave
  297. #define spin_trylock_irqsave(lock, flags) 
  298. ({ 
  299. int success; 
  300. __save_flags(flags); 
  301. __cli(); 
  302. success = spin_trylock(lock); 
  303. if (success == 0) 
  304. __restore_flags(flags); 
  305. success; 
  306. })
  307. #endif /* if not spin_trylock_irqsave */
  308. #ifndef s390irq_spin_trylock_irqsave
  309. #define s390irq_spin_trylock_irqsave(irq, flags) 
  310. spin_trylock_irqsave(&(ioinfo[irq]->irq_lock), flags)
  311. #endif /* if not s390irq_spin_trylock_irqsave */
  312. #define TUBLOCK(irq, flags) 
  313. s390irq_spin_lock_irqsave(irq, flags)
  314. #define TUBTRYLOCK(irq, flags) 
  315. s390irq_spin_trylock_irqsave(irq, flags)
  316. #define TUBUNLOCK(irq, flags) 
  317. s390irq_spin_unlock_irqrestore(irq, flags)
  318. /*
  319.  * Find tub_t * given fullscreen device's irq (subchannel number)
  320.  */
  321. extern tub_t *tubfindbyirq(int);
  322. #define IRQ2TUB(irq) tubfindbyirq(irq)
  323. /*
  324.  * Find tub_t * given fullscreen device's inode pointer
  325.  * This algorithm takes into account /dev/3270/tub.
  326.  */
  327. static inline tub_t *INODE2TUB(struct inode *ip)
  328. {
  329. unsigned int minor = MINOR(ip->i_rdev);
  330. tub_t *tubp = NULL;
  331. if (minor == 0 && current->tty != NULL) {
  332. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
  333. #ifdef CONFIG_TN3270_CONSOLE
  334. if (tub3270_con_tubp != NULL &&
  335.     current->tty->device == S390_CONSOLE_DEV)
  336. minor = tub3270_con_tubp->minor;
  337. else
  338. #endif
  339. #endif
  340. if (MAJOR(current->tty->device) == IBM_TTY3270_MAJOR)
  341. minor = MINOR(current->tty->device);
  342. }
  343. if (minor <= tubnummins && minor > 0)
  344. tubp = (*tubminors)[minor];
  345. return tubp;
  346. }
  347. /*
  348.  * Find tub_t * given non-fullscreen (tty) device's tty_struct pointer
  349.  */
  350. static inline tub_t *TTY2TUB(struct tty_struct *tty)
  351. {
  352. unsigned int minor = MINOR(tty->device);
  353. tub_t *tubp = NULL;
  354. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
  355. #ifdef CONFIG_TN3270_CONSOLE
  356. if (tty->device == S390_CONSOLE_DEV)
  357. tubp = tub3270_con_tubp;
  358. else
  359. #endif
  360. #endif
  361. if (minor <= tubnummins && minor > 0)
  362. tubp = (*tubminors)[minor];
  363. return tubp;
  364. }
  365. extern void tub_inc_use_count(void);
  366. extern void tub_dec_use_count(void);
  367. extern int tub3270_movedata(bcb_t *, bcb_t *, int);
  368. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
  369. extern int tubmakemin(int, dev_info_t *);
  370. #else
  371. extern int tubmakemin(int, s390_dev_info_t *);
  372. #endif
  373. extern int tub3270_con_copy(tub_t *);
  374. extern int tty3270_rcl_init(tub_t *);
  375. extern int tty3270_rcl_set(tub_t *, char *, int);
  376. extern void tty3270_rcl_fini(tub_t *);
  377. extern int tty3270_rcl_get(tub_t *, char *, int, int);
  378. extern void tty3270_rcl_put(tub_t *, char *, int);
  379. extern void tty3270_rcl_sync(tub_t *);
  380. extern void tty3270_rcl_purge(tub_t *);
  381. extern int tty3270_rcl_resize(tub_t *, int);
  382. extern int tty3270_size(tub_t *, long *);
  383. extern int tty3270_aid_init(tub_t *);
  384. extern void tty3270_aid_fini(tub_t *);
  385. extern void tty3270_aid_reinit(tub_t *);
  386. extern int tty3270_aid_get(tub_t *, int, int *, char **);
  387. extern int tty3270_aid_set(tub_t *, char *, int);
  388. extern int tty3270_build(tub_t *);
  389. extern void tty3270_scl_settimer(tub_t *);
  390. extern void tty3270_scl_resettimer(tub_t *);
  391. extern int tty3270_scl_set(tub_t *, char *, int);
  392. extern int tty3270_scl_init(tub_t *tubp);
  393. extern void tty3270_scl_fini(tub_t *tubp);