Parent Directory
|
Revision Log
speakup fix
| 1 | phreak | 327 | Index: linux-git/Documentation/speakup/DefaultKeyAssignments |
| 2 | phreak | 279 | =================================================================== |
| 3 | --- /dev/null | ||
| 4 | phreak | 327 | +++ linux-git/Documentation/speakup/DefaultKeyAssignments |
| 5 | eradicator | 150 | @@ -0,0 +1,46 @@ |
| 6 | +This file is intended to give you an overview of the default keys used | ||
| 7 | +by speakup for it's review functions. You may change them to be | ||
| 8 | +anything you want but that will take some familiarity with key | ||
| 9 | +mapping. | ||
| 10 | + | ||
| 11 | +We have remapped the insert or zero key on the keypad to act as a | ||
| 12 | +shift key. Well, actually as an altgr key. So in the following list | ||
| 13 | +InsKeyPad-period means hold down the insert key like a shift key and | ||
| 14 | +hit the keypad period. | ||
| 15 | + | ||
| 16 | +KeyPad-8 Say current Line | ||
| 17 | +InsKeyPad-8 say from top of screen to reading cursor. | ||
| 18 | +KeyPad-7 Say Previous Line (UP one line) | ||
| 19 | +KeyPad-9 Say Next Line (down one line) | ||
| 20 | +KeyPad-5 Say Current Word | ||
| 21 | +InsKeyPad-5 Spell Current Word | ||
| 22 | +KeyPad-4 Say Previous Word (left one word) | ||
| 23 | +InsKeyPad-4 say from left edge of line to reading cursor. | ||
| 24 | +KeyPad-6 Say Next Word (right one word) | ||
| 25 | +InsKeyPad-6 Say from reading cursor to right edge of line. | ||
| 26 | +KeyPad-2 Say Current Letter | ||
| 27 | +InsKeyPad-2 say current letter phonetically | ||
| 28 | +KeyPad-1 Say Previous Character (left one letter) | ||
| 29 | +KeyPad-3 Say Next Character (right one letter) | ||
| 30 | +KeyPad-plus Say Entire Screen | ||
| 31 | +InsKeyPad-plus Say from reading cursor line to bottom of screen. | ||
| 32 | +KeyPad-Minus Park reading cursor (toggle) | ||
| 33 | +InsKeyPad-minus Say character hex and decimal value. | ||
| 34 | +KeyPad-period Say Position (current line, position and console) | ||
| 35 | +InsKeyPad-period say colour attributes of current position. | ||
| 36 | +InsKeyPad-9 Move reading cursor to top of screen (insert pgup) | ||
| 37 | +InsKeyPad-3 Move reading cursor to bottom of screen (insert pgdn) | ||
| 38 | +InsKeyPad-7 Move reading cursor to left edge of screen (insert home) | ||
| 39 | +InsKeyPad-1 Move reading cursor to right edge of screen (insert end) | ||
| 40 | +ControlKeyPad-1 Move reading cursor to last character on current line. | ||
| 41 | +KeyPad-Enter Shut Up (until another key is hit) and sync reading cursor | ||
| 42 | +InsKeyPad-Enter Shut Up (until toggled back on). | ||
| 43 | +InsKeyPad-star n<x|y> go to line (y) or column (x). Where 'n' is any | ||
| 44 | + allowed value for the row or column for your current screen. | ||
| 45 | +KeyPad-/ Mark and Cut screen region. | ||
| 46 | +InsKeyPad-/ Paste screen region into any console. | ||
| 47 | + | ||
| 48 | +Hitting any key while speakup is outputting speech will quiet the | ||
| 49 | +synth until it has caught up with what is being printed on the | ||
| 50 | +console. | ||
| 51 | + | ||
| 52 | phreak | 327 | Index: linux-git/Documentation/speakup/INSTALLATION |
| 53 | phreak | 279 | =================================================================== |
| 54 | --- /dev/null | ||
| 55 | phreak | 327 | +++ linux-git/Documentation/speakup/INSTALLATION |
| 56 | eradicator | 150 | @@ -0,0 +1,108 @@ |
| 57 | +This document assumes you have had some experience with kernel | ||
| 58 | +compilation and installation. If you have not, I recommend you get | ||
| 59 | +the kernel source and read the README and various documents in the | ||
| 60 | +linux/Documentation directory. In particular the Changes file to make | ||
| 61 | +sure you have the appropriate utilities needed for installing a 2.2.xx | ||
| 62 | +or 2.4xx kernel. It isn't as difficult as you might think. The | ||
| 63 | +kernel README is intimidating the first time but once you get the | ||
| 64 | +steps down, it's really pretty easy. Getting through the "make | ||
| 65 | +config" is the tedious bit. | ||
| 66 | + | ||
| 67 | +The first thing to do is to place a copy of the tarball in the /usr/src | ||
| 68 | +directory which is the directory the linux tree is located in as well. | ||
| 69 | +Next untar speakup by typing: | ||
| 70 | + | ||
| 71 | +tar zxf speakup-1.00.tar.gz | ||
| 72 | +cd speakup-1.00 | ||
| 73 | +./install | ||
| 74 | + | ||
| 75 | +Note the dot-slash before the install. This will copy the speakup | ||
| 76 | +directory to the kernel tree and apply the various patches and | ||
| 77 | +components to the appropriate kernel files. Depending on how | ||
| 78 | +experienced you are with kernel compiling and hacking will determine | ||
| 79 | +whether you should bother looking at any failed patches. If this | ||
| 80 | +happens, you should probably write to the speakup mailing list for | ||
| 81 | +help or myself. | ||
| 82 | + | ||
| 83 | +If all of the patch hunks apply successfully then just continue with | ||
| 84 | +the standard steps to compile the kernel with: | ||
| 85 | + | ||
| 86 | +make mrproper | ||
| 87 | +make config | ||
| 88 | + | ||
| 89 | +When you get to the section console speech output, answer 'y' to the | ||
| 90 | +CONFIG_SPEAKUP prompt. You will be given a submenu with the list of | ||
| 91 | +synthesizers which are currently supported. You can include as many | ||
| 92 | +synths in the kernel as you wish but remember each one takes up kernel | ||
| 93 | +space. You can only choose one of the synths as the default or none, | ||
| 94 | +so just type dtlk or whatever is the correct string for the | ||
| 95 | +synthesizer you have. You will also be asked if you wish to build-in | ||
| 96 | +a speakup key map. If you do not say 'y' to this option you will need | ||
| 97 | +to load a speakup map at boot time with whichever mechanism your | ||
| 98 | +distribution uses for loading key maps. | ||
| 99 | + | ||
| 100 | +We have placed the speakup configuration options in make config just | ||
| 101 | +after the vga console choice. For the DoubleTalk PC driver included | ||
| 102 | +by Jim Van Zandt. I recommend you say no to that option. I have not | ||
| 103 | +tried configuring them both in, but I wouldn't be at all surprised if | ||
| 104 | +it didn't work. | ||
| 105 | + | ||
| 106 | +If all goes well up to this point you can continue with the compiling | ||
| 107 | +process by doing: | ||
| 108 | + | ||
| 109 | +make dep >dep.file 2>&1 & | ||
| 110 | +make bzImage >cc.file 2>&1 & | ||
| 111 | +make modules >mod.file 2>&1 & | ||
| 112 | + | ||
| 113 | +I always redirect output to the files dep.file and cc.file so I can | ||
| 114 | +look over the compilation record to make sure there are no errors and | ||
| 115 | +warnings. | ||
| 116 | + | ||
| 117 | +Okay, you are ready to install the newly compiled kernel. Make sure | ||
| 118 | +you make an linux.old entry in your lilo.conf file so you can recover | ||
| 119 | +if it blows up. next as root run "make modules_install" to install | ||
| 120 | +whatever modules you compiled and move the bzImage from | ||
| 121 | +/usr/src/linux/arch/i386/boot to wherever your kernel lives. Also | ||
| 122 | +move the System.map from /usr/src/linux to where your System.map | ||
| 123 | +lives. On our systems we use debian so we create an vmlinuz-speakup | ||
| 124 | +and System.map-speakup in our /boot directory and set the symbolic | ||
| 125 | +links vmlinuz and System.map in the root (/) directory to point to the | ||
| 126 | +images. Now type lilo to tell lilo to build the new booter file and | ||
| 127 | +install it. | ||
| 128 | + | ||
| 129 | +As of version 0.07, the keymap for speakup is automatically built in | ||
| 130 | +at compile time. If you have other keymaps installed at boot time, | ||
| 131 | +you might want to consider removing them before you reboot the system. | ||
| 132 | + | ||
| 133 | +If everything has gone OK up until now, cross your fingers and type: | ||
| 134 | + | ||
| 135 | +shutdown -r now | ||
| 136 | + | ||
| 137 | +Your system should start talking to you as soon as it starts booting. | ||
| 138 | +It will talk and talk and ... well, you might want to hit the | ||
| 139 | +keypad-enter key to tell it to shut up. You should also read the | ||
| 140 | +DefaultKeyAssignments file to learn the various review functions | ||
| 141 | +available. | ||
| 142 | + | ||
| 143 | +As of v-0.10 the speakup configuration options are in the | ||
| 144 | +/proc/speakup subtree. The individual options should be fairly | ||
| 145 | +obvious by their names such as rate, volume, punc_level and so forth. | ||
| 146 | +You can manipulate them by cat'ing or echoing new values to them such | ||
| 147 | +as: | ||
| 148 | + | ||
| 149 | +echo 9 >/proc/speakup/rate | ||
| 150 | + | ||
| 151 | +You can see what the current values are by cat'ing those files to the console: | ||
| 152 | + | ||
| 153 | +cat /proc/speakup/rate | ||
| 154 | + | ||
| 155 | +I have probably managed to overlook a whole whack of things because | ||
| 156 | +this is the, enter version number here, draft. Don't worry we'll get | ||
| 157 | +it right eventually. If you like the package you really should get on | ||
| 158 | +the mailing list and start participating in it's development. | ||
| 159 | + | ||
| 160 | + Kirk | ||
| 161 | + | ||
| 162 | +email: kirk@braille.uwo.ca | ||
| 163 | +phone: (519) 679-6845 (home) | ||
| 164 | + | ||
| 165 | phreak | 327 | Index: linux-git/Documentation/speakup/README |
| 166 | phreak | 279 | =================================================================== |
| 167 | --- /dev/null | ||
| 168 | phreak | 327 | +++ linux-git/Documentation/speakup/README |
| 169 | @@ -0,0 +1,98 @@ | ||
| 170 | +Welcome to the speakup project for the Speakup speech package for Linux. | ||
| 171 | + | ||
| 172 | +Speakup is written by Kirk Reiser and Andy Berdan. It is licensed | ||
| 173 | +under the GPL. If you don't already know, the GPL stands for the GNU | ||
| 174 | +General Public License. Which basically states that this code is free to | ||
| 175 | +copy, modify and distribute to anyone interested in playing with it. | ||
| 176 | +The one thing you may not do is turn any part of it into proprietary | ||
| 177 | +or commercial code without the permission of the author. That's me. | ||
| 178 | + | ||
| 179 | +If you are interested in being involved with the development of speech | ||
| 180 | +output for Linux you can subscribe to the Speakup mailing list by | ||
| 181 | +sending a message to speakup-request@braille.uwo.ca with the line: subscribe. You can also subscribe by going to the speakup web page and following the links at http://www.linux-speakup.org. | ||
| 182 | + | ||
| 183 | +We are at a very early stage in the development of this package. | ||
| 184 | +Hopefully changes will happen often and many. The current files in | ||
| 185 | +this directory are: | ||
| 186 | + | ||
| 187 | +DefaultKeyAssignments # speakup's default review keys | ||
| 188 | +INSTALLATION # for installing speakup from the tar ball. | ||
| 189 | +README # this file | ||
| 190 | +keymap-tutorial # a tutorial on how to layout the keyboard | ||
| 191 | + | ||
| 192 | +Read the INSTALLATION file to learn how to apply the patches and the | ||
| 193 | +default.map for the keyboard. You should also read the Changes file. | ||
| 194 | +It really has any new things I've added since last time. | ||
| 195 | + | ||
| 196 | +There is no documentation in any of these files to instruct you what | ||
| 197 | +to do if something goes wrong with the patching or compilation. If | ||
| 198 | +you would like that information you will need to subscribe to the | ||
| 199 | +mailing list and ask for help, or write me kirk@braille.uwo.ca for | ||
| 200 | +help. I suggest the mailing list because I will probably tire quickly | ||
| 201 | +of answering the same questions over and over. You could always | ||
| 202 | +decide to dig-in and take on the task, and write documentation to help | ||
| 203 | +others. | ||
| 204 | + | ||
| 205 | +There also is a speakup reflector for the Speak Freely package, which | ||
| 206 | +many of us hang out on and discuss all sorts of topics from speakup | ||
| 207 | +problems to ALSA driver installation and just about anything else | ||
| 208 | +you'd like to talk about. The reflector is at lwl.braille.uwo.ca:4074 | ||
| 209 | +with it's lwl page at lwl.braille.uwo.ca/speakup.html. Come and join | ||
| 210 | +us, it's fun! | ||
| 211 | + | ||
| 212 | +Acknowledgements: | ||
| 213 | + | ||
| 214 | +I am really very new at kernel hacking and screen review package | ||
| 215 | +writing, so I have depended heavily on other folks kindness to help me | ||
| 216 | +a long. No doubt I will continue to abuse them freely and others | ||
| 217 | +before this is a really good speech solution for Linux. (Oh Well!, | ||
| 218 | +somebody's got to do it.) | ||
| 219 | + | ||
| 220 | +Theodore Ts'o. He gave me a good discussion of unicode and UTF and | ||
| 221 | +the like. He doesn't even remember writing me about it. | ||
| 222 | + | ||
| 223 | +Alan Cox. He has answered many questions about scheduling and wait | ||
| 224 | +queues and timers along with code fragments and so on. I just wish I | ||
| 225 | +understood it all totally. He has also helped immensely in moving | ||
| 226 | +this package toward inclusion in the standard kernel tree. (Maybe next | ||
| 227 | +release!) | ||
| 228 | + | ||
| 229 | +Martin Mares. He pointed me in the right direction to figuring out | ||
| 230 | +the colour attributes and other useful tidbits. | ||
| 231 | + | ||
| 232 | +Paul McDermott. He really is the catalyst for me to actually get | ||
| 233 | +this all working. Besides I like seeing him bounce around and get all | ||
| 234 | +excited every time I have something new working. | ||
| 235 | + | ||
| 236 | +John Covici, He was the first person to actually attempt writing | ||
| 237 | +another synthesizer driver for speakup. It was the Speakout driver so | ||
| 238 | +it was also the first serial driver. | ||
| 239 | + | ||
| 240 | +Brian Borowski, he was the first person to actually write a speakup | ||
| 241 | +function other than Andy and I. | ||
| 242 | + | ||
| 243 | +Jim Danley, he has more or less become my main man in helping test | ||
| 244 | +code, add new features, bounce ideas off and generally become a good | ||
| 245 | +friend. | ||
| 246 | + | ||
| 247 | +Matt Campbell, he basically rewrote the drivers to be able to include | ||
| 248 | +all synths in the kernel at the same time. The distribution | ||
| 249 | +maintainers appreciate him a lot as well. | ||
| 250 | + | ||
| 251 | +Gene Collins, he was very helpful debugging the current release prior | ||
| 252 | +to its public showing. He has also worked hard educating others on | ||
| 253 | +the list and writing the ALSA mini howto. | ||
| 254 | + | ||
| 255 | +I would also like to really thank the folks that handle the | ||
| 256 | +distribution packages. I and many other people would not find access | ||
| 257 | +to speakup nearly so convenient without their efforts. They include | ||
| 258 | +Bill Acker, Tom Moore, Matt Campbell, Joe Norton and Joshua Lambert. | ||
| 259 | + | ||
| 260 | +There are probably many more I am forgetting right now. I guess I'll | ||
| 261 | +just have to add you all later. | ||
| 262 | + | ||
| 263 | + | ||
| 264 | +Happy Hacking! | ||
| 265 | + | ||
| 266 | + Kirk | ||
| 267 | + | ||
| 268 | Index: linux-git/Documentation/speakup/keymap-tutorial | ||
| 269 | =================================================================== | ||
| 270 | --- /dev/null | ||
| 271 | +++ linux-git/Documentation/speakup/keymap-tutorial | ||
| 272 | eradicator | 150 | @@ -0,0 +1,140 @@ |
| 273 | + Speakup Keymap Tutorial | ||
| 274 | + | ||
| 275 | +This is meant to be a basic tutorial on how to change the Linux keymap | ||
| 276 | +file to assign speakup review functions to desired keys. It is not | ||
| 277 | +intended to be a replacement for the loadkeys(8) or keymap(5) man | ||
| 278 | +pages. | ||
| 279 | + | ||
| 280 | +The basic lay-out of the keymap file is a series of lines with the | ||
| 281 | +following fields. The keyword keycode indicates this is the start of | ||
| 282 | +a new key assignment. It is then followed by a number which | ||
| 283 | +represents the actual key on the keyboard. That number is followed by | ||
| 284 | +the equals '=' operator and finally a list of keywords representing | ||
| 285 | +key names such as keypad5. Each line can have quite a few key | ||
| 286 | +functions on it. They are interpreted by loadkeys in order and | ||
| 287 | +assigned to key shift states depending on the order they are | ||
| 288 | +encountered. So for example, the first value after the equals is the | ||
| 289 | +keys unshifted state, while the second is the keys shifted state. If | ||
| 290 | +you wish to learn the order they are interpreted in read the | ||
| 291 | +loadkeys(8) and keymap(5) man pages. | ||
| 292 | + | ||
| 293 | +You can have subsequent lines which are indented and start with | ||
| 294 | +another keyword for the various shifted states. This way you can | ||
| 295 | +assign some of the states without having to specify them all in order | ||
| 296 | +up until you get to the one you want to assign. | ||
| 297 | + | ||
| 298 | +In speakup, we have assigned the insert key on the number pad to the | ||
| 299 | +altgr keyword. This is not required; you could choose any other | ||
| 300 | +shifted state keyword. We used altgr because it typically represents | ||
| 301 | +the right hand alt key. In Linux each shift key is separate and | ||
| 302 | +independent, so the left shift and the right shift keys are not | ||
| 303 | +necessarily the same. The altgr key is not really used for anything | ||
| 304 | +important, so we steel it. | ||
| 305 | + | ||
| 306 | +Here are the default key assignments for the number eight on the | ||
| 307 | +keypad: | ||
| 308 | + | ||
| 309 | phreak | 279 | +keycode 72 = KP_8 |
| 310 | + alt keycode 72 = Ascii_8 | ||
| 311 | eradicator | 150 | + |
| 312 | +As you can see, the first line starts with keycode followed by 72 | ||
| 313 | +which is the actual number assigned to the key when the keyboard port | ||
| 314 | +is read. The KP_8 after the equal sign, is the symbolic representation | ||
| 315 | +of the function called when that key is hit. | ||
| 316 | + | ||
| 317 | +The second line is the same format except it starts with the keyword | ||
| 318 | +alt which is indented. That means that the function at the end of | ||
| 319 | +that line Ascii_8 is applied to the alt-shifted eight key. | ||
| 320 | + | ||
| 321 | +Now here are the speakup assignments for that key: | ||
| 322 | + | ||
| 323 | +keycode 72 = 0x0d0a | ||
| 324 | + altgr keycode 72 = 0x0d20 | ||
| 325 | phreak | 279 | +#keycode 72 = KP_8 |
| 326 | + alt keycode 72 = Ascii_8 | ||
| 327 | eradicator | 150 | + |
| 328 | +Notice that the only thing which has changed on the first line is the | ||
| 329 | +function called when the key is struck. It is a hexadecimal number | ||
| 330 | +identifying the function called in a look up table. It is not a | ||
| 331 | +symbolic representation yet because that means we need to change the | ||
| 332 | +loadkeys program to understand our symbolic names. We will do this in | ||
| 333 | +the future but for now it is more expedient to just use the table | ||
| 334 | +indices. You will find a table at the bottom of this document | ||
| 335 | +listing the review functions and their corresponding hex lookups. | ||
| 336 | + | ||
| 337 | +The 0x0d0a in the first line above is speakup's say line function. | ||
| 338 | +The second line ends with 0x0d20 which is speakup's read from top of | ||
| 339 | +screen to reading cursor line. | ||
| 340 | + | ||
| 341 | +The third line is the original key assignment commented out with a | ||
| 342 | +number-sign '#' at the beginning. I do that so I can easily find the | ||
| 343 | +keys I want to affect by symbolic name. Otherwise I would need to | ||
| 344 | +keep a look up table for all the keycodes. I recommend you do this as | ||
| 345 | +well or you'll be very sorry at some point in the future. | ||
| 346 | + | ||
| 347 | +The forth line is just the standard key assignment for the left hand | ||
| 348 | +alt key. | ||
| 349 | + | ||
| 350 | +Now let's say we want to design a different keyboard layout. I'll use | ||
| 351 | +an example for the JAWS style keypad because I've specifically been | ||
| 352 | +asked to help with that. JAWS uses the eight on the keypad to move up | ||
| 353 | +a line or the speakup function to read previous line. JAWS also uses | ||
| 354 | +the keypad_8 key in a shifted mode to read the current line. I | ||
| 355 | +apologize if these are not quite right. It has been a long time since | ||
| 356 | +I used JAWS. So we would have the following two lines: | ||
| 357 | + | ||
| 358 | +keycode 72 = 0x0d0b | ||
| 359 | + altgr keycode 72 = 0x0d0a | ||
| 360 | + | ||
| 361 | +The hex value 0x0d0b in the first line is speakup's SAY_PREVIOUS_LINE | ||
| 362 | +function. The 0x0d0a in the second line is the same say_line function | ||
| 363 | +as we had earlier. So when the number eight is hit on the keypad | ||
| 364 | +speakup will read the previous line and when the number eight is | ||
| 365 | +shifted with the insert key on the keypad it will read the current | ||
| 366 | +line. | ||
| 367 | + | ||
| 368 | +As you can tell, it is not really very difficult to reassign the keys | ||
| 369 | +to different review functions. | ||
| 370 | + | ||
| 371 | +Once you have carefully edited the keymap file, called default.map in | ||
| 372 | +the speakup distribution, you copy it into the /etc/kbd directory. | ||
| 373 | +Make sure you back up the original default.map from that directory | ||
| 374 | +first, if there is one. Then you run loadkeys to load the new map | ||
| 375 | +into the kernel: | ||
| 376 | + | ||
| 377 | +loadkeys /etc/kbd/default.map | ||
| 378 | + | ||
| 379 | +If you wish to build your new keyboard lay-out into the kernel, after | ||
| 380 | +testing it, copy the default.map file into the drivers/char directory, | ||
| 381 | +with the name defkeymap.map, of your Linux source tree. Then rm the | ||
| 382 | +defkeymap.c file and recompile the kernel. Because there is no | ||
| 383 | +defkeymap.c `make' will rebuild it on the next compile. | ||
| 384 | + | ||
| 385 | +Here is a list of the available speakup review functions at this point | ||
| 386 | +in time. | ||
| 387 | + | ||
| 388 | +SAY_CHAR 0x0d04 /* say this character */ | ||
| 389 | +SAY_PREV_CHAR 0x0d05 /* say character left of this char */ | ||
| 390 | +SAY_NEXT_CHAR 0x0d06 /* say char right of this char */ | ||
| 391 | +SAY_WORD 0x0d07 /* say this word under reading cursor */ | ||
| 392 | +SAY_PREV_WORD 0x0d08 | ||
| 393 | +SAY_NEXT_WORD 0x0d09 | ||
| 394 | +SAY_LINE 0x0d0a /* say this line */ | ||
| 395 | +SAY_PREV_LINE 0x0d0b /* say line above this line */ | ||
| 396 | +SAY_NEXT_LINE 0x0d0c | ||
| 397 | +TOP_EDGE 0x0d0d /* move to top edge of screen */ | ||
| 398 | +BOTTOM_EDGE 0x0d0e | ||
| 399 | +LEFT_EDGE 0x0d0f | ||
| 400 | +RIGHT_EDGE 0x0d10 | ||
| 401 | +SAY_PHONETIC_CHAR 0x0d11 /* say this character phonetically */ | ||
| 402 | +SPELL_WORD 0x0d12 /* spell this word letter by letter */ | ||
| 403 | +SAY_SCREEN 0x0d14 | ||
| 404 | +SAY_POSITION 0x0d1b | ||
| 405 | +SPEECH_OFF 0x0d1c | ||
| 406 | +SAY_ATTRIBUTES 0x0d1d | ||
| 407 | +SPEAKUP_PARKED 0x0d1e | ||
| 408 | +SAY_FROM_TOP 0x0d20 | ||
| 409 | +SAY_TO_BOTTOM 0x0d21 | ||
| 410 | +SAY_FROM_LEFT 0x0d22 | ||
| 411 | +SAY_TO_RIGHT 0x0d23 | ||
| 412 | + | ||
| 413 | phreak | 327 | Index: linux-git/Documentation/speakup/spkguide.txt |
| 414 | phreak | 279 | =================================================================== |
| 415 | --- /dev/null | ||
| 416 | phreak | 327 | +++ linux-git/Documentation/speakup/spkguide.txt |
| 417 | eradicator | 150 | @@ -0,0 +1,1279 @@ |
| 418 | + | ||
| 419 | +The Speakup User's Guide | ||
| 420 | +For Speakup 2.0 and Later | ||
| 421 | +By Gene Collins | ||
| 422 | +Last modified on Tue Mar 29 10:54:19 2005 | ||
| 423 | +Document version 1.0 | ||
| 424 | + | ||
| 425 | +Copyright (c) 2005 Gene Collins | ||
| 426 | + | ||
| 427 | +Permission is granted to copy, distribute and/or modify this document | ||
| 428 | +under the terms of the GNU Free Documentation License, Version 1.2 or | ||
| 429 | +any later version published by the Free Software Foundation; with no | ||
| 430 | +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A | ||
| 431 | +copy of the license is included in the section entitled "GNU Free | ||
| 432 | +Documentation License". | ||
| 433 | + | ||
| 434 | +Preface | ||
| 435 | + | ||
| 436 | +The purpose of this document is to familiarize users with the user | ||
| 437 | +interface to Speakup, a Linux Screen Reader. If you need instructions | ||
| 438 | +for installing or obtaining Speakup, visit the web site at | ||
| 439 | +http://linux-speakup.org/. Speakup is a set of patches to the standard | ||
| 440 | +Linux kernel source tree. It can be built as a series of modules, or as | ||
| 441 | +a part of a monolithic kernel. These details are beyond the scope of | ||
| 442 | +this manual, but the user may need to be aware of the module | ||
| 443 | +capabilities, depending on how your system administrator has installed | ||
| 444 | +Speakup. If Speakup is built as a part of a monolithic kernel, and the | ||
| 445 | +user is using a hardware synthesizer, then Speakup will be able to | ||
| 446 | +provide speech access from the time the kernel is loaded, until the time | ||
| 447 | +the system is shutdown. This means that if you have obtained Linux | ||
| 448 | +installation media for a distribution which includes Speakup as a part | ||
| 449 | +of its kernel, you will be able, as a blind person, to install Linux | ||
| 450 | +with speech access unaided by a sighted person. Again, these details | ||
| 451 | +are beyond the scope of this manual, but the user should be aware of | ||
| 452 | +them. See the web site mentioned above for further details. | ||
| 453 | + | ||
| 454 | +1. Starting Speakup | ||
| 455 | + | ||
| 456 | +If your system administrator has installed Speakup to work with your | ||
| 457 | +specific synthesizer by default, then all you need to do to use Speakup | ||
| 458 | +is to boot your system, and Speakup should come up talking. This | ||
| 459 | +assumes of course that your synthesizer is a supported hardware | ||
| 460 | +synthesizer, and that it is either installed in or connected to your | ||
| 461 | +system, and is if necessary powered on. | ||
| 462 | + | ||
| 463 | +It is possible, however, that Speakup may have been compiled into the | ||
| 464 | +kernel with no default synthesizer. It is even possible that your | ||
| 465 | +kernel has been compiled with support for some of the supported | ||
| 466 | +synthesizers and not others. If you find that this is the case, and | ||
| 467 | +your synthesizer is supported but not available, complain to the person | ||
| 468 | +who compiled and installed your kernel. Or better yet, go to the web | ||
| 469 | +site, and learn how to patch Speakup into your own kernel source, and | ||
| 470 | +build and install your own kernel. | ||
| 471 | + | ||
| 472 | +If your kernel has been compiled with Speakup, and has no default | ||
| 473 | +synthesizer set, or you would like to use a different synthesizer than | ||
| 474 | +the default one, then you may issue the following command at the boot | ||
| 475 | +prompt of your boot loader. | ||
| 476 | + | ||
| 477 | +linux speakup_synth=ltlk | ||
| 478 | + | ||
| 479 | +This command would tell Speakup to look for and use a LiteTalk or | ||
| 480 | +DoubleTalk LT at boot up. You may replace the ltlk synthesizer keyword | ||
| 481 | +with the keyword for whatever synthesizer you wish to use. The | ||
| 482 | +speakup_synth parameter will accept the following keywords, provided | ||
| 483 | +that support for the related synthesizers has been built into the | ||
| 484 | +kernel. | ||
| 485 | + | ||
| 486 | +acntsa -- Accent SA | ||
| 487 | +acntpc -- Accent PC | ||
| 488 | +apolo -- Apolo | ||
| 489 | +audptr -- Audapter | ||
| 490 | +bns -- Braille 'n Speak | ||
| 491 | +dectlk -- DecTalk Express (old and new, db9 serial only) | ||
| 492 | +decext -- DecTalk (old) External | ||
| 493 | +dtlk -- DoubleTalk PC | ||
| 494 | +keypc -- Keynote Gold PC | ||
| 495 | +ltlk -- DoubleTalk LT, LiteTalk, or external Tripletalk (db9 serial only) | ||
| 496 | +spkout -- Speak Out | ||
| 497 | +txprt -- Transport | ||
| 498 | + | ||
| 499 | +Note: Speakup does * NOT * support usb connections! Speakup also does * | ||
| 500 | +NOT * support the internal Tripletalk! | ||
| 501 | + | ||
| 502 | +Speakup does support two other synthesizers, but because they work in | ||
| 503 | +conjunction with other software, they must be loaded as modules after | ||
| 504 | phreak | 279 | +their related software is loaded, and so are not available at boot up. |
| 505 | eradicator | 150 | +These are as follows: |
| 506 | + | ||
| 507 | +decpc -- DecTalk PC (not available at boot up) | ||
| 508 | +sftsyn -- One of several software synthesizers (not available at boot up) | ||
| 509 | + | ||
| 510 | +See the sections on loading modules and software synthesizers later in | ||
| 511 | +this manual for further details. It should be noted here that the | ||
| 512 | +speakup_synth boot parameter will have no effect if Speakup has been | ||
| 513 | +compiled as modules. In order for Speakup modules to be loaded during | ||
| 514 | +the boot process, such action must be configured by your system | ||
| 515 | +administrator. This will mean that you will hear some, but not all, of | ||
| 516 | +the bootup messages. | ||
| 517 | + | ||
| 518 | +2. Basic operation | ||
| 519 | + | ||
| 520 | +Once you have booted the system, and if necessary, have supplied the | ||
| 521 | +proper bootup parameter for your synthesizer, Speakup will begin | ||
| 522 | phreak | 279 | +talking as soon as the kernel is loaded. In fact, it will talk a lot! |
| 523 | eradicator | 150 | +It will speak all the boot up messages that the kernel prints on the |
| 524 | +screen during the boot process. This is because Speakup is not a | ||
| 525 | +separate screen reader, but is actually built into the operating | ||
| 526 | +system. Since almost all console applications must print text on the | ||
| 527 | +screen using the kernel, and must get their keyboard input through the | ||
| 528 | +kernel, they are automatically handled properly by Speakup. There are a | ||
| 529 | +few exceptions, but we'll come to those later. | ||
| 530 | + | ||
| 531 | phreak | 279 | +Note: In this guide I will refer to the numeric keypad as the keypad. |
| 532 | eradicator | 150 | +This is done because the speakupmap.map file referred to later in this |
| 533 | +manual uses the term keypad instead of numeric keypad. Also I'm lazy | ||
| 534 | +and would rather only type one word. So keypad it is. Got it? Good. | ||
| 535 | + | ||
| 536 | +Most of the Speakup review keys are located on the keypad at the far | ||
| 537 | +right of the keyboard. The numlock key should be off, in order for these | ||
| 538 | +to work. If you toggle the numlock on, the keypad will produce numbers, | ||
| 539 | +which is exactly what you want for spreadsheets and such. For the | ||
| 540 | +purposes of this guide, you should have the numlock turned off, which is | ||
| 541 | +its default state at bootup. | ||
| 542 | + | ||
| 543 | +You probably won't want to listen to all the bootup messages every time | ||
| 544 | +you start your system, though it's a good idea to listen to them at | ||
| 545 | +least once, just so you'll know what kind of information is available to | ||
| 546 | +you during the boot process. You can always review these messages after | ||
| 547 | +bootup with the command: | ||
| 548 | + | ||
| 549 | +dmesg | more | ||
| 550 | + | ||
| 551 | +In order to speed the boot process, and to silence the speaking of the | ||
| 552 | +bootup messages, just press the keypad enter key. This key is located | ||
| 553 | +in the bottom right corner of the keypad. Speakup will shut up and stay | ||
| 554 | +that way, until you press another key. | ||
| 555 | + | ||
| 556 | +You can check to see if the boot process has completed by pressing the 8 | ||
| 557 | +key on the keypad, which reads the current line. This also has the | ||
| 558 | +effect of starting Speakup talking again, so you can press keypad enter | ||
| 559 | phreak | 279 | +to silence it again if the boot process has not completed. |
| 560 | eradicator | 150 | + |
| 561 | +When the boot process is complete, you will arrive at a "login" prompt. | ||
| 562 | +At this point, you'll need to type in your user id and password, as | ||
| 563 | +provided by your system administrator. You will hear Speakup speak the | ||
| 564 | +letters of your user id as you type it, but not the password. This is | ||
| 565 | +because the password is not displayed on the screen for security | ||
| 566 | +reasons. This has nothing to do with Speakup, it's a Linux security | ||
| 567 | +feature. | ||
| 568 | + | ||
| 569 | +Once you've logged in, you can run any Linux command or program which is | ||
| 570 | +allowed by your user id. Normal users will not be able to run programs | ||
| 571 | +which require root privileges. | ||
| 572 | + | ||
| 573 | +When you are running a program or command, Speakup will automatically | ||
| 574 | +speak new text as it arrives on the screen. You can at any time silence | ||
| 575 | phreak | 279 | +the speech with keypad enter, or use any of the Speakup review keys. |
| 576 | eradicator | 150 | + |
| 577 | +Here are some basic Speakup review keys, and a short description of what | ||
| 578 | +they do. | ||
| 579 | + | ||
| 580 | +keypad 1 -- read previous character | ||
| 581 | +keypad 2 -- read current character (pressing keypad 2 twice rapidly will speak | ||
| 582 | + the current character phonetically) | ||
| 583 | +keypad 3 -- read next character | ||
| 584 | +keypad 4 -- read previous word | ||
| 585 | +keypad 5 -- read current word (press twice rapidly to spell the current word) | ||
| 586 | +keypad 6 -- read next word | ||
| 587 | +keypad 7 -- read previous line | ||
| 588 | +keypad 8 -- read current line (press twice rapidly to hear how much the | ||
| 589 | + text on the current line is indented) | ||
| 590 | +keypad 9 -- read next line | ||
| 591 | +keypad period -- speak current cursor position and announce current | ||
| 592 | + virtual console | ||
| 593 | + | ||
| 594 | +It's also worth noting that the insert key on the keypad is mapped | ||
| 595 | +as the speakup key. Instead of pressing and releasing this key, as you | ||
| 596 | +do under DOS or Windows, you hold it like a shift key, and press other | ||
| 597 | +keys in combination with it. For example, repeatedly holding keypad | ||
| 598 | +insert, from now on called speakup, and keypad enter will toggle the | ||
| 599 | +speaking of new text on the screen on and off. This is not the same as | ||
| 600 | +just pressing keypad enter by itself, which just silences the speech | ||
| 601 | +until you hit another key. When you hit speakup plus keypad enter, | ||
| 602 | +Speakup will say, "You turned me off.", or "Hey, that's better." When | ||
| 603 | +Speakup is turned off, no new text on the screen will be spoken. You | ||
| 604 | +can still use the reading controls to review the screen however. | ||
| 605 | + | ||
| 606 | +3. Using the Speakup Help System | ||
| 607 | + | ||
| 608 | +Speakup has a help system, which is compiled as a module. It is loaded | ||
| 609 | +automatically whenever the Speakup help system is invoked for the first | ||
| 610 | +time, and remains loaded after that, until speakup is unloaded. Note | ||
| 611 | +that if speakup was compiled into a monolithic kernel on your system, | ||
| 612 | +you will not be able to unload Speakup from your kernel. If you try to | ||
| 613 | +use the help system, and find that it is unavailable, then your system | ||
| 614 | +administrator has not installed the Speakup help module, which is called | ||
| 615 | +speakup_help. Complain to your system administrator about this. | ||
| 616 | + | ||
| 617 | +In order to enter the Speakup help system, press and hold the speakup | ||
| 618 | +key (remember that this is the keypad insert key), and press the f1 key. | ||
| 619 | +You will hear the message: | ||
| 620 | + | ||
| 621 | +"Press space to leave help, cursor up or down to scroll, or a letter to | ||
| 622 | +go to commands in list." | ||
| 623 | + | ||
| 624 | +When you press the spacebar to leave the help system, you will hear: | ||
| 625 | + | ||
| 626 | +"Leaving help." | ||
| 627 | + | ||
| 628 | +While you are in the Speakup help system, you can scroll up or down | ||
| 629 | +through the list of available commands using the cursor keys. The list | ||
| 630 | +of commands is arranged in alphabetical order. If you wish to jump to | ||
| 631 | +commands in a specific part of the alphabet, you may press the letter of | ||
| 632 | +the alphabet you wish to jump to. | ||
| 633 | + | ||
| 634 | +You can also just explore by typing keyboard keys. Pressing keys will | ||
| 635 | +cause Speakup to speak the command associated with that key. For | ||
| 636 | +example, if you press the keypad 8 key, you will hear: | ||
| 637 | + | ||
| 638 | +"Keypad 8 is line, say current." | ||
| 639 | + | ||
| 640 | phreak | 279 | +You'll notice that some commands do not have keys assigned to them. |
| 641 | eradicator | 150 | +This is because they are very infrequently used commands, and are also |
| 642 | +accessible through the proc system. We'll discuss the proc system later | ||
| 643 | +in this manual. | ||
| 644 | + | ||
| 645 | phreak | 279 | +You'll also notice that some commands have two keys assigned to them. |
| 646 | eradicator | 150 | +This is because Speakup has a built in set of alternative key bindings |
| 647 | +for laptop users. The alternate speakup key is the caps lock key. You | ||
| 648 | +can press and hold the caps lock key, while pressing an alternate | ||
| 649 | +speakup command key to activate the command. On most laptops, the | ||
| 650 | +numeric keypad is defined as the keys in the j k l area of the keyboard. | ||
| 651 | + | ||
| 652 | +There is usually a function key which turns this keypad function on and | ||
| 653 | +off, and some other key which controls the numlock state. Toggling the | ||
| 654 | +keypad functionality on and off can become a royal pain. So, Speakup | ||
| 655 | +gives you a simple way to get at an alternative set of key mappings for | ||
| 656 | +your laptop. These are also available by default on desktop systems, | ||
| 657 | +because Speakup does not know whether it is running on a desktop or | ||
| 658 | +laptop. So you may choose which set of Speakup keys to use. Some | ||
| 659 | +system administrators may have chosen to compile Speakup for a desktop | ||
| 660 | +system without this set of alternate key bindings, but these details are | ||
| 661 | +beyond the scope of this manual. To use the caps lock for its normal | ||
| 662 | +purpose, hold the shift key while toggling the caps lock on and off. We | ||
| 663 | +should note here, that holding the caps lock key and pressing the z key | ||
| 664 | +will toggle the alternate j k l keypad on and off. | ||
| 665 | + | ||
| 666 | +4. Keys and Their Assigned Commands | ||
| 667 | + | ||
| 668 | +In this section, we'll go through a list of all the speakup keys and | ||
| 669 | +commands. You can also get a list of commands and assigned keys from | ||
| 670 | +the help system. | ||
| 671 | + | ||
| 672 | +The following list was taken from the speakupmap.map file. Key | ||
| 673 | +assignments are on the left of the equal sign, and the associated | ||
| 674 | +Speakup commands are on the right. The designation "spk" means to press | ||
| 675 | +and hold the speakup key, a.k.a. keypad insert, a.k.a. caps lock, while | ||
| 676 | +pressing the other specified key. | ||
| 677 | + | ||
| 678 | +spk key_f9 = punc_level_dec | ||
| 679 | +spk key_f10 = punc_level_inc | ||
| 680 | +spk key_f11 = reading_punc_dec | ||
| 681 | +spk key_f12 = reading_punc_inc | ||
| 682 | +spk key_1 = vol_dec | ||
| 683 | +spk key_2 = vol_inc | ||
| 684 | +spk key_3 = pitch_dec | ||
| 685 | +spk key_4 = pitch_inc | ||
| 686 | +spk key_5 = rate_dec | ||
| 687 | +spk key_6 = rate_inc | ||
| 688 | +key_kpasterisk = toggle_cursoring | ||
| 689 | +spk key_kpasterisk = speakup_goto | ||
| 690 | +spk key_f1 = speakup_help | ||
| 691 | +spk key_f2 = set_win | ||
| 692 | +spk key_f3 = clear_win | ||
| 693 | +spk key_f4 = enable_win | ||
| 694 | +spk key_f5 = edit_some | ||
| 695 | +spk key_f6 = edit_most | ||
| 696 | +spk key_f7 = edit_delim | ||
| 697 | +spk key_f8 = edit_repeat | ||
| 698 | +shift spk key_f9 = edit_exnum | ||
| 699 | + key_kp7 = say_prev_line | ||
| 700 | +spk key_kp7 = left_edge | ||
| 701 | + key_kp8 = say_line | ||
| 702 | +double key_kp8 = say_line_indent | ||
| 703 | +spk key_kp8 = say_from_top | ||
| 704 | + key_kp9 = say_next_line | ||
| 705 | +spk key_kp9 = top_edge | ||
| 706 | + key_kpminus = speakup_parked | ||
| 707 | +spk key_kpminus = say_char_num | ||
| 708 | + key_kp4 = say_prev_word | ||
| 709 | +spk key_kp4 = say_from_left | ||
| 710 | + key_kp5 = say_word | ||
| 711 | +double key_kp5 = spell_word | ||
| 712 | +spk key_kp5 = spell_phonetic | ||
| 713 | + key_kp6 = say_next_word | ||
| 714 | +spk key_kp6 = say_to_right | ||
| 715 | + key_kpplus = say_screen | ||
| 716 | +spk key_kpplus = say_win | ||
| 717 | phreak | 279 | + key_kp1 = say_prev_char |
| 718 | eradicator | 150 | +spk key_kp1 = right_edge |
| 719 | + key_kp2 = say_char | ||
| 720 | +spk key_kp2 = say_to_bottom | ||
| 721 | +double key_kp2 = say_phonetic_char | ||
| 722 | phreak | 279 | + key_kp3 = say_next_char |
| 723 | eradicator | 150 | +spk key_kp3 = bottom_edge |
| 724 | + key_kp0 = spk_key | ||
| 725 | + key_kpdot = say_position | ||
| 726 | +spk key_kpdot = say_attributes | ||
| 727 | +key_kpenter = speakup_quiet | ||
| 728 | +spk key_kpenter = speakup_off | ||
| 729 | +key_sysrq = speech_kill | ||
| 730 | + key_kpslash = speakup_cut | ||
| 731 | +spk key_kpslash = speakup_paste | ||
| 732 | +spk key_pageup = say_first_char | ||
| 733 | +spk key_pagedown = say_last_char | ||
| 734 | +key_capslock = spk_key | ||
| 735 | + spk key_z = spk_lock | ||
| 736 | +key_leftmeta = spk_key | ||
| 737 | +ctrl spk key_0 = speakup_goto | ||
| 738 | +spk key_u = say_prev_line | ||
| 739 | +spk key_i = say_line | ||
| 740 | +double spk key_i = say_line_indent | ||
| 741 | +spk key_o = say_next_line | ||
| 742 | +spk key_minus = speakup_parked | ||
| 743 | +shift spk key_minus = say_char_num | ||
| 744 | +spk key_j = say_prev_word | ||
| 745 | +spk key_k = say_word | ||
| 746 | +double spk key_k = spell_word | ||
| 747 | +spk key_l = say_next_word | ||
| 748 | +spk key_m = say_prev_char | ||
| 749 | +spk key_comma = say_char | ||
| 750 | +double spk key_comma = say_phonetic_char | ||
| 751 | +spk key_dot = say_next_char | ||
| 752 | +spk key_n = say_position | ||
| 753 | + ctrl spk key_m = left_edge | ||
| 754 | + ctrl spk key_y = top_edge | ||
| 755 | + ctrl spk key_dot = right_edge | ||
| 756 | +ctrl spk key_p = bottom_edge | ||
| 757 | +spk key_apostrophe = say_screen | ||
| 758 | +spk key_h = say_from_left | ||
| 759 | +spk key_y = say_from_top | ||
| 760 | +spk key_semicolon = say_to_right | ||
| 761 | +spk key_p = say_to_bottom | ||
| 762 | +spk key_slash = say_attributes | ||
| 763 | + spk key_enter = speakup_quiet | ||
| 764 | + ctrl spk key_enter = speakup_off | ||
| 765 | + spk key_9 = speakup_cut | ||
| 766 | +spk key_8 = speakup_paste | ||
| 767 | +shift spk key_m = say_first_char | ||
| 768 | + ctrl spk key_semicolon = say_last_char | ||
| 769 | + | ||
| 770 | +5. The Speakup Proc System | ||
| 771 | + | ||
| 772 | +The Speakup screen reader also creates a speakup subdirectory as a part | ||
| 773 | +of the proc system. You can see these entries by typing the command: | ||
| 774 | + | ||
| 775 | +ls -1 /proc/speakup/* | ||
| 776 | + | ||
| 777 | +If you issue the above ls command, you will get back something like | ||
| 778 | +this: | ||
| 779 | + | ||
| 780 | +/proc/speakup/attrib_bleep | ||
| 781 | +/proc/speakup/bell_pos | ||
| 782 | +/proc/speakup/bleep_time | ||
| 783 | +/proc/speakup/bleeps | ||
| 784 | +/proc/speakup/caps_start | ||
| 785 | +/proc/speakup/caps_stop | ||
| 786 | +/proc/speakup/characters | ||
| 787 | +/proc/speakup/cursor_time | ||
| 788 | +/proc/speakup/delay_time | ||
| 789 | +/proc/speakup/delimiters | ||
| 790 | +/proc/speakup/ex_num | ||
| 791 | +/proc/speakup/freq | ||
| 792 | +/proc/speakup/full_time | ||
| 793 | +/proc/speakup/jiffy_delta | ||
| 794 | +/proc/speakup/key_echo | ||
| 795 | +/proc/speakup/keymap | ||
| 796 | +/proc/speakup/no_interrupt | ||
| 797 | +/proc/speakup/pitch | ||
| 798 | +/proc/speakup/punc_all | ||
| 799 | +/proc/speakup/punc_level | ||
| 800 | +/proc/speakup/punc_most | ||
| 801 | +/proc/speakup/punc_some | ||
| 802 | +/proc/speakup/punct | ||
| 803 | +/proc/speakup/rate | ||
| 804 | +/proc/speakup/reading_punc | ||
| 805 | +/proc/speakup/repeats | ||
| 806 | +/proc/speakup/say_control | ||
| 807 | +/proc/speakup/say_word_ctl | ||
| 808 | +/proc/speakup/silent | ||
| 809 | +/proc/speakup/spell_delay | ||
| 810 | +/proc/speakup/synth_direct | ||
| 811 | +/proc/speakup/synth_name | ||
| 812 | +/proc/speakup/tone | ||
| 813 | +/proc/speakup/trigger_time | ||
| 814 | +/proc/speakup/version | ||
| 815 | +/proc/speakup/voice | ||
| 816 | +/proc/speakup/vol | ||
| 817 | + | ||
| 818 | +In addition to using the Speakup hot keys to change such things as | ||
| 819 | +volume, pitch, and rate, you can also echo values to the appropriate | ||
| 820 | +entry in the /proc/speakup directory. This is very useful, since it | ||
| 821 | +lets you control Speakup parameters from within a script. How you | ||
| 822 | +would write such scripts is somewhat beyond the scope of this manual, | ||
| 823 | +but I will include a couple of simple examples here to give you a | ||
| 824 | +general idea of what such scripts can do. | ||
| 825 | + | ||
| 826 | +Suppose for example, that you wanted to control both the punctuation | ||
| 827 | +level and the reading punctuation level at the same time. For | ||
| 828 | +simplicity, we'll call them punc0, punc1, punc2, and punc3. The scripts | ||
| 829 | +might look something like this: | ||
| 830 | + | ||
| 831 | +#!/bin/bash | ||
| 832 | +# punc0 | ||
| 833 | +# set punc and reading punc levels to 0 | ||
| 834 | +echo 0 >/proc/speakup/punc_level | ||
| 835 | +echo 0 >/proc/speakup/reading_punc | ||
| 836 | +echo Punctuation level set to 0. | ||
| 837 | + | ||
| 838 | +#!/bin/bash | ||
| 839 | +# punc1 | ||
| 840 | +# set punc and reading punc levels to 1 | ||
| 841 | +echo 1 >/proc/speakup/punc_level | ||
| 842 | +echo 1 >/proc/speakup/reading_punc | ||
| 843 | +echo Punctuation level set to 1. | ||
| 844 | + | ||
| 845 | +#!/bin/bash | ||
| 846 | +# punc2 | ||
| 847 | +# set punc and reading punc levels to 2 | ||
| 848 | +echo 2 >/proc/speakup/punc_level | ||
| 849 | +echo 2 >/proc/speakup/reading_punc | ||
| 850 | +echo Punctuation level set to 2. | ||
| 851 | + | ||
| 852 | +#!/bin/bash | ||
| 853 | +# punc3 | ||
| 854 | +# set punc and reading punc levels to 3 | ||
| 855 | +echo 3 >/proc/speakup/punc_level | ||
| 856 | +echo 3 >/proc/speakup/reading_punc | ||
| 857 | +echo Punctuation level set to 3. | ||
| 858 | + | ||
| 859 | +If you were to store these four small scripts in a directory in your | ||
| 860 | +path, perhaps /usr/local/bin, and set the permissions to 755 with the | ||
| 861 | +chmod command, then you could change the default reading punc and | ||
| 862 | +punctuation levels at the same time by issuing just one command. For | ||
| 863 | +example, if you were to execute the punc3 command at your shell prompt, | ||
| 864 | +then the reading punc and punc level would both get set to 3. | ||
| 865 | + | ||
| 866 | +I should note that the above scripts were written to work with bash, but | ||
| 867 | +regardless of which shell you use, you should be able to do something | ||
| 868 | +similar. | ||
| 869 | + | ||
| 870 | +The Speakup proc system also has another interesting use. You can echo | ||
| 871 | +Speakup parameters into the proc system in a script during system | ||
| 872 | +startup, and speakup will return to your preferred parameters every time | ||
| 873 | +the system is rebooted. | ||
| 874 | + | ||
| 875 | +Most of the Speakup proc parameters can be manipulated by a regular user | ||
| 876 | +on the system. However, there are a few parameters that are dangerous | ||
| 877 | +enough that they should only be manipulated by the root user on your | ||
| 878 | +system. There are even some parameters that are read only, and cannot | ||
| 879 | +be written to at all. For example, the version entry in the Speakup | ||
| 880 | +proc system is read only. This is because there is no reason for a user | ||
| 881 | +to tamper with the version number which is reported by Speakup. Doing | ||
| 882 | +an ls -l on /proc/speakup/version will return this: | ||
| 883 | + | ||
| 884 | +-r--r--r-- 1 root root 0 Mar 21 13:46 /proc/speakup/version | ||
| 885 | + | ||
| 886 | +As you can see, the version entry in the Speakup proc system is read | ||
| 887 | +only, is owned by root, and belongs to the root group. Doing a cat of | ||
| 888 | +/proc/speakup/version will display the Speakup version number, like | ||
| 889 | +this: | ||
| 890 | + | ||
| 891 | +cat /proc/speakup/version | ||
| 892 | phreak | 279 | +Speakup v-2.00 CVS: Thu Oct 21 10:38:21 EDT 2004 |
| 893 | eradicator | 150 | +synth dtlk version 1.1 |
| 894 | + | ||
| 895 | +The display shows the Speakup version number, along with the version | ||
| 896 | +number of the driver for the current synthesizer. | ||
| 897 | + | ||
| 898 | +Looking at entries in the Speakup proc system can be useful in many | ||
| 899 | +ways. For example, you might wish to know what level your volume is set | ||
| 900 | +at. You could type: | ||
| 901 | + | ||
| 902 | +cat /proc/speakup/vol | ||
| 903 | +5 | ||
| 904 | + | ||
| 905 | +The number five which comes back is the level at which the synthesizer | ||
| 906 | +volume is set at. | ||
| 907 | + | ||
| 908 | +All the entries in the Speakup proc system are readable, some are | ||
| 909 | +writable by root only, and some are writable by everyone. Unless you | ||
| 910 | +know what you are doing, you should probably leave the ones that are | ||
| 911 | phreak | 279 | +writable by root only alone. Most of the names are self explanatory. |
| 912 | eradicator | 150 | +Vol for controlling volume, pitch for pitch, rate for controlling speaking |
| 913 | +rate, etc. If you find one you aren't sure about, you can post a query | ||
| 914 | +on the Speakup list. | ||
| 915 | + | ||
| 916 | +6. Changing Synthesizers | ||
| 917 | + | ||
| 918 | +It is possible to change to a different synthesizer while speakup is | ||
| 919 | +running. In other words, it is not necessary to reboot the system | ||
| 920 | +in order to use a different synthesizer. You can simply echo the | ||
| 921 | phreak | 279 | +synthesizer keyword to the /proc/speakup/synth_name proc entry. |
| 922 | eradicator | 150 | +Depending on your situation, you may wish to echo none to the synth_name |
| 923 | +proc entry, to disable speech while one synthesizer is disconnected and | ||
| 924 | +a second one is connected in its place. Then echo the keyword for the | ||
| 925 | +new synthesizer into the synth_name proc entry in order to start speech | ||
| 926 | +with the newly connected synthesizer. See the list of synthesizer | ||
| 927 | +keywords in section 1 to find the keyword which matches your synth. | ||
| 928 | + | ||
| 929 | +7. Loading modules | ||
| 930 | + | ||
| 931 | +As mentioned earlier, Speakup can either be completely compiled into the | ||
| 932 | +kernel, with the exception of the help module, or it can be compiled as | ||
| 933 | +a series of modules. When compiled as modules, Speakup will only be | ||
| 934 | +able to speak some of the bootup messages if your system administrator | ||
| 935 | +has configured the system to load the modules at boo time. The modules | ||
| 936 | +can be loaded after the file systems have been checked and mounted, or | ||
| 937 | +from an initrd. There is a third possibility. Speakup can be compiled | ||
| 938 | +with some components built into the kernel, and others as modules. As | ||
| 939 | +we'll see in the next section, this is particularly useful when you are | ||
| 940 | +working with software synthesizers. | ||
| 941 | + | ||
| 942 | +If Speakup is completely compiled as modules, then you must use the | ||
| 943 | +modprobe command to load Speakup. You do this by loading the module for | ||
| 944 | +the synthesizer driver you wish to use. The driver modules are all | ||
| 945 | +named speakup_<keyword>, where <keyword> is the keyword for the | ||
| 946 | +synthesizer you want. So, in order to load the driver for the DecTalk | ||
| 947 | +Express, you would type the following command: | ||
| 948 | + | ||
| 949 | +modprobe speakup_dectlk | ||
| 950 | + | ||
| 951 | +Issuing this command would load the DecTalk Express driver and all other | ||
| 952 | +related Speakup modules necessary to get Speakup up and running. | ||
| 953 | + | ||
| 954 | +To completely unload Speakup, again presuming that it is entirely built | ||
| 955 | +as modules, you would give the command: | ||
| 956 | + | ||
| 957 | +modprobe -r speakup_dectlk | ||
| 958 | + | ||
| 959 | +The above command assumes you were running a DecTalk Express. If you | ||
| 960 | +were using a different synth, then you would substitute its keyword in | ||
| 961 | +place of dectlk. | ||
| 962 | + | ||
| 963 | +But now, suppose we have a situation where the main Speakup component | ||
| 964 | +is built into the kernel, and some or all of the drivers are built as | ||
| 965 | +modules. Since the main part of Speakup is compiled into the kernel, a | ||
| 966 | +partial Speakup proc system has been created which we can take advantage | ||
| 967 | +of by simply echoing the synthesizer keyword into the | ||
| 968 | +/proc/speakup/synth_name proc entry. This will cause the kernel to | ||
| 969 | +automatically load the appropriate driver module, and start Speakup | ||
| 970 | +talking. To switch to another synth, just echo a new keyword to the | ||
| 971 | +synth_name proc entry. For example, to load the DoubleTalk LT driver, | ||
| 972 | +you would type: | ||
| 973 | + | ||
| 974 | +echo ltlk >/proc/speakup/synth_name | ||
| 975 | + | ||
| 976 | +You can use the modprobe -r command to unload driver modules, regardless | ||
| 977 | +of whether the main part of Speakup has been built into the kernel or | ||
| 978 | +not. | ||
| 979 | + | ||
| 980 | +8. Using Software Synthesizers | ||
| 981 | + | ||
| 982 | +Using a software synthesizer requires that some other software be | ||
| 983 | +installed and running on your system. For this reason, software | ||
| 984 | +synthesizers are not available for use at bootup, or during a system | ||
| 985 | +installation process. | ||
| 986 | + | ||
| 987 | +In order to use a software synthesizer, you must have a package called | ||
| 988 | +Speech Dispatcher running on your system, and it must be configured to | ||
| 989 | +work with one of its supported software synthesizers. | ||
| 990 | + | ||
| 991 | +Two open source synthesizers you might use are Flite and Festival. You | ||
| 992 | +might also choose to purchase the Software DecTalk from Fonix Sales Inc. | ||
| 993 | +If you run a google search for Fonix, you'll find their web site. | ||
| 994 | + | ||
| 995 | +You can obtain a copy of Speech Dispatcher from free(b)soft at | ||
| 996 | +http://www.freebsoft.org/. Follow the installation instructions that | ||
| 997 | +come with Speech Dispatcher in order to install and configure Speech | ||
| 998 | +Dispatcher. You can check out the web site for your Linux distribution | ||
| 999 | +in order to get a copy of either Flite or Festival. Your Linux | ||
| 1000 | +distribution may also have a precompiled Speech Dispatcher package. | ||
| 1001 | + | ||
| 1002 | +Once you've installed, configured, and tested Speech Dispatcher with your | ||
| 1003 | +chosen software synthesizer, you still need one more piece of software | ||
| 1004 | phreak | 279 | +in order to make things work. You need a package called speechd-up. |
| 1005 | eradicator | 150 | +You get it from the free(b)soft web site mentioned above. After you've |
| 1006 | +compiled and installed speechd-up, you are almost ready to begin using | ||
| 1007 | +your software synthesizer. | ||
| 1008 | + | ||
| 1009 | +Before you can use a software synthesizer, you must have created the | ||
| 1010 | +/dev/softsynth device. If you have not already done so, issue the | ||
| 1011 | +following commands as root: | ||
| 1012 | + | ||
| 1013 | +cd /dev | ||
| 1014 | +mknod softsynth c 10 26 | ||
| 1015 | + | ||
| 1016 | +While we are at it, we might just as well create the /dev/synth device, | ||
| 1017 | +which can be used to let user space programs send information to your | ||
| 1018 | +synthesizer. To create /dev/synth, change to the /dev directory, and | ||
| 1019 | +issue the following command as root: | ||
| 1020 | + | ||
| 1021 | +mknod synth c 10 25 | ||
| 1022 | + | ||
| 1023 | +Now you can begin using your software synthesizer. In order to do so, | ||
| 1024 | +echo the sftsyn keyword to the synth_name proc entry like this: | ||
| 1025 | + | ||
| 1026 | +echo sftsyn >/proc/speakup/synth_name | ||
| 1027 | + | ||
| 1028 | +Next run the speechd_up command like this: | ||
| 1029 | + | ||
| 1030 | +speechd_up & | ||
| 1031 | + | ||
| 1032 | +Your synth should now start talking, and you should be able to adjust | ||
| 1033 | +the pitch, rate, etc. | ||
| 1034 | + | ||
| 1035 | +In this section, we have assumed that your copy of Speakup was compiled | ||
| 1036 | +with the speakup_sftsyn component either built into the kernel, or | ||
| 1037 | +compiled as a module. | ||
| 1038 | + | ||
| 1039 | +9. Using The DecTalk PC Card | ||
| 1040 | + | ||
| 1041 | +The DecTalk PC card is an ISA card that is inserted into one of the ISA | ||
| 1042 | +slots in your computer. It requires that the DecTalk PC software be | ||
| 1043 | +installed on your computer, and that the software be loaded onto the | ||
| 1044 | +Dectalk PC card before it can be used. | ||
| 1045 | + | ||
| 1046 | +You can get the dec_pc.tgz file from the linux-speakup.org site. The | ||
| 1047 | +dec_pc.tgz file is in the ~ftp/pub/linux/speakup directory. | ||
| 1048 | + | ||
| 1049 | +After you have downloaded the dec_pc.tgz file, untar it in your home | ||
| 1050 | +directory, and read the Readme file in the newly created dec_pc | ||
| 1051 | +directory. | ||
| 1052 | + | ||
| 1053 | +The easiest way to get the software working is to copy the entire dec_pc | ||
| 1054 | +directory into /user/local/lib. To do this, su to root in your home | ||
| 1055 | +directory, and issue the command: | ||
| 1056 | + | ||
| 1057 | +cp dec_pc /usr/local/lib | ||
| 1058 | + | ||
| 1059 | +You will need to copy the dtload command from the dec_pc directory to a | ||
| 1060 | +directory in your path. Either /usr/bin or /usr/local/bin is a good | ||
| 1061 | +choice. | ||
| 1062 | + | ||
| 1063 | +You can now run the dtload command in order to load the DecTalk PC | ||
| 1064 | +software onto the card. After you have done this, echo the decpc | ||
| 1065 | +keyword to the synth_name entry in the proc system like this: | ||
| 1066 | + | ||
| 1067 | +echo decpc >/proc/speakup/synth_name | ||
| 1068 | + | ||
| 1069 | +Your DecTalk PC should start talking, and then you can adjust the pitch, | ||
| 1070 | +rate, volume, voice, etc. The voice entry in the Speakup proc system | ||
| 1071 | +will accept a number from 0 through 7 for the DecTalk PC synthesizer, | ||
| 1072 | +which will give you access to some of the DecTalk voices. | ||
| 1073 | + | ||
| 1074 | +10. Using Cursor Tracking | ||
| 1075 | + | ||
| 1076 | +In Speakup version 2.0 and later, cursor tracking is turned on by | ||
| 1077 | +default. This means that when you are using an editor, Speakup will | ||
| 1078 | +automatically speak characters as you move left and right with the | ||
| 1079 | +cursor keys, and lines as you move up and down with the cursor keys. | ||
| 1080 | + | ||
| 1081 | +This is extremely useful, and makes editing files a snap. But there are | ||
| 1082 | +times when cursor tracking can get in your way. So Speakup provides a | ||
| 1083 | +toggle to turn cursor tracking on and off. You do this with the keypad | ||
| 1084 | +asterisk key. Pressing this key repeatedly will toggle the cursor | ||
| 1085 | +tracking on and off, and you will hear Speakup say, "cursoring off", and | ||
| 1086 | +"cursoring on". | ||
| 1087 | + | ||
| 1088 | +Some folks like to turn cursor tracking off while they are using the | ||
| 1089 | +lynx web browser. You definitely want to turn cursor tracking off when | ||
| 1090 | +you are using the alsamixer application. Otherwise, you won't be able | ||
| 1091 | +to hear your mixer settings while you are using the arrow keys. | ||
| 1092 | + | ||
| 1093 | +11. Cut and Paste | ||
| 1094 | + | ||
| 1095 | +One of Speakup's more useful features is the ability to cut and paste | ||
| 1096 | +text on the screen. This means that you can capture information from a | ||
| 1097 | +program, and paste that captured text into a different place in the | ||
| 1098 | +program, or into an entirely different program, which may even be | ||
| 1099 | +running on a different console. | ||
| 1100 | + | ||
| 1101 | +For example, in this manual, we have made references to several web | ||
| 1102 | +sites. It would be nice if you could cut and paste these urls into your | ||
| 1103 | +web browser. Speakup does this quite nicely. Suppose you wanted to | ||
| 1104 | +past the following url into your browser: | ||
| 1105 | + | ||
| 1106 | +http://linux-speakup.org/ | ||
| 1107 | + | ||
| 1108 | +Use the speakup review keys to position the reading cursor on the first | ||
| 1109 | +character of the above url. When the reading cursor is in position, | ||
| 1110 | +press the keypad slash key once. Speakup will say, "mark". Next, | ||
| 1111 | +position the reading cursor on the rightmost character of the above | ||
| 1112 | +url. Press the keypad slash key once again to actually cut the text | ||
| 1113 | +from the screen. Speakup will say, "cut". Although we call this | ||
| 1114 | phreak | 279 | +cutting, Speakup does not actually delete the cut text from the screen. |
| 1115 | eradicator | 150 | +It makes a copy of the text in a special buffer for later pasting. |
| 1116 | + | ||
| 1117 | +Now that you have the url cut from the screen, you can paste it into | ||
| 1118 | +your browser, or even paste the url on a command line as an argument to | ||
| 1119 | +your browser. | ||
| 1120 | + | ||
| 1121 | +Suppose you want to start lynx and go to the Speakup site. | ||
| 1122 | + | ||
| 1123 | +You can switch to a different console with the alt left and right | ||
| 1124 | +arrows, or you can switch to a specific console by typing alt and a | ||
| 1125 | +function key. These are not Speakup commands, just standard Linux | ||
| 1126 | +console capabilities. | ||
| 1127 | + | ||
| 1128 | +Once you've changed to an appropriate console, and are at a shell prompt, | ||
| 1129 | +type the word lynx, followed by a space. Now press and hold the speakup | ||
| 1130 | +key, while you type the keypad slash character. The url will be pasted | ||
| 1131 | +onto the command line, just as though you had typed it in. Press the | ||
| 1132 | +enter key to execute the command. | ||
| 1133 | + | ||
| 1134 | +The paste buffer will continue to hold the cut information, until a new | ||
| 1135 | +mark and cut operation is carried out. This means you can paste the cut | ||
| 1136 | +information as many times as you like before doing another cut | ||
| 1137 | +operation. | ||
| 1138 | + | ||
| 1139 | +You are not limited to cutting and pasting only one line on the screen. | ||
| 1140 | +You can also cut and paste rectangular regions of the screen. Just | ||
| 1141 | +position the reading cursor at the top left corner of the text to be | ||
| 1142 | +cut, mark it with the keypad slash key, then position the reading cursor | ||
| 1143 | +at the bottom right corner of the region to be cut, and cut it with the | ||
| 1144 | +keypad slash key. | ||
| 1145 | + | ||
| 1146 | +12. Changing the Pronunciation of Characters | ||
| 1147 | + | ||
| 1148 | +Through the /proc/speakup/chars proc entry, Speakup gives you the | ||
| 1149 | +ability to change how Speakup pronounces a given character. You could, | ||
| 1150 | +for example, change how some punctuation characters are spoken. You can | ||
| 1151 | +even change how Speakup will pronounce certain letters. | ||
| 1152 | + | ||
| 1153 | +You may, for example, wish to change how Speakup pronounces the z | ||
| 1154 | +character. The author of Speakup, Kirk Reiser, is Canadian, and thus | ||
| 1155 | +believes that the z should be pronounced zed. If you are an American, | ||
| 1156 | +you might wish to use the zee pronunciation instead of zed. You can | ||
| 1157 | +change the pronunciation of both the upper and lower case z with the | ||
| 1158 | +following two commands: | ||
| 1159 | + | ||
| 1160 | +echo 90 zee >/proc/speakup/characters | ||
| 1161 | +echo 122 zee >/proc/speakup/characters | ||
| 1162 | + | ||
| 1163 | +Let's examine the parts of the two previous commands. They are issued | ||
| 1164 | +at the shell prompt, and could be placed in a startup script. | ||
| 1165 | + | ||
| 1166 | +The word echo tells the shell that you want to have it display the | ||
| 1167 | +string of characters that follow the word echo. If you were to just | ||
| 1168 | +type: | ||
| 1169 | + | ||
| 1170 | +echo hello. | ||
| 1171 | + | ||
| 1172 | +You would get the word hello printed on your screen as soon as you | ||
| 1173 | +pressed the enter key. In this case, we are echoing strings that we | ||
| 1174 | +want to be redirected into the proc system. | ||
| 1175 | + | ||
| 1176 | +The numbers 90 and 122 in the above echo commands are the ascii numeric | ||
| 1177 | +values for the upper and lower case z, the characters we wish to change. | ||
| 1178 | + | ||
| 1179 | +The string zee is the pronunciation that we want Speakup to use for the | ||
| 1180 | +upper and lower case z. | ||
| 1181 | + | ||
| 1182 | +The > symbol redirects the output of the echo command to a file, just | ||
| 1183 | +like in DOS, or at the Windows command prompt. | ||
| 1184 | + | ||
| 1185 | +And finally, /proc/speakup/chars is the file entry in the proc system | ||
| 1186 | +where we want the output to be directed. Speakup looks at the numeric | ||
| 1187 | +value of the character we want to change, and inserts the pronunciation | ||
| 1188 | +string into an internal table. | ||
| 1189 | + | ||
| 1190 | +You can look at the whole table with the following command: | ||
| 1191 | + | ||
| 1192 | +cat /proc/speakup/chars | ||
| 1193 | + | ||
| 1194 | +Speakup will then print out the entire character pronunciation table. I | ||
| 1195 | +won't display it here, but leave you to look at it at your convenience. | ||
| 1196 | + | ||
| 1197 | +13. Mapping Keys | ||
| 1198 | + | ||
| 1199 | +Speakup has the capability of allowing you to assign or "map" keys to | ||
| 1200 | +internal Speakup commands. This section necessarily assumes you have a | ||
| 1201 | +Linux kernel source tree installed, and that it has been patched and | ||
| 1202 | +configured with Speakup. How you do this is beyond the scope of this | ||
| 1203 | +manual. For this information, visit the Speakup web site at | ||
| 1204 | +http://linux-speakup.org/. The reason you'll need the kernel source | ||
| 1205 | +tree patched with Speakup is that the genmap utility you'll need for | ||
| 1206 | +processing keymaps is in the | ||
| 1207 | +/usr/src/linux-<version_number>/drivers/char/speakup directory. The | ||
| 1208 | +<version_number> in the above directory path is the version number of | ||
| 1209 | +the Linux source tree you are working with. | ||
| 1210 | + | ||
| 1211 | +So ok, you've gone off and gotten your kernel source tree, and patched | ||
| 1212 | +and configured it. Now you can start manipulating keymaps. | ||
| 1213 | + | ||
| 1214 | +You can either use the | ||
| 1215 | +/usr/src/linux-<version_number>/drivers/char/speakup/speakupmap.map file | ||
| 1216 | +included with the Speakup source, or you can cut and paste the copy in | ||
| 1217 | +section 4 into a separate file. If you use the one in the Speakup | ||
| 1218 | +source tree, make sure you make a backup of it before you start making | ||
| 1219 | +changes. You have been warned! | ||
| 1220 | + | ||
| 1221 | +Suppose that you want to swap the key assignments for the Speakup | ||
| 1222 | +say_last_char and the Speakup say_first_char commands. The | ||
| 1223 | +speakupmap.map lists the key mappings for these two commands as follows: | ||
| 1224 | + | ||
| 1225 | +spk key_pageup = say_first_char | ||
| 1226 | +spk key_pagedown = say_last_char | ||
| 1227 | + | ||
| 1228 | +You can edit your copy of the speakupmap.map file and swap the command | ||
| 1229 | +names on the right side of the = (equals) sign. You did make a backup, | ||
| 1230 | +right? The new keymap lines would look like this: | ||
| 1231 | + | ||
| 1232 | +spk key_pageup = say_last_char | ||
| 1233 | +spk key_pagedown = say_first_char | ||
| 1234 | + | ||
| 1235 | +After you edit your copy of the speakupmap.map file, save it under a new | ||
| 1236 | +file name, perhaps newmap.map. Then exit your editor and return to the | ||
| 1237 | +shell prompt. | ||
| 1238 | + | ||
| 1239 | +You are now ready to load your keymap with your swapped key assignments. | ||
| 1240 | + Assuming that you saved your new keymap as the file newmap.map, you | ||
| 1241 | +would load your keymap into the proc system like this: | ||
| 1242 | + | ||
| 1243 | +/usr/src/linux-<version_number>/drivers/char/speakup/genmap newmap.map | ||
| 1244 | +>/proc/speakup/keymap | ||
| 1245 | + | ||
| 1246 | +Remember to substitute your kernel version number for the | ||
| 1247 | +<version_number> in the above command. Also note that although the | ||
| 1248 | +above command wrapped onto two lines in this document, you should type | ||
| 1249 | +it all on one line. | ||
| 1250 | + | ||
| 1251 | +Your say first and say last characters should now be swapped. Pressing | ||
| 1252 | +speakup pagedown should read you the first non-whitespace character on | ||
| 1253 | +the line your reading cursor is in, and pressing speakup pageup should | ||
| 1254 | +read you the last character on the line your reading cursor is in. | ||
| 1255 | + | ||
| 1256 | +You should note that these new mappings will only stay in effect until | ||
| 1257 | +you reboot, or until you load another keymap. | ||
| 1258 | + | ||
| 1259 | +One final warning. If you try to load a partial map, you will quickly | ||
| 1260 | +find that all the mappings you didn't include in your file got deleted | ||
| 1261 | phreak | 279 | +from the working map. Be extremely careful, and always make a backup! |
| 1262 | eradicator | 150 | +You have been warned! |
| 1263 | + | ||
| 1264 | +14. Using Speakup's Windowing Capability | ||
| 1265 | + | ||
| 1266 | +Speakup has the capability of defining and manipulating windows on the | ||
| 1267 | +screen. Speakup uses the term "Window", to mean a user defined area of | ||
| 1268 | +the screen. The key strokes for defining and manipulating Speakup | ||
| 1269 | +windows are as follows: | ||
| 1270 | + | ||
| 1271 | +speakup + f2 -- Set the bounds of the window. | ||
| 1272 | +Speakup + f3 -- clear the current window definition. | ||
| 1273 | +speakup + f4 -- Toggle window silence on and off. | ||
| 1274 | +speakup + keypad plus -- Say the currently defined window. | ||
| 1275 | + | ||
| 1276 | +These capabilities are useful for tracking a certain part of the screen | ||
| 1277 | +without rereading the whole screen, or for silencing a part of the | ||
| 1278 | +screen that is constantly changing, such as a clock or status line. | ||
| 1279 | + | ||
| 1280 | +There is no way to save these window settings, and you can only have one | ||
| 1281 | +window defined for each virtual console. There is also no way to have | ||
| 1282 | +windows automaticly defined for specific applications. | ||
| 1283 | + | ||
| 1284 | +In order to define a window, use the review keys to move your reading | ||
| 1285 | +cursor to the beginning of the area you want to define. Then press | ||
| 1286 | +speakup + f2. Speakup will tell you that the window starts at the | ||
| 1287 | +indicated row and column position. Then move the reading cursor to the | ||
| 1288 | +end of the area to be defined as a window, and press speakup + f2 again. | ||
| 1289 | + If there is more than one line in the window, Speakup will tell you | ||
| 1290 | +that the window ends at the indicated row and column position. If there | ||
| 1291 | +is only one line in the window, then Speakup will tell you that the | ||
| 1292 | +window is the specified line on the screen. If you are only defining a | ||
| 1293 | +one line window, you can just press speakup + f2 twice after placing the | ||
| 1294 | +reading cursor on the line you want to define as a window. It is not | ||
| 1295 | +necessary to position the reading cursor at the end of the line in order | ||
| 1296 | +to define the whole line as a window. | ||
| 1297 | + | ||
| 1298 | + GNU Free Documentation License | ||
| 1299 | + Version 1.2, November 2002 | ||
| 1300 | + | ||
| 1301 | + | ||
| 1302 | + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. | ||
| 1303 | + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 1304 | + Everyone is permitted to copy and distribute verbatim copies | ||
| 1305 | + of this license document, but changing it is not allowed. | ||
| 1306 | + | ||
| 1307 | + | ||
| 1308 | +0. PREAMBLE | ||
| 1309 | + | ||
| 1310 | +The purpose of this License is to make a manual, textbook, or other | ||
| 1311 | +functional and useful document "free" in the sense of freedom: to | ||
| 1312 | +assure everyone the effective freedom to copy and redistribute it, | ||
| 1313 | +with or without modifying it, either commercially or noncommercially. | ||
| 1314 | +Secondarily, this License preserves for the author and publisher a way | ||
| 1315 | +to get credit for their work, while not being considered responsible | ||
| 1316 | +for modifications made by others. | ||
| 1317 | + | ||
| 1318 | +This License is a kind of "copyleft", which means that derivative | ||
| 1319 | +works of the document must themselves be free in the same sense. It | ||
| 1320 | +complements the GNU General Public License, which is a copyleft | ||
| 1321 | +license designed for free software. | ||
| 1322 | + | ||
| 1323 | +We have designed this License in order to use it for manuals for free | ||
| 1324 | +software, because free software needs free documentation: a free | ||
| 1325 | +program should come with manuals providing the same freedoms that the | ||
| 1326 | +software does. But this License is not limited to software manuals; | ||
| 1327 | +it can be used for any textual work, regardless of subject matter or | ||
| 1328 | +whether it is published as a printed book. We recommend this License | ||
| 1329 | +principally for works whose purpose is instruction or reference. | ||
| 1330 | + | ||
| 1331 | + | ||
| 1332 | +1. APPLICABILITY AND DEFINITIONS | ||
| 1333 | + | ||
| 1334 | +This License applies to any manual or other work, in any medium, that | ||
| 1335 | +contains a notice placed by the copyright holder saying it can be | ||
| 1336 | +distributed under the terms of this License. Such a notice grants a | ||
| 1337 | +world-wide, royalty-free license, unlimited in duration, to use that | ||
| 1338 | +work under the conditions stated herein. The "Document", below, | ||
| 1339 | +refers to any such manual or work. Any member of the public is a | ||
| 1340 | +licensee, and is addressed as "you". You accept the license if you | ||
| 1341 | +copy, modify or distribute the work in a way requiring permission | ||
| 1342 | +under copyright law. | ||
| 1343 | + | ||
| 1344 | +A "Modified Version" of the Document means any work containing the | ||
| 1345 | +Document or a portion of it, either copied verbatim, or with | ||
| 1346 | +modifications and/or translated into another language. | ||
| 1347 | + | ||
| 1348 | +A "Secondary Section" is a named appendix or a front-matter section of | ||
| 1349 | +the Document that deals exclusively with the relationship of the | ||
| 1350 | +publishers or authors of the Document to the Document's overall subject | ||
| 1351 | +(or to related matters) and contains nothing that could fall directly | ||
| 1352 | +within that overall subject. (Thus, if the Document is in part a | ||
| 1353 | +textbook of mathematics, a Secondary Section may not explain any | ||
| 1354 | +mathematics.) The relationship could be a matter of historical | ||
| 1355 | +connection with the subject or with related matters, or of legal, | ||
| 1356 | +commercial, philosophical, ethical or political position regarding | ||
| 1357 | +them. | ||
| 1358 | + | ||
| 1359 | +The "Invariant Sections" are certain Secondary Sections whose titles | ||
| 1360 | +are designated, as being those of Invariant Sections, in the notice | ||
| 1361 | +that says that the Document is released under this License. If a | ||
| 1362 | +section does not fit the above definition of Secondary then it is not | ||
| 1363 | +allowed to be designated as Invariant. The Document may contain zero | ||
| 1364 | +Invariant Sections. If the Document does not identify any Invariant | ||
| 1365 | +Sections then there are none. | ||
| 1366 | + | ||
| 1367 | +The "Cover Texts" are certain short passages of text that are listed, | ||
| 1368 | +as Front-Cover Texts or Back-Cover Texts, in the notice that says that | ||
| 1369 | +the Document is released under this License. A Front-Cover Text may | ||
| 1370 | +be at most 5 words, and a Back-Cover Text may be at most 25 words. | ||
| 1371 | + | ||
| 1372 | +A "Transparent" copy of the Document means a machine-readable copy, | ||
| 1373 | +represented in a format whose specification is available to the | ||
| 1374 | +general public, that is suitable for revising the document | ||
| 1375 | +straightforwardly with generic text editors or (for images composed of | ||
| 1376 | +pixels) generic paint programs or (for drawings) some widely available | ||
| 1377 | +drawing editor, and that is suitable for input to text formatters or | ||
| 1378 | +for automatic translation to a variety of formats suitable for input | ||
| 1379 | +to text formatters. A copy made in an otherwise Transparent file | ||
| 1380 | +format whose markup, or absence of markup, has been arranged to thwart | ||
| 1381 | +or discourage subsequent modification by readers is not Transparent. | ||
| 1382 | +An image format is not Transparent if used for any substantial amount | ||
| 1383 | +of text. A copy that is not "Transparent" is called "Opaque". | ||
| 1384 | + | ||
| 1385 | +Examples of suitable formats for Transparent copies include plain | ||
| 1386 | +ASCII without markup, Texinfo input format, LaTeX input format, SGML | ||
| 1387 | +or XML using a publicly available DTD, and standard-conforming simple | ||
| 1388 | +HTML, PostScript or PDF designed for human modification. Examples of | ||
| 1389 | +transparent image formats include PNG, XCF and JPG. Opaque formats | ||
| 1390 | +include proprietary formats that can be read and edited only by | ||
| 1391 | +proprietary word processors, SGML or XML for which the DTD and/or | ||
| 1392 | +processing tools are not generally available, and the | ||
| 1393 | +machine-generated HTML, PostScript or PDF produced by some word | ||
| 1394 | +processors for output purposes only. | ||
| 1395 | + | ||
| 1396 | +The "Title Page" means, for a printed book, the title page itself, | ||
| 1397 | +plus such following pages as are needed to hold, legibly, the material | ||
| 1398 | +this License requires to appear in the title page. For works in | ||
| 1399 | +formats which do not have any title page as such, "Title Page" means | ||
| 1400 | +the text near the most prominent appearance of the work's title, | ||
| 1401 | +preceding the beginning of the body of the text. | ||
| 1402 | + | ||
| 1403 | +A section "Entitled XYZ" means a named subunit of the Document whose | ||
| 1404 | +title either is precisely XYZ or contains XYZ in parentheses following | ||
| 1405 | +text that translates XYZ in another language. (Here XYZ stands for a | ||
| 1406 | +specific section name mentioned below, such as "Acknowledgements", | ||
| 1407 | +"Dedications", "Endorsements", or "History".) To "Preserve the Title" | ||
| 1408 | +of such a section when you modify the Document means that it remains a | ||
| 1409 | +section "Entitled XYZ" according to this definition. | ||
| 1410 | + | ||
| 1411 | +The Document may include Warranty Disclaimers next to the notice which | ||
| 1412 | +states that this License applies to the Document. These Warranty | ||
| 1413 | +Disclaimers are considered to be included by reference in this | ||
| 1414 | +License, but only as regards disclaiming warranties: any other | ||
| 1415 | +implication that these Warranty Disclaimers may have is void and has | ||
| 1416 | +no effect on the meaning of this License. | ||
| 1417 | + | ||
| 1418 | + | ||
| 1419 | +2. VERBATIM COPYING | ||
| 1420 | + | ||
| 1421 | +You may copy and distribute the Document in any medium, either | ||
| 1422 | +commercially or noncommercially, provided that this License, the | ||
| 1423 | +copyright notices, and the license notice saying this License applies | ||
| 1424 | +to the Document are reproduced in all copies, and that you add no other | ||
| 1425 | +conditions whatsoever to those of this License. You may not use | ||
| 1426 | +technical measures to obstruct or control the reading or further | ||
| 1427 | +copying of the copies you make or distribute. However, you may accept | ||
| 1428 | +compensation in exchange for copies. If you distribute a large enough | ||
| 1429 | +number of copies you must also follow the conditions in section 3. | ||
| 1430 | + | ||
| 1431 | +You may also lend copies, under the same conditions stated above, and | ||
| 1432 | +you may publicly display copies. | ||
| 1433 | + | ||
| 1434 | + | ||
| 1435 | +3. COPYING IN QUANTITY | ||
| 1436 | + | ||
| 1437 | +If you publish printed copies (or copies in media that commonly have | ||
| 1438 | +printed covers) of the Document, numbering more than 100, and the | ||
| 1439 | +Document's license notice requires Cover Texts, you must enclose the | ||
| 1440 | +copies in covers that carry, clearly and legibly, all these Cover | ||
| 1441 | +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on | ||
| 1442 | +the back cover. Both covers must also clearly and legibly identify | ||
| 1443 | +you as the publisher of these copies. The front cover must present | ||
| 1444 | +the full title with all words of the title equally prominent and | ||
| 1445 | +visible. You may add other material on the covers in addition. | ||
| 1446 | +Copying with changes limited to the covers, as long as they preserve | ||
| 1447 | +the title of the Document and satisfy these conditions, can be treated | ||
| 1448 | +as verbatim copying in other respects. | ||
| 1449 | + | ||
| 1450 | +If the required texts for either cover are too voluminous to fit | ||
| 1451 | +legibly, you should put the first ones listed (as many as fit | ||
| 1452 | +reasonably) on the actual cover, and continue the rest onto adjacent | ||
| 1453 | +pages. | ||
| 1454 | + | ||
| 1455 | +If you publish or distribute Opaque copies of the Document numbering | ||
| 1456 | +more than 100, you must either include a machine-readable Transparent | ||
| 1457 | +copy along with each Opaque copy, or state in or with each Opaque copy | ||
| 1458 | +a computer-network location from which the general network-using | ||
| 1459 | +public has access to download using public-standard network protocols | ||
| 1460 | +a complete Transparent copy of the Document, free of added material. | ||
| 1461 | +If you use the latter option, you must take reasonably prudent steps, | ||
| 1462 | +when you begin distribution of Opaque copies in quantity, to ensure | ||
| 1463 | +that this Transparent copy will remain thus accessible at the stated | ||
| 1464 | +location until at least one year after the last time you distribute an | ||
| 1465 | +Opaque copy (directly or through your agents or retailers) of that | ||
| 1466 | +edition to the public. | ||
| 1467 | + | ||
| 1468 | +It is requested, but not required, that you contact the authors of the | ||
| 1469 | +Document well before redistributing any large number of copies, to give | ||
| 1470 | +them a chance to provide you with an updated version of the Document. | ||
| 1471 | + | ||
| 1472 | + | ||
| 1473 | +4. MODIFICATIONS | ||
| 1474 | + | ||
| 1475 | +You may copy and distribute a Modified Version of the Document under | ||
| 1476 | +the conditions of sections 2 and 3 above, provided that you release | ||
| 1477 | +the Modified Version under precisely this License, with the Modified | ||
| 1478 | +Version filling the role of the Document, thus licensing distribution | ||
| 1479 | +and modification of the Modified Version to whoever possesses a copy | ||
| 1480 | +of it. In addition, you must do these things in the Modified Version: | ||
| 1481 | + | ||
| 1482 | +A. Use in the Title Page (and on the covers, if any) a title distinct | ||
| 1483 | + from that of the Document, and from those of previous versions | ||
| 1484 | + (which should, if there were any, be listed in the History section | ||
| 1485 | + of the Document). You may use the same title as a previous version | ||
| 1486 | + if the original publisher of that version gives permission. | ||
| 1487 | +B. List on the Title Page, as authors, one or more persons or entities | ||
| 1488 | + responsible for authorship of the modifications in the Modified | ||
| 1489 | + Version, together with at least five of the principal authors of the | ||
| 1490 | + Document (all of its principal authors, if it has fewer than five), | ||
| 1491 | + unless they release you from this requirement. | ||
| 1492 | +C. State on the Title page the name of the publisher of the | ||
| 1493 | + Modified Version, as the publisher. | ||
| 1494 | +D. Preserve all the copyright notices of the Document. | ||
| 1495 | +E. Add an appropriate copyright notice for your modifications | ||
| 1496 | + adjacent to the other copyright notices. | ||
| 1497 | +F. Include, immediately after the copyright notices, a license notice | ||
| 1498 | + giving the public permission to use the Modified Version under the | ||
| 1499 | + terms of this License, in the form shown in the Addendum below. | ||
| 1500 | +G. Preserve in that license notice the full lists of Invariant Sections | ||
| 1501 | + and required Cover Texts given in the Document's license notice. | ||
| 1502 | +H. Include an unaltered copy of this License. | ||
| 1503 | +I. Preserve the section Entitled "History", Preserve its Title, and add | ||
| 1504 | + to it an item stating at least the title, year, new authors, and | ||
| 1505 | + publisher of the Modified Version as given on the Title Page. If | ||
| 1506 | + there is no section Entitled "History" in the Document, create one | ||
| 1507 | + stating the title, year, authors, and publisher of the Document as | ||
| 1508 | + given on its Title Page, then add an item describing the Modified | ||
| 1509 | + Version as stated in the previous sentence. | ||
| 1510 | +J. Preserve the network location, if any, given in the Document for | ||
| 1511 | + public access to a Transparent copy of the Document, and likewise | ||
| 1512 | + the network locations given in the Document for previous versions | ||
| 1513 | + it was based on. These may be placed in the "History" section. | ||
| 1514 | + You may omit a network location for a work that was published at | ||
| 1515 | + least four years before the Document itself, or if the original | ||
| 1516 | + publisher of the version it refers to gives permission. | ||
| 1517 | +K. For any section Entitled "Acknowledgements" or "Dedications", | ||
| 1518 | + Preserve the Title of the section, and preserve in the section all | ||
| 1519 | + the substance and tone of each of the contributor acknowledgements | ||
| 1520 | + and/or dedications given therein. | ||
| 1521 | +L. Preserve all the Invariant Sections of the Document, | ||
| 1522 | + unaltered in their text and in their titles. Section numbers | ||
| 1523 | + or the equivalent are not considered part of the section titles. | ||
| 1524 | +M. Delete any section Entitled "Endorsements". Such a section | ||
| 1525 | + may not be included in the Modified Version. | ||
| 1526 | +N. Do not retitle any existing section to be Entitled "Endorsements" | ||
| 1527 | + or to conflict in title with any Invariant Section. | ||
| 1528 | +O. Preserve any Warranty Disclaimers. | ||
| 1529 | + | ||
| 1530 | +If the Modified Version includes new front-matter sections or | ||
| 1531 | +appendices that qualify as Secondary Sections and contain no material | ||
| 1532 | +copied from the Document, you may at your option designate some or all | ||
| 1533 | +of these sections as invariant. To do this, add their titles to the | ||
| 1534 | +list of Invariant Sections in the Modified Version's license notice. | ||
| 1535 | +These titles must be distinct from any other section titles. | ||
| 1536 | + | ||
| 1537 | +You may add a section Entitled "Endorsements", provided it contains | ||
| 1538 | +nothing but endorsements of your Modified Version by various | ||
| 1539 | +parties--for example, statements of peer review or that the text has | ||
| 1540 | +been approved by an organization as the authoritative definition of a | ||
| 1541 | +standard. | ||
| 1542 | + | ||
| 1543 | +You may add a passage of up to five words as a Front-Cover Text, and a | ||
| 1544 | +passage of up to 25 words as a Back-Cover Text, to the end of the list | ||
| 1545 | +of Cover Texts in the Modified Version. Only one passage of | ||
| 1546 | +Front-Cover Text and one of Back-Cover Text may be added by (or | ||
| 1547 | +through arrangements made by) any one entity. If the Document already | ||
| 1548 | +includes a cover text for the same cover, previously added by you or | ||
| 1549 | +by arrangement made by the same entity you are acting on behalf of, | ||
| 1550 | +you may not add another; but you may replace the old one, on explicit | ||
| 1551 | +permission from the previous publisher that added the old one. | ||
| 1552 | + | ||
| 1553 | +The author(s) and publisher(s) of the Document do not by this License | ||
| 1554 | +give permission to use their names for publicity for or to assert or | ||
| 1555 | +imply endorsement of any Modified Version. | ||
| 1556 | + | ||
| 1557 | + | ||
| 1558 | +5. COMBINING DOCUMENTS | ||
| 1559 | + | ||
| 1560 | +You may combine the Document with other documents released under this | ||
| 1561 | +License, under the terms defined in section 4 above for modified | ||
| 1562 | +versions, provided that you include in the combination all of the | ||
| 1563 | +Invariant Sections of all of the original documents, unmodified, and | ||
| 1564 | +list them all as Invariant Sections of your combined work in its | ||
| 1565 | +license notice, and that you preserve all their Warranty Disclaimers. | ||
| 1566 | + | ||
| 1567 | +The combined work need only contain one copy of this License, and | ||
| 1568 | +multiple identical Invariant Sections may be replaced with a single | ||
| 1569 | +copy. If there are multiple Invariant Sections with the same name but | ||
| 1570 | +different contents, make the title of each such section unique by | ||
| 1571 | +adding at the end of it, in parentheses, the name of the original | ||
| 1572 | +author or publisher of that section if known, or else a unique number. | ||
| 1573 | +Make the same adjustment to the section titles in the list of | ||
| 1574 | +Invariant Sections in the license notice of the combined work. | ||
| 1575 | + | ||
| 1576 | +In the combination, you must combine any sections Entitled "History" | ||
| 1577 | +in the various original documents, forming one section Entitled | ||
| 1578 | +"History"; likewise combine any sections Entitled "Acknowledgements", | ||
| 1579 | +and any sections Entitled "Dedications". You must delete all sections | ||
| 1580 | +Entitled "Endorsements". | ||
| 1581 | + | ||
| 1582 | + | ||
| 1583 | +6. COLLECTIONS OF DOCUMENTS | ||
| 1584 | + | ||
| 1585 | +You may make a collection consisting of the Document and other documents | ||
| 1586 | +released under this License, and replace the individual copies of this | ||
| 1587 | +License in the various documents with a single copy that is included in | ||
| 1588 | +the collection, provided that you follow the rules of this License for | ||
| 1589 | +verbatim copying of each of the documents in all other respects. | ||
| 1590 | + | ||
| 1591 | +You may extract a single document from such a collection, and distribute | ||
| 1592 | +it individually under this License, provided you insert a copy of this | ||
| 1593 | +License into the extracted document, and follow this License in all | ||
| 1594 | +other respects regarding verbatim copying of that document. | ||
| 1595 | + | ||
| 1596 | + | ||
| 1597 | +7. AGGREGATION WITH INDEPENDENT WORKS | ||
| 1598 | + | ||
| 1599 | +A compilation of the Document or its derivatives with other separate | ||
| 1600 | +and independent documents or works, in or on a volume of a storage or | ||
| 1601 | +distribution medium, is called an "aggregate" if the copyright | ||
| 1602 | +resulting from the compilation is not used to limit the legal rights | ||
| 1603 | +of the compilation's users beyond what the individual works permit. | ||
| 1604 | +When the Document is included in an aggregate, this License does not | ||
| 1605 | +apply to the other works in the aggregate which are not themselves | ||
| 1606 | +derivative works of the Document. | ||
| 1607 | + | ||
| 1608 | +If the Cover Text requirement of section 3 is applicable to these | ||
| 1609 | +copies of the Document, then if the Document is less than one half of | ||
| 1610 | +the entire aggregate, the Document's Cover Texts may be placed on | ||
| 1611 | +covers that bracket the Document within the aggregate, or the | ||
| 1612 | +electronic equivalent of covers if the Document is in electronic form. | ||
| 1613 | +Otherwise they must appear on printed covers that bracket the whole | ||
| 1614 | +aggregate. | ||
| 1615 | + | ||
| 1616 | + | ||
| 1617 | +8. TRANSLATION | ||
| 1618 | + | ||
| 1619 | +Translation is considered a kind of modification, so you may | ||
| 1620 | +distribute translations of the Document under the terms of section 4. | ||
| 1621 | +Replacing Invariant Sections with translations requires special | ||
| 1622 | +permission from their copyright holders, but you may include | ||
| 1623 | +translations of some or all Invariant Sections in addition to the | ||
| 1624 | +original versions of these Invariant Sections. You may include a | ||
| 1625 | +translation of this License, and all the license notices in the | ||
| 1626 | +Document, and any Warranty Disclaimers, provided that you also include | ||
| 1627 | +the original English version of this License and the original versions | ||
| 1628 | +of those notices and disclaimers. In case of a disagreement between | ||
| 1629 | +the translation and the original version of this License or a notice | ||
| 1630 | +or disclaimer, the original version will prevail. | ||
| 1631 | + | ||
| 1632 | +If a section in the Document is Entitled "Acknowledgements", | ||
| 1633 | +"Dedications", or "History", the requirement (section 4) to Preserve | ||
| 1634 | +its Title (section 1) will typically require changing the actual | ||
| 1635 | +title. | ||
| 1636 | + | ||
| 1637 | + | ||
| 1638 | +9. TERMINATION | ||
| 1639 | + | ||
| 1640 | +You may not copy, modify, sublicense, or distribute the Document except | ||
| 1641 | +as expressly provided for under this License. Any other attempt to | ||
| 1642 | +copy, modify, sublicense or distribute the Document is void, and will | ||
| 1643 | +automatically terminate your rights under this License. However, | ||
| 1644 | +parties who have received copies, or rights, from you under this | ||
| 1645 | +License will not have their licenses terminated so long as such | ||
| 1646 | +parties remain in full compliance. | ||
| 1647 | + | ||
| 1648 | + | ||
| 1649 | +10. FUTURE REVISIONS OF THIS LICENSE | ||
| 1650 | + | ||
| 1651 | +The Free Software Foundation may publish new, revised versions | ||
| 1652 | +of the GNU Free Documentation License from time to time. Such new | ||
| 1653 | +versions will be similar in spirit to the present version, but may | ||
| 1654 | +differ in detail to address new problems or concerns. See | ||
| 1655 | +http://www.gnu.org/copyleft/. | ||
| 1656 | + | ||
| 1657 | +Each version of the License is given a distinguishing version number. | ||
| 1658 | +If the Document specifies that a particular numbered version of this | ||
| 1659 | +License "or any later version" applies to it, you have the option of | ||
| 1660 | +following the terms and conditions either of that specified version or | ||
| 1661 | +of any later version that has been published (not as a draft) by the | ||
| 1662 | +Free Software Foundation. If the Document does not specify a version | ||
| 1663 | +number of this License, you may choose any version ever published (not | ||
| 1664 | +as a draft) by the Free Software Foundation. | ||
| 1665 | + | ||
| 1666 | + | ||
| 1667 | +ADDENDUM: How to use this License for your documents | ||
| 1668 | + | ||
| 1669 | +To use this License in a document you have written, include a copy of | ||
| 1670 | +the License in the document and put the following copyright and | ||
| 1671 | +license notices just after the title page: | ||
| 1672 | + | ||
| 1673 | + Copyright (c) YEAR YOUR NAME. | ||
| 1674 | + Permission is granted to copy, distribute and/or modify this document | ||
| 1675 | + under the terms of the GNU Free Documentation License, Version 1.2 | ||
| 1676 | + or any later version published by the Free Software Foundation; | ||
| 1677 | + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. | ||
| 1678 | + A copy of the license is included in the section entitled "GNU | ||
| 1679 | + Free Documentation License". | ||
| 1680 | + | ||
| 1681 | +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, | ||
| 1682 | +replace the "with...Texts." line with this: | ||
| 1683 | + | ||
| 1684 | + with the Invariant Sections being LIST THEIR TITLES, with the | ||
| 1685 | + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. | ||
| 1686 | + | ||
| 1687 | +If you have Invariant Sections without Cover Texts, or some other | ||
| 1688 | +combination of the three, merge those two alternatives to suit the | ||
| 1689 | +situation. | ||
| 1690 | + | ||
| 1691 | +If your document contains nontrivial examples of program code, we | ||
| 1692 | +recommend releasing these examples in parallel under your choice of | ||
| 1693 | +free software license, such as the GNU General Public License, | ||
| 1694 | +to permit their use in free software. | ||
| 1695 | + | ||
| 1696 | +The End. | ||
| 1697 | phreak | 327 | Index: linux-git/MAINTAINERS |
| 1698 | phreak | 279 | =================================================================== |
| 1699 | phreak | 327 | --- linux-git.orig/MAINTAINERS |
| 1700 | +++ linux-git/MAINTAINERS | ||
| 1701 | @@ -2501,6 +2501,13 @@ M: wli@holomorphy.com | ||
| 1702 | L: sparclinux@vger.kernel.org | ||
| 1703 | S: Maintained | ||
| 1704 | |||
| 1705 | +SPEAKUP Console speech output | ||
| 1706 | +P: Kirk Reiser | ||
| 1707 | +M: kirk@braille.uwo.ca | ||
| 1708 | +L: speakup@braille.uwo.ca | ||
| 1709 | +W: http://www.linux-speakup.org | ||
| 1710 | +S: Maintained | ||
| 1711 | + | ||
| 1712 | SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER | ||
| 1713 | P: Roger Wolff | ||
| 1714 | M: R.E.Wolff@BitWizard.nl | ||
| 1715 | Index: linux-git/arch/arm/Kconfig | ||
| 1716 | =================================================================== | ||
| 1717 | --- linux-git.orig/arch/arm/Kconfig | ||
| 1718 | +++ linux-git/arch/arm/Kconfig | ||
| 1719 | @@ -810,6 +810,7 @@ source "drivers/mfd/Kconfig" | ||
| 1720 | source "drivers/media/Kconfig" | ||
| 1721 | |||
| 1722 | source "drivers/video/Kconfig" | ||
| 1723 | +source "drivers/char/speakup/Kconfig" | ||
| 1724 | |||
| 1725 | source "sound/Kconfig" | ||
| 1726 | |||
| 1727 | Index: linux-git/drivers/Kconfig | ||
| 1728 | =================================================================== | ||
| 1729 | --- linux-git.orig/drivers/Kconfig | ||
| 1730 | +++ linux-git/drivers/Kconfig | ||
| 1731 | @@ -58,6 +58,8 @@ source "drivers/media/Kconfig" | ||
| 1732 | |||
| 1733 | source "drivers/video/Kconfig" | ||
| 1734 | |||
| 1735 | +source "drivers/char/speakup/Kconfig" | ||
| 1736 | + | ||
| 1737 | source "sound/Kconfig" | ||
| 1738 | |||
| 1739 | source "drivers/usb/Kconfig" | ||
| 1740 | Index: linux-git/drivers/Makefile | ||
| 1741 | =================================================================== | ||
| 1742 | --- linux-git.orig/drivers/Makefile | ||
| 1743 | +++ linux-git/drivers/Makefile | ||
| 1744 | @@ -29,6 +29,9 @@ obj-$(CONFIG_FB_INTEL) += video | ||
| 1745 | obj-$(CONFIG_SERIO) += input/serio/ | ||
| 1746 | obj-y += serial/ | ||
| 1747 | obj-$(CONFIG_PARPORT) += parport/ | ||
| 1748 | +obj-$(CONFIG_GAMEPORT) += input/gameport/ | ||
| 1749 | +# load keyboard early so speakup can be quieted | ||
| 1750 | +obj-$(CONFIG_INPUT) += input/ | ||
| 1751 | obj-y += base/ block/ misc/ mfd/ net/ media/ | ||
| 1752 | obj-$(CONFIG_NUBUS) += nubus/ | ||
| 1753 | obj-$(CONFIG_ATM) += atm/ | ||
| 1754 | @@ -52,8 +55,6 @@ obj-$(CONFIG_TC) += tc/ | ||
| 1755 | obj-$(CONFIG_USB) += usb/ | ||
| 1756 | obj-$(CONFIG_PCI) += usb/ | ||
| 1757 | obj-$(CONFIG_USB_GADGET) += usb/gadget/ | ||
| 1758 | -obj-$(CONFIG_GAMEPORT) += input/gameport/ | ||
| 1759 | -obj-$(CONFIG_INPUT) += input/ | ||
| 1760 | obj-$(CONFIG_I2O) += message/ | ||
| 1761 | obj-$(CONFIG_I2C) += i2c/ | ||
| 1762 | obj-$(CONFIG_W1) += w1/ | ||
| 1763 | Index: linux-git/drivers/char/Makefile | ||
| 1764 | =================================================================== | ||
| 1765 | --- linux-git.orig/drivers/char/Makefile | ||
| 1766 | +++ linux-git/drivers/char/Makefile | ||
| 1767 | @@ -86,6 +86,7 @@ obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu. | ||
| 1768 | obj-$(CONFIG_TANBAC_TB0219) += tb0219.o | ||
| 1769 | obj-$(CONFIG_TELCLOCK) += tlclk.o | ||
| 1770 | |||
| 1771 | +obj-$(CONFIG_SPEAKUP) += speakup/ | ||
| 1772 | obj-$(CONFIG_WATCHDOG) += watchdog/ | ||
| 1773 | obj-$(CONFIG_MWAVE) += mwave/ | ||
| 1774 | obj-$(CONFIG_AGP) += agp/ | ||
| 1775 | Index: linux-git/drivers/char/consolemap.c | ||
| 1776 | =================================================================== | ||
| 1777 | --- linux-git.orig/drivers/char/consolemap.c | ||
| 1778 | +++ linux-git/drivers/char/consolemap.c | ||
| 1779 | dsd | 228 | @@ -668,3 +668,4 @@ console_map_init(void) |
| 1780 | eradicator | 150 | } |
| 1781 | |||
| 1782 | EXPORT_SYMBOL(con_copy_unimap); | ||
| 1783 | +EXPORT_SYMBOL(inverse_translate); | ||
| 1784 | phreak | 327 | Index: linux-git/drivers/char/keyboard.c |
| 1785 | phreak | 279 | =================================================================== |
| 1786 | phreak | 327 | --- linux-git.orig/drivers/char/keyboard.c |
| 1787 | +++ linux-git/drivers/char/keyboard.c | ||
| 1788 | eradicator | 150 | @@ -40,6 +40,13 @@ |
| 1789 | #include <linux/sysrq.h> | ||
| 1790 | #include <linux/input.h> | ||
| 1791 | |||
| 1792 | + | ||
| 1793 | +#include <linux/speakup.h> | ||
| 1794 | phreak | 279 | + |
| 1795 | eradicator | 150 | +#ifdef CONFIG_SPEAKUP_MODULE |
| 1796 | +spk_key_func addr_spk_key = NULL; | ||
| 1797 | +#endif | ||
| 1798 | phreak | 279 | + |
| 1799 | eradicator | 150 | static void kbd_disconnect(struct input_handle *handle); |
| 1800 | extern void ctrl_alt_del(void); | ||
| 1801 | |||
| 1802 | @@ -64,6 +71,10 @@ extern void ctrl_alt_del(void); | ||
| 1803 | |||
| 1804 | #define KBD_DEFLOCK 0 | ||
| 1805 | |||
| 1806 | +/* Key types processed even in raw modes */ | ||
| 1807 | + | ||
| 1808 | +#define TYPES_ALLOWED_IN_RAW_MODE ((1 << KT_SPEC) | (1 << KT_SHIFT) | (1 << KT_SPKUP)) | ||
| 1809 | + | ||
| 1810 | void compute_shiftstate(void); | ||
| 1811 | |||
| 1812 | /* | ||
| 1813 | @@ -79,7 +90,7 @@ void compute_shiftstate(void); | ||
| 1814 | eradicator | 187 | typedef void (k_handler_fn)(struct vc_data *vc, unsigned char value, |
| 1815 | eradicator | 150 | char up_flag, struct pt_regs *regs); |
| 1816 | static k_handler_fn K_HANDLERS; | ||
| 1817 | -static k_handler_fn *k_handler[16] = { K_HANDLERS }; | ||
| 1818 | +k_handler_fn *k_handler[16] = { K_HANDLERS }; | ||
| 1819 | |||
| 1820 | #define FN_HANDLERS\ | ||
| 1821 | eradicator | 187 | fn_null, fn_enter, fn_show_ptregs, fn_show_mem,\ |
| 1822 | eradicator | 150 | @@ -100,15 +111,18 @@ static fn_handler_fn *fn_handler[] = { F |
| 1823 | const int max_vals[] = { | ||
| 1824 | 255, ARRAY_SIZE(func_table) - 1, ARRAY_SIZE(fn_handler) - 1, NR_PAD - 1, | ||
| 1825 | NR_DEAD - 1, 255, 3, NR_SHIFT - 1, 255, NR_ASCII - 1, NR_LOCK - 1, | ||
| 1826 | - 255, NR_LOCK - 1, 255 | ||
| 1827 | + 255, NR_LOCK - 1, 255, 255 | ||
| 1828 | }; | ||
| 1829 | |||
| 1830 | const int NR_TYPES = ARRAY_SIZE(max_vals); | ||
| 1831 | |||
| 1832 | struct kbd_struct kbd_table[MAX_NR_CONSOLES]; | ||
| 1833 | -static struct kbd_struct *kbd = kbd_table; | ||
| 1834 | +struct kbd_struct *kbd = kbd_table; | ||
| 1835 | static struct kbd_struct kbd0; | ||
| 1836 | |||
| 1837 | +EXPORT_SYMBOL(kbd); | ||
| 1838 | +EXPORT_SYMBOL(k_handler); | ||
| 1839 | + | ||
| 1840 | int spawnpid, spawnsig; | ||
| 1841 | |||
| 1842 | /* | ||
| 1843 | eradicator | 187 | @@ -255,12 +269,14 @@ void kd_mksound(unsigned int hz, unsigne |
| 1844 | eradicator | 150 | } |
| 1845 | } | ||
| 1846 | } | ||
| 1847 | - if (ticks) | ||
| 1848 | - mod_timer(&kd_mksound_timer, jiffies + ticks); | ||
| 1849 | + if (ticks) | ||
| 1850 | + mod_timer(&kd_mksound_timer, jiffies + ticks); | ||
| 1851 | } else | ||
| 1852 | kd_nosound(0); | ||
| 1853 | } | ||
| 1854 | |||
| 1855 | +EXPORT_SYMBOL(kd_mksound); | ||
| 1856 | + | ||
| 1857 | /* | ||
| 1858 | * Setting the keyboard rate. | ||
| 1859 | */ | ||
| 1860 | eradicator | 187 | @@ -602,6 +618,7 @@ static void k_spec(struct vc_data *vc, u |
| 1861 | eradicator | 150 | if (up_flag) |
| 1862 | return; | ||
| 1863 | if (value >= ARRAY_SIZE(fn_handler)) | ||
| 1864 | + if (up_flag || (value >= ARRAY_SIZE(fn_handler))) | ||
| 1865 | return; | ||
| 1866 | eradicator | 187 | if ((kbd->kbdmode == VC_RAW || |
| 1867 | kbd->kbdmode == VC_MEDIUMRAW) && | ||
| 1868 | eradicator | 150 | @@ -1119,6 +1136,13 @@ static void kbd_keycode(unsigned int key |
| 1869 | key_map = key_maps[shift_final]; | ||
| 1870 | |||
| 1871 | if (!key_map) { | ||
| 1872 | +#ifdef CONFIG_SPEAKUP | ||
| 1873 | + if (speakup_key(vc, shift_final, keycode, K(KT_SHIFT,0), !down, regs )) | ||
| 1874 | + return; | ||
| 1875 | +#elif defined(CONFIG_SPEAKUP_MODULE) | ||
| 1876 | + if ( addr_spk_key && (*addr_spk_key)(vc, shift_final, | ||
| 1877 | + keycode, K(KT_SHIFT,0), !down, regs) ) return; | ||
| 1878 | +#endif | ||
| 1879 | compute_shiftstate(); | ||
| 1880 | kbd->slockstate = 0; | ||
| 1881 | return; | ||
| 1882 | phreak | 305 | @@ -1137,8 +1161,15 @@ static void kbd_keycode(unsigned int key |
| 1883 | eradicator | 150 | } |
| 1884 | |||
| 1885 | type -= 0xf0; | ||
| 1886 | +#ifdef CONFIG_SPEAKUP | ||
| 1887 | + if (speakup_key(vc, shift_final, keycode, keysym, !down, regs )) | ||
| 1888 | phreak | 305 | + return; |
| 1889 | eradicator | 150 | +#elif defined(CONFIG_SPEAKUP_MODULE) |
| 1890 | + if ( addr_spk_key && (*addr_spk_key)(vc, shift_final, | ||
| 1891 | + keycode, keysym, !down, regs) ) return; | ||
| 1892 | +#endif | ||
| 1893 | |||
| 1894 | phreak | 305 | - if (raw_mode && type != KT_SPEC && type != KT_SHIFT) |
| 1895 | eradicator | 150 | + if (raw_mode && type != KT_SPEC && type != KT_SHIFT ) |
| 1896 | phreak | 305 | return; |
| 1897 | |||
| 1898 | eradicator | 150 | if (type == KT_LETTER) { |
| 1899 | dsd | 228 | @@ -1149,13 +1180,29 @@ static void kbd_keycode(unsigned int key |
| 1900 | eradicator | 150 | keysym = key_map[keycode]; |
| 1901 | } | ||
| 1902 | } | ||
| 1903 | - | ||
| 1904 | (*k_handler[type])(vc, keysym & 0xff, !down, regs); | ||
| 1905 | |||
| 1906 | if (type != KT_SLOCK) | ||
| 1907 | dsd | 198 | kbd->slockstate = 0; |
| 1908 | } | ||
| 1909 | |||
| 1910 | +struct input_dev *fakekeydev=NULL; | ||
| 1911 | + | ||
| 1912 | dsd | 228 | +/*void kbd_fakekey(unsigned int keycode) |
| 1913 | dsd | 198 | +{ |
| 1914 | + if (fakekeydev==NULL) | ||
| 1915 | + return; | ||
| 1916 | + kbd_keycode(keycode, 0, HW_RAW(fakekeydev), fakekeydev->regs); | ||
| 1917 | + kbd_keycode(keycode, 1, HW_RAW(fakekeydev), fakekeydev->regs); | ||
| 1918 | + | ||
| 1919 | + tasklet_schedule(&keyboard_tasklet); | ||
| 1920 | + do_poke_blanked_console = 1; | ||
| 1921 | + schedule_console_callback(); | ||
| 1922 | +} | ||
| 1923 | + | ||
| 1924 | dsd | 228 | +EXPORT_SYMBOL(kbd_fakekey);*/ |
| 1925 | +EXPORT_SYMBOL(fakekeydev); | ||
| 1926 | dsd | 198 | + |
| 1927 | static void kbd_event(struct input_handle *handle, unsigned int event_type, | ||
| 1928 | unsigned int event_code, int value) | ||
| 1929 | { | ||
| 1930 | dsd | 228 | @@ -1193,6 +1240,7 @@ static struct input_handle *kbd_connect( |
| 1931 | dsd | 198 | memset(handle, 0, sizeof(struct input_handle)); |
| 1932 | |||
| 1933 | handle->dev = dev; | ||
| 1934 | + fakekeydev=dev; | ||
| 1935 | handle->handler = handler; | ||
| 1936 | handle->name = "kbd"; | ||
| 1937 | |||
| 1938 | phreak | 327 | Index: linux-git/drivers/char/speakup/Config.in |
| 1939 | phreak | 279 | =================================================================== |
| 1940 | --- /dev/null | ||
| 1941 | phreak | 327 | +++ linux-git/drivers/char/speakup/Config.in |
| 1942 | eradicator | 150 | @@ -0,0 +1,26 @@ |
| 1943 | +tristate 'Speakup console speech' CONFIG_SPEAKUP | ||
| 1944 | +if [ "$CONFIG_SPEAKUP" != "n" ]; then | ||
| 1945 | + comment 'Type "y" for each synthesizer you want built into the kernel.' | ||
| 1946 | + dep_tristate "Accent SA, acntsa" CONFIG_SPEAKUP_ACNTSA $CONFIG_SPEAKUP | ||
| 1947 | + dep_tristate "Accent PC, acntpc" CONFIG_SPEAKUP_ACNTPC $CONFIG_SPEAKUP | ||
| 1948 | + dep_tristate "Apollo, apollo" CONFIG_SPEAKUP_APOLLO $CONFIG_SPEAKUP | ||
| 1949 | + dep_tristate "Audapter, audptr" CONFIG_SPEAKUP_AUDPTR $CONFIG_SPEAKUP | ||
| 1950 | + dep_tristate "Braille 'n' Speak, bns" CONFIG_SPEAKUP_BNS $CONFIG_SPEAKUP | ||
| 1951 | + dep_tristate "DECtalk Express, dectlk" CONFIG_SPEAKUP_DECTLK $CONFIG_SPEAKUP | ||
| 1952 | + dep_tristate "DECtalk External (old), decext" CONFIG_SPEAKUP_DECEXT $CONFIG_SPEAKUP | ||
| 1953 | + dep_tristate "DECtalk PC (big ISA card), decpc" CONFIG_SPEAKUP_DECPC $CONFIG_SPEAKUP | ||
| 1954 | + if [ "$CONFIG_SPEAKUP_DECPC" = "y" ] ;then | ||
| 1955 | + comment 'warning: decpc can only be built as a module' | ||
| 1956 | + fi | ||
| 1957 | + comment 'In order to use this you will need' | ||
| 1958 | + comment 'the dtload program and DECPC software files ' | ||
| 1959 | + comment 'Read the accompanying DECPC documentation for more details' | ||
| 1960 | + dep_tristate "DoubleTalk PC, dtlk" CONFIG_SPEAKUP_DTLK $CONFIG_SPEAKUP | ||
| 1961 | + dep_tristate "Keynote Gold PC, keypc" CONFIG_SPEAKUP_KEYPC $CONFIG_SPEAKUP | ||
| 1962 | + dep_tristate "DoubleTalk LT or LiteTalk, ltlk" CONFIG_SPEAKUP_LTLK $CONFIG_SPEAKUP | ||
| 1963 | + dep_tristate "Software synthesizers /dev/sftsyn, sftsyn" CONFIG_SPEAKUP_SFTSYN $CONFIG_SPEAKUP | ||
| 1964 | + dep_tristate "Speak Out, spkout" CONFIG_SPEAKUP_SPKOUT $CONFIG_SPEAKUP | ||
| 1965 | + dep_tristate "Transport, txprt" CONFIG_SPEAKUP_TXPRT $CONFIG_SPEAKUP | ||
| 1966 | + comment 'Enter the three to six character synth string from above or none.' | ||
| 1967 | + string "Default synthesizer for Speakup" CONFIG_SPEAKUP_DEFAULT "none" | ||
| 1968 | +fi | ||
| 1969 | phreak | 327 | Index: linux-git/drivers/char/speakup/Kconfig |
| 1970 | phreak | 279 | =================================================================== |
| 1971 | --- /dev/null | ||
| 1972 | phreak | 327 | +++ linux-git/drivers/char/speakup/Kconfig |
| 1973 | @@ -0,0 +1,210 @@ | ||
| 1974 | +menu "Speakup console speech" | ||
| 1975 | +config SPEAKUP | ||
| 1976 | + tristate "Build speakup console speech" | ||
| 1977 | + ---help--- | ||
| 1978 | + | ||
| 1979 | + This is the Speakup screen reader. Think of it as a | ||
| 1980 | + video console for blind people. If built in to the | ||
| 1981 | + kernel, it can speak evrything on the text console from | ||
| 1982 | + boot up to shutdown. For more information on Speakup, | ||
| 1983 | + point your browser at http://www.linux-speakup.org/. | ||
| 1984 | + There is also a mailing list at the above url that you | ||
| 1985 | + can subscribe to. | ||
| 1986 | + | ||
| 1987 | + Supported synthesizers are accent sa, accent pc, appollo | ||
| 1988 | + II., Auddapter, Braille 'n Speak, Dectalk external | ||
| 1989 | + (old), Dectalk PC (full length isa board), Dectalk | ||
| 1990 | + express, Doubletalk, Doubletalk LT or Litetalk, | ||
| 1991 | + Keynote | ||
| 1992 | + Gold internal PC, software synthesizers, Speakout, and transport. | ||
| 1993 | + | ||
| 1994 | + Speakup can either be built in or compiled as a module | ||
| 1995 | + by answering y or m. If you answer y here, then you | ||
| 1996 | + must answer either y or m to at least one of the | ||
| 1997 | + synthesizer drivers below. If you answer m here, then | ||
| 1998 | + the synthesizer drivers below can only be built as | ||
| 1999 | + modules. | ||
| 2000 | + | ||
| 2001 | + These drivers are not standalone drivers, but must be | ||
| 2002 | + used in conjunction with Speakup. Think of them as | ||
| 2003 | + video cards for blind people. | ||
| 2004 | + | ||
| 2005 | + | ||
| 2006 | + The Dectalk pc driver can only be built as a module, and | ||
| 2007 | + requires software to be pre-loaded on to the card before | ||
| 2008 | + the module can be loaded. See the decpc choice below | ||
| 2009 | + for more details. | ||
| 2010 | + | ||
| 2011 | + If you are not a blind person, or don't have access to | ||
| 2012 | + one of the listed synthesizers, you should say n. | ||
| 2013 | + | ||
| 2014 | +config SPEAKUP_ACNTSA | ||
| 2015 | + depends on SPEAKUP | ||
| 2016 | + tristate "Accent SA, acntsa" | ||
| 2017 | + ---help--- | ||
| 2018 | + | ||
| 2019 | + This is the Speakup driver for the accent sa | ||
| 2020 | + synthesizer. You can say y to build it into the kernel, | ||
| 2021 | + or m to build it as a module. See the configuration | ||
| 2022 | + help on the Speakup choice above for more info. | ||
| 2023 | + | ||
| 2024 | +config SPEAKUP_ACNTPC | ||
| 2025 | + depends on SPEAKUP | ||
| 2026 | + tristate "Accent PC, acntpc" | ||
| 2027 | + ---help--- | ||
| 2028 | + | ||
| 2029 | + This is the Speakup driver for the accent pc | ||
| 2030 | + synthesizer. You can say y to build it into the kernel, | ||
| 2031 | + or m to build it as a module. See the configuration | ||
| 2032 | + help on the Speakup choice above for more info. | ||
| 2033 | + | ||
| 2034 | +config SPEAKUP_APOLLO | ||
| 2035 | + depends on SPEAKUP | ||
| 2036 | + tristate "Apollo, apollo" | ||
| 2037 | + ---help--- | ||
| 2038 | + | ||
| 2039 | + This is the Speakup driver for the Apollo II | ||
| 2040 | + synthesizer. You can say y to build it into the kernel, | ||
| 2041 | + or m to build it as a module. See the configuration | ||
| 2042 | + help on the Speakup choice above for more info. | ||
| 2043 | + | ||
| 2044 | +config SPEAKUP_AUDPTR | ||
| 2045 | + depends on SPEAKUP | ||
| 2046 | + tristate "Audapter, audptr" | ||
| 2047 | + ---help--- | ||
| 2048 | + | ||
| 2049 | + This is the Speakup driver for the Audapter synthesizer. | ||
| 2050 | + You can say y to build it into the kernel, or m to | ||
| 2051 | + build it as a module. See the configuration help on the | ||
| 2052 | + Speakup choice above for more info. | ||
| 2053 | + | ||
| 2054 | +config SPEAKUP_BNS | ||
| 2055 | + depends on SPEAKUP | ||
| 2056 | + tristate "Braille 'n' Speak, bns" | ||
| 2057 | + ---help--- | ||
| 2058 | + | ||
| 2059 | + This is the Speakup driver for the Braille 'n' Speak | ||
| 2060 | + synthesizer. You can say y to build it into the kernel, | ||
| 2061 | + or m to build it as a module. See the configuration | ||
| 2062 | + help on the Speakup choice above for more info. | ||
| 2063 | + | ||
| 2064 | +config SPEAKUP_DECTLK | ||
| 2065 | + depends on SPEAKUP | ||
| 2066 | + tristate "DECtalk Express, dectlk" | ||
| 2067 | + ---help--- | ||
| 2068 | + | ||
| 2069 | + This is the Speakup driver for the DecTalk Express | ||
| 2070 | + synthesizer. You can say y to build it into the kernel, | ||
| 2071 | + or m to build it as a module. See the configuration | ||
| 2072 | + help on the Speakup choice above for more info. | ||
| 2073 | + | ||
| 2074 | +config SPEAKUP_DECEXT | ||
| 2075 | + depends on SPEAKUP | ||
| 2076 | + tristate "DECtalk External (old), decext" | ||
| 2077 | + ---help--- | ||
| 2078 | + | ||
| 2079 | + This is the Speakup driver for the DecTalk External | ||
| 2080 | + (old) synthesizer. You can say y to build it into the | ||
| 2081 | + kernel, or m to build it as a module. See the | ||
| 2082 | + configuration help on the Speakup choice above for more | ||
| 2083 | + info. | ||
| 2084 | + | ||
| 2085 | +config SPEAKUP_DECPC | ||
| 2086 | + depends on SPEAKUP | ||
| 2087 | + tristate "DECtalk PC (big ISA card), decpc" | ||
| 2088 | + ---help--- | ||
| 2089 | + | ||
| 2090 | + This is the Speakup driver for the DecTalk PC (full | ||
| 2091 | + length ISA) synthesizer. You can say m to build it as | ||
| 2092 | + a module. See the configuration help on the Speakup | ||
| 2093 | + choice above for more info. | ||
| 2094 | + | ||
| 2095 | + In order to use the DecTalk PC driver, you must download | ||
| 2096 | + the dec_pc.tgz file from linux-speakup.org. It is in | ||
| 2097 | + the pub/linux/goodies directory. The dec_pc.tgz file | ||
| 2098 | + contains the software which must be pre-loaded on to the | ||
| 2099 | + DecTalk PC board in order to use it with this driver. | ||
| 2100 | + This driver must be built as a module, and can not be | ||
| 2101 | + loaded until the file system is mounted and the DecTalk | ||
| 2102 | + PC software has been pre-loaded on to the board. | ||
| 2103 | + | ||
| 2104 | + See the README file in the dec_pc.tgz file for more | ||
| 2105 | + details. | ||
| 2106 | + | ||
| 2107 | +config SPEAKUP_DTLK | ||
| 2108 | + depends on SPEAKUP | ||
| 2109 | + tristate "DoubleTalk PC, dtlk" | ||
| 2110 | + ---help--- | ||
| 2111 | + | ||
| 2112 | + This is the Speakup driver for the internal DoubleTalk | ||
| 2113 | + PC synthesizer. You can say y to build it into the | ||
| 2114 | + kernel, or m to build it as a module. See the | ||
| 2115 | + configuration help on the Speakup choice above for more | ||
| 2116 | + info. | ||
| 2117 | + | ||
| 2118 | +config SPEAKUP_KEYPC | ||
| 2119 | + depends on SPEAKUP | ||
| 2120 | + tristate "Keynote Gold PC, keypc" | ||
| 2121 | + ---help--- | ||
| 2122 | + | ||
| 2123 | + This is the Speakup driver for the Keynote Gold | ||
| 2124 | + PC synthesizer. You can say y to build it into the | ||
| 2125 | + kernel, or m to build it as a module. See the | ||
| 2126 | + configuration help on the Speakup choice above for more | ||
| 2127 | + info. | ||
| 2128 | + | ||
| 2129 | +config SPEAKUP_LTLK | ||
| 2130 | + depends on SPEAKUP | ||
| 2131 | + tristate "DoubleTalk LT or LiteTalk, ltlk" | ||
| 2132 | +---help--- | ||
| 2133 | + | ||
| 2134 | + This is the Speakup driver for the LiteTalk/DoubleTalk | ||
| 2135 | + LT synthesizer. You can say y to build it into the | ||
| 2136 | + kernel, or m to build it as a module. See the | ||
| 2137 | + configuration help on the Speakup choice above for more | ||
| 2138 | + info. | ||
| 2139 | + | ||
| 2140 | +config SPEAKUP_SFTSYN | ||
| 2141 | + depends on SPEAKUP | ||
| 2142 | + tristate "Software synthesizers, sftsyn" | ||
| 2143 | +---help--- | ||
| 2144 | + | ||
| 2145 | + This is the software synthesizer device node. It will | ||
| 2146 | + register a device /dev/sftsyn which midware programs | ||
| 2147 | + and speech | ||
| 2148 | + daemons may open and read to provide kernel output to | ||
| 2149 | + software synths | ||
| 2150 | + such as festival, flite, tuxtalk and so forth. You | ||
| 2151 | + can select 'y' or | ||
| 2152 | + 'm' to have it built-in to the kernel or loaded as a module. | ||
| 2153 | + | ||
| 2154 | +config SPEAKUP_SPKOUT | ||
| 2155 | + depends on SPEAKUP | ||
| 2156 | + tristate "Speak Out, spkout" | ||
| 2157 | + ---help--- | ||
| 2158 | + | ||
| 2159 | + This is the Speakup driver for the Speakout synthesizer. | ||
| 2160 | + You can say y to build it into the kernel, or m to | ||
| 2161 | + build it as a module. See the configuration help on the | ||
| 2162 | + Speakup choice above for more info. | ||
| 2163 | + | ||
| 2164 | +config SPEAKUP_TXPRT | ||
| 2165 | + depends on SPEAKUP | ||
| 2166 | + tristate "Transport, txprt" | ||
| 2167 | + ---help--- | ||
| 2168 | + | ||
| 2169 | + This is the Speakup driver for the Transport | ||
| 2170 | + synthesizer. You can say y to build it into the kernel, | ||
| 2171 | + or m to build it as a module. See the configuration | ||
| 2172 | + help on the Speakup choice above for more info. | ||
| 2173 | + | ||
| 2174 | +if SPEAKUP != n | ||
| 2175 | + comment 'Enter the 3 to 6 character keyword from the list above, or none for no default synthesizer on boot up.' | ||
| 2176 | + depends on SPEAKUP | ||
| 2177 | +endif | ||
| 2178 | + | ||
| 2179 | +config SPEAKUP_DEFAULT | ||
| 2180 | + string "Choose Default synthesizer for Speakup" | ||
| 2181 | + default "none" | ||
| 2182 | + | ||
| 2183 | +endmenu | ||
| 2184 | Index: linux-git/drivers/char/speakup/Makefile | ||
| 2185 | =================================================================== | ||
| 2186 | --- /dev/null | ||
| 2187 | +++ linux-git/drivers/char/speakup/Makefile | ||
| 2188 | @@ -0,0 +1,61 @@ | ||
| 2189 | +# | ||
| 2190 | +# Makefile for the speakup speech output system. | ||
| 2191 | +# | ||
| 2192 | + | ||
| 2193 | +V := $(shell awk '/UTS_RELEASE/ {print substr($$3,2,3)}' $(TOPDIR)/include/linux/version.h) | ||
| 2194 | +ifeq ($V,2.4) | ||
| 2195 | +# Note! Dependencies are done automagically by 'make dep', which also | ||
| 2196 | +# removes any old dependencies. DON'T put your own dependencies here | ||
| 2197 | +# unless it's something special (ie not a .c file). | ||
| 2198 | +# | ||
| 2199 | +# Note 2! The CFLAGS definitions are now inherited from the | ||
| 2200 | +# parent makes.. | ||
| 2201 | +# | ||
| 2202 | +O_TARGET := spk.o | ||
| 2203 | +export-objs := speakup_drvcommon.o speakup.o | ||
| 2204 | +endif | ||
| 2205 | +obj-m = speakup_keyhelp.o | ||
| 2206 | +speakupmain-objs := speakup.o speakup_drvcommon.o | ||
| 2207 | +obj-$(CONFIG_SPEAKUP) += speakupmain.o | ||
| 2208 | +obj-$(CONFIG_SPEAKUP_ACNTPC) += speakup_acntpc.o | ||
| 2209 | +obj-$(CONFIG_SPEAKUP_ACNTSA) += speakup_acntsa.o | ||
| 2210 | +obj-$(CONFIG_SPEAKUP_APOLLO) += speakup_apollo.o | ||
| 2211 | +obj-$(CONFIG_SPEAKUP_AUDPTR) += speakup_audptr.o | ||
| 2212 | +obj-$(CONFIG_SPEAKUP_BNS) += speakup_bns.o | ||
| 2213 | +obj-$(CONFIG_SPEAKUP_DECEXT) += speakup_decext.o | ||
| 2214 | +obj-$(CONFIG_SPEAKUP_DECPC) += speakup_decpc.o | ||
| 2215 | +obj-$(CONFIG_SPEAKUP_DECTLK) += speakup_dectlk.o | ||
| 2216 | +obj-$(CONFIG_SPEAKUP_DTLK) += speakup_dtlk.o | ||
| 2217 | +obj-$(CONFIG_SPEAKUP_KEYPC) += speakup_keypc.o | ||
| 2218 | +obj-$(CONFIG_SPEAKUP_LTLK) += speakup_ltlk.o | ||
| 2219 | +obj-$(CONFIG_SPEAKUP_SFTSYN) += speakup_sftsyn.o | ||
| 2220 | +obj-$(CONFIG_SPEAKUP_SPKOUT) += speakup_spkout.o | ||
| 2221 | +obj-$(CONFIG_SPEAKUP_TXPRT) += speakup_txprt.o | ||
| 2222 | + | ||
| 2223 | +ifeq ($V,2.4) | ||
| 2224 | + include $(TOPDIR)/Rules.make | ||
| 2225 | + | ||
| 2226 | +speakupmap.h: speakupmap.map genmap | ||
| 2227 | + ./genmap speakupmap.map >$@ | ||
| 2228 | + | ||
| 2229 | +genmap: genmap.c mapdata.h | ||
| 2230 | + cc -o genmap genmap.c | ||
| 2231 | + | ||
| 2232 | +mapdata.h: makemapdata.c keyinfo.h | ||
| 2233 | + cc -o makemapdata makemapdata.c | ||
| 2234 | + ./makemapdata >mapdata.h | ||
| 2235 | + | ||
| 2236 | +endif | ||
| 2237 | +speakupmain.o:speakup.o speakup_drvcommon.o | ||
| 2238 | + ld -r -o speakupmain.o speakup.o speakup_drvcommon.o | ||
| 2239 | + | ||
| 2240 | +$(obj)/speakupmap.h: $(src)/speakupmap.map $(src)/genmap | ||
| 2241 | + $(src)/genmap $(src)/speakupmap.map >$@ | ||
| 2242 | + | ||
| 2243 | +$(obj)/mapdata.h: $(src)/keyinfo.h $(src)/makemapdata | ||
| 2244 | + $(src)/makemapdata >$@ | ||
| 2245 | + | ||
| 2246 | +$(obj)/genmap: $(obj)/mapdata.h | ||
| 2247 | + | ||
| 2248 | +HOSTCFLAGS := -Iinclude -I/usr/include | ||
| 2249 | +hostprogs-y := makemapdata genmap | ||
| 2250 | Index: linux-git/drivers/char/speakup/cvsversion.h | ||
| 2251 | =================================================================== | ||
| 2252 | --- /dev/null | ||
| 2253 | +++ linux-git/drivers/char/speakup/cvsversion.h | ||
| 2254 | eradicator | 150 | @@ -0,0 +1 @@ |
| 2255 | dsd | 243 | +#define CVSVERSION " CVS: Wed Dec 21 14:36:03 EST 2005 " |
| 2256 | phreak | 327 | Index: linux-git/drivers/char/speakup/dtload.c |
| 2257 | phreak | 279 | =================================================================== |
| 2258 | --- /dev/null | ||
| 2259 | phreak | 327 | +++ linux-git/drivers/char/speakup/dtload.c |
| 2260 | eradicator | 150 | @@ -0,0 +1,554 @@ |
| 2261 | +/* | ||
| 2262 | + * This is the DECtalk PC firmware loader for the Linux kernel, version 1.0 | ||
| 2263 | + * | ||
| 2264 | + * Original 386BSD source: | ||
| 2265 | + * Copyright ( c ) 1996 Brian Buhrow <buhrow@lothlorien.nfbcal.org> | ||
| 2266 | + * | ||
| 2267 | + * Adapted for Linux: | ||
| 2268 | + * Copyright ( c ) 1997 Nicolas Pitre <nico@cam.org> | ||
| 2269 | + * | ||
| 2270 | + * Adapted for speakup: | ||
| 2271 | + * Copyright ( c ) 2003 David Borowski <david575@golden.net> | ||
| 2272 | + * | ||
| 2273 | + * All rights reserved. | ||
| 2274 | + * | ||
| 2275 | + * This program is free software; you can redistribute it and/or modify | ||
| 2276 | + * it under the terms of the GNU General Public License as published by | ||
| 2277 | + * the Free Software Foundation; either version 2 of the License, or | ||
| 2278 | + * ( at your option ) any later version. | ||
| 2279 | + * | ||
| 2280 | + * This program is distributed in the hope that it will be useful, | ||
| 2281 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 2282 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 2283 | + * GNU General Public License for more details. | ||
| 2284 | + * | ||
| 2285 | + * You should have received a copy of the GNU General Public License | ||
| 2286 | + * along with this program; if not, write to the Free Software | ||
| 2287 | + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 2288 | + * | ||
| 2289 | + */ | ||
| 2290 | + | ||
| 2291 | +#include <stdio.h> | ||
| 2292 | +#include <stdlib.h> | ||
| 2293 | +#include <unistd.h> | ||
| 2294 | +#include <string.h> | ||
| 2295 | +#include <sys/types.h> | ||
| 2296 | +#include <sys/stat.h> | ||
| 2297 | +#include <fcntl.h> | ||
| 2298 | +#include <malloc.h> | ||
| 2299 | +#include <sys/errno.h> | ||
| 2300 | +#include <asm/io.h> | ||
| 2301 | +#include "dtload.h" | ||
| 2302 | +#include "dtpc_reg.h" | ||
| 2303 | + | ||
| 2304 | +#define dt_delay(x) usleep(x) | ||
| 2305 | +int verbose = 0, intest = 0,infd = -1; | ||
| 2306 | +int image_len, total_paras; | ||
| 2307 | +int dt_stat, dma_state = 0, has_kernel = 0; | ||
| 2308 | +struct dos_reloc fixups[512]; | ||
| 2309 | +char *read_buff = NULL; | ||
| 2310 | +struct dos_exe_header header; | ||
| 2311 | +u_short iobase = 0x350; | ||
| 2312 | + | ||
| 2313 | +static inline int dt_getstatus( ) | ||
| 2314 | +{ | ||
| 2315 | + dt_stat = inb_p( iobase )|(inb_p( iobase+1 )<<8); | ||
| 2316 | + return dt_stat; | ||
| 2317 | +} | ||
| 2318 | + | ||
| 2319 | +static void dt_sendcmd( u_int cmd ) | ||
| 2320 | +{ | ||
| 2321 | + outb_p( cmd & 0xFF, iobase ); | ||
| 2322 | + outb_p( (cmd>>8) & 0xFF, iobase+1 ); | ||
| 2323 | +} | ||
| 2324 | + | ||
| 2325 | +static int dt_waitbit( int bit ) | ||
| 2326 | +{ | ||
| 2327 | + int timeout = 100; | ||
| 2328 | + while ( --timeout > 0 ) { | ||
| 2329 | + if( (dt_getstatus( ) & bit ) == bit ) return 1; | ||
| 2330 | + usleep( 1000 ); | ||
| 2331 | + } | ||
| 2332 | + return 0; | ||
| 2333 | +} | ||
| 2334 | + | ||
| 2335 | +static int dt_sendcmd_wait( u_int cmd, int bit ) | ||
| 2336 | +{ | ||
| 2337 | + int timeout = 1000; | ||
| 2338 | + outb_p( cmd & 0xFF, iobase ); | ||
| 2339 | + outb_p( (cmd>>8) & 0xFF, iobase+1 ); | ||
| 2340 | + while ( --timeout > 0 ) { | ||
| 2341 | + if( (dt_getstatus( ) & bit ) == bit ) return 1; | ||
| 2342 | + usleep( 1000 ); | ||
| 2343 | + } | ||
| 2344 | + return 0; | ||
| 2345 | +} | ||
| 2346 | + | ||
| 2347 | +static int dt_waitmode( int pattern ) | ||
| 2348 | +{ | ||
| 2349 | + int timeout = 1000; | ||
| 2350 | + while ( --timeout > 0 ) { | ||
| 2351 | + if( dt_getstatus( ) == pattern ) return 1; | ||
| 2352 | + usleep( 1000 ); | ||
| 2353 | + } | ||
| 2354 | + fprintf( stderr, "waitmode p=%x s = %x\n", pattern, dt_stat ); | ||
| 2355 | + return 0; | ||
| 2356 | +} | ||
| 2357 | + | ||
| 2358 | +static int dt_wait_dma( ) | ||
| 2359 | +{ | ||
| 2360 | + int timeout = 1000, state = dma_state; | ||
| 2361 | + if( !has_kernel ){ | ||
| 2362 | + dt_delay( 500 ); | ||
| 2363 | + return( dt_waitbit( STAT_dma_ready ) ); | ||
| 2364 | + } | ||
| 2365 | + if( ! dt_waitbit( STAT_dma_ready ) ) return 0; | ||
| 2366 | + while ( --timeout > 0 ) { | ||
| 2367 | + if( (dt_getstatus()&STAT_dma_state) == state ) return 1; | ||
| 2368 | + usleep( 1000 ); | ||
| 2369 | + } | ||
| 2370 | + dma_state = dt_getstatus( ) & STAT_dma_state; | ||
| 2371 | + return 1; | ||
| 2372 | +} | ||
| 2373 | + | ||
| 2374 | +dt_ctrl( u_int cmd ) | ||
| 2375 | +{ | ||
| 2376 | + while ( ! dt_waitbit( STAT_cmd_ready ) ) dt_delay( 100 ); | ||
| 2377 | + outb_p( 0, iobase+2 ); | ||
| 2378 | + outb_p( 0, iobase+3 ); | ||
| 2379 | + dt_getstatus( ); | ||
| 2380 | + dt_sendcmd( CMD_control|cmd ); | ||
| 2381 | + outb_p( 0, iobase+6 ); | ||
| 2382 | + dt_delay( 100 ); | ||
| 2383 | + dt_sendcmd( CMD_null ); | ||
| 2384 | + while ( ! dt_waitbit( STAT_cmd_ready ) ) dt_delay( 100 ); | ||
| 2385 | +} | ||
| 2386 | + | ||
| 2387 | +int dt_flush( void ) | ||
| 2388 | +{ | ||
| 2389 | + dt_ctrl( CTRL_flush ); | ||
| 2390 | + dt_waitbit( STAT_dma_ready ); | ||
| 2391 | + outb_p( DMA_sync, iobase+4 ); | ||
| 2392 | + outb_p( 0, iobase+4 ); | ||
| 2393 | + dma_state ^= STAT_dma_state; | ||
| 2394 | + while( dt_getstatus( ) & STAT_flushing ) dt_delay( 100 ); | ||
| 2395 | + return 0; | ||
| 2396 | +} | ||
| 2397 | + | ||
| 2398 | +static int dt_sendbuff( char *src, int len ) | ||
| 2399 | +{ | ||
| 2400 | + while( len-- ){ | ||
| 2401 | + if( ! dt_wait_dma( ) ) return -1; | ||
| 2402 | + if( ! (dt_getstatus( ) & STAT_rr_char) ) break; | ||
| 2403 | + outb_p( DMA_single_in, iobase+4 ); | ||
| 2404 | + outb_p( *src++, iobase+4 ); | ||
| 2405 | + dma_state ^= STAT_dma_state; | ||
| 2406 | + } | ||
| 2407 | + return 0; | ||
| 2408 | +} | ||
| 2409 | + | ||
| 2410 | +unsigned long dt_allocmem( unsigned long paras ) | ||
| 2411 | +{ | ||
| 2412 | + unsigned long addr; | ||
| 2413 | + if( ! dt_wait_dma( ) ) return 0; | ||
| 2414 | + outb_p( DMA_control, iobase+4 ); | ||
| 2415 | + outb_p( DT_MEM_ALLOC, iobase+4 ); | ||
| 2416 | + dma_state ^= STAT_dma_state; | ||
| 2417 | + if( ! dt_wait_dma( ) ) return 0; | ||
| 2418 | + outb_p( paras & 0xFF, iobase+4 ); | ||
| 2419 | + outb_p( (paras>>8) & 0xFF, iobase+4 ); | ||
| 2420 | + dma_state ^= STAT_dma_state; | ||
| 2421 | + if( ! dt_wait_dma( ) ) return 0; | ||
| 2422 | + addr = inb_p( iobase+4 ); | ||
| 2423 | + addr |= (inb_p( iobase+4 )<<8); | ||
| 2424 | + addr += (inb_p( iobase+4 )<<4); | ||
| 2425 | + addr += (inb_p( iobase+4 )<<12); | ||
| 2426 | + dma_state ^= STAT_dma_state; | ||
| 2427 | + return addr; | ||
| 2428 | +} | ||
| 2429 | + | ||
| 2430 | +static int testkernel( void ) | ||
| 2431 | +{ | ||
| 2432 | + dt_sendcmd( CMD_sync ); | ||
| 2433 | + if( ! dt_waitbit( STAT_cmd_ready ) ) return -10; | ||
| 2434 | + has_kernel = ( dt_stat&0x8000 ) ? 1 : 0; | ||
| 2435 | + if ( verbose ) printf( "testkernel got %x\n", dt_stat ); | ||
| 2436 | + if ( has_kernel ) return 0; | ||
| 2437 | + dt_delay( 100 ); | ||
| 2438 | + return 1; | ||
| 2439 | +} | ||
| 2440 | + | ||
| 2441 | +static int dt_loadmem( int addr, int len, char *src ) | ||
| 2442 | +{ | ||
| 2443 | + char c; | ||
| 2444 | + int l; | ||
| 2445 | + if ( verbose ) printf( "dt_loadmem: addr = %08X size = %d\n", addr, len ); | ||
| 2446 | + do { | ||
| 2447 | + l = len; | ||
| 2448 | + if ( l >= 0xc000 ) l = 0xc000; | ||
| 2449 | + len -= l; | ||
| 2450 | + if( ! dt_wait_dma( ) ) return -1; | ||
| 2451 | + outb_p( DMA_control, iobase+4 ); | ||
| 2452 | + outb_p( DT_LOAD_MEM, iobase+4 ); | ||
| 2453 | + dma_state ^= STAT_dma_state; | ||
| 2454 | + if( ! dt_wait_dma( ) ) return -2; | ||
| 2455 | + outb_p( addr & 0xFF, iobase+4 ); | ||
| 2456 | + outb_p( (addr>>8) & 0xFF, iobase+4 ); | ||
| 2457 | + outb_p( (addr>>16) & 0xFF, iobase+4 ); | ||
| 2458 | + outb_p( (addr>>24) & 0xFF, iobase+4 ); | ||
| 2459 | + outb_p( l & 0xFF, iobase+4 ); | ||
| 2460 | + outb_p( (l>>8) & 0xFF, iobase+4 ); | ||
| 2461 | + dma_state ^= STAT_dma_state; | ||
| 2462 | + if( ! dt_wait_dma( ) ) return -3; | ||
| 2463 | + addr += l; | ||
| 2464 | phreak | 279 | + while( l-- ){ |
| 2465 | eradicator | 150 | + c = *src++; |
| 2466 | + outb_p( c, iobase+4 ); | ||
| 2467 | + } | ||
| 2468 | + dma_state ^= STAT_dma_state; | ||
| 2469 | + } while ( len > 0 ); | ||
| 2470 | + return 0; | ||
| 2471 | +} | ||
| 2472 | + | ||
| 2473 | +unsigned int loadfile ( char *filename ) | ||
| 2474 | +{ | ||
| 2475 | + int i, header_size; | ||
| 2476 | + unsigned int total_paras; | ||
| 2477 | + long fix; | ||
| 2478 | + infd = open ( filename, O_RDONLY ); | ||
| 2479 | + if ( infd == -1 ) { | ||
| 2480 | + perror ( "Opening file: " ); | ||
| 2481 | + return 0; | ||
| 2482 | + } | ||
| 2483 | + read ( infd, &header, sizeof ( struct dos_exe_header ) ); | ||
| 2484 | + if ( header.id != 0x5a4d ) { | ||
| 2485 | + fprintf ( stderr, "Invalid header file format\n" ); | ||
| 2486 | + fprintf ( stderr, "Want 0x5a4d, got 0x%x\n", header.id ); | ||
| 2487 | + return 0; | ||
| 2488 | + } | ||
| 2489 | + if ( header.relen > MAX_FIXUPS ) { | ||
| 2490 | + fprintf ( stderr, "Too many fixups\n" ); | ||
| 2491 | + return 0; | ||
| 2492 | + } | ||
| 2493 | + lseek ( infd, ( long ) header.reloc, SEEK_SET ); | ||
| 2494 | + read ( infd, fixups, sizeof ( struct dos_reloc ) * header.relen ); | ||
| 2495 | + header_size = header.hsize * 16; | ||
| 2496 | + lseek ( infd, ( long )header_size, SEEK_SET ); | ||
| 2497 | + image_len = ( ( header.pages-1 )*512 ) + ( header.rem- header_size ); | ||
| 2498 | + total_paras = ( image_len >> 4 ) + header.hmin + 16; | ||
| 2499 | + read ( infd, read_buff, image_len ); | ||
| 2500 | + close( infd ); | ||
| 2501 | + return total_paras; | ||
| 2502 | +} | ||
| 2503 | + | ||
| 2504 | +static int loadkernel( char *filename ) | ||
| 2505 | +{ | ||
| 2506 | + int segfix = 0x40, fix, i; | ||
| 2507 | + int ipval, csval; | ||
| 2508 | + if ( has_kernel ) return 0; | ||
| 2509 | + if ( !loadfile( filename ) ) return -1; | ||
| 2510 | + header.csval += segfix; | ||
| 2511 | + header.ssval += segfix; | ||
| 2512 | + if ( verbose ) { | ||
| 2513 | + printf ( "Loading kernel of %ld bytes ( %d relocs )\n", | ||
| 2514 | + image_len, header.relen ); | ||
| 2515 | + printf ( " cs:ip == %04x:%04x ss:sp == %04x:%04x\n", | ||
| 2516 | + header.csval, header.ipval, header.ssval, header.spval ); | ||
| 2517 | + } | ||
| 2518 | + for ( i = 0; i < header.relen; i++ ) { | ||
| 2519 | + fix = ( fixups[i].segment << 4 ) + fixups[i].offset; | ||
| 2520 | + ( *( unsigned int * ) &read_buff[fix] ) += segfix; | ||
| 2521 | + } | ||
| 2522 | + csval = header.csval; | ||
| 2523 | + ipval = header.ipval; | ||
| 2524 | + dt_sendcmd_wait( MODULE_reset, MODULE_init ); | ||
| 2525 | + dt_sendcmd( CMD_reset ); | ||
| 2526 | + if( dt_getstatus( ) == MODULE_self_test ){ | ||
| 2527 | + if( ! dt_waitmode( MODULE_init ) ) return -1; | ||
| 2528 | + } | ||
| 2529 | + if ( !dt_sendcmd_wait( CMD_reset, MODE_status ) ) return -2; | ||
| 2530 | + if ( !dt_sendcmd_wait( CMD_sync, MODE_error ) ) return -3; | ||
| 2531 | + if ( !dt_sendcmd_wait( CMD_reset, MODE_status ) ) return -4; | ||
| 2532 | + if ( verbose ) printf( "card is ready\n" ); | ||
| 2533 | + dt_sendcmd( CMD_dma ); | ||
| 2534 | + if( ! dt_waitbit( STAT_dma_ready ) ) return -5; | ||
| 2535 | + if( ( i = dt_loadmem( 0x00000400, image_len, read_buff ) ) ) { | ||
| 2536 | + fprintf( stderr, "kernel load failed, status %d\n", i ); | ||
| 2537 | + return -6; | ||
| 2538 | + } | ||
| 2539 | + dt_delay( 100 ); | ||
| 2540 | + /* the kernel is loaded, start it */ | ||
| 2541 | + if ( !dt_sendcmd_wait( CMD_reset, MODE_status ) ) return -7; | ||
| 2542 | + dt_sendcmd( CMD_dma+1 ); /**xxx**/ | ||
| 2543 | + dt_delay( 100 ); | ||
| 2544 | + if( ! dt_waitbit( STAT_dma_ready ) ) return-8; | ||
| 2545 | + outb_p( DMA_control, iobase+4 ); | ||
| 2546 | + outb_p( DT_START_TASK, iobase+4 ); | ||
| 2547 | + dt_delay( 100 ); | ||
| 2548 | + outb_p( ipval & 0xFF, iobase+4 ); | ||
| 2549 | + outb_p( (ipval>>8) & 0xFF, iobase+4 ); | ||
| 2550 | + outb_p( csval & 0xFF, iobase+4 ); | ||
| 2551 | + outb_p( (csval>>8) & 0xFF, iobase+4 ); | ||
| 2552 | + if( ! dt_waitmode( 0xc001 ) ) return -9; | ||
| 2553 | + if ( verbose ) { | ||
| 2554 | + printf( "done loading kernel\n" ); | ||
| 2555 | + } | ||
| 2556 | + return testkernel( ); | ||
| 2557 | +} | ||
| 2558 | + | ||
| 2559 | +int loaddict ( char *filename, char *name, int type ) | ||
| 2560 | +{ | ||
| 2561 | + int i, read_index, read_size, act_size; | ||
| 2562 | + unsigned short *index_fix, seg_fix; | ||
| 2563 | + unsigned long entries, index, dic_bytes, dic_addr; | ||
| 2564 | + unsigned int total_paras; | ||
| 2565 | + unsigned long param, l; | ||
| 2566 | + infd = open ( filename, O_RDONLY ); | ||
| 2567 | + if ( infd == -1 ) { | ||
| 2568 | + perror ( filename ); | ||
| 2569 | + return -1; | ||
| 2570 | + } | ||
| 2571 | +/* read in the entry count and the actual entry size excluding the | ||
| 2572 | + * index table ( which is entries * 4 ) ... */ | ||
| 2573 | + read ( infd, &entries, 4 ); | ||
| 2574 | + read ( infd, &dic_bytes, 4 ); | ||
| 2575 | + if ( verbose ) | ||
| 2576 | + printf ( "Loading %s dictionary of %lu entries, %lu bytes.\n", | ||
| 2577 | + name, entries, dic_bytes ); | ||
| 2578 | + total_paras = ( ( ( entries * 4 ) + dic_bytes ) >> 4 ) + 2; | ||
| 2579 | + if ( verbose ) | ||
| 2580 | + printf ( "Allocating %d paragraphs of free ram ...\n", total_paras ); | ||
| 2581 | + l = dt_allocmem( total_paras ); | ||
| 2582 | + if ( l == 0 ) { | ||
| 2583 | + perror ( "Error requesting memory from speech device" ); | ||
| 2584 | + return -1; | ||
| 2585 | + } | ||
| 2586 | + seg_fix = ( l >> 4 ) & 0xffff; | ||
| 2587 | + dic_addr = l; | ||
| 2588 | + index = entries; | ||
| 2589 | + index_fix = ( unsigned short * ) &read_buff[0]; | ||
| 2590 | + if ( verbose ) | ||
| 2591 | + printf ( "Index table starts at %lx\n", l ); | ||
| 2592 | + read_index = index*4; | ||
| 2593 | + act_size = read ( infd, read_buff, read_index ); | ||
| 2594 | + if ( act_size != read_index ) { | ||
| 2595 | + fprintf ( stderr, "\nError reading indexes\n" ); | ||
| 2596 | + fprintf ( stderr, " exp : %d act : %d\n", read_index * 4, act_size ); | ||
| 2597 | + return -1; | ||
| 2598 | + } | ||
| 2599 | + for ( i = 1; i < index * 2; i += 2 ) | ||
| 2600 | + index_fix[i] += seg_fix; | ||
| 2601 | + if( ( i = dt_loadmem( l, read_index, read_buff ) ) ) { | ||
| 2602 | + fprintf ( stderr, "\nError loading indexes at 0x%lX: i %d\n", | ||
| 2603 | + l, i ); | ||
| 2604 | + return -1; | ||
| 2605 | + } | ||
| 2606 | + l += read_index; | ||
| 2607 | +/* now, load up the dictionary bytes ... */ | ||
| 2608 | + if ( verbose ) | ||
| 2609 | + printf ( "Dictionary text starts at %lx\n", l ); | ||
| 2610 | + read_size = dic_bytes; | ||
| 2611 | + if ( ( act_size = read ( infd, read_buff, read_size ) ) != read_size ) { | ||
| 2612 | + fprintf ( stderr, "\nError reading dictionary text!\n" ); | ||
| 2613 | + fprintf ( stderr, "asked : %d actual : %d\n", act_size, read_size ); | ||
| 2614 | + return -1; | ||
| 2615 | + } | ||
| 2616 | + if( ( i = dt_loadmem( l, read_size, read_buff ) ) ) { | ||
| 2617 | + fprintf ( stderr, "\nError loading dictionary at 0x%lX: status %d\n", | ||
| 2618 | + l, i ); | ||
| 2619 | + return -1; | ||
| 2620 | + } | ||
| 2621 | + if( ! dt_wait_dma( ) ) return -1; | ||
| 2622 | + outb_p( DMA_control, iobase+4 ); | ||
| 2623 | + outb_p( DT_SET_DIC, iobase+4 ); | ||
| 2624 | + dma_state ^= STAT_dma_state; | ||
| 2625 | + if( ! dt_wait_dma( ) ) return -1; | ||
| 2626 | + l = dic_addr; | ||
| 2627 | + l = ((l << 12) & 0xFFFF0000) + (l & 0x0000000F); | ||
| 2628 | + outb_p( l & 0xFF, iobase+4 ); | ||
| 2629 | + outb_p( (l>>8) & 0xFF, iobase+4 ); | ||
| 2630 | + outb_p( (l>>16) & 0xFF, iobase+4 ); | ||
| 2631 | + outb_p( (l>>24) & 0xFF, iobase+4 ); | ||
| 2632 | + l = entries; | ||
| 2633 | + outb_p( l & 0xFF, iobase+4 ); | ||
| 2634 | + outb_p( (l>>8) & 0xFF, iobase+4 ); | ||
| 2635 | + outb_p( (l>>16) & 0xFF, iobase+4 ); | ||
| 2636 | + outb_p( (l>>24) & 0xFF, iobase+4 ); | ||
| 2637 | + l = type; | ||
| 2638 | + outb_p( l & 0xFF, iobase+4 ); | ||
| 2639 | + outb_p( (l>>8) & 0xFF, iobase+4 ); | ||
| 2640 | + dma_state ^= STAT_dma_state; | ||
| 2641 | + close ( infd ); | ||
| 2642 | + if ( verbose ) printf( "dictionary load complete\n" ); | ||
| 2643 | + return 0; | ||
| 2644 | +} | ||
| 2645 | + | ||
| 2646 | +int loadexe ( char *filename ) | ||
| 2647 | +{ | ||
| 2648 | + unsigned int load_addr = 0, seg_fix; | ||
| 2649 | + int i, read_size; | ||
| 2650 | + int ipval, csval; | ||
| 2651 | + long fix; | ||
| 2652 | + unsigned long total_paras; | ||
| 2653 | + total_paras = loadfile ( filename ); | ||
| 2654 | + if ( total_paras == 0 ) return -1; | ||
| 2655 | + load_addr = dt_allocmem( total_paras ); | ||
| 2656 | + if ( load_addr == 0 ) { | ||
| 2657 | + fprintf ( stderr, "Error allocating memory on card: " ); | ||
| 2658 | + return -1; | ||
| 2659 | + } | ||
| 2660 | + seg_fix = ( load_addr >> 4 ) & 0xffff; | ||
| 2661 | + if ( verbose ) { | ||
| 2662 | + printf ( "Loading %s %ld bytes ( %d relocs )\n", | ||
| 2663 | + filename, image_len, header.relen ); | ||
| 2664 | + printf ( "Allocating %ld bytes of free ram at %05x\n", | ||
| 2665 | + ( long ) header.hmin * 16, load_addr ); | ||
| 2666 | + printf ( "Total memory taken is %ld bytes\n", ( long ) total_paras * 16 ); | ||
| 2667 | + printf ( " cs:ip == %04x:%04x ss:sp == %04x:%04x\n", | ||
| 2668 | + header.csval + seg_fix, header.ipval, header.ssval + seg_fix, header.spval ); | ||
| 2669 | + } | ||
| 2670 | + for ( i = 0; i < header.relen; i++ ) { | ||
| 2671 | + fix = ( ( long ) fixups[i].segment << 4 ) + ( long ) fixups[i].offset; | ||
| 2672 | + ( *( unsigned int * ) &read_buff[fix] ) += seg_fix; | ||
| 2673 | + } | ||
| 2674 | + if( ( i = dt_loadmem( load_addr, image_len, read_buff ) ) ) { | ||
| 2675 | + fprintf ( stderr, "Error loading speech device at 0x%lX: status %d\n", | ||
| 2676 | + load_addr, i ); | ||
| 2677 | + return -1; | ||
| 2678 | + } | ||
| 2679 | + csval = header.csval + seg_fix; | ||
| 2680 | + ipval = header.ipval; | ||
| 2681 | + if( ! dt_wait_dma( ) ) return -1; | ||
| 2682 | + outb_p( DMA_control, iobase+4 ); | ||
| 2683 | + outb_p( DT_START_TASK, iobase+4 ); | ||
| 2684 | + dma_state ^= STAT_dma_state; | ||
| 2685 | + if( ! dt_wait_dma( ) ) return -1; | ||
| 2686 | + outb_p( ipval & 0xFF, iobase+4 ); | ||
| 2687 | + outb_p( (ipval>>8) & 0xFF, iobase+4 ); | ||
| 2688 | + outb_p( csval & 0xFF, iobase+4 ); | ||
| 2689 | + outb_p( (csval>>8) & 0xFF, iobase+4 ); | ||
| 2690 | + dma_state ^= STAT_dma_state; | ||
| 2691 | + return 0; | ||
| 2692 | +} | ||
| 2693 | + | ||
| 2694 | +void release_io( void ) | ||
| 2695 | +{ | ||
| 2696 | + ioperm( (long)iobase, 8, 0 ); | ||
| 2697 | + ioperm( (long)0x0080, 1, 0 ); | ||
| 2698 | + if ( read_buff ) free( read_buff ); | ||
| 2699 | +} | ||
| 2700 | + | ||
| 2701 | +parseparm( char *parm, char *value ) | ||
| 2702 | +{ | ||
| 2703 | + char *cp = parm+strlen( parm ); | ||
| 2704 | + while ( --cp > parm ) if ( *cp > ' ' ) break; | ||
| 2705 | + cp[1] = '\0'; | ||
| 2706 | + if ( !strcmp( parm, "io" ) ) { | ||
| 2707 | + long io = strtol( value, 0, 0 ); | ||
| 2708 | + if ( io >= 0x100 && io <= 0x350 ) { | ||
| 2709 | + iobase = (u_short)io; | ||
| 2710 | + return; | ||
| 2711 | + } | ||
| 2712 | + fprintf( stderr, "invalid io value %s\n", value ); | ||
| 2713 | + exit( 1 ); | ||
| 2714 | + } else if ( !strcmp( parm,"verbose" ) ) { | ||
| 2715 | + verbose = atoi( value ); | ||
| 2716 | + } | ||
| 2717 | +} | ||
| 2718 | + | ||
| 2719 | +do_test( void ) | ||
| 2720 | +{ | ||
| 2721 | + char buffer[512]; | ||
| 2722 | + int len; | ||
| 2723 | + dma_state = dt_getstatus( ) & STAT_dma_state; | ||
| 2724 | + while ( fgets( buffer, 510, stdin ) ) { | ||
| 2725 | + len = strlen( buffer ); | ||
| 2726 | + if ( len == 1 ) dt_flush( ); | ||
| 2727 | + else { | ||
| 2728 | + if ( buffer[len-1] == '\n' ) buffer[len-1] = '\013'; | ||
| 2729 | + dt_sendbuff( buffer, len ); | ||
| 2730 | + } | ||
| 2731 | + } | ||
| 2732 | + *buffer = '\013'; | ||
| 2733 | + dt_sendbuff( buffer, 1 ); | ||
| 2734 | +} | ||
| 2735 | + | ||
| 2736 | +int main ( int argc, char **argv ) | ||
| 2737 | +{ | ||
| 2738 | + char name[80], *cp; | ||
| 2739 | + char *dirname = 0, *confname = "dec_pc.conf"; | ||
| 2740 | + char *init_msg = "[:ra 360] dec pc initialized\011"; | ||
| 2741 | + FILE *confile; | ||
| 2742 | + struct stat statbuf; | ||
| 2743 | + int maxsize = 0, status = 0; | ||
| 2744 | + while ( --argc > 0 ) { | ||
| 2745 | + argv++; | ||
| 2746 | + if ( !strcmp( *argv, "-v" ) ) verbose = 1; | ||
| 2747 | + else if ( !strcmp( *argv, "-t" ) ) intest = 1; | ||
| 2748 | + else dirname = *argv; | ||
| 2749 | + } | ||
| 2750 | + if ( !dirname ) dirname = "/usr/local/lib/dec_pc"; | ||
| 2751 | + if ( chdir( dirname ) != 0 ) { | ||
| 2752 | + fprintf( stderr, "cannot chdir to %s\n", dirname ); | ||
| 2753 | + exit( 1 ); | ||
| 2754 | + } | ||
| 2755 | + if ( !( confile = fopen( confname, "r" ) ) ) { | ||
| 2756 | + fprintf( stderr, "could not open %s", confname ); | ||
| 2757 | + exit( 1 ); | ||
| 2758 | + } | ||
| 2759 | + while ( fgets( name, 80, confile ) ) { | ||
| 2760 | + cp = strchr( name, '\n' ); | ||
| 2761 | + if ( cp ) *cp = '\0'; | ||
| 2762 | + if ( ( cp = strchr( name, '=' ) ) ) { | ||
| 2763 | + *cp++ = '\0'; | ||
| 2764 | + parseparm( name, cp ); | ||
| 2765 | + continue; | ||
| 2766 | + } | ||
| 2767 | + if ( stat( name, &statbuf ) != 0 ) { | ||
| 2768 | + fprintf( stderr, "cannot stat %s\n", name ); | ||
| 2769 | + exit( 1 ); | ||
| 2770 | + } | ||
| 2771 | + if ( statbuf.st_size > maxsize ) maxsize = statbuf.st_size; | ||
| 2772 | + } | ||
| 2773 | + rewind( confile ); | ||
| 2774 | + if ( ioperm( (long)0x0080, 1, 1 ) || ioperm( (long)iobase, 8, 1 ) ) { | ||
| 2775 | + fprintf( stderr, "could not get ioperm\n" ); | ||
| 2776 | + exit( 1 ); | ||
| 2777 | + } | ||
| 2778 | + atexit( release_io ); | ||
| 2779 | + if ( testkernel( ) == 0 ) { | ||
| 2780 | + if ( intest ) do_test( ); | ||
| 2781 | + else fprintf( stderr, "kernel already loaded\n" ); | ||
| 2782 | + exit( 0 ); | ||
| 2783 | + } | ||
| 2784 | + read_buff = malloc( maxsize ); | ||
| 2785 | + if ( !read_buff ) { | ||
| 2786 | + fprintf( stderr, "cannot malloc %d bytes\n", maxsize ); | ||
| 2787 | + exit( 1 ); | ||
| 2788 | + } | ||
| 2789 | + while ( fgets( name, 80, confile ) && !status ) { | ||
| 2790 | + cp = strchr( name, '\n' ); | ||
| 2791 | + if ( cp ) *cp = '\0'; | ||
| 2792 | + if ( strchr( name, '=' ) ) continue; /* a parameter */ | ||
| 2793 | + if ( !( cp = strchr( name, '.' ) ) ) continue; | ||
| 2794 | + cp++; | ||
| 2795 | + if ( !strcmp ( cp, "dic" ) ) { | ||
| 2796 | + status = loaddict ( name, "primary", PRIMARY_DIC ); | ||
| 2797 | + } else if ( !strcmp ( cp, "dtu" ) ) { | ||
| 2798 | + status = loaddict ( name, "user", USER_DIC ); | ||
| 2799 | + } else if ( !strcmp ( cp, "dta" ) ) { | ||
| 2800 | + status = loaddict ( name, "abbreviation file", ABBREV_DIC ); | ||
| 2801 | + } else if ( !strcmp ( cp, "exe" ) ) { | ||
| 2802 | + status = loadexe ( name ); | ||
| 2803 | + } else if ( !strcmp ( cp, "sys" ) ) { | ||
| 2804 | + status = loadkernel ( name ); | ||
| 2805 | + } | ||
| 2806 | + } | ||
| 2807 | + if ( status ) fprintf( stderr, "status %d\n", status ); | ||
| 2808 | + fclose( confile ); | ||
| 2809 | + if ( status ) exit( status ); | ||
| 2810 | + dt_sendbuff( init_msg, strlen( init_msg ) ); | ||
| 2811 | + sleep( 1 ); | ||
| 2812 | + if ( intest ) do_test( ); | ||
| 2813 | + exit( 0 ); | ||
| 2814 | +} | ||
| 2815 | phreak | 327 | Index: linux-git/drivers/char/speakup/dtload.h |
| 2816 | phreak | 279 | =================================================================== |
| 2817 | --- /dev/null | ||
| 2818 | phreak | 327 | +++ linux-git/drivers/char/speakup/dtload.h |
| 2819 | eradicator | 150 | @@ -0,0 +1,57 @@ |
| 2820 | +/* | ||
| 2821 | + * This is the DECtalk PC firmware loader for the Linux kernel, version 1.0 | ||
| 2822 | + * | ||
| 2823 | + * Original 386BSD source: | ||
| 2824 | + * Copyright (c) 1996 Brian Buhrow <buhrow@lothlorien.nfbcal.org> | ||
| 2825 | + * | ||
| 2826 | + * Adapted for Linux: | ||
| 2827 | + * Copyright (c) 1997 Nicolas Pitre <nico@cam.org> | ||
| 2828 | + * | ||
| 2829 | + * Adapted for speakup: | ||
| 2830 | + * Copyright (c) 2003 David Borowski <david575@golden.net> | ||
| 2831 | + * | ||
| 2832 | + * All rights reserved. | ||
| 2833 | + * | ||
| 2834 | + * This program is free software; you can redistribute it and/or modify | ||
| 2835 | + * it under the terms of the GNU General Public License as published by | ||
| 2836 | + * the Free Software Foundation; either version 2 of the License, or | ||
| 2837 | + * (at your option) any later version. | ||
| 2838 | + * | ||
| 2839 | + * This program is distributed in the hope that it will be useful, | ||
| 2840 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 2841 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 2842 | + * GNU General Public License for more details. | ||
| 2843 | + * | ||
| 2844 | + * You should have received a copy of the GNU General Public License | ||
| 2845 | + * along with this program; if not, write to the Free Software | ||
| 2846 | + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 2847 | + * | ||
| 2848 | + */ | ||
| 2849 | + | ||
| 2850 | +#define MAX_FIXUPS 512 /* maximum fixups per exe */ | ||
| 2851 | +/* | ||
| 2852 | + * msdos .exe files will look like ... | ||
| 2853 | + */ | ||
| 2854 | + | ||
| 2855 | +struct dos_exe_header { | ||
| 2856 | + unsigned short id; /* Linker's signature, must be 0x5a4d */ | ||
| 2857 | + unsigned short rem; /* length of image mod 512 */ | ||
| 2858 | + unsigned short pages; /* length of image in pages of 512 bytes */ | ||
| 2859 | + unsigned short relen; /* number of relocation items */ | ||
| 2860 | + unsigned short hsize; /* header size in paragraphs of 16 bytes */ | ||
| 2861 | + unsigned short hmin; /* min # of paragraphs above prog end */ | ||
| 2862 | + unsigned short hmax; | ||
| 2863 | + unsigned short ssval; | ||
| 2864 | + unsigned short spval; /* to be loaded in sp */ | ||
| 2865 | + unsigned short checksum; | ||
| 2866 | + unsigned short ipval; /* to be loaded in ip */ | ||
| 2867 | + unsigned short csval; /* segment offset to code */ | ||
| 2868 | + unsigned short reloc; /* location of relocation items */ | ||
| 2869 | + unsigned short ovrlay; /* overlay number */ | ||
| 2870 | +}; | ||
| 2871 | + | ||
| 2872 | +/* a dos relocation element looks like */ | ||
| 2873 | + | ||
| 2874 | +struct dos_reloc { | ||
| 2875 | + short int offset, segment; | ||
| 2876 | +}; | ||
| 2877 | phreak | 327 | Index: linux-git/drivers/char/speakup/dtpc_reg.h |
| 2878 | phreak | 279 | =================================================================== |
| 2879 | --- /dev/null | ||
| 2880 | phreak | 327 | +++ linux-git/drivers/char/speakup/dtpc_reg.h |
| 2881 | eradicator | 150 | @@ -0,0 +1,132 @@ |
| 2882 | +/* | ||
| 2883 | + * This is the DECtalk PC register constants (from DEC's DOS driver) | ||
| 2884 | + * | ||
| 2885 | + * Original code: | ||
| 2886 | + * Copyright (c) by Digital Equipment Corp. | ||
| 2887 | + * | ||
| 2888 | + * 386BSD DECtalk PC driver: | ||
| 2889 | + * Copyright (c) 1996 Brian Buhrow <buhrow@lothlorien.nfbcal.org> | ||
| 2890 | + * | ||
| 2891 | + * Linux DECtalk PC driver: | ||
| 2892 | + * Copyright (c) 1997 Nicolas Pitre <nico@cam.org> | ||
| 2893 | + * | ||
| 2894 | + * speakup DECtalk PC driver: | ||
| 2895 | + * Copyright (c) 2003 David Borowski <david575@golden.net> | ||
| 2896 | + * | ||
| 2897 | + * All rights reserved. | ||
| 2898 | + * | ||
| 2899 | + * This program is free software; you can redistribute it and/or modify | ||
| 2900 | + * it under the terms of the GNU General Public License as published by | ||
| 2901 | + * the Free Software Foundation; either version 2 of the License, or | ||
| 2902 | + * (at your option) any later version. | ||
| 2903 | + * | ||
| 2904 | + * This program is distributed in the hope that it will be useful, | ||
| 2905 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 2906 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 2907 | + * GNU General Public License for more details. | ||
| 2908 | + * | ||
| 2909 | + * You should have received a copy of the GNU General Public License | ||
| 2910 | + * along with this program; if not, write to the Free Software | ||
| 2911 | + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 2912 | + * | ||
| 2913 | + */ | ||
| 2914 | + | ||
| 2915 | +/* | ||
| 2916 | + * port interface defs ... used by dtpc.c | ||
| 2917 | + */ | ||
| 2918 | + | ||
| 2919 | phreak | 279 | +#define MODULE_init 0x0dec /* module in boot code */ |
| 2920 | eradicator | 150 | +#define MODULE_self_test 0x8800 /* module in self-test */ |
| 2921 | +#define MODULE_reset 0xffff /* reinit the whole module */ | ||
| 2922 | + | ||
| 2923 | +#define MODE_mask 0xf000 /* mode bits in high nibble */ | ||
| 2924 | +#define MODE_null 0x0000 | ||
| 2925 | +#define MODE_test 0x2000 /* in testing mode */ | ||
| 2926 | +#define MODE_status 0x8000 | ||
| 2927 | +#define STAT_int 0x0001 /* running in interrupt mode */ | ||
| 2928 | +#define STAT_tr_char 0x0002 /* character data to transmit */ | ||
| 2929 | +#define STAT_rr_char 0x0004 /* ready to receive char data */ | ||
| 2930 | +#define STAT_cmd_ready 0x0008 /* ready to accept commands */ | ||
| 2931 | +#define STAT_dma_ready 0x0010 /* dma command ready */ | ||
| 2932 | +#define STAT_digitized 0x0020 /* spc in digitized mode */ | ||
| 2933 | +#define STAT_new_index 0x0040 /* new last index ready */ | ||
| 2934 | +#define STAT_new_status 0x0080 /* new status posted */ | ||
| 2935 | +#define STAT_dma_state 0x0100 /* dma state toggle */ | ||
| 2936 | +#define STAT_index_valid 0x0200 /* indexs are valid */ | ||
| 2937 | +#define STAT_flushing 0x0400 /* flush in progress */ | ||
| 2938 | +#define STAT_self_test 0x0800 /* module in self test */ | ||
| 2939 | +#define MODE_ready 0xc000 /* module ready for next phase */ | ||
| 2940 | phreak | 279 | +#define READY_boot 0x0000 |
| 2941 | +#define READY_kernel 0x0001 | ||
| 2942 | eradicator | 150 | +#define MODE_error 0xf000 |
| 2943 | + | ||
| 2944 | +#define CMD_mask 0xf000 /* mask for command nibble */ | ||
| 2945 | +#define CMD_null 0x0000 /* post status */ | ||
| 2946 | +#define CMD_control 0x1000 /* hard control command */ | ||
| 2947 | +#define CTRL_mask 0x0F00 /* mask off control nibble */ | ||
| 2948 | +#define CTRL_data 0x00FF /* madk to get data byte */ | ||
| 2949 | +#define CTRL_null 0x0000 /* null control */ | ||
| 2950 | +#define CTRL_vol_up 0x0100 /* increase volume */ | ||
| 2951 | +#define CTRL_vol_down 0x0200 /* decrease volume */ | ||
| 2952 | +#define CTRL_vol_set 0x0300 /* set volume */ | ||
| 2953 | +#define CTRL_pause 0x0400 /* pause spc */ | ||
| 2954 | +#define CTRL_resume 0x0500 /* resume spc clock */ | ||
| 2955 | +#define CTRL_resume_spc 0x0001 /* resume spc soft pause */ | ||
| 2956 | +#define CTRL_flush 0x0600 /* flush all buffers */ | ||
| 2957 | +#define CTRL_int_enable 0x0700 /* enable status change ints */ | ||
| 2958 | +#define CTRL_buff_free 0x0800 /* buffer remain count */ | ||
| 2959 | +#define CTRL_buff_used 0x0900 /* buffer in use */ | ||
| 2960 | +#define CTRL_speech 0x0a00 /* immediate speech change */ | ||
| 2961 | +#define CTRL_SP_voice 0x0001 /* voice change */ | ||
| 2962 | +#define CTRL_SP_rate 0x0002 /* rate change */ | ||
| 2963 | +#define CTRL_SP_comma 0x0003 /* comma pause change */ | ||
| 2964 | +#define CTRL_SP_period 0x0004 /* period pause change */ | ||
| 2965 | +#define CTRL_SP_rate_delta 0x0005 /* delta rate change */ | ||
| 2966 | +#define CTRL_SP_get_param 0x0006 /* return the desired parameter */ | ||
| 2967 | +#define CTRL_last_index 0x0b00 /* get last index spoken */ | ||
| 2968 | +#define CTRL_io_priority 0x0c00 /* change i/o priority */ | ||
| 2969 | +#define CTRL_free_mem 0x0d00 /* get free paragraphs on module */ | ||
| 2970 | +#define CTRL_get_lang 0x0e00 /* return bit mask of loaded languages */ | ||
| 2971 | +#define CMD_test 0x2000 /* self-test request */ | ||
| 2972 | +#define TEST_mask 0x0F00 /* isolate test field */ | ||
| 2973 | +#define TEST_null 0x0000 /* no test requested */ | ||
| 2974 | +#define TEST_isa_int 0x0100 /* assert isa irq */ | ||
| 2975 | +#define TEST_echo 0x0200 /* make data in == data out */ | ||
| 2976 | +#define TEST_seg 0x0300 /* set peek/poke segment */ | ||
| 2977 | +#define TEST_off 0x0400 /* set peek/poke offset */ | ||
| 2978 | +#define TEST_peek 0x0500 /* data out == *peek */ | ||
| 2979 | +#define TEST_poke 0x0600 /* *peek == data in */ | ||
| 2980 | +#define TEST_sub_code 0x00FF /* user defined test sub codes */ | ||
| 2981 | +#define CMD_id 0x3000 /* return software id */ | ||
| 2982 | +#define ID_null 0x0000 /* null id */ | ||
| 2983 | +#define ID_kernel 0x0100 /* kernel code executing */ | ||
| 2984 | +#define ID_boot 0x0200 /* boot code executing */ | ||
| 2985 | +#define CMD_dma 0x4000 /* force a dma start */ | ||
| 2986 | +#define CMD_reset 0x5000 /* reset module status */ | ||
| 2987 | +#define CMD_sync 0x6000 /* kernel sync command */ | ||
| 2988 | +#define CMD_char_in 0x7000 /* single character send */ | ||
| 2989 | +#define CMD_char_out 0x8000 /* single character get */ | ||
| 2990 | +#define CHAR_count_1 0x0100 /* one char in cmd_low */ | ||
| 2991 | +#define CHAR_count_2 0x0200 /* the second in data_low */ | ||
| 2992 | +#define CHAR_count_3 0x0300 /* the third in data_high */ | ||
| 2993 | +#define CMD_spc_mode 0x9000 /* change spc mode */ | ||
| 2994 | +#define CMD_spc_to_text 0x0100 /* set to text mode */ | ||
| 2995 | +#define CMD_spc_to_digit 0x0200 /* set to digital mode */ | ||
| 2996 | +#define CMD_spc_rate 0x0400 /* change spc data rate */ | ||
| 2997 | +#define CMD_error 0xf000 /* severe error */ | ||
| 2998 | + | ||
| 2999 | +enum { PRIMARY_DIC = 0, USER_DIC, COMMAND_DIC, ABBREV_DIC }; | ||
| 3000 | + | ||
| 3001 | +#define DMA_single_in 0x01 | ||
| 3002 | +#define DMA_single_out 0x02 | ||
| 3003 | +#define DMA_buff_in 0x03 | ||
| 3004 | +#define DMA_buff_out 0x04 | ||
| 3005 | +#define DMA_control 0x05 | ||
| 3006 | +#define DT_MEM_ALLOC 0x03 | ||
| 3007 | +#define DT_SET_DIC 0x04 | ||
| 3008 | +#define DT_START_TASK 0x05 | ||
| 3009 | +#define DT_LOAD_MEM 0x06 | ||
| 3010 | +#define DT_READ_MEM 0x07 | ||
| 3011 | +#define DT_DIGITAL_IN 0x08 | ||
| 3012 | +#define DMA_sync 0x06 | ||
| 3013 | +#define DMA_sync_char 0x07 | ||
| 3014 | phreak | 327 | Index: linux-git/drivers/char/speakup/genmap.c |
| 3015 | phreak | 279 | =================================================================== |
| 3016 | --- /dev/null | ||
| 3017 | phreak | 327 | +++ linux-git/drivers/char/speakup/genmap.c |
| 3018 | eradicator | 150 | @@ -0,0 +1,204 @@ |
| 3019 | +#include <stdlib.h> | ||
| 3020 | +#include <stdio.h> | ||
| 3021 | +#include <libgen.h> | ||
| 3022 | +#include <string.h> | ||
| 3023 | +#include <linux/version.h> | ||
| 3024 | +#include <ctype.h> | ||
| 3025 | + | ||
| 3026 | +int get_define(void); | ||
| 3027 | + | ||
| 3028 | +#define MAXKEYS 512 | ||
| 3029 | +#define MAXKEYVAL 160 | ||
| 3030 | +#define HASHSIZE 101 | ||
| 3031 | +#define is_shift -3 | ||
| 3032 | +#define is_spk -2 | ||
| 3033 | +#define is_input -1 | ||
| 3034 | +typedef struct st_key_init t_key_init; | ||
| 3035 | +struct st_key_init { | ||
| 3036 | + char *name; | ||
| 3037 | + int value, shift; | ||
| 3038 | +}; | ||
| 3039 | +typedef struct st_key t_key; | ||
| 3040 | +struct st_key { | ||
| 3041 | + char *name; | ||
| 3042 | + t_key *next; | ||
| 3043 | + int value, shift; | ||
| 3044 | +}; | ||
| 3045 | +unsigned char key_data[MAXKEYVAL][16], *kp; | ||
| 3046 | + | ||
| 3047 | +#include "mapdata.h" | ||
| 3048 | +t_key key_table[MAXKEYS]; | ||
| 3049 | +t_key *extra_keys = key_table+HASHSIZE; | ||
| 3050 | +char buffer[256], filename[256]; | ||
| 3051 | +FILE *infile; | ||
| 3052 | +char delims[] = "\t\n "; | ||
| 3053 | +char *def_name, *def_val, *cp; | ||
| 3054 | +int map_ver = 119; /* an arbitrary number so speakup can check */ | ||
| 3055 | +int lc, shift_table[17]; | ||
| 3056 | +int max_states = 1, flags = 0; | ||
| 3057 | +/* flags reserved for later, maybe for individual console maps */ | ||
| 3058 | + | ||
| 3059 | +void open_input( char *name ) | ||
| 3060 | +{ | ||
| 3061 | + strcpy( filename, name ); | ||
| 3062 | + if ( ( infile = fopen( filename, "r" ) ) == 0 ) { | ||
| 3063 | + fprintf( stderr, "can't open %s, version %d\n", filename, LINUX_VERSION_CODE ); | ||
| 3064 | + exit( 1 ); | ||
| 3065 | + } | ||
| 3066 | + lc = 0; | ||
| 3067 | +} | ||
| 3068 | + | ||
| 3069 | +int | ||
| 3070 | +oops( char *msg, char *info ) | ||
| 3071 | +{ | ||
| 3072 | + if ( info == NULL ) info = " "; | ||
| 3073 | + fprintf( stderr, "error: file %s line %d\n", filename, lc ); | ||
| 3074 | + fprintf( stderr, "%s %s\n", msg, info ); | ||
| 3075 | + exit( 1 ); | ||
| 3076 | +} | ||
| 3077 | + | ||
| 3078 | +t_key *hash_name( char *name ) | ||
| 3079 | +{ | ||
| 3080 | + u_char *pn = (u_char *)name; | ||
| 3081 | + int hash = 0; | ||
| 3082 | + while ( *pn ) { | ||
| 3083 | + hash = ( hash * 17 ) & 0xfffffff; | ||
| 3084 | + if ( isupper( *pn ) ) *pn = tolower( *pn ); | ||
| 3085 | + hash += ( int )*pn; | ||
| 3086 | + pn++; | ||
| 3087 | + } | ||
| 3088 | + hash %= HASHSIZE; | ||
| 3089 | + return &key_table[hash]; | ||
| 3090 | +} | ||
| 3091 | + | ||
| 3092 | +t_key *find_key( char *name ) | ||
| 3093 | +{ | ||
| 3094 | + t_key *this = hash_name( name ); | ||
| 3095 | + while ( this ) { | ||
| 3096 | + if ( !strcmp( name, this->name ) ) return this; | ||
| 3097 | + this = this->next; | ||
| 3098 | + } | ||
| 3099 | + return this; | ||
| 3100 | +} | ||
| 3101 | + | ||
| 3102 | +t_key *add_key( char *name, int value, int shift ) | ||
| 3103 | +{ | ||
| 3104 | + t_key *this = hash_name( name ); | ||
| 3105 | + if ( extra_keys-key_table >= MAXKEYS ) | ||
| 3106 | + oops( "out of key table space, enlarge MAXKEYS", NULL ); | ||
| 3107 | + if ( this->name != NULL ) { | ||
| 3108 | + while ( this->next ) { | ||
| 3109 | + if ( !strcmp( name, this->name ) ) | ||
| 3110 | + oops( "attempt to add duplicate key", name ); | ||
| 3111 | + this = this->next; | ||
| 3112 | + } | ||
| 3113 | + this->next = extra_keys++; | ||
| 3114 | + this = this->next; | ||
| 3115 | + } | ||
| 3116 | + this->name = strdup( name ); | ||
| 3117 | + this->value = value; | ||
| 3118 | + this->shift = shift; | ||
| 3119 | + return this; | ||
| 3120 | +} | ||
| 3121 | + | ||
| 3122 | +int get_shift_value( int state ) | ||
| 3123 | +{ | ||
| 3124 | + int i; | ||
| 3125 | + for ( i = 0; shift_table[i] != state; i++ ) { | ||
| 3126 | + if ( shift_table[i] == -1 ) { | ||
| 3127 | + if ( i >= 16 ) | ||
| 3128 | + oops( "too many shift states", NULL ); | ||
| 3129 | + shift_table[i] = state; | ||
| 3130 | + max_states = i+1; | ||
| 3131 | + break; | ||
| 3132 | + } | ||
| 3133 | + } | ||
| 3134 | + return i; | ||
| 3135 | +} | ||
| 3136 | + | ||
| 3137 | phreak | 279 | +int |
| 3138 | eradicator | 150 | +main( int argc, char *argv[] ) |
| 3139 | +{ | ||
| 3140 | + int value, shift_state, i, spk_val = 0, lock_val = 0; | ||
| 3141 | + int max_key_used = 0, num_keys_used = 0; | ||
| 3142 | + t_key *this; | ||
| 3143 | + t_key_init *p_init; | ||
| 3144 | +char *argpath, *argname, *argcopy; | ||
| 3145 | + | ||
| 3146 | + bzero( key_table, sizeof( key_table ) ); | ||
| 3147 | + bzero( key_data, sizeof( key_data ) ); | ||
| 3148 | + shift_table[0] = 0; | ||
| 3149 | + for ( i = 1; i <= 16; i++ ) shift_table[i] = -1; | ||
| 3150 | + if ( argc < 2 ) { | ||
| 3151 | + fputs( "usage: genmap filename\n", stderr ); | ||
| 3152 | + exit( 1 ); | ||
| 3153 | + } | ||
| 3154 | + for ( p_init = init_key_data; p_init->name[0] != '.'; p_init++ ) | ||
| 3155 | + add_key( p_init->name, p_init->value, p_init->shift ); | ||
| 3156 | + open_input( argv[1] ); | ||
| 3157 | + while ( fgets( buffer, 250, infile ) ) { | ||
| 3158 | + lc++; | ||
| 3159 | + value = shift_state = 0; | ||
| 3160 | + cp = strtok( buffer, delims ); | ||
| 3161 | + if ( *cp == '#' ) continue; | ||
| 3162 | + while ( cp ) { | ||
| 3163 | + if ( *cp == '=' ) break; | ||
| 3164 | + this = find_key( cp ); | ||
| 3165 | + if ( this == NULL ) | ||
| 3166 | + oops( "unknown key/modifier", cp ); | ||
| 3167 | + if ( this->shift == is_shift ) { | ||
| 3168 | + if ( value ) | ||
| 3169 | + oops( "modifiers must come first", cp ); | ||
| 3170 | + shift_state += this->value; | ||
| 3171 | + } else if ( this->shift == is_input ) | ||
| 3172 | + value = this->value; | ||
| 3173 | + else oops( "bad modifier or key", cp ); | ||
| 3174 | + cp = strtok( 0, delims ); | ||
| 3175 | + } | ||
| 3176 | + if ( !cp ) oops( "no = found", NULL ); | ||
| 3177 | + cp = strtok( 0, delims ); | ||
| 3178 | + if ( !cp ) oops( "no speakup function after =", NULL ); | ||
| 3179 | + this = find_key( cp ); | ||
| 3180 | + if ( this == NULL || this->shift != is_spk ) | ||
| 3181 | + oops( "invalid speakup function", cp ); | ||
| 3182 | + i = get_shift_value( shift_state ); | ||
| 3183 | + if ( key_data[value][i] ) { | ||
| 3184 | + while ( --cp > buffer ) | ||
| 3185 | + if ( !*cp ) *cp = ' '; | ||
| 3186 | + oops( "two functions on same key combination", cp ); | ||
| 3187 | + } | ||
| 3188 | + key_data[value][i] = (char)this->value; | ||
| 3189 | + if ( value > max_key_used ) max_key_used = value; | ||
| 3190 | + } | ||
| 3191 | + fclose( infile ); | ||
| 3192 | + this = find_key( "spk_key" ); | ||
| 3193 | + if ( this ) spk_val = this->value; | ||
| 3194 | + this = find_key( "spk_lock" ); | ||
| 3195 | + if ( this ) lock_val = this->value; | ||
| 3196 | + for ( lc = 1; lc <= max_key_used; lc++ ) { | ||
| 3197 | + kp = key_data[lc]; | ||
| 3198 | + if ( !memcmp( key_data[0], kp, 16 ) ) continue; | ||
| 3199 | + num_keys_used++; | ||
| 3200 | + for ( i = 0; i < max_states; i++ ) { | ||
| 3201 | + if ( kp[i] != spk_val&& kp[i] != lock_val ) continue; | ||
| 3202 | + shift_state = shift_table[i]; | ||
| 3203 | + if ( ( shift_state&16 ) ) continue; | ||
| 3204 | + shift_state = get_shift_value( shift_state+16 ); | ||
| 3205 | + kp[shift_state] = kp[i]; | ||
| 3206 | +/* fill in so we can process the key up, as spk bit will be set */ | ||
| 3207 | + } | ||
| 3208 | + } | ||
| 3209 | + printf( "\t%d, %d, %d,\n\t", map_ver, num_keys_used, max_states ); | ||
| 3210 | + for ( i = 0; i < max_states; i++ ) | ||
| 3211 | + printf( "%d, ", shift_table[i] ); | ||
| 3212 | + printf( "%d,", flags ); | ||
| 3213 | + for ( lc = 1; lc <= max_key_used; lc++ ) { | ||
| 3214 | + kp = key_data[lc]; | ||
| 3215 | + if ( !memcmp( key_data[0], kp, 16 ) ) continue; | ||
| 3216 | + printf( "\n\t%d,", lc ); | ||
| 3217 | + for ( i = 0; i < max_states; i++ ) | ||
| 3218 | + printf( " %d,", (unsigned int)kp[i] ); | ||
| 3219 | + } | ||
| 3220 | + printf( "\n\t0, %d\n", map_ver ); | ||
| 3221 | + exit( 0 ); | ||
| 3222 | +} | ||
| 3223 | phreak | 327 | Index: linux-git/drivers/char/speakup/keyinfo.h |
| 3224 | phreak | 279 | =================================================================== |
| 3225 | --- /dev/null | ||
| 3226 | phreak | 327 | +++ linux-git/drivers/char/speakup/keyinfo.h |
| 3227 | dsd | 198 | @@ -0,0 +1,120 @@ |
| 3228 | eradicator | 150 | +/* spk_priv.h |
| 3229 | + review functions for the speakup screen review package. | ||
| 3230 | + originally written by: Kirk Reiser and Andy Berdan. | ||
| 3231 | + | ||
| 3232 | + extensively modified by David Borowski. | ||
| 3233 | + | ||
| 3234 | + Copyright (C ) 1998 Kirk Reiser. | ||
| 3235 | + Copyright (C ) 2003 David Borowski. | ||
| 3236 | + | ||
| 3237 | + This program is free software; you can redistribute it and/or modify | ||
| 3238 | + it under the terms of the GNU General Public License as published by | ||
| 3239 | + the Free Software Foundation; either version 2 of the License, or | ||
| 3240 | + (at your option ) any later version. | ||
| 3241 | + | ||
| 3242 | + This program is distributed in the hope that it will be useful, | ||
| 3243 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 3244 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 3245 | + GNU General Public License for more details. | ||
| 3246 | + | ||
| 3247 | + You should have received a copy of the GNU General Public License | ||
| 3248 | + along with this program; if not, write to the Free Software | ||
| 3249 | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 3250 | +*/ | ||
| 3251 | + | ||
| 3252 | +enum { /* var_ids */ | ||
| 3253 | + VERSION = 0, SYNTH, SILENT, SYNTH_DIRECT, | ||
| 3254 | + KEYMAP, CHARS, | ||
| 3255 | + PUNC_SOME, PUNC_MOST, PUNC_ALL, | ||
| 3256 | + DELIM, REPEATS, EXNUMBER, | ||
| 3257 | + DELAY, TRIGGER, JIFFY, FULL, /* all timers must be together */ | ||
| 3258 | + BLEEP_TIME, CURSOR_TIME, BELL_POS, | ||
| 3259 | +SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO, | ||
| 3260 | + SPELL_DELAY, PUNC_LEVEL, READING_PUNC, | ||
| 3261 | + ATTRIB_BLEEP, BLEEPS, | ||
| 3262 | + RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQ, LANG, | ||
| 3263 | + CAPS_START, CAPS_STOP, | ||
| 3264 | + MAXVARS | ||
| 3265 | +}; | ||
| 3266 | + | ||
| 3267 | +#define FIRST_SYNTH_VAR RATE | ||
| 3268 | +/* 0 is reserved for no remap */ | ||
| 3269 | +#define SPEAKUP_GOTO 0x01 | ||
| 3270 | +#define SPEECH_KILL 0x02 | ||
| 3271 | +#define SPEAKUP_QUIET 0x03 | ||
| 3272 | +#define SPEAKUP_CUT 0x04 | ||
| 3273 | +#define SPEAKUP_PASTE 0x05 | ||
| 3274 | +#define SAY_FIRST_CHAR 0x06 | ||
| 3275 | +#define SAY_LAST_CHAR 0x07 | ||
| 3276 | +#define SAY_CHAR 0x08 | ||
| 3277 | +#define SAY_PREV_CHAR 0x09 | ||
| 3278 | +#define SAY_NEXT_CHAR 0x0a | ||
| 3279 | +#define SAY_WORD 0x0b | ||
| 3280 | +#define SAY_PREV_WORD 0x0c | ||
| 3281 | +#define SAY_NEXT_WORD 0x0d | ||
| 3282 | +#define SAY_LINE 0x0e | ||
| 3283 | +#define SAY_PREV_LINE 0x0f | ||
| 3284 | +#define SAY_NEXT_LINE 0x10 | ||
| 3285 | +#define TOP_EDGE 0x11 | ||
| 3286 | +#define BOTTOM_EDGE 0x12 | ||
| 3287 | +#define LEFT_EDGE 0x13 | ||
| 3288 | +#define RIGHT_EDGE 0x14 | ||
| 3289 | +#define SPELL_PHONETIC 0x15 | ||
| 3290 | +#define SPELL_WORD 0x16 | ||
| 3291 | +#define SAY_SCREEN 0x17 | ||
| 3292 | +#define SAY_POSITION 0x18 | ||
| 3293 | +#define SAY_ATTRIBUTES 0x19 | ||
| 3294 | +#define SPEAKUP_OFF 0x1a | ||
| 3295 | +#define SPEAKUP_PARKED 0x1b | ||
| 3296 | +#define SAY_LINE_INDENT 0x1c | ||
| 3297 | +#define SAY_FROM_TOP 0x1d | ||
| 3298 | +#define SAY_TO_BOTTOM 0x1e | ||
| 3299 | +#define SAY_FROM_LEFT 0x1f | ||
| 3300 | +#define SAY_TO_RIGHT 0x20 | ||
| 3301 | +#define SAY_CHAR_NUM 0x21 | ||
| 3302 | +#define EDIT_SOME 0x22 | ||
| 3303 | +#define EDIT_MOST 0x23 | ||
| 3304 | +#define SAY_PHONETIC_CHAR 0x24 | ||
| 3305 | +#define EDIT_DELIM 0x25 | ||
| 3306 | +#define EDIT_REPEAT 0x26 | ||
| 3307 | +#define EDIT_EXNUM 0x27 | ||
| 3308 | +#define SET_WIN 0x28 | ||
| 3309 | +#define CLEAR_WIN 0x29 | ||
| 3310 | +#define ENABLE_WIN 0x2a | ||
| 3311 | +#define SAY_WIN 0x2b | ||
| 3312 | +#define SPK_LOCK 0x2c | ||
| 3313 | +#define SPEAKUP_HELP 0x2d | ||
| 3314 | +#define TOGGLE_CURSORING 0x2e | ||
| 3315 | dsd | 198 | +#define READ_ALL_DOC 0x2f |
| 3316 | +#define SPKUP_MAX_FUNC 0x30 /* one greater than the last func handler */ | ||
| 3317 | eradicator | 150 | + |
| 3318 | +#define SPK_KEY 0x80 | ||
| 3319 | +#define FIRST_EDIT_BITS 0x22 | ||
| 3320 | + | ||
| 3321 | +#define FIRST_SET_VAR SPELL_DELAY | ||
| 3322 | +#define VAR_START 0x40 /* increase if adding more than 0x3f functions */ | ||
| 3323 | + | ||
| 3324 | +/* keys for setting variables, must be ordered same as the enum for var_ids */ | ||
| 3325 | +/* with dec being even and inc being 1 greater */ | ||
| 3326 | +#define SPELL_DELAY_DEC VAR_START+0 | ||
| 3327 | +#define SPELL_DELAY_INC SPELL_DELAY_DEC+1 | ||
| 3328 | +#define PUNC_LEVEL_DEC SPELL_DELAY_DEC+2 | ||
| 3329 | +#define PUNC_LEVEL_INC PUNC_LEVEL_DEC+1 | ||
| 3330 | +#define READING_PUNC_DEC PUNC_LEVEL_DEC+2 | ||
| 3331 | +#define READING_PUNC_INC READING_PUNC_DEC+1 | ||
| 3332 | +#define ATTRIB_BLEEP_DEC READING_PUNC_DEC+2 | ||
| 3333 | +#define ATTRIB_BLEEP_INC ATTRIB_BLEEP_DEC+1 | ||
| 3334 | +#define BLEEPS_DEC ATTRIB_BLEEP_DEC+2 | ||
| 3335 | +#define BLEEPS_INC BLEEPS_DEC+1 | ||
| 3336 | +#define RATE_DEC BLEEPS_DEC+2 | ||
| 3337 | +#define RATE_INC RATE_DEC+1 | ||
| 3338 | +#define PITCH_DEC RATE_DEC+2 | ||
| 3339 | +#define PITCH_INC PITCH_DEC+1 | ||
| 3340 | +#define VOL_DEC PITCH_DEC+2 | ||
| 3341 | +#define VOL_INC VOL_DEC+1 | ||
| 3342 | +#define TONE_DEC VOL_DEC+2 | ||
| 3343 | +#define TONE_INC TONE_DEC+1 | ||
| 3344 | +#define PUNCT_DEC TONE_DEC+2 | ||
| 3345 | +#define PUNCT_INC PUNCT_DEC+1 | ||
| 3346 | +#define VOICE_DEC PUNCT_DEC+2 | ||
| 3347 | +#define VOICE_INC VOICE_DEC+1 | ||
| 3348 | phreak | 327 | Index: linux-git/drivers/char/speakup/makemapdata.c |
| 3349 | phreak | 279 | =================================================================== |
| 3350 | --- /dev/null | ||
| 3351 | phreak | 327 | +++ linux-git/drivers/char/speakup/makemapdata.c |
| 3352 | eradicator | 150 | @@ -0,0 +1,156 @@ |
| 3353 | +#include <stdlib.h> | ||
| 3354 | +#include <stdio.h> | ||
| 3355 | +#include <libgen.h> | ||
| 3356 | +#include <string.h> | ||
| 3357 | +#include <linux/version.h> | ||
| 3358 | +#include <ctype.h> | ||
| 3359 | + | ||
| 3360 | +int get_define(void); | ||
| 3361 | + | ||
| 3362 | +#define MAXKEYS 512 | ||
| 3363 | +#define MAXKEYVAL 160 | ||
| 3364 | +#define HASHSIZE 101 | ||
| 3365 | +#define is_shift -3 | ||
| 3366 | +#define is_spk -2 | ||
| 3367 | +#define is_input -1 | ||
| 3368 | +typedef struct st_key t_key; | ||
| 3369 | +struct st_key { | ||
| 3370 | + char *name; | ||
| 3371 | + t_key *next; | ||
| 3372 | + int value, shift; | ||
| 3373 | +}; | ||
| 3374 | + | ||
| 3375 | +t_key key_table[MAXKEYS]; | ||
| 3376 | +t_key *extra_keys = key_table+HASHSIZE; | ||
| 3377 | +char buffer[256], filename[256]; | ||
| 3378 | +FILE *infile; | ||
| 3379 | +char delims[] = "\t\n "; | ||
| 3380 | +char *dir_name, *def_name, *def_val, *cp; | ||
| 3381 | +int lc; | ||
| 3382 | + | ||
| 3383 | +void open_input( char *name ) | ||
| 3384 | +{ | ||
| 3385 | + sprintf( filename, "%s/%s", dir_name, name ); | ||
| 3386 | + if ( ( infile = fopen( filename, "r" ) ) == 0 ) { | ||
| 3387 | + fprintf( stderr, "can't open %s\n", filename ); | ||
| 3388 | + exit( 1 ); | ||
| 3389 | + } | ||
| 3390 | + lc = 0; | ||
| 3391 | +} | ||
| 3392 | + | ||
| 3393 | +int | ||
| 3394 | +oops( char *msg, char *info ) | ||
| 3395 | +{ | ||
| 3396 | + if ( info == NULL ) info = " "; | ||
| 3397 | + fprintf( stderr, "error: file %s line %d\n", filename, lc ); | ||
| 3398 | + fprintf( stderr, "%s %s\n", msg, info ); | ||
| 3399 | + exit( 1 ); | ||
| 3400 | +} | ||
| 3401 | + | ||
| 3402 | +int get_define( ) | ||
| 3403 | +{ | ||
| 3404 | + while ( fgets( buffer, 250, infile ) ) { | ||
| 3405 | + lc++; | ||
| 3406 | + if ( strncmp( buffer, "#define", 7 ) ) continue; | ||
| 3407 | + strtok( buffer, delims ); | ||
| 3408 | + def_name = strtok( 0, delims ); | ||
| 3409 | + def_val = strtok( 0, delims ); | ||
| 3410 | + if ( def_val != NULL ) return 1; | ||
| 3411 | + } | ||
| 3412 | + fclose( infile ); | ||
| 3413 | + infile = 0; | ||
| 3414 | + return 0; | ||
| 3415 | +} | ||
| 3416 | + | ||
| 3417 | +t_key *hash_name( char *name ) | ||
| 3418 | +{ | ||
| 3419 | + u_char *pn = (u_char *)name; | ||
| 3420 | + int hash = 0; | ||
| 3421 | + while ( *pn ) { | ||
| 3422 | + hash = ( hash * 17 ) & 0xfffffff; | ||
| 3423 | + if ( isupper( *pn ) ) *pn = tolower( *pn ); | ||
| 3424 | + hash += ( int )*pn; | ||
| 3425 | + pn++; | ||
| 3426 | + } | ||
| 3427 | + hash %= HASHSIZE; | ||
| 3428 | + return &key_table[hash]; | ||
| 3429 | +} | ||
| 3430 | + | ||
| 3431 | +t_key *find_key( char *name ) | ||
| 3432 | +{ | ||
| 3433 | + t_key *this = hash_name( name ); | ||
| 3434 | + while ( this ) { | ||
| 3435 | + if ( !strcmp( name, this->name ) ) return this; | ||
| 3436 | + this = this->next; | ||
| 3437 | + } | ||
| 3438 | + return this; | ||
| 3439 | +} | ||
| 3440 | + | ||
| 3441 | +t_key *add_key( char *name, int value, int shift ) | ||
| 3442 | +{ | ||
| 3443 | + t_key *this = hash_name( name ); | ||
| 3444 | + if ( extra_keys-key_table >= MAXKEYS ) | ||
| 3445 | + oops( "out of key table space, enlarge MAXKEYS", NULL ); | ||
| 3446 | + if ( this->name != NULL ) { | ||
| 3447 | + while ( this->next ) { | ||
| 3448 | + if ( !strcmp( name, this->name ) ) | ||
| 3449 | + oops( "attempt to add duplicate key", name ); | ||
| 3450 | + this = this->next; | ||
| 3451 | + } | ||
| 3452 | + this->next = extra_keys++; | ||
| 3453 | + this = this->next; | ||
| 3454 | + } | ||
| 3455 | + this->name = strdup( name ); | ||
| 3456 | + this->value = value; | ||
| 3457 | + this->shift = shift; | ||
| 3458 | + return this; | ||
| 3459 | +} | ||
| 3460 | + | ||
| 3461 | phreak | 279 | +int |
| 3462 | eradicator | 150 | +main( int argc, char *argv[] ) |
| 3463 | +{ | ||
| 3464 | + int value, i; | ||
| 3465 | + t_key *this; | ||
| 3466 | + dir_name = getenv( "TOPDIR" ); | ||
| 3467 | + if ( !dir_name ) dir_name = "/usr/src/linux"; | ||
| 3468 | + bzero( key_table, sizeof( key_table ) ); | ||
| 3469 | + add_key( "shift", 1, is_shift ); | ||
| 3470 | + add_key( "altgr", 2, is_shift ); | ||
| 3471 | + add_key( "ctrl", 4, is_shift ); | ||
| 3472 | + add_key( "alt", 8, is_shift ); | ||
| 3473 | + add_key( "spk", 16, is_shift ); | ||
| 3474 | + add_key( "double", 32, is_shift ); | ||
| 3475 | + open_input( "include/linux/input.h" ); | ||
| 3476 | + while ( get_define( ) ) { | ||
| 3477 | + if ( strncmp( def_name, "KEY_", 4 ) ) continue; | ||
| 3478 | + value = atoi( def_val ); | ||
| 3479 | + if ( value > 0 && value < MAXKEYVAL ) | ||
| 3480 | + add_key( def_name, value, is_input ); | ||
| 3481 | + } | ||
| 3482 | + open_input( "drivers/char/speakup/keyinfo.h" ); | ||
| 3483 | + while ( get_define( ) ) { | ||
| 3484 | + if ( strlen( def_val ) > 5 ) { | ||
| 3485 | + if ( !( cp = strchr( def_val, '+' ) ) ) continue; | ||
| 3486 | + *cp++ = '\0'; | ||
| 3487 | + this = find_key( def_val ); | ||
| 3488 | + if ( !this || *cp < '0' || *cp > '9' ) continue; | ||
| 3489 | + value = this->value+atoi( cp ); | ||
| 3490 | phreak | 279 | + } else if ( !strncmp( def_val, "0x", 2 ) ) |
| 3491 | eradicator | 150 | + sscanf( def_val+2, "%x", &value ); |
| 3492 | + else if ( *def_val >= '0' && *def_val <= '9' ) | ||
| 3493 | + value = atoi( def_val ); | ||
| 3494 | + else continue; | ||
| 3495 | + add_key( def_name, value, is_spk ); | ||
| 3496 | + } | ||
| 3497 | + printf( "t_key_init init_key_data[] = {\n" ); | ||
| 3498 | + for ( i = 0; i < HASHSIZE; i++ ) { | ||
| 3499 | + this = &key_table[i]; | ||
| 3500 | + if ( !this->name ) continue; | ||
| 3501 | + do { | ||
| 3502 | + printf( "\t\"%s\", %d, %d,\n", this->name, this->value, this->shift ); | ||
| 3503 | + this = this->next; | ||
| 3504 | + } while ( this ); | ||
| 3505 | + } | ||
| 3506 | + printf( "\t\".\", 0, 0\n};\n" ); | ||
| 3507 | + exit( 0 ); | ||
| 3508 | +} | ||
| 3509 | phreak | 327 | Index: linux-git/drivers/char/speakup/mod_code.c |
| 3510 | phreak | 279 | =================================================================== |
| 3511 | --- /dev/null | ||
| 3512 | phreak | 327 | +++ linux-git/drivers/char/speakup/mod_code.c |
| 3513 | eradicator | 150 | @@ -0,0 +1,22 @@ |
| 3514 | +/* this code is to modularize a synth specific file, included at the end */ | ||
| 3515 | + | ||
| 3516 | +static void __exit mod_synth_exit( void ) | ||
| 3517 | +{ | ||
| 3518 | phreak | 279 | + if ( synth == &MY_SYNTH ) |
| 3519 | eradicator | 150 | + synth_release( ); |
| 3520 | + synth_remove( &MY_SYNTH ); | ||
| 3521 | +} | ||
| 3522 | + | ||
| 3523 | +static int __init mod_synth_init( void ) | ||
| 3524 | +{ | ||
| 3525 | + int status = do_synth_init( &MY_SYNTH ); | ||
| 3526 | + if ( status != 0 ) return status; | ||
| 3527 | + synth_add( &MY_SYNTH ); | ||
| 3528 | + return 0; | ||
| 3529 | +} | ||
| 3530 | + | ||
| 3531 | +module_init( mod_synth_init ); | ||
| 3532 | +module_exit( mod_synth_exit ); | ||
| 3533 | +MODULE_AUTHOR("Kirk Reiser <kirk@braille.uwo.ca>"); | ||
| 3534 | +MODULE_DESCRIPTION("Synthesizer driver module for speakup for the synth->long_name"); | ||
| 3535 | +MODULE_LICENSE( "GPL" ); | ||
| 3536 | phreak | 327 | Index: linux-git/drivers/char/speakup/serialio.h |
| 3537 | phreak | 279 | =================================================================== |
| 3538 | --- /dev/null | ||
| 3539 | phreak | 327 | +++ linux-git/drivers/char/speakup/serialio.h |
| 3540 | eradicator | 150 | @@ -0,0 +1,18 @@ |
| 3541 | +#ifndef SSPK_SERIAL | ||
| 3542 | +#define SSPK_SERIAL | ||
| 3543 | + | ||
| 3544 | phreak | 279 | +#include <linux/serial.h> /* for rs_table, serial constants & |
| 3545 | eradicator | 150 | + serial_uart_config */ |
| 3546 | +#include <linux/serial_reg.h> /* for more serial constants */ | ||
| 3547 | +#include <linux/serialP.h> /* for struct serial_state */ | ||
| 3548 | +#include <asm/serial.h> | ||
| 3549 | + | ||
| 3550 | +#define SPK_SERIAL_TIMEOUT 1000000 /* countdown values for serial timeouts */ | ||
| 3551 | +#define SPK_XMITR_TIMEOUT 1000000 /* countdown values transmitter/dsr timeouts */ | ||
| 3552 | +#define SPK_LO_TTY 0 /* check ttyS0 ... ttyS3 */ | ||
| 3553 | +#define SPK_HI_TTY 3 | ||
| 3554 | +#define NUM_DISABLE_TIMEOUTS 3 /* # of timeouts permitted before disable */ | ||
| 3555 | +#define SPK_TIMEOUT 100 /* buffer timeout in ms */ | ||
| 3556 | +#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) | ||
| 3557 | + | ||
| 3558 | +#endif | ||
| 3559 | phreak | 327 | Index: linux-git/drivers/char/speakup/speakup.c |
| 3560 | phreak | 279 | =================================================================== |
| 3561 | --- /dev/null | ||
| 3562 | phreak | 327 | +++ linux-git/drivers/char/speakup/speakup.c |
| 3563 | dsd | 243 | @@ -0,0 +1,2721 @@ |
| 3564 | eradicator | 150 | +/* speakup.c |
| 3565 | + review functions for the speakup screen review package. | ||
| 3566 | + originally written by: Kirk Reiser and Andy Berdan. | ||
| 3567 | + | ||
| 3568 | + extensively modified by David Borowski. | ||
| 3569 | + | ||
| 3570 | + Copyright (C ) 1998 Kirk Reiser. | ||
| 3571 | + Copyright (C ) 2003 David Borowski. | ||
| 3572 | + | ||
| 3573 | + This program is free software; you can redistribute it and/or modify | ||
| 3574 | + it under the terms of the GNU General Public License as published by | ||
| 3575 | + the Free Software Foundation; either version 2 of the License, or | ||
| 3576 | + (at your option ) any later version. | ||
| 3577 | + | ||
| 3578 | + This program is distributed in the hope that it will be useful, | ||
| 3579 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 3580 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 3581 | + GNU General Public License for more details. | ||
| 3582 | + | ||
| 3583 | + You should have received a copy of the GNU General Public License | ||
| 3584 | + along with this program; if not, write to the Free Software | ||
| 3585 | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 3586 | +*/ | ||
| 3587 | + | ||
| 3588 | +#define __KERNEL_SYSCALLS__ | ||
| 3589 | + | ||
| 3590 | +#include <linux/kernel.h> | ||
| 3591 | +#include <linux/version.h> | ||
| 3592 | +#include <linux/vt.h> | ||
| 3593 | +#include <linux/tty.h> | ||
| 3594 | +#include <linux/mm.h> /* __get_free_page( ) and friends */ | ||
| 3595 | +#include <linux/vt_kern.h> | ||
| 3596 | +#include <linux/ctype.h> | ||
| 3597 | +#include <linux/selection.h> | ||
| 3598 | +#include <asm/uaccess.h> /* copy_from|to|user( ) and others */ | ||
| 3599 | +#include <linux/unistd.h> | ||
| 3600 | + | ||
| 3601 | +#include <linux/keyboard.h> /* for KT_SHIFT */ | ||
| 3602 | +#include <linux/kbd_kern.h> /* for vc_kbd_* and friends */ | ||
| 3603 | +#include <linux/vt_kern.h> | ||
| 3604 | +#include <linux/input.h> | ||
| 3605 | +#include <linux/kmod.h> | ||
| 3606 | +#include <linux/speakup.h> | ||
| 3607 | + | ||
| 3608 | +#include "cvsversion.h" | ||
| 3609 | +#include "spk_priv.h" | ||
| 3610 | +#include <linux/bootmem.h> /* for alloc_bootmem */ | ||
| 3611 | + | ||
| 3612 | +/* speakup_*_selection */ | ||
| 3613 | +#include <linux/module.h> | ||
| 3614 | +#include <linux/sched.h> | ||
| 3615 | +#include <linux/slab.h> | ||
| 3616 | +#include <linux/types.h> | ||
| 3617 | +#include <asm/uaccess.h> | ||
| 3618 | +#include <linux/consolemap.h> | ||
| 3619 | + | ||
| 3620 | +#define SPEAKUP_VERSION "Speakup v-2.00" CVSVERSION | ||
| 3621 | +#define MAX_DELAY ( (500 * HZ ) / 1000 ) | ||
| 3622 | +#define KEY_MAP_VER 119 | ||
| 3623 | +#define MINECHOCHAR SPACE | ||
| 3624 | + | ||
| 3625 | +/* these are globals from the kernel code */ | ||
| 3626 | +extern void *kmalloc (size_t, unsigned int ); | ||
| 3627 | +extern void kfree (const void * ); | ||
| 3628 | +extern struct kbd_struct * kbd; | ||
| 3629 | +extern int fg_console; | ||
| 3630 | +extern short punc_masks[]; | ||
| 3631 | + | ||
| 3632 | +static special_func special_handler = NULL; | ||
| 3633 | +special_func help_handler = NULL; | ||
| 3634 | + | ||
| 3635 | +int synth_file_inuse = 0; | ||
| 3636 | +short pitch_shift = 0, synth_flags = 0; | ||
| 3637 | +static char buf[256]; | ||
| 3638 | +short attrib_bleep = 0, bleeps = 0, bleep_time = 1; | ||
| 3639 | +short no_intr = 0, spell_delay = 0; | ||
| 3640 | +short key_echo = 0, cursor_timeout = 120, say_word_ctl = 0; | ||
| 3641 | +short say_ctrl = 0, bell_pos = 0; | ||
| 3642 | +short punc_mask = 0, punc_level = 0, reading_punc = 0; | ||
| 3643 | +char str_caps_start[MAXVARLEN+1] = "\0", str_caps_stop[MAXVARLEN+1] = "\0"; | ||
| 3644 | +bits_data punc_info[] = { | ||
| 3645 | + { "none", "", 0 }, | ||
| 3646 | + { "some", "/$%&@", SOME }, | ||
| 3647 | + { "most", "$%&#()=+*/@^<>|\\", MOST }, | ||
| 3648 | + { "all", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", PUNC }, | ||
| 3649 | + { "delimiters", "", B_WDLM }, | ||
| 3650 | + { "repeats", "()", CH_RPT }, | ||
| 3651 | + { "extended numeric", "", B_EXNUM }, | ||
| 3652 | + { "symbols", "", B_SYM }, | ||
| 3653 | + { 0, 0 } | ||
| 3654 | +}; | ||
| 3655 | +char mark_cut_flag = 0; | ||
| 3656 | +u_short mark_x = 0, mark_y = 0; | ||
| 3657 | dsd | 243 | +char synth_name[10] = CONFIG_SPEAKUP_DEFAULT; |
| 3658 | eradicator | 150 | +#define MAX_KEY 160 |
| 3659 | +u_char *our_keys[MAX_KEY], *shift_table; | ||
| 3660 | +static u_char key_buf[600]; | ||
| 3661 | +static u_char key_defaults[] = { | ||
| 3662 | +#include "speakupmap.h" | ||
| 3663 | +}; | ||
| 3664 | + | ||
| 3665 | dsd | 198 | +// Speakup Cursor Track Variables |
| 3666 | +#define MAXCURSORTRACK 2 | ||
| 3667 | +static int cursor_track = 1; | ||
| 3668 | +static int prev_cursor_track=1; | ||
| 3669 | +static int read_all_mode=MAXCURSORTRACK+1; | ||
| 3670 | + | ||
| 3671 | eradicator | 150 | +struct tty_struct *tty; |
| 3672 | +#define key_handler k_handler | ||
| 3673 | +typedef void (*k_handler_fn)(struct vc_data *vc, unsigned char value, | ||
| 3674 | + char up_flag, struct pt_regs *regs); | ||
| 3675 | +#define KBD_PROTO struct vc_data *vc, u_char value, char up_flag, struct pt_regs *regs | ||
| 3676 | +#define KBD_ARGS vc, value, up_flag, regs | ||
| 3677 | +extern k_handler_fn key_handler[16]; | ||
| 3678 | +static k_handler_fn do_shift, do_spec, do_latin, do_cursor; | ||
| 3679 | +EXPORT_SYMBOL( help_handler ); | ||
| 3680 | +EXPORT_SYMBOL( special_handler ); | ||
| 3681 | +EXPORT_SYMBOL( our_keys ); | ||
| 3682 | dsd | 243 | +EXPORT_SYMBOL(synth_name); |
| 3683 | eradicator | 150 | + |
| 3684 | +static void speakup_date (struct vc_data *vc ); | ||
| 3685 | +static void spkup_write (const char *in_buf, int count ); | ||
| 3686 | +int set_mask_bits( const char *input, const int which, const int how ); | ||
| 3687 | + | ||
| 3688 | +char str_ctl[] = "control-"; | ||
| 3689 | +char *colors[] = { | ||
| 3690 | + "black", "blue", "green", "cyan", "red", "magenta", "yellow", "white", | ||
| 3691 | + "grey" | ||
| 3692 | +}; | ||
| 3693 | + | ||
| 3694 | +char *phonetic[] = { | ||
| 3695 | + "alpha", "beta", "charley", "delta", "echo", "fox", "gamma", "hotel", | ||
| 3696 | + "india", "juleiet", "keelo", "leema", "mike", "november", "oscar", | ||
| 3697 | + "papa", | ||
| 3698 | + "quebec", "romeo", "seeara", "tango", "uniform", "victer", "wiskey", | ||
| 3699 | + "x ray", "yankee", "zooloo" | ||
| 3700 | +}; | ||
| 3701 | + | ||
| 3702 | +// array of 256 char pointers (one for each ASCII character description ) | ||
| 3703 | +// initialized to default_chars and user selectable via /proc/speakup/characters | ||
| 3704 | +char *characters[256]; | ||
| 3705 | + | ||
| 3706 | +char *default_chars[256] = { | ||
| 3707 | + "null", "^a", "^b", "^c", "^d", "^e", "^f", "^g", | ||
| 3708 | + "^h", "^i", "^j", "^k", "^l", "^m", "^n", "^o", | ||
| 3709 | + "^p", "^q", "^r", "^s", "^t", "^u", "^v", "^w", | ||
| 3710 | + "^x", "^y", "^z", NULL, NULL, NULL, NULL, NULL, | ||
| 3711 | + "space", "bang!", "quote", "number", "dollar", "percent", "and", | ||
| 3712 | + "tick", | ||
| 3713 | + "left paren", "right paren", "star", "plus", "comma", "dash", "dot", | ||
| 3714 | + "slash", | ||
| 3715 | + "zero", "one", "two", "three", "four", "five", "six", "seven", | ||
| 3716 | + "eight", "nine", | ||
| 3717 | + "colon", "semmy", "less", "equals", "greater", "question", "at", | ||
| 3718 | + "eigh", "b", "c", "d", "e", "f", "g", | ||
| 3719 | + "h", "i", "j", "k", "l", "m", "n", "o", | ||
| 3720 | + "p", "q", "r", "s", "t", "u", "v", "w", "x", | ||
| 3721 | + "y", "zehd", "left bracket", "backslash", "right bracket", "caret", | ||
| 3722 | + "line", | ||
| 3723 | + "accent", NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
| 3724 | + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
| 3725 | + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
| 3726 | + NULL, NULL, NULL, "left brace", "bar", "right brace", "tihlduh", | ||
| 3727 | + "delta", "see cedilla", "u oomlout", "e acute", /* 128 */ | ||
| 3728 | + "eigh circumflex", "eigh oomlout", "eigh grave", "eigh ring", /* 132 */ | ||
| 3729 | + "see cedilla", "e circumflex", "e oomlout", "e grave", /* 136 */ | ||
| 3730 | + "i oomlout", "i circumflex", "i grave", "eigh oomlout", /* 140 */ | ||
| 3731 | + "eigh ring", "e acute", "eigh e dipthong", "eigh e dipthong", /* 144 */ | ||
| 3732 | + "o circumflex", "o oomlout", "o grave", "u circumflex", /* 148 */ | ||
| 3733 | + "u grave", "y oomlout", "o oomlout", "u oomlout", /* 152 */ | ||
| 3734 | + "cents", "pounds", "yen", "peseta", /* 156 */ | ||
| 3735 | + "florin", "eigh acute", "i acute", "o acute", /* 160 */ | ||
| 3736 | + "u acute", "n tilde", "n tilde", "feminine ordinal", /* 164 */ | ||
| 3737 | + "masculin ordinal", "inverted question", "reversed not", "not", /* 168 */ | ||
| 3738 | + "half", "quarter", "inverted bang", "much less than", /* 172 */ | ||
| 3739 | + "much greater than", "dark shading", "medium shading", /* 176 */ | ||
| 3740 | + "light shading", "verticle line", "left tee", /* 179 */ | ||
| 3741 | + "double left tee", "left double tee", "double top right", /* 182 */ | ||
| 3742 | + "top double right", "double left double tee", /* 185 */ | ||
| 3743 | + "double vertical line", "double top double right", /* 187 */ | ||
| 3744 | + "double bottom double right", "double bottom right", /* 189 */ | ||
| 3745 | + "bottom double right", "top right", "left bottom", /* 191 */ | ||
| 3746 | + "up tee", "tee down", "tee right", "horizontal line", /* 194 */ | ||
| 3747 | + "cross bars", "tee double right", "double tee right", /* 198 */ | ||
| 3748 | + "double left double bottom", "double left double top", /* 201 */ | ||
| 3749 | + "double up double tee", "double tee double down", /* 203 */ | ||
| 3750 | + "double tee double right", "double horizontal line", /* 205 */ | ||
| 3751 | + "double cross bars", "up double tee", "double up tee", /* 207 */ | ||
| 3752 | + "double tee down", "tee double down", /* 210 */ | ||
| 3753 | + "double left bottom", "left double bottom", /* 212 */ | ||
| 3754 | + "double left top", "left double top", /* 214 */ | ||
| 3755 | + "double vertical cross", "double horizontal cross", /* 216 */ | ||
| 3756 | + "bottom right", "left top", "solid square", /* 218 */ | ||
| 3757 | + "solid lower half", "solid left half", "solid right half", /* 221 */ | ||
| 3758 | + "solid upper half", "alpha", "beta", "gamma", /* 224 */ | ||
| 3759 | + "pie", "sigma", "sigma", "mu", /* 228 */ | ||
| 3760 | + "tou", "phigh", "thayta", "ohmega", /* 232 */ | ||
| 3761 | + "delta", "infinity", "phigh", "epsilaun", /* 236 */ | ||
| 3762 | +"intersection", "identical to", "plus or minus", "equal grater than", /* 240 */ | ||
| 3763 | + "less than equal", "upper integral", "lower integral", /* 244 */ | ||
| 3764 | + "divided by", "almost equal", "degrees", /* 247 */ | ||
| 3765 | + "centre dot", "bullet", "square root", /* 250 */ | ||
| 3766 | + "power", "squared", "black square", "white space" /* 252 */ | ||
| 3767 | +}; | ||
| 3768 | + | ||
| 3769 | +u_short spk_chartab[256] = { | ||
| 3770 | + B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /* 0-7 */ | ||
| 3771 | + B_CTL, B_CTL, A_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /* 8-15 */ | ||
| 3772 | + B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /*16-23 */ | ||
| 3773 | + B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, B_CTL, /* 24-31 */ | ||
| 3774 | +WDLM, A_PUNC, PUNC, PUNC, PUNC, PUNC, PUNC, A_PUNC, /* !"#$%&' */ | ||
| 3775 | +PUNC, PUNC, PUNC, PUNC, A_PUNC, A_PUNC, A_PUNC, PUNC, /* ( )*+, -./ */ | ||
| 3776 | +NUM, NUM, NUM, NUM, NUM, NUM, NUM, NUM, /* 01234567 */ | ||
| 3777 | +NUM, NUM, A_PUNC, PUNC, PUNC, PUNC, PUNC, A_PUNC, /* 89:;<=>? */ | ||
| 3778 | +PUNC, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, /* @ABCDEFG */ | ||
| 3779 | +A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, /* HIJKLMNO */ | ||
| 3780 | +A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, A_CAP, /* PQRSTUVW */ | ||
| 3781 | +A_CAP, A_CAP, A_CAP, PUNC, PUNC, PUNC, PUNC, PUNC, /* XYZ[\]^_ */ | ||
| 3782 | +PUNC, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, /* `abcdefg */ | ||
| 3783 | +ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, /* hijklmno */ | ||
| 3784 | +ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, ALPHA, /* pqrstuvw */ | ||
| 3785 | +ALPHA, ALPHA, ALPHA, PUNC, PUNC, PUNC, PUNC, 0, /* xyz{|}~ */ | ||
| 3786 | +B_CAPSYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 128-135 */ | ||
| 3787 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_CAPSYM, /* 136-143 */ | ||
| 3788 | +B_CAPSYM, B_CAPSYM, B_SYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 144-151 */ | ||
| 3789 | +B_SYM, B_SYM, B_CAPSYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 152-159 */ | ||
| 3790 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_CAPSYM, B_SYM, /* 160-167 */ | ||
| 3791 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 168-175 */ | ||
| 3792 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 176-183 */ | ||
| 3793 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 184-191 */ | ||
| 3794 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 192-199 */ | ||
| 3795 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 200-207 */ | ||
| 3796 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 208-215 */ | ||
| 3797 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 216-223 */ | ||
| 3798 | +B_SYM, B_SYM, B_SYM, B_CAPSYM, B_SYM, B_CAPSYM, B_SYM, B_SYM, /* 224-231 */ | ||
| 3799 | +B_SYM, B_CAPSYM, B_CAPSYM, B_CAPSYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 232-239 */ | ||
| 3800 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, /* 240-247 */ | ||
| 3801 | +B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM, B_SYM /* 248-255 */ | ||
| 3802 | +}; | ||
| 3803 | + | ||
| 3804 | +int spk_keydown = 0; | ||
| 3805 | +static u_char spk_lastkey = 0, spk_close_press = 0, keymap_flags = 0; | ||
| 3806 | +static u_char last_keycode = 0, this_speakup_key = 0; | ||
| 3807 | +static u_long last_spk_jiffy = 0; | ||
| 3808 | + | ||
| 3809 | +spk_t *speakup_console[MAX_NR_CONSOLES]; | ||
| 3810 | + | ||
| 3811 | +int spk_setup (char *str ) | ||
| 3812 | +{ | ||
| 3813 | + int ints[4]; | ||
| 3814 | + str = get_options (str, ARRAY_SIZE (ints ), ints ); | ||
| 3815 | + if (ints[0] > 0 && ints[1] >= 0 ) | ||
| 3816 | + synth_port_forced = ints[1]; | ||
| 3817 | + return 1; | ||
| 3818 | +} | ||
| 3819 | + | ||
| 3820 | +int spk_ser_setup (char *str ) | ||
| 3821 | +{ | ||
| 3822 | + int lookup[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; | ||
| 3823 | + int ints[4]; | ||
| 3824 | + str = get_options (str, ARRAY_SIZE (ints ), ints ); | ||
| 3825 | + if (ints[0] > 0 && ints[1] >= 0 ) | ||
| 3826 | + synth_port_forced = lookup[ints[1]]; | ||
| 3827 | + return 1; | ||
| 3828 | +} | ||
| 3829 | + | ||
| 3830 | +int spk_synth_setup (char *str ) | ||
| 3831 | +{ | ||
| 3832 | + size_t len = MIN (strlen (str ), 9 ); | ||
| 3833 | + memcpy (synth_name, str, len ); | ||
| 3834 | + synth_name[len] = '\0'; | ||
| 3835 | + return 1; | ||
| 3836 | +} | ||
| 3837 | + | ||
| 3838 | +__setup ("speakup_port=", spk_setup ); | ||
| 3839 | +__setup ("speakup_ser=", spk_ser_setup ); | ||
| 3840 | +__setup ("speakup_synth=", spk_synth_setup ); | ||
| 3841 | + | ||
| 3842 | +char * | ||
| 3843 | +strlwr (char *s ) | ||
| 3844 | +{ | ||
| 3845 | + char *p; | ||
| 3846 | + for (p = s; *p; p++ ) { | ||
| 3847 | + if (*p >= CAP_A && *p <= CAP_Z ) *p |= 32; | ||
| 3848 | + } | ||
| 3849 | + return s; | ||
| 3850 | +} | ||
| 3851 | + | ||
| 3852 | +static void | ||
| 3853 | +bleep (u_short val ) | ||
| 3854 | +{ | ||
| 3855 | + static short vals[] = { 350, 370, 392, 414, 440, 466, 491, 523, | ||
| 3856 | +554, 587, 619, 659 }; | ||
| 3857 | + short freq; | ||
| 3858 | + int time = bleep_time; | ||
| 3859 | + freq = vals[val%12]; | ||
| 3860 | + if (val > 11 ) | ||
| 3861 | + freq *= (1<<(val/12 ) ); | ||
| 3862 | + kd_mksound (freq, time ); | ||
| 3863 | +} | ||
| 3864 | + | ||
| 3865 | +void | ||
| 3866 | +speakup_shut_up (struct vc_data *vc ) | ||
| 3867 | +{ | ||
| 3868 | + if (spk_killed ) return; | ||
| 3869 | + spk_shut_up |= 0x01; | ||
| 3870 | + spk_parked &= 0xfe; | ||
| 3871 | + speakup_date (vc ); | ||
| 3872 | + if (synth == NULL ) return; | ||
| 3873 | + do_flush( ); | ||
| 3874 | +} | ||
| 3875 | + | ||
| 3876 | +void | ||
| 3877 | +speech_kill (struct vc_data *vc ) | ||
| 3878 | +{ | ||
| 3879 | + char val = synth->is_alive ( ); | ||
| 3880 | + if (val == 0 ) return; | ||
| 3881 | + /* re-enables synth, if disabled */ | ||
| 3882 | + if (val == 2 || spk_killed ) { /* dead */ | ||
| 3883 | + spk_shut_up &= ~0x40; | ||
| 3884 | + synth_write_msg ("Eyem a Lighve!" ); | ||
| 3885 | + } else { | ||
| 3886 | + synth_write_msg ("You killed speak up!" ); | ||
| 3887 | + spk_shut_up |= 0x40; | ||
| 3888 | + } | ||
| 3889 | +} | ||
| 3890 | + | ||
| 3891 | +static void | ||
| 3892 | +speakup_off (struct vc_data *vc ) | ||
| 3893 | +{ | ||
| 3894 | + if (spk_shut_up & 0x80 ) { | ||
| 3895 | + spk_shut_up &= 0x7f; | ||
| 3896 | + synth_write_msg ("hey. That's better!" ); | ||
| 3897 | + } else { | ||
| 3898 | + spk_shut_up |= 0x80; | ||
| 3899 | + synth_write_msg ("You turned me off!" ); | ||
| 3900 | + } | ||
| 3901 | + speakup_date (vc ); | ||
| 3902 | +} | ||
| 3903 | + | ||
| 3904 | +static void | ||
| 3905 | +speakup_parked (struct vc_data *vc ) | ||
| 3906 | +{ | ||
| 3907 | + if (spk_parked & 0x80 ) { | ||
| 3908 | + spk_parked = 0; | ||
| 3909 | + synth_write_msg ("unparked!" ); | ||
| 3910 | + } else { | ||
| 3911 | + spk_parked |= 0x80; | ||
| 3912 | + synth_write_msg ("parked!" ); | ||
| 3913 | + } | ||
| 3914 | +} | ||
| 3915 | + | ||
| 3916 | +/* ------ cut and paste ----- */ | ||
| 3917 | +/* Don't take this from <ctype.h>: 011-015 on the screen aren't spaces */ | ||
| 3918 | +#undef isspace | ||
| 3919 | +#define isspace(c) ((c) == ' ') | ||
| 3920 | +/* Variables for selection control. */ | ||
| 3921 | +struct vc_data *spk_sel_cons; /* defined in selection.c must not be disallocated */ | ||
| 3922 | +static volatile int sel_start = -1; /* cleared by clear_selection */ | ||
| 3923 | +static int sel_end; | ||
| 3924 | +static int sel_buffer_lth; | ||
| 3925 | +static char *sel_buffer; | ||
| 3926 | + | ||
| 3927 | +static unsigned char | ||
| 3928 | +sel_pos(int n) | ||
| 3929 | +{ | ||
| 3930 | + return inverse_translate(spk_sel_cons, screen_glyph(spk_sel_cons, n)); | ||
| 3931 | +} | ||
| 3932 | + | ||
| 3933 | +static void | ||
| 3934 | +speakup_clear_selection(void) | ||
| 3935 | +{ | ||
| 3936 | + sel_start = -1; | ||
| 3937 | +} | ||
| 3938 | + | ||
| 3939 | +/* does screen address p correspond to character at LH/RH edge of screen? */ | ||
| 3940 | +static inline int atedge(const int p, int size_row) | ||
| 3941 | +{ | ||
| 3942 | + return (!(p % size_row) || !((p + 2) % size_row)); | ||
| 3943 | +} | ||
| 3944 | + | ||
| 3945 | +/* constrain v such that v <= u */ | ||
| 3946 | +static inline unsigned short limit(const unsigned short v, const unsigned short u) | ||
| 3947 | +{ | ||
| 3948 | + return (v > u) ? u : v; | ||
| 3949 | +} | ||
| 3950 | + | ||
| 3951 | +unsigned short xs, ys, xe, ye; /* our region points */ | ||
| 3952 | + | ||
| 3953 | phreak | 279 | +static int |
| 3954 | eradicator | 150 | +speakup_set_selection( struct tty_struct *tty) |
| 3955 | +{ | ||
| 3956 | + int new_sel_start, new_sel_end; | ||
| 3957 | + char *bp, *obp; | ||
| 3958 | + int i, ps, pe; | ||
| 3959 | + struct vc_data *vc = vc_cons[fg_console].d; | ||
| 3960 | + | ||
| 3961 | + xs = limit(xs, vc->vc_cols - 1); | ||
| 3962 | + ys = limit(ys, vc->vc_rows - 1); | ||
| 3963 | + xe = limit(xe, vc->vc_cols - 1); | ||
| 3964 | + ye = limit(ye, vc->vc_rows - 1); | ||
| 3965 | + ps = ys * vc->vc_size_row + (xs << 1); | ||
| 3966 | + pe = ye * vc->vc_size_row + (xe << 1); | ||
| 3967 | + | ||
| 3968 | + if (ps > pe) { /* make sel_start <= sel_end */ | ||
| 3969 | + int tmp = ps; | ||
| 3970 | + ps = pe; | ||
| 3971 | + pe = tmp; | ||
| 3972 | + } | ||
| 3973 | + | ||
| 3974 | + if (spk_sel_cons != vc_cons[fg_console].d) { | ||
| 3975 | + speakup_clear_selection(); | ||
| 3976 | + spk_sel_cons = vc_cons[fg_console].d; | ||
| 3977 | + printk(KERN_WARNING "Selection: mark console not the same as cut\n"); | ||
| 3978 | + return -EINVAL; | ||
| 3979 | + } | ||
| 3980 | + | ||
| 3981 | + new_sel_start = ps; | ||
| 3982 | + new_sel_end = pe; | ||
| 3983 | + | ||
| 3984 | + /* select to end of line if on trailing space */ | ||
| 3985 | + if (new_sel_end > new_sel_start && | ||
| 3986 | + !atedge(new_sel_end, vc->vc_size_row) && | ||
| 3987 | + isspace(sel_pos(new_sel_end))) { | ||
| 3988 | + for (pe = new_sel_end + 2; ; pe += 2) | ||
| 3989 | + if (!isspace(sel_pos(pe)) || | ||
| 3990 | + atedge(pe, vc->vc_size_row)) | ||
| 3991 | + break; | ||
| 3992 | + if (isspace(sel_pos(pe))) | ||
| 3993 | + new_sel_end = pe; | ||
| 3994 | + } | ||
| 3995 | + if ((new_sel_start == sel_start) | ||
| 3996 | + && (new_sel_end == sel_end)) /* no action required */ | ||
| 3997 | + return 0; | ||
| 3998 | + | ||
| 3999 | + sel_start = new_sel_start; | ||
| 4000 | + sel_end = new_sel_end; | ||
| 4001 | + /* Allocate a new buffer before freeing the old one ... */ | ||
| 4002 | + bp = kmalloc((sel_end-sel_start)/2+1, GFP_ATOMIC); | ||
| 4003 | + if (!bp) { | ||
| 4004 | + printk(KERN_WARNING "selection: kmalloc() failed\n"); | ||
| 4005 | + speakup_clear_selection(); | ||
| 4006 | + return -ENOMEM; | ||
| 4007 | + } | ||
| 4008 | + if (sel_buffer) | ||
| 4009 | + kfree(sel_buffer); | ||
| 4010 | + sel_buffer = bp; | ||
| 4011 | + | ||
| 4012 | + obp = bp; | ||
| 4013 | + for (i = sel_start; i <= sel_end; i += 2) { | ||
| 4014 | + *bp = sel_pos(i); | ||
| 4015 | + if (!isspace(*bp++)) | ||
| 4016 | + obp = bp; | ||
| 4017 | + if (! ((i + 2) % vc->vc_size_row)) { | ||
| 4018 | + /* strip trailing blanks from line and add newline, | ||
| 4019 | + unless non-space at end of line. */ | ||
| 4020 | + if (obp != bp) { | ||
| 4021 | + bp = obp; | ||
| 4022 | + *bp++ = '\r'; | ||
| 4023 | + } | ||
| 4024 | + obp = bp; | ||
| 4025 | + } | ||
| 4026 | + } | ||
| 4027 | + sel_buffer_lth = bp - sel_buffer; | ||
| 4028 | + return 0; | ||
| 4029 | +} | ||
| 4030 | + | ||
| 4031 | phreak | 279 | +static int |
| 4032 | eradicator | 150 | +speakup_paste_selection(struct tty_struct *tty) |
| 4033 | +{ | ||
| 4034 | + struct vc_data *vc = (struct vc_data *) tty->driver_data; | ||
| 4035 | + int pasted = 0, count; | ||
| 4036 | + DECLARE_WAITQUEUE(wait, current); | ||
| 4037 | + add_wait_queue(&vc->paste_wait, &wait); | ||
| 4038 | + while (sel_buffer && sel_buffer_lth > pasted) { | ||
| 4039 | + set_current_state(TASK_INTERRUPTIBLE); | ||
| 4040 | + if (test_bit(TTY_THROTTLED, &tty->flags)) { | ||
| 4041 | + schedule(); | ||
| 4042 | + continue; | ||
| 4043 | + } | ||
| 4044 | + count = sel_buffer_lth - pasted; | ||
| 4045 | dsd | 338 | + count = MIN(count, tty->receive_room); |
| 4046 | eradicator | 150 | + tty->ldisc.receive_buf(tty, sel_buffer + pasted, 0, count); |
| 4047 | + pasted += count; | ||
| 4048 | + } | ||
| 4049 | + remove_wait_queue(&vc->paste_wait, &wait); | ||
| 4050 | + current->state = TASK_RUNNING; | ||
| 4051 | + return 0; | ||
| 4052 | +} | ||
| 4053 | + | ||
| 4054 | +static void | ||
| 4055 | +speakup_cut (struct vc_data *vc ) | ||
| 4056 | +{ | ||
| 4057 | + static const char err_buf[] = "set selection failed"; | ||
| 4058 | + int ret; | ||
| 4059 | + | ||
| 4060 | + if (!mark_cut_flag ) { | ||
| 4061 | + mark_cut_flag = 1; | ||
| 4062 | + xs = spk_x; | ||
| 4063 | + ys = spk_y; | ||
| 4064 | + spk_sel_cons = vc; | ||
| 4065 | + synth_write_msg ("mark" ); | ||
| 4066 | + return; | ||
| 4067 | + } | ||
| 4068 | + xe = (u_short ) spk_x; | ||
| 4069 | + ye = (u_short )spk_y; | ||
| 4070 | + mark_cut_flag = 0; | ||
| 4071 | + synth_write_msg ("cut" ); | ||
| 4072 | phreak | 279 | + |
| 4073 | eradicator | 150 | + speakup_clear_selection( ); |
| 4074 | + ret = speakup_set_selection ( tty ); | ||
| 4075 | + | ||
| 4076 | + switch (ret ) { | ||
| 4077 | + case 0: | ||
| 4078 | + break; /* no error */ | ||
| 4079 | + case -EFAULT : | ||
| 4080 | + pr_warn( "%sEFAULT\n", err_buf ); | ||
| 4081 | + break; | ||
| 4082 | + case -EINVAL : | ||
| 4083 | + pr_warn( "%sEINVAL\n", err_buf ); | ||
| 4084 | + break; | ||
| 4085 | + case -ENOMEM : | ||
| 4086 | + pr_warn( "%sENOMEM\n", err_buf ); | ||
| 4087 | + break; | ||
| 4088 | + } | ||
| 4089 |