tubio.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:12k
源码类别:

嵌入式Linux

开发平台:

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