1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
|
/* $Id: citron.h,v 1.2 2008/08/23 13:05:44 matthieu Exp $
* Copyright (c) 1998 Metro Link Incorporated
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Metro Link shall not be
* used in advertising or otherwise to promote the sale, use or other dealings
* in this Software without prior written authorization from Metro Link.
*
*/
/* $XFree86: xc/programs/Xserver/hw/xfree86/input/citron/citron.h,v 1.1 2000/11/02 02:51:21 dawes Exp $ */
/*
* Based, in part, on code with the following copyright notice:
*
* Copyright 1999-2001 by Thomas Thanner, Citron GmbH, Germany. <support@citron.de>
* Copyright 2002-2005 Citron GmbH, Augsburg <support@citron.de>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting documentation, and that
* the name of Thomas Thanner and Citron GmbH not be used in advertising or
* publicity pertaining to distribution of the software without specific, written
* prior permission. Thomas Thanner and Citron GmbH makes no representations about
* the suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* THOMAS THANNER AND CITRON GMBH DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
* IN NO EVENT SHALL THOMAS THANNER OR CITRON GMBH BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
*/
#ifndef _citron_H_
#define _citron_H_
/******************************************************************************
* Definitions
* structs, typedefs, #defines, enums
*****************************************************************************/
/* CTS (Citron Touch Software) protocol constants */
#define CTS_CTRLMIN 0x10 /* Lower end of the control character range */
#define CTS_XON 0x11 /* Start serial transmission character */
#define CTS_STX 0x12 /* Start of message delimiter */
#define CTS_XOFF 0x13 /* Stop serial transmission character */
#define CTS_ETX 0x14 /* End of message delimiter */
#define CTS_NAK 0x15 /* Not Acknowledge, send by the IRT just before it resets itself */
#define CTS_ESC 0x16 /* Escape character to encode non control characters with a value inside the control character range */
#define CTS_CTRLMAX 0x16 /* Upper end of the control character range */
#define CTS_ENCODE 0x40 /* Use this constant to encode non control character with a value inside the control character range */
#define CTS_DECODE (~0x40) /* Use this constant to decode previously encoded characters. These characters are marked by a leading CTS_ESC. */
#define CTS_MSG_MIN 0x18 /* First usable character for message and report identifiers */
#define CTS_MSG_MAX 0x7F /* Last usable character for message and report identifiers */
#define CTS_DESIGNATOR_LEN 32 /* Length of the designator part in the HardwareRevision report */
#define CTS_ASSY_LEN 16 /* Length of the ASSY part in the HardwareRevision report */
#define CTS_OEMSTRING_LEN 256 /* Length of the OEM string */
#define CTS_FPGA_LEN 28 /* Length of the FPGA version string */
#define CTS_SENSORCOUNT_LEN 1 /* Length of sensorcount report */
#define CTS_PERIPHERAL_LEN 4 /* Length of hardware peripheral report */
#define CTS_KEYCHANGE_LEN 3 /* Length of Key chnage report */
#define CTS_USERNAME_LEN 14 /* User name length without trailing zero (GetUserString) */
#define CTS_USERSTRING_LEN 127 /* Length of the Userstring without trailing zero */
#define CTS_MAX_HWASSY 32 /* Maximum number of hardware codeable assy numbers */
#define CTS_MAX_POLYEDGE 64 /* Maximum number of polygonal area edges */
#define CMD_REP_CONV 0x7f /* Use this bit mask to convert a command into a report identifier */
#define CTS_PACKET_SIZE (1+CTS_OEMSTRING_LEN)
/* Area operating modes */
#define AOM_OFF 0x00 /* No coordinate messages will be generated by this area */
#define AOM_ENTER 0x01 /* Only the area entry point will be reported in a coordinate message */
#define AOM_TRACK 0x02 /* Every movement inside the area will be reported in a coordinate message */
#define AOM_CONT 0x03 /* If the area is touched, coordinate messages will be created in fixed time intervals */
/* Modification flags for the area operating mode */
#define AOF_ADDEXIT 0x01 /* Exit messages will be generated for this area */
#define AOF_ADDCOORD 0x02 /* The coordinate of the touch point will be reported in addition to the area number */
#define AOF_ADDPRESS 0x04 /* Pressure messages will be generated for this area */
#define AOF_PRESSALWAYS 0x08 /* This area requires a permanent pressure to generate coordinate messages */
#define AOF_PRESSENTER 0x10 /* This area requires only pressure to generate the first coordinate message. */
#define AOF_PRESSLOCAL 0x20 /* This area has a locally defined pressure sensitivity, If this flag is not set, the pressure sensivity of area0 is used. */
#define AOF_EXTENDED 0x40 /* This area must be leaved, before any other area will generate coordinate messages */
#define AOF_ACTIVE 0x80 /* This area is active. Only active areas will generate messages. */
/* group ClearArea command parameter values */
#define CA_ALL 0x00 /* Clear all areas on all pages */
#define CA_PAGE 0x01 /* Clear all areas of a certain page */
#define CA_AREA 0x02 /* Clear a single area, however area0 cannot be cleared. area0 will only be reset to its power up default state. */
/* SetTransmission command parameter values */
#define TM_TRANSMIT 0x01 /* Enable the transmission of messages (report will be transmitted always) */
#define TM_NONE 0x00 /* Disable transmission of messages and disable the XON/XOFF protocol */
#define TM_RXDFLOW 0x10 /* Enable the XON/XOFF protocol for the transmitter (IRT will send XON/XOFF to the host) */
#define TM_TXDFLOW 0x20 /* Enable the XON/XOFF protocol for the receiver (host will sned XON/XOFF to the IRT) */
/* SetScanning command parameter values */
#define SC_DISABLE 0x00 /* Disable scanning */
#define SC_ENABLE 0x01 /* Enable scanning */
/* Sleep- and Doze-Mode command parameters */
#define TS_QUIET 0x00 /* Disable the generation of TouchSaver messages */
#define TS_ACTIMSG 0x01 /* Enable the generation of messages on sleep- or doze-mode activation */
#define TS_PASIMSG 0x02 /* Enable the generation of messages on sleep- or doze-mode deactivation */
#define TS_SETOUT 0x10 /* The /GP_OUT output of the IRT will reflect the sleep- or doze-mode state, if this flag is set. */
#define TS_ACTIVE 0x80 /* This is a read only flag to decode the current sleep- or doze-mode state in SleepModeState and DozeModeState reports. */
/* SetDualTouching command parameters */
#define DT_IGNORE 0x00 /* Multiple touches are ignored, no DualTouchError messages will be generated */
#define DT_ERROR 0x01 /* Multiple touches will be reported by a DualTouchError message */
#define DT_COORD 0x02 /* The coordinate of the second touch point will be reported in a separate coordinate message. More than 2 touch points will be reported by DualTouchError messages. */
/* SetOrigin command parameters */
#define OR_TOPLEFT 0x00 /* The coordinate origin is in the top left corner of the touch */
#define OR_TOPRIGHT 0x01 /* The coordinate origin is in the top right corner of the touch */
#define OR_BOTTOMRIGHT 0x02 /* The coordinate origin is in the bottom right corner of the touch */
#define OR_BOTTOMLEFT 0x03 /* The coordinate origin is in the bottom left corner of the touch */
/* GetSignalValues command parameters */
#define GS_NOREPORT 0x00 /* Don't report the signal values */
#define GS_SIGNAL 0x01 /* Report the beam values as used for coordinate generation */
#define GS_REFERENCE 0x02 /* Report the reference beam values */
#define GS_BROKEN 0x03 /* Report the results of the broken/not broken beam detection */
#define GS_RESCAN 0x80 /* Add this flag to rescan the touch before generating the SignalValues report */
/* GetPressureValues command parameters */
#define GP_NOREPORT 0x00 /* Don't report the pressure values */
#define GP_SIGNAL 0x01 /* Report the signals of the active pressure sensors */
#define GP_REFERENCE 0x02 /* Report the signals of the calibration sensors */
#define GP_INTERNAL 0x04 /* Report the internal state of the pressure sensitive unit */
/* SetPort/GetPort command parameters */
#define GP_OCOUT0 0x01 /* Get/Set the /OC_OUT0 port of the IRT */
#define GP_BIJMP 0x02 /* Get the state of the BurnIn jumper on the IRT */
#define GP_OCSSAVER 0x04 /* Get/Set the /OC_SSAVER port of the IRT */
#define GP_OCIN0 0x08 /* Get the state of the /OC_IN0 port of the IRT */
/* GetRevisions command parameters */
#define GR_SYSMGR 0x01 /* Get the version number of the System Manager module */
#define GR_HARDWARE 0x02 /* Get the version number of the Hardware module */
#define GR_PROCESS 0x04 /* Get the version number of the Process module */
#define GR_PROTOCOL 0x08 /* Get the version number of the Protocol module */
#define GR_HWPARAM 0x10 /* Get the version number of the Hardware Parameters module */
#define GR_DESIGNATOR 0x20 /* Get the IRT designator and ASSY number */
#define GR_BURNIN 0x40 /* Get the version number of the Burn-In module */
#define GR_FPGA 0x80 /* Get the version number of the FPGA module */
/* GetErrors command parameters */
#define GE_INITIAL 0x01 /* Report the errors detected during IRT startup */
#define GE_DEFECTBEAMS 0x02 /* Report the beams that are marked defect and are therefore excluded from the coordinate calculations */
#define GE_COMMUNICATION 0x04 /* Report communication errors on the serial link */
#define GE_COMMAND 0x08 /* Report command errors (invalid parameters, unknown commands, ...) */
#define GE_CLEAR 0x80 /* Add this flag to clear the errors after reporting */
/* GetHardware command parameters */
#define GH_BEAMCOUNT 0x01 /* Report the number of x and y beams */
#define GH_SENSORCOUNT 0x02 /* Report the number of pressure sensors */
#define GH_PERIPHERALS 0x04 /* Report a bit vector that identifies all assembled peripherals on the IRT */
/* Defines for GH_PERIPHERALS (Peripheral identification bit)*/
#define PR_NONE 0x00000000
#define PR_OUT0 0x00000001 /* The /OC_OUT0 port is available */
#define PR_BURNIN 0x00000002 /* The BurnIn jumper is available */
#define PR_SSAVE 0x00000004 /* The /GP_OUT port is available */
#define PR_PWM 0x00000008 /* The /OC_PWM port is available */
#define PR_SOUND 0x00000010 /* The speaker port is available */
#define PR_OCOUT0 0x00000020
#define PR_RUNLED 0x00000040 /* The red blinking indication LED is available */
#define PR_GPIN 0x00000080 /* The /GP_IN port is available */
#define PR_KEYMATRIX 0xffff0000
#define PR_KEYMATRIX0 0x80000000 /* Key 0 available */
#define PR_KEYMATRIX1 0x40000000 /* Key 1 available */
#define PR_KEYMATRIX2 0x20000000 /* Key 2 available */
#define PR_KEYMATRIX3 0x10000000 /* Key 3 available */
#define PR_KEYMATRIX4 0x08000000 /* Key 4 available */
#define PR_KEYMATRIX5 0x04000000 /* Key 5 available */
#define PR_KEYMATRIX6 0x02000000 /* Key 6 available */
#define PR_KEYMATRIX7 0x01000000 /* Key 7 available */
#define PR_KEYMATRIX8 0x00800000 /* Key 8 available */
#define PR_KEYMATRIX9 0x00400000 /* Key 9 available */
#define PR_KEYMATRIX10 0x00200000 /* Key 10 available */
#define PR_KEYMATRIX11 0x00100000 /* Key 11 available */
#define PR_KEYMATRIX12 0x00080000 /* Key 12 available */
#define PR_KEYMATRIX13 0x00040000 /* Key 13 available */
#define PR_KEYMATRIX14 0x00020000 /* Key 14 available */
#define PR_KEYMATRIX15 0x00010000 /* Key 15 available */
/* GetHWVersion command parameters */
#define HV_SSNO 0x01 /* Report the silicon serial number */
#define HV_ASSY 0x02 /* Report the hard wired assembly number */
#define HV_FPGA 0x04 /* Report the FPGA version string */
/* InitialError decoding bit masks */
#define IE_SMCHKSUM 0x00000001UL /* The system manager module has a checksum error */
#define IE_SMINIT 0x00000002UL /* The system manager module reported an error during initialisation */
#define IE_HWCHKSUM 0x00000004UL /* The hardware module has a checksum error */
#define IE_HWINIT 0x00000008UL /* The hardware module reported an error during initialisation */
#define IE_PCCHKSUM 0x00000010UL /* The process module has a checksum error */
#define IE_PCINIT 0x00000020UL /* The process module reported an error during initialisation */
#define IE_PTCHKSUM 0x00000040UL /* The protocol module has a checksum error */
#define IE_PTINIT 0x00000080UL /* The protocol module reported an error during initialisation */
#define IE_HW_BEAMS 0x00000100UL /* There were broken beams during hardware initialisation */
#define IE_HW_PSU 0x00000200UL /* There pressure sensitive unit could not be initialised */
#define IE_HW_CPU 0x00000400UL /* There was an error in the CPU core detected during startup */
#define IE_HW_IRAM 0x00000800UL /* There was an error in the initial internal ram check */
#define IE_HW_XRAM 0x00001000UL /* There was an error in the initial external ram check */
#define IE_BICHK 0x00002000UL /* The burnin module has a checksum error */
#define IE_BIINIT 0x00004000UL /* The burnin module reported an error during initialisation */
#define IE_FPGACHK 0x00008000UL /* The fpga module has a checksum error */
#define IE_HWPCHK 0x00010000UL /* The hardware parameter module has a checksum error */
/* CommunicationError decoding bit masks */
#define CE_DC2GTDC4 0x00000001UL /* There were more CTS_STX received than CTS_ETX */
#define CE_DC4GTDC2 0x00000002UL /* There were more CTS_ETX received than CTS_STX */
#define CE_UNXNONCTRL 0x00000004UL /* Non control character received outside a CTS_STX/CTS_ETX sequence */
#define CE_UNXCONTROL 0x00000008UL /* Unexpected control character received */
#define CE_OVERFLOW 0x00000010UL /* The hardware receiver buffer had an overflow */
#define CE_FRAMING 0x00000020UL /* There were characters with framing errors received */
#define CE_PARITY 0x00000040UL /* There were characters with invalid parity received */
#define CE_XOFFTO 0x00000080UL /* No XON was received within the defined timeout after a XOFF */
#define CE_CMDOVER 0x00000100UL /* The command buffer had an overflow */
#define CE_RCVROVER 0x00000200UL /* The receiver ring buffer had an overflow */
/* CommandError decoding bit masks */
#define CE_UNKNOWN 0x00000001UL /* Unknown command received */
#define CE_PARAMCNT 0x00000002UL /* Too much or too less parameters received */
#define CE_RANGE 0x00000004UL /* One or more parameters were out of range */
/* SaveSetup/ReadSetup command parameters */
#define SUP_SERIAL 0x01 /* Save/Read the serial port setup */
#define SUP_MACRO 0x02 /* Save/Read the macro definitions */
#define SUP_AREAS 0x04 /* Save/Read the area definitions */
#define SUP_PERI 0x08 /* Save/Read the peripheral settings */
#define SUP_COORD 0x10 /* Save/Read the coordinate settings */
/* IRT initialisation modes for <f cts_Connect> */
#define MODE_A 0x7b /* Initialise the IRT to AFE-Mode A emulation */
#define MODE_B 0x3c /* Initialise the IRT to Carroll emulation */
#define MODE_C 0x6f /* Another entry point for Mode-D (for backwards compatibility) */
#define MODE_D 0x81 /* Initialise the IRT to the CTS protocol */
/* Command is for the driver */
#define DRIVCOMM 0x00 /* Command for driver */
/* Command Identifiers for the driver */
#define D_SETCLICKMODE 0x00
#define D_BEEP 0x01
#define D_SETBEEP 0x02
#define D_DEBUG 0x03
#define D_ENTERCOUNT 0x04
#define D_ZENTERCOUNT 0x05
#define D_PWMADJ 0x06
#define D_PWMEX 0x07
/* Message identifiers */
#define R_DUALTOUCHERROR 0x18 /* Invalid multiple touches are detected */
#define R_COORD 0x19 /* Regular coordinate report */
#define R_EXIT 0x1a /* An area was leaved */
#define R_PRESSURE 0x1b /* An area was pressed or released */
#define R_SLEEPMODE 0x1c /* The sleep-mode was activated or deactivated */
#define R_DOZEMODE 0x1d /* The doze-mode was activated or deactivated */
#define R_AMBIENTOVERLOADERROR 0x1e /* Ambient light exceeds or falls below a level proper function can be guaranteed */
#define R_KEYCHANGE 0x1f /* Report a keychange (4x4 matrix) for special Touches */
#define PRESS_BELOW 0x00 /* Pressure below a certain threshold */
#define PRESS_EXCEED 0x01 /* Pressure higher than a certain threshold */
/* Special report identifiers */
#define R_POLYAREADEF 0x2a
#define R_IDLE 0x34
#define R_SCANTIMING 0x56
#define R_LOCKZ 0x52 /* LockZ timings report */
#define R_AMBIENTOVERLOAD 0x58 /* Ambient overload behaviour */
#define R_KEYSTATE 0x59 /* Report with state of all matrix keys */
#define R_USERSTRING 0x66 /* Userstring report */
#define R_KEYMODE 0x7d /* Report with current handling of keyboard matrix actions */
#define R_PWMEX 0x7f /* State of extended PWM Channel */
/* Command identifiers */
#define C_SOFTRESET 0x80
#define C_RESETCTS 0x81
#define C_SAVESETUP 0x83
#define C_DESTROYSETUP 0x84
#define C_SETSCANTIMING 0x85
#define C_GETSCANTIMING 0x86
#define C_CLEARAREA 0xa0
#define C_DEFINEAREA 0xa1
#define C_GETAREADEF 0xa2
#define C_GETAREAPAGE 0xa3
#define C_GETFREEAREASPACE 0xa4
#define C_SELECTAREAPAGE 0xa5
#define C_SETAREASTATE 0xa6
#define C_SETAREAMODE 0xa7
#define C_SETAREAFLAGS 0xa8
#define C_SETAREAPRESSURE 0xa9
#define C_DEFINEPOLYAREA 0xaa
#define C_GETERRORS 0xb0
#define C_GETHARDWARE 0xb1
#define C_GETREVISIONS 0xb2
#define C_GETSETUP 0xb3
#define C_GETSINGLEMESSAGE 0xb4
#define C_GETSINGLESCAN 0xb5
#define C_GETSIGNALVALUES 0xb6
#define C_GETPRESSUREVALUES 0xb7
#define C_GETOEMSTRING 0xb8
#define C_GETHWVERSIONS 0xb9
#define C_BIGETFIRSTSESSION 0xba
#define C_BIGETNEXTSESSION 0xbb
#define C_BIGETRECORD 0xbc
#define C_BIERASEDATA 0xbd
#define C_BIGETTICKUNIT 0xbe
#define C_GETBEAMMINMAX 0xc0
#define C_GETBEAMTIMEOUT 0xc1
#define C_GETCONTTIME 0xc2
#define C_GETDUALTOUCHING 0xc3
#define C_GETORIGIN 0xc4
#define C_GETRESOLUTION 0xc5
#define C_GETSCANNING 0xc6
#define C_GETTRANSMISSION 0xc7
#define C_SETBEAMMINMAX 0xc8
#define C_SETBEAMTIMEOUT 0xc9
#define C_SETCONTTIME 0xca
#define C_SETDUALTOUCHING 0xcb
#define C_SETORIGIN 0xcc
#define C_SETRESOLUTION 0xcd
#define C_SETSCANNING 0xce
#define C_SETTRANSMISSION 0xcf
#define C_GETTOUCHTIME 0xd0
#define C_SETTOUCHTIME 0xd1
#define C_GETLOCKZ 0xd2
#define C_SETLOCKZ 0xd3
#define C_SETAMBIENTOVERLOAD 0xd6
#define C_GETAMBIENTOVERLOAD 0xd8
#define C_GETKEYSTATE 0xd9
#define C_CLEARMACRO 0xe0
#define C_ENDMACRORECORD 0xe1
#define C_EXECMACRO 0xe2
#define C_GETFREEMACROSPACE 0xe3
#define C_STARTMACRORECORD 0xe5
#define C_GETUSERSTRING 0xe6
#define C_SETUSERSTRING 0xe7
#define C_GETPORT 0xf0
#define C_GETPWM 0xf1
#define C_GETSOUND 0xf2
#define C_GETSLEEPMODE 0xf3
#define C_SETPORT 0xf4
#define C_SETPWM 0xf5
#define C_SETSOUND 0xf6
#define C_SETSLEEPMODE 0xf7
#define C_GETDOZEMODE 0xf8
#define C_SETDOZEMODE 0xf9
#define C_SETPWMFREQ 0xfa
#define C_GETPWMFREQ 0xfb
#define C_SETKEYMODE 0xfc
#define C_GETKEYMODE 0xfd
#define C_SETPWMEX 0xfe /* Define behaviour of the extended PWM-channels */
#define C_GETPWMEX 0xff /* Ask for current settings of extended PWM channel */
/* touch states */
#define CIT_TOUCHED 0x01
#define CIT_PRESSED 0x02
#define CIT_BUTTON 0x04
#define CIT_KEYPRESSED 0x08
#define CIT_AMBIENTOVERFLOW 0x10
/* Key modes */
#define KM_ENABLE 0x01 /* Enable keyboard matrix mode */
/* Ambient overload modes */
#define AO_IGNORE 0x00 /* Ignore ambient overload and generate no error messages */
#define AO_GENERATE 0x01 /* generate ambient overflow messages */
#define AO_STOPSCANNING 0x02 /* scanning is stopped in case of ambient light error */
#define AMBIENTOFLOW_KEY (-1) /* Key sent if ambient overflow error occures */
/* click modes */
#define CM_ENTER 1
#define CM_DUAL 2
#define CM_DUALEXIT 3
#define CM_ZPRESS 4
#define CM_ZPRESSEXIT 5
#define MAX_DUAL_TOUCH_COUNT 2
#define NO_CLICK_MODE 255 /* no click mode set in xf86Config */
/* command structure for Feedback Functions */
typedef struct {
unsigned char par[3]; /* byte parameter */
char packet; /* packet number 00 - 7F */
} COMMAND;
/* Data exchange with driver (Driver Data Structure) */
#define MAX_BYTES_TO_TRANSFER 0x20
#define LAST_PACKET 0x7f
typedef struct {
short curbyte; /* current byte number */
short numbytes; /* number of bytes to transmit */
short packet; /* packet number */
unsigned char data[MAX_BYTES_TO_TRANSFER]; /* pointer to data area */
} CitronDDS;
/*****************************************************************************
* X-Header
****************************************************************************/
#define X_CITOUCH " CiTouch: "
const char *CI_PROBED = {"(--)" X_CITOUCH}; /* Value was probed */
const char *CI_CONFIG = {"(**)" X_CITOUCH}; /* Value was given in the config file */
const char *CI_DEFAULT = {"(==)" X_CITOUCH}; /* Value is a default */
const char *CI_CMDLINE = {"(++)" X_CITOUCH}; /* Value was given on the command line */
const char *CI_NOTICE = {"(!!)" X_CITOUCH}; /* Notice */
const char *CI_INFO = {"(II)" X_CITOUCH}; /* Informational message */
const char *CI_WARNING = {"(WW)" X_CITOUCH}; /* Warning message */
const char *CI_ERROR = {"(EE)" X_CITOUCH}; /* Error message */
const char *CI_UNKNOWN = {"(?\?)" X_CITOUCH}; /* Unknown message */
/*****************************************************************************
* macros
****************************************************************************/
#define millisleep(ms) xf86usleep((ms) * 1000)
#define HIBYTE(x) ( (unsigned char) ( (x) >> 8 ) )
#define LOBYTE(x) ( (unsigned char) ( (x) & 0xff ) )
/*****************************************************************************
* typedefs
****************************************************************************/
typedef enum
{
cit_idle, cit_getID, cit_collect, cit_escape
}
cit_State; /* Citron Infrared Touch Driver State */
typedef struct _cit_privateRec
{
int min_x; /* Minimum x reported by calibration */
int max_x; /* Maximum x */
int min_y; /* Minimum y reported by calibration */
int max_y; /* Maximum y */
int button_threshold; /* Z > button threshold = button click */
int axes;
int dual_touch_count; /* counter for dual touch error events */
int click_mode; /* one of the CM_ constants */
int button_number; /* which button to report */
int proximity_number; /* which button to report if proximity is on*/
int key_number; /* which key is pressed or released */
int genproxbutev; /* Generate proximity button events if != 0 */
int reporting_mode; /* TS_Raw or TS_Scaled */
int screen_num; /* Screen associated with the device */
int screen_width; /* Width of the associated X screen */
int screen_height; /* Height of the screen */
int packeti; /* index into packet */
int raw_x; /* Raw Coordinates */
int raw_y;
int sleep_mode; /* sleep mode: 0x00=no message, 0x01=m at activation, 0x02=m at deactivation, */
/* 0x03= message at act. + deact., 0x10= GP_OUT set */
int sleep_time_act; /* time until touchsaver gets activate */
int sleep_time_scan; /* time interval between two scans */
int pwm_sleep; /* PWM duty cycle during touch saver mode */
int pwm_active; /* PWM duty cycle during regular operation */
int pwm_freq; /* PWM base frequency */
int pwm_src; /* Source for PWM adjust BL_TDK or BL_AC */
int pwm_dst; /* Destination for PWM adjust BL_TDK or BL_AC */
int pwmex_channel; /* Bitfield, defining which PWM channel is affected */
int pwmex_duty; /* Duty cycle of PWM signal (logical high in 255 steps) */
int pwmex_freq; /* Cycle frequency in Hz. 0x0000 means static on or off, depening on duty cycle */
int state;
/* additional parameters */
int last_x; /* last cooked data */
int last_y;
int doze_mode; /* doze mode: 0x00=no message, 0x01=m at activation, 0x02=m at deactivation, */
/* 0x03= message at act. + deact., 0x10= GP_OUT set */
int doze_time_act; /* time until touchsaver gets activate */
int doze_time_scan; /* time interval between scans */
int origin; /* Coordinates origin */
int delta_x; /* Delta x - if coordinate changed less than delta x no motion event */
int delta_y;
/* Beep in event of touch */
int beep; /* 0= no beep, 1=beep enabled */
int press_vol; /* volume of beep (press event) */
int press_pitch; /* pitch of beep (press event) */
int press_dur; /* length of beep in 10ms (press event) */
int rel_vol; /* volume of beep (release event) */
int rel_pitch; /* pitch of beep (release event) */
int rel_dur; /* length of beep in 10ms (release event) */
/* Beep in event of keyboard press or release */
int beepkey; /* 0= no beep, 1=beep enabled */
int presskey_vol; /* volume of beep (press event) */
int presskey_pitch; /* pitch of beep (press event) */
int presskey_dur; /* length of beep in 10ms (press event) */
int relkey_vol; /* volume of beep (release event) */
int relkey_pitch; /* pitch of beep (release event) */
int relkey_dur; /* length of beep in 10ms (release event) */
int beam_timeout; /* Beam timeout 0= no beam timeout */
int touch_time; /* minimum time span for a valid interruption */
int enter_touched; /* button is down due to an enter event */
int enter_count; /* number of jumed coord reports before a ButtonPress event is sent */
int enter_count_no_Z; /* number of jumped over coords before ButtonPress event in not pressure sensitive mode */
int enter_count_Z; /* number of jumped over coords before ButtonPress event in pressure sensitive mode */
int max_dual_count; /* number of jumed dualtouch error reports before a ButtonPress event is sent */
int dual_flg; /* Flag set if dualtouch error report is received , reset by counter */
int raw_min_x; /* min x,y max x,y value accumulated over the whole session */
int query_state; /* test if query was already started */
int raw_max_x;
int raw_min_y;
int raw_max_y;
int pressure_sensors; /* number of pressure sensors */
int lockz_enter_time; /* Minimum duration of AreaPressEnter state before a PressEnter event is issued. Steps: 10ms */
int lockz_exit_time; /* Minimum duration of AreaPressExit state before a PressEnter event is issued. Steps: 10ms */
int lockz_lock_time; /* Minimum gap between PressExit and PressEnter event. Steps: 10ms */
int key_matrix; /* if > 0 Enable key matrix (4x4) - only available on special touches with key matrix */
int ambient_overload; /* Enable ambient overload report feature */
int ambientoverflow_changed;
unsigned long peripherals; /* Bitfield of hardware used */
#define MAX_TIMER 2 /* Max. concurrent timers */
#define FAKE_TIMER 0 /* Timer for faked exit message */
#define SV_TIMER 1 /* Supervision timer for command timeout suopervision */
OsTimerPtr timer_ptr[MAX_TIMER]; /* Timer for general purposes */
CARD32 timer_val1[MAX_TIMER]; /* Timer 1st delay */
CARD32 timer_val2[MAX_TIMER]; /* Timer second delay */
OsTimerCallback timer_callback[MAX_TIMER]; /* timer callback routine */
int fake_exit; /* tell the ReadInput function there is a exit message (from timer) */
/* end additional parameters */
LocalDevicePtr local; /* Pointer to local device */
Bool button_down; /* is the "button" currently down */
Bool proximity;
Bool key_changed; /* is a key pressed or released */
cit_State lex_mode;
XISBuffer *buffer;
unsigned char packet[CTS_PACKET_SIZE]; /* packet being/just read */
CitronDDS dds; /* Structure for Byte transfer to the driver via LedFeedbackControl */
}
cit_PrivateRec, *cit_PrivatePtr;
#define BL_TDK 0 /* TDK Inverter */
#define BL_AC 1 /* Applied Concepts inverter */
#define BL_MAX 1 /* Max. Tables */
const unsigned short cit_bright_adjust[2] [256] =
{
{1,1,2,2,2,3,3,3,4,4,5,5,6,7,8,10,11,13,14,16,18,20,23,25,27,30,33,36,39,42,45,49,52,56,60,64,68,72,76,
80,85,89,94,99,104,109,114,119,124,130,135,141,147,153,159,165,171,177,183,190,196,203,209,216,223,230,
237,244,251,258,265,273,280,288,295,303,311,319,326,334,342,350,359,367,375,383,392,400,408,417,426,434,
443,452,460,469,478,487,496,505,514,523,532,541,550,560,569,578,587,597,606,615,625,634,644,653,663,672,
682,691,701,710,720,730,739,749,758,768,778,787,797,807,816,826,836,845,855,865,874,884,893,903,913,922,
932,941,951,960,970,979,989,998,1008,1017,1027,1036,1045,1054,1064,1073,1082,1091,1100,1109,1119,1128,
1136,1145,1154,1163,1172,1181,1189,1198,1207,1215,1224,1232,1240,1249,1257,1265,1273,1281,1289,1297,1305,
1313,1321,1329,1336,1344,1351,1359,1366,1373,1380,1387,1395,1401,1408,1415,1422,1428,1435,1441,1448,1454,
1460,1466,1472,1478,1484,1489,1495,1500,1506,1511,1516,1521,1526,1531,1536,1541,1545,1549,1554,1558,1562,
1566,1570,1574,1577,1581,1584,1587,1590,1593,1596,1599,1601,1604,1606,1608,1610,1612,1614,1616,1617,1618,
1620,1621,1622,1622,1623,1623}, /* TDK */
{113,117,122,126,131,135,140,144,149,154,159,164,168,173,178,183,189,194,199,204,210,215,220,226,231,237,
243,248,254,260,265,271,277,283,289,295,301,307,313,320,326,332,338,345,351,357,364,370,377,383,390,397,
403,410,417,423,430,437,444,451,458,465,472,479,486,493,500,507,514,521,529,536,543,550,558,565,572,580,
587,594,602,609,617,624,632,639,647,655,662,670,677,685,693,700,708,716,723,731,739,747,755,762,770,778,
786,794,801,809,817,825,833,841,849,856,864,872,880,888,896,904,912,920,928,935,943,951,959,967,975,983,
991,999,1007,1015,1023,1030,1038,1046,1054,1062,1070,1078,1086,1093,1101,1109,1117,1125,1133,1140,1148,
1156,1164,1171,1179,1187,1194,1202,1210,1217,1225,1233,1240,1248,1256,1263,1271,1278,1286,1293,1301,1308,
1315,1323,1330,1337,1345,1352,1359,1367,1374,1381,1388,1395,1402,1409,1417,1424,1431,1438,1444,1451,1458,
1465,1472,1479,1485,1492,1499,1506,1512,1519,1525,1532,1538,1545,1551,1557,1564,1570,1576,1582,1589,1595,
1601,1607,1613,1619,1625,1631,1636,1642,1648,1654,1659,1665,1670,1676,1681,1687,1692,1697,1703,1708,1713,
1718,1723,1728,1733,1738,1743,1748,1752,1757,1762,1766,1771,1775,1779,1784,1788,1792,1796,1801,1805,1809}, /* AC */
};
/******************************************************************************
* Declarations
*****************************************************************************/
/*extern void ModuleInit (pointer *, INT32 *);*/
static MODULESETUPPROTO (SetupProc);
static void TearDownProc (pointer p);
/*static void *SetupProc (XF86OptionPtr, int *, int *);*/
static Bool DeviceControl (DeviceIntPtr def, int mode);
static Bool DeviceOn (DeviceIntPtr);
static Bool DeviceOff (DeviceIntPtr);
static Bool DeviceClose (DeviceIntPtr);
static Bool DeviceInit (DeviceIntPtr);
static void ReadInput (LocalDevicePtr);
static int ControlProc (LocalDevicePtr, xDeviceCtl *);
static void CloseProc (LocalDevicePtr);
static int SwitchMode (ClientPtr, DeviceIntPtr, int);
static Bool ConvertProc (LocalDevicePtr, int, int, int, int, int, int, int, int, int *, int *);
static Bool QueryHardware (LocalDevicePtr, int *, int *);
static Bool cit_GetPacket (cit_PrivatePtr);
static void cit_Flush(cit_PrivatePtr);
static void cit_SendCommand(XISBuffer *, unsigned char, int, ...);
static Bool cit_GetInitialErrors(cit_PrivatePtr);
static Bool cit_GetDefectiveBeams(cit_PrivatePtr);
static Bool cit_GetDesignator(cit_PrivatePtr);
static Bool cit_GetPressureSensors(cit_PrivatePtr);
static Bool cit_GetPeripherals(cit_PrivatePtr);
static Bool cit_GetRevision(cit_PrivatePtr, int);
static void cit_ProcessPacket(cit_PrivatePtr);
static void cit_Beep(cit_PrivatePtr priv, int press);
static void cit_BeepKey(cit_PrivatePtr priv, int press);
static void cit_SetBlockDuration (cit_PrivatePtr priv, int block_duration);
static void cit_ReinitSerial(cit_PrivatePtr priv);
static int cit_ZPress(cit_PrivatePtr priv);
static void cit_SetEnterCount(cit_PrivatePtr priv);
static void cit_SendPWM(cit_PrivatePtr priv);
static void cit_SendPWMFreq(cit_PrivatePtr priv);
static void cit_SendPWMEx(cit_PrivatePtr priv);
static int cit_AdjustBright(cit_PrivatePtr priv, int val);
#ifdef CIT_TIM
static void cit_StartTimer(cit_PrivatePtr priv, int nr);
static void cit_CloseTimer(cit_PrivatePtr priv, int nr);
static CARD32 cit_SuperVisionTimer(OsTimerPtr timer, CARD32 now, pointer arg);
static CARD32 cit_DualTouchTimer(OsTimerPtr timer, CARD32 now, pointer arg);
#endif
/*
* DO NOT PUT ANYTHING AFTER THIS ENDIF
*/
#endif
|