12067fd92SSamuel Thibault // SPDX-License-Identifier: GPL-2.0+ 22067fd92SSamuel Thibault /* 32067fd92SSamuel Thibault * originally written by: Kirk Reiser <kirk@braille.uwo.ca> 42067fd92SSamuel Thibault * this version considerably modified by David Borowski, david575@rogers.com 52067fd92SSamuel Thibault * eventually modified by Samuel Thibault <samuel.thibault@ens-lyon.org> 62067fd92SSamuel Thibault * 72067fd92SSamuel Thibault * Copyright (C) 1998-99 Kirk Reiser. 82067fd92SSamuel Thibault * Copyright (C) 2003 David Borowski. 92067fd92SSamuel Thibault * Copyright (C) 2007 Samuel Thibault. 102067fd92SSamuel Thibault * 112067fd92SSamuel Thibault * specificly written as a driver for the speakup screenreview 122067fd92SSamuel Thibault * s not a general device driver. 132067fd92SSamuel Thibault */ 142067fd92SSamuel Thibault #include "spk_priv.h" 152067fd92SSamuel Thibault #include "speakup.h" 162067fd92SSamuel Thibault 172067fd92SSamuel Thibault #define PROCSPEECH '\n' 182067fd92SSamuel Thibault #define DRV_VERSION "2.11" 192067fd92SSamuel Thibault #define SYNTH_CLEAR '!' 202067fd92SSamuel Thibault 212067fd92SSamuel Thibault static struct var_t vars[] = { 222067fd92SSamuel Thibault { CAPS_START, .u.s = {"CAPS_START\n" } }, 232067fd92SSamuel Thibault { CAPS_STOP, .u.s = {"CAPS_STOP\n" } }, 242067fd92SSamuel Thibault { PAUSE, .u.s = {"PAUSE\n"} }, 252067fd92SSamuel Thibault { RATE, .u.n = {"RATE %d\n", 8, 1, 16, 0, 0, NULL } }, 262067fd92SSamuel Thibault { PITCH, .u.n = {"PITCH %d\n", 8, 0, 16, 0, 0, NULL } }, 272067fd92SSamuel Thibault { INFLECTION, .u.n = {"INFLECTION %d\n", 8, 0, 16, 0, 0, NULL } }, 282067fd92SSamuel Thibault { VOL, .u.n = {"VOL %d\n", 8, 0, 16, 0, 0, NULL } }, 292067fd92SSamuel Thibault { TONE, .u.n = {"TONE %d\n", 8, 0, 16, 0, 0, NULL } }, 302067fd92SSamuel Thibault { DIRECT, .u.n = {NULL, 0, 0, 1, 0, 0, NULL } }, 312067fd92SSamuel Thibault V_LAST_VAR 322067fd92SSamuel Thibault }; 332067fd92SSamuel Thibault 342067fd92SSamuel Thibault /* 352067fd92SSamuel Thibault * These attributes will appear in /sys/accessibility/speakup/dummy. 362067fd92SSamuel Thibault */ 372067fd92SSamuel Thibault static struct kobj_attribute caps_start_attribute = 382067fd92SSamuel Thibault __ATTR(caps_start, 0644, spk_var_show, spk_var_store); 392067fd92SSamuel Thibault static struct kobj_attribute caps_stop_attribute = 402067fd92SSamuel Thibault __ATTR(caps_stop, 0644, spk_var_show, spk_var_store); 412067fd92SSamuel Thibault static struct kobj_attribute pitch_attribute = 422067fd92SSamuel Thibault __ATTR(pitch, 0644, spk_var_show, spk_var_store); 432067fd92SSamuel Thibault static struct kobj_attribute inflection_attribute = 442067fd92SSamuel Thibault __ATTR(inflection, 0644, spk_var_show, spk_var_store); 452067fd92SSamuel Thibault static struct kobj_attribute rate_attribute = 462067fd92SSamuel Thibault __ATTR(rate, 0644, spk_var_show, spk_var_store); 472067fd92SSamuel Thibault static struct kobj_attribute tone_attribute = 482067fd92SSamuel Thibault __ATTR(tone, 0644, spk_var_show, spk_var_store); 492067fd92SSamuel Thibault static struct kobj_attribute vol_attribute = 502067fd92SSamuel Thibault __ATTR(vol, 0644, spk_var_show, spk_var_store); 512067fd92SSamuel Thibault 522067fd92SSamuel Thibault static struct kobj_attribute delay_time_attribute = 532067fd92SSamuel Thibault __ATTR(delay_time, 0644, spk_var_show, spk_var_store); 542067fd92SSamuel Thibault static struct kobj_attribute direct_attribute = 552067fd92SSamuel Thibault __ATTR(direct, 0644, spk_var_show, spk_var_store); 562067fd92SSamuel Thibault static struct kobj_attribute full_time_attribute = 572067fd92SSamuel Thibault __ATTR(full_time, 0644, spk_var_show, spk_var_store); 582067fd92SSamuel Thibault static struct kobj_attribute jiffy_delta_attribute = 592067fd92SSamuel Thibault __ATTR(jiffy_delta, 0644, spk_var_show, spk_var_store); 602067fd92SSamuel Thibault static struct kobj_attribute trigger_time_attribute = 612067fd92SSamuel Thibault __ATTR(trigger_time, 0644, spk_var_show, spk_var_store); 622067fd92SSamuel Thibault 632067fd92SSamuel Thibault /* 642067fd92SSamuel Thibault * Create a group of attributes so that we can create and destroy them all 652067fd92SSamuel Thibault * at once. 662067fd92SSamuel Thibault */ 672067fd92SSamuel Thibault static struct attribute *synth_attrs[] = { 682067fd92SSamuel Thibault &caps_start_attribute.attr, 692067fd92SSamuel Thibault &caps_stop_attribute.attr, 702067fd92SSamuel Thibault &pitch_attribute.attr, 712067fd92SSamuel Thibault &inflection_attribute.attr, 722067fd92SSamuel Thibault &rate_attribute.attr, 732067fd92SSamuel Thibault &tone_attribute.attr, 742067fd92SSamuel Thibault &vol_attribute.attr, 752067fd92SSamuel Thibault &delay_time_attribute.attr, 762067fd92SSamuel Thibault &direct_attribute.attr, 772067fd92SSamuel Thibault &full_time_attribute.attr, 782067fd92SSamuel Thibault &jiffy_delta_attribute.attr, 792067fd92SSamuel Thibault &trigger_time_attribute.attr, 802067fd92SSamuel Thibault NULL, /* need to NULL terminate the list of attributes */ 812067fd92SSamuel Thibault }; 822067fd92SSamuel Thibault 83*a79db45fSSamuel Thibault static void read_buff_add(u_char c) 84*a79db45fSSamuel Thibault { 85*a79db45fSSamuel Thibault pr_info("speakup_dummy: got character %02x\n", c); 86*a79db45fSSamuel Thibault } 87*a79db45fSSamuel Thibault 882067fd92SSamuel Thibault static struct spk_synth synth_dummy = { 892067fd92SSamuel Thibault .name = "dummy", 902067fd92SSamuel Thibault .version = DRV_VERSION, 912067fd92SSamuel Thibault .long_name = "Dummy", 922067fd92SSamuel Thibault .init = "Speakup\n", 932067fd92SSamuel Thibault .procspeech = PROCSPEECH, 942067fd92SSamuel Thibault .clear = SYNTH_CLEAR, 952067fd92SSamuel Thibault .delay = 500, 962067fd92SSamuel Thibault .trigger = 50, 972067fd92SSamuel Thibault .jiffies = 50, 982067fd92SSamuel Thibault .full = 40000, 992067fd92SSamuel Thibault .dev_name = SYNTH_DEFAULT_DEV, 1002067fd92SSamuel Thibault .startup = SYNTH_START, 1012067fd92SSamuel Thibault .checkval = SYNTH_CHECK, 1022067fd92SSamuel Thibault .vars = vars, 1032067fd92SSamuel Thibault .io_ops = &spk_ttyio_ops, 1042067fd92SSamuel Thibault .probe = spk_ttyio_synth_probe, 1052067fd92SSamuel Thibault .release = spk_ttyio_release, 1062067fd92SSamuel Thibault .synth_immediate = spk_ttyio_synth_immediate, 1072067fd92SSamuel Thibault .catch_up = spk_do_catch_up_unicode, 1082067fd92SSamuel Thibault .flush = spk_synth_flush, 1092067fd92SSamuel Thibault .is_alive = spk_synth_is_alive_restart, 1102067fd92SSamuel Thibault .synth_adjust = NULL, 111*a79db45fSSamuel Thibault .read_buff_add = read_buff_add, 1122067fd92SSamuel Thibault .get_index = NULL, 1132067fd92SSamuel Thibault .indexing = { 1142067fd92SSamuel Thibault .command = NULL, 1152067fd92SSamuel Thibault .lowindex = 0, 1162067fd92SSamuel Thibault .highindex = 0, 1172067fd92SSamuel Thibault .currindex = 0, 1182067fd92SSamuel Thibault }, 1192067fd92SSamuel Thibault .attributes = { 1202067fd92SSamuel Thibault .attrs = synth_attrs, 1212067fd92SSamuel Thibault .name = "dummy", 1222067fd92SSamuel Thibault }, 1232067fd92SSamuel Thibault }; 1242067fd92SSamuel Thibault 1252067fd92SSamuel Thibault module_param_named(ser, synth_dummy.ser, int, 0444); 1262067fd92SSamuel Thibault module_param_named(dev, synth_dummy.dev_name, charp, 0444); 1272067fd92SSamuel Thibault module_param_named(start, synth_dummy.startup, short, 0444); 1282067fd92SSamuel Thibault 1292067fd92SSamuel Thibault MODULE_PARM_DESC(ser, "Set the serial port for the synthesizer (0-based)."); 1302067fd92SSamuel Thibault MODULE_PARM_DESC(dev, "Set the device e.g. ttyUSB0, for the synthesizer."); 1312067fd92SSamuel Thibault MODULE_PARM_DESC(start, "Start the synthesizer once it is loaded."); 1322067fd92SSamuel Thibault 1332067fd92SSamuel Thibault module_spk_synth(synth_dummy); 1342067fd92SSamuel Thibault 1352067fd92SSamuel Thibault MODULE_AUTHOR("Samuel Thibault <samuel.thibault@ens-lyon.org>"); 1362067fd92SSamuel Thibault MODULE_DESCRIPTION("Speakup support for text console"); 1372067fd92SSamuel Thibault MODULE_LICENSE("GPL"); 1382067fd92SSamuel Thibault MODULE_VERSION(DRV_VERSION); 1392067fd92SSamuel Thibault 140