1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef SPEAKUP_TYPES_H 3 #define SPEAKUP_TYPES_H 4 5 /* This file includes all of the typedefs and structs used in speakup. */ 6 7 #include <linux/types.h> 8 #include <linux/fs.h> 9 #include <linux/errno.h> 10 #include <linux/delay.h> 11 #include <linux/wait.h> /* for wait_queue */ 12 #include <linux/init.h> /* for __init */ 13 #include <linux/module.h> 14 #include <linux/vt_kern.h> 15 #include <linux/spinlock.h> 16 #include <linux/mutex.h> 17 #include <linux/io.h> /* for inb_p, outb_p, inb, outb, etc... */ 18 #include <linux/device.h> 19 20 enum var_type_t { 21 VAR_NUM = 0, 22 VAR_TIME, 23 VAR_STRING, 24 VAR_PROC 25 }; 26 27 enum { 28 E_DEFAULT = 0, 29 E_SET, 30 E_INC, 31 E_DEC, 32 E_NEW_DEFAULT, 33 }; 34 35 enum var_id_t { 36 VERSION = 0, SYNTH, SILENT, SYNTH_DIRECT, 37 KEYMAP, CHARS, 38 PUNC_SOME, PUNC_MOST, PUNC_ALL, 39 DELIM, REPEATS, EXNUMBER, 40 DELAY, TRIGGER, JIFFY, FULL, /* all timers must be together */ 41 BLEEP_TIME, CURSOR_TIME, BELL_POS, 42 SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO, 43 SPELL_DELAY, PUNC_LEVEL, READING_PUNC, 44 ATTRIB_BLEEP, BLEEPS, 45 RATE, PITCH, INFLECTION, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, 46 DIRECT, PAUSE, 47 CAPS_START, CAPS_STOP, CHARTAB, 48 MAXVARS 49 }; 50 51 typedef int (*special_func)(struct vc_data *vc, u_char type, u_char ch, 52 u_short key); 53 54 #define COLOR_BUFFER_SIZE 160 55 56 struct spk_highlight_color_track { 57 /* Count of each background color */ 58 unsigned int bgcount[8]; 59 /* Buffer for characters drawn with each background color */ 60 u16 highbuf[8][COLOR_BUFFER_SIZE]; 61 /* Current index into highbuf */ 62 unsigned int highsize[8]; 63 /* Reading Position for each color */ 64 u_long rpos[8], rx[8], ry[8]; 65 /* Real Cursor Y Position */ 66 ulong cy; 67 }; 68 69 struct st_spk_t { 70 u_long reading_x, cursor_x; 71 u_long reading_y, cursor_y; 72 u_long reading_pos, cursor_pos; 73 u_long go_x, go_pos; 74 u_long w_top, w_bottom, w_left, w_right; 75 u_char w_start, w_enabled; 76 u_char reading_attr, old_attr; 77 char parked, shut_up; 78 struct spk_highlight_color_track ht; 79 int tty_stopped; 80 }; 81 82 /* now some defines to make these easier to use. */ 83 #define spk_shut_up (speakup_console[vc->vc_num]->shut_up) 84 #define spk_killed (speakup_console[vc->vc_num]->shut_up & 0x40) 85 #define spk_x (speakup_console[vc->vc_num]->reading_x) 86 #define spk_cx (speakup_console[vc->vc_num]->cursor_x) 87 #define spk_y (speakup_console[vc->vc_num]->reading_y) 88 #define spk_cy (speakup_console[vc->vc_num]->cursor_y) 89 #define spk_pos (speakup_console[vc->vc_num]->reading_pos) 90 #define spk_cp (speakup_console[vc->vc_num]->cursor_pos) 91 #define goto_pos (speakup_console[vc->vc_num]->go_pos) 92 #define goto_x (speakup_console[vc->vc_num]->go_x) 93 #define win_top (speakup_console[vc->vc_num]->w_top) 94 #define win_bottom (speakup_console[vc->vc_num]->w_bottom) 95 #define win_left (speakup_console[vc->vc_num]->w_left) 96 #define win_right (speakup_console[vc->vc_num]->w_right) 97 #define win_start (speakup_console[vc->vc_num]->w_start) 98 #define win_enabled (speakup_console[vc->vc_num]->w_enabled) 99 #define spk_attr (speakup_console[vc->vc_num]->reading_attr) 100 #define spk_old_attr (speakup_console[vc->vc_num]->old_attr) 101 #define spk_parked (speakup_console[vc->vc_num]->parked) 102 103 struct st_var_header { 104 char *name; 105 enum var_id_t var_id; 106 enum var_type_t var_type; 107 void *p_val; /* ptr to programs variable to store value */ 108 void *data; /* ptr to the vars data */ 109 }; 110 111 struct num_var_t { 112 char *synth_fmt; 113 int default_val; 114 int low; 115 int high; 116 short offset, multiplier; /* for fiddling rates etc. */ 117 char *out_str; /* if synth needs char representation of number */ 118 int value; /* current value */ 119 }; 120 121 struct punc_var_t { 122 enum var_id_t var_id; 123 short value; 124 }; 125 126 struct string_var_t { 127 char *default_val; 128 }; 129 130 struct var_t { 131 enum var_id_t var_id; 132 union { 133 struct num_var_t n; 134 struct string_var_t s; 135 } u; 136 }; 137 138 struct st_bits_data { /* punc, repeats, word delim bits */ 139 char *name; 140 char *value; 141 short mask; 142 }; 143 144 struct synth_indexing { 145 char *command; 146 unsigned char lowindex; 147 unsigned char highindex; 148 unsigned char currindex; 149 }; 150 151 struct spk_synth; 152 153 struct spk_io_ops { 154 int (*synth_out)(struct spk_synth *synth, const char ch); 155 int (*synth_out_unicode)(struct spk_synth *synth, u16 ch); 156 void (*send_xchar)(char ch); 157 void (*tiocmset)(unsigned int set, unsigned int clear); 158 unsigned char (*synth_in)(void); 159 unsigned char (*synth_in_nowait)(void); 160 void (*flush_buffer)(void); 161 int (*wait_for_xmitr)(struct spk_synth *synth); 162 }; 163 164 struct spk_synth { 165 struct list_head node; 166 167 const char *name; 168 const char *version; 169 const char *long_name; 170 const char *init; 171 char procspeech; 172 char clear; 173 int delay; 174 int trigger; 175 int jiffies; 176 int full; 177 int ser; 178 char *dev_name; 179 short flags; 180 short startup; 181 const int checkval; /* for validating a proper synth module */ 182 struct var_t *vars; 183 int *default_pitch; 184 int *default_vol; 185 struct spk_io_ops *io_ops; 186 int (*probe)(struct spk_synth *synth); 187 void (*release)(void); 188 const char *(*synth_immediate)(struct spk_synth *synth, 189 const char *buff); 190 void (*catch_up)(struct spk_synth *synth); 191 void (*flush)(struct spk_synth *synth); 192 int (*is_alive)(struct spk_synth *synth); 193 int (*synth_adjust)(struct st_var_header *var); 194 void (*read_buff_add)(u_char c); 195 unsigned char (*get_index)(struct spk_synth *synth); 196 struct synth_indexing indexing; 197 int alive; 198 struct attribute_group attributes; 199 }; 200 201 /* 202 * module_spk_synth() - Helper macro for registering a speakup driver 203 * @__spk_synth: spk_synth struct 204 * Helper macro for speakup drivers which do not do anything special in module 205 * init/exit. This eliminates a lot of boilerplate. Each module may only 206 * use this macro once, and calling it replaces module_init() and module_exit() 207 */ 208 #define module_spk_synth(__spk_synth) \ 209 module_driver(__spk_synth, synth_add, synth_remove) 210 211 struct speakup_info_t { 212 spinlock_t spinlock; 213 int port_tts; 214 int flushing; 215 }; 216 217 struct bleep { 218 short freq; 219 unsigned long jiffies; 220 int active; 221 }; 222 #endif 223