Staging: comedi: add addi-data drivers
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / comedi / drivers / addi-data / APCI1710_Ttl.c
1 /**
2 @verbatim
3
4 Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
6 ADDI-DATA GmbH
7 Dieselstrasse 3
8 D-77833 Ottersweier
9 Tel: +19(0)7223/9493-0
10 Fax: +49(0)7223/9493-92
11 http://www.addi-data-com
12 info@addi-data.com
13
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 You shoud also find the complete GPL in the COPYING file accompanying this source code.
21
22 @endverbatim
23 */
24 /*
25
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
28 +-----------------------------------------------------------------------+
29 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
30 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
31 +-----------------------------------------------------------------------+
32 | Project : API APCI1710 | Compiler : gcc |
33 | Module name : TTL.C | Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-----------------------------------------------------------------------+
37 | Description : APCI-1710 TTL I/O module |
38 | |
39 | |
40 +-----------------------------------------------------------------------+
41 | UPDATES |
42 +-----------------------------------------------------------------------+
43 | Date | Author | Description of updates |
44 +----------+-----------+------------------------------------------------+
45 | 13/05/98 | S. Weber | TTL digital input / output implementation |
46 |----------|-----------|------------------------------------------------|
47 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
48 | | | available |
49 +-----------------------------------------------------------------------+
50 | | | |
51 | | | |
52 +-----------------------------------------------------------------------+
53 */
54
55 /*
56 +----------------------------------------------------------------------------+
57 | Included files |
58 +----------------------------------------------------------------------------+
59 */
60
61 #include "APCI1710_Ttl.h"
62
63 /*
64 +----------------------------------------------------------------------------+
65 | Function Name : _INT_ i_APCI1710_InitTTLIODirection |
66 | (BYTE_ b_BoardHandle, |
67 | BYTE_ b_ModulNbr, |
68 | BYTE_ b_PortAMode, |
69 | BYTE_ b_PortBMode, |
70 | BYTE_ b_PortCMode, |
71 | BYTE_ b_PortDMode) |
72 +----------------------------------------------------------------------------+
73 | Task APCI1710_TTL_INIT (using defaults) : Configure the TTL I/O operating mode from selected |
74 | module (b_ModulNbr). You must calling this function be|
75 | for you call any other function witch access of TTL. |
76 APCI1710_TTL_INITDIRECTION(user inputs for direction)
77
78 +----------------------------------------------------------------------------+
79 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710|
80 | BYTE_ b_ModulNbr : Module number to |
81 | configure (0 to 3)
82 b_ModulNbr = (BYTE) CR_AREF(insn->chanspec);
83 b_InitType = (BYTE) data[0];
84 b_PortAMode = (BYTE) data[1];
85 b_PortBMode = (BYTE) data[2];
86 b_PortCMode = (BYTE) data[3];
87 b_PortDMode = (BYTE) data[4];|
88 +----------------------------------------------------------------------------+
89 | Output Parameters : - |
90 +----------------------------------------------------------------------------+
91 | Return Value : 0: No error |
92 | -1: The handle parameter of the board is wrong |
93 | -2: The module parameter is wrong |
94 | -3: The module is not a TTL module |
95 | -4: Function not available for this version |
96 | -5: Port A mode selection is wrong |
97 | -6: Port B mode selection is wrong |
98 | -7: Port C mode selection is wrong |
99 | -8: Port D mode selection is wrong |
100 +----------------------------------------------------------------------------+
101 */
102
103 INT i_APCI1710_InsnConfigInitTTLIO(comedi_device * dev, comedi_subdevice * s,
104 comedi_insn * insn, lsampl_t * data)
105 {
106 INT i_ReturnValue = 0;
107 BYTE b_ModulNbr;
108 BYTE b_InitType;
109 BYTE b_PortAMode;
110 BYTE b_PortBMode;
111 BYTE b_PortCMode;
112 BYTE b_PortDMode;
113
114 b_ModulNbr = (BYTE) CR_AREF(insn->chanspec);
115 b_InitType = (BYTE) data[0];
116 i_ReturnValue = insn->n;
117
118 /**************************/
119 /* Test the module number */
120 /**************************/
121
122 if (b_ModulNbr < 4) {
123 /**************************/
124 /* Test if TTL I/O module */
125 /**************************/
126
127 if ((devpriv->s_BoardInfos.
128 dw_MolduleConfiguration[b_ModulNbr] &
129 0xFFFF0000UL) == APCI1710_TTL_IO) {
130 switch (b_InitType) {
131 case APCI1710_TTL_INIT:
132
133 devpriv->s_ModuleInfo[b_ModulNbr].
134 s_TTLIOInfo.b_TTLInit = 1;
135
136 /***************************/
137 /* Set TTL port A to input */
138 /***************************/
139
140 devpriv->s_ModuleInfo[b_ModulNbr].
141 s_TTLIOInfo.b_PortConfiguration[0] = 0;
142
143 /***************************/
144 /* Set TTL port B to input */
145 /***************************/
146
147 devpriv->s_ModuleInfo[b_ModulNbr].
148 s_TTLIOInfo.b_PortConfiguration[1] = 0;
149
150 /***************************/
151 /* Set TTL port C to input */
152 /***************************/
153
154 devpriv->s_ModuleInfo[b_ModulNbr].
155 s_TTLIOInfo.b_PortConfiguration[2] = 0;
156
157 /****************************/
158 /* Set TTL port D to output */
159 /****************************/
160
161 devpriv->s_ModuleInfo[b_ModulNbr].
162 s_TTLIOInfo.b_PortConfiguration[3] = 1;
163
164 /*************************/
165 /* Set the configuration */
166 /*************************/
167
168 outl(0x8,
169 devpriv->s_BoardInfos.ui_Address + 20 +
170 (64 * b_ModulNbr));
171 break;
172
173 case APCI1710_TTL_INITDIRECTION:
174
175 b_PortAMode = (BYTE) data[1];
176 b_PortBMode = (BYTE) data[2];
177 b_PortCMode = (BYTE) data[3];
178 b_PortDMode = (BYTE) data[4];
179
180 /********************/
181 /* Test the version */
182 /********************/
183
184 if ((devpriv->s_BoardInfos.
185 dw_MolduleConfiguration
186 [b_ModulNbr] & 0xFFFF) >=
187 0x3230) {
188 /************************/
189 /* Test the port A mode */
190 /************************/
191
192 if ((b_PortAMode == 0)
193 || (b_PortAMode == 1)) {
194 /************************/
195 /* Test the port B mode */
196 /************************/
197
198 if ((b_PortBMode == 0)
199 || (b_PortBMode == 1)) {
200 /************************/
201 /* Test the port C mode */
202 /************************/
203
204 if ((b_PortCMode == 0)
205 || (b_PortCMode
206 == 1)) {
207 /************************/
208 /* Test the port D mode */
209 /************************/
210
211 if ((b_PortDMode == 0) || (b_PortDMode == 1)) {
212 devpriv->
213 s_ModuleInfo
214 [b_ModulNbr].
215 s_TTLIOInfo.
216 b_TTLInit
217 =
218 1;
219
220 /***********************/
221 /* Set TTL port A mode */
222 /***********************/
223
224 devpriv->
225 s_ModuleInfo
226 [b_ModulNbr].
227 s_TTLIOInfo.
228 b_PortConfiguration
229 [0]
230 =
231 b_PortAMode;
232
233 /***********************/
234 /* Set TTL port B mode */
235 /***********************/
236
237 devpriv->
238 s_ModuleInfo
239 [b_ModulNbr].
240 s_TTLIOInfo.
241 b_PortConfiguration
242 [1]
243 =
244 b_PortBMode;
245
246 /***********************/
247 /* Set TTL port C mode */
248 /***********************/
249
250 devpriv->
251 s_ModuleInfo
252 [b_ModulNbr].
253 s_TTLIOInfo.
254 b_PortConfiguration
255 [2]
256 =
257 b_PortCMode;
258
259 /***********************/
260 /* Set TTL port D mode */
261 /***********************/
262
263 devpriv->
264 s_ModuleInfo
265 [b_ModulNbr].
266 s_TTLIOInfo.
267 b_PortConfiguration
268 [3]
269 =
270 b_PortDMode;
271
272 /*************************/
273 /* Set the configuration */
274 /*************************/
275
276 outl((b_PortAMode << 0) | (b_PortBMode << 1) | (b_PortCMode << 2) | (b_PortDMode << 3), devpriv->s_BoardInfos.ui_Address + 20 + (64 * b_ModulNbr));
277 } else {
278 /**********************************/
279 /* Port D mode selection is wrong */
280 /**********************************/
281
282 DPRINTK("Port D mode selection is wrong\n");
283 i_ReturnValue
284 =
285 -8;
286 }
287 } else {
288 /**********************************/
289 /* Port C mode selection is wrong */
290 /**********************************/
291
292 DPRINTK("Port C mode selection is wrong\n");
293 i_ReturnValue =
294 -7;
295 }
296 } else {
297 /**********************************/
298 /* Port B mode selection is wrong */
299 /**********************************/
300
301 DPRINTK("Port B mode selection is wrong\n");
302 i_ReturnValue = -6;
303 }
304 } else {
305 /**********************************/
306 /* Port A mode selection is wrong */
307 /**********************************/
308
309 DPRINTK("Port A mode selection is wrong\n");
310 i_ReturnValue = -5;
311 }
312 } else {
313 /*******************************************/
314 /* Function not available for this version */
315 /*******************************************/
316
317 DPRINTK("Function not available for this version\n");
318 i_ReturnValue = -4;
319 }
320 break;
321
322 DPRINTK("\n");
323 default:
324 printk("Bad Config Type\n");
325 } // switch end
326 } else {
327 /**********************************/
328 /* The module is not a TTL module */
329 /**********************************/
330
331 DPRINTK("The module is not a TTL module\n");
332 i_ReturnValue = -3;
333 }
334 } else {
335 /***********************/
336 /* Module number error */
337 /***********************/
338
339 DPRINTK("Module number error\n");
340 i_ReturnValue = -2;
341 }
342
343 return (i_ReturnValue);
344 }
345
346 /*
347 +----------------------------------------------------------------------------+
348 | INPUT FUNCTIONS |
349 +----------------------------------------------------------------------------+
350 */
351
352 /*
353 +----------------------------------------------------------------------------+
354 | Function Name : _INT_ i_APCI1710_ReadTTLIOChannelValue |
355 | (BYTE_ b_BoardHandle, |
356 | BYTE_ b_ModulNbr, |
357 | BYTE_ b_SelectedPort, |
358 | BYTE_ b_InputChannel, |
359 | PBYTE_ pb_ChannelStatus) |
360 +----------------------------------------------------------------------------+
361 | Task : Read the status from selected TTL digital input |
362 | (b_InputChannel)
363 +----------------------------------------------------------------------------+
364 | Task : Read the status from digital input port |
365 | (b_SelectedPort) from selected TTL module (b_ModulNbr) |
366 +----------------------------------------------------------------------------+
367
368 +----------------------------------------------------------------------------+
369 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710|
370 | BYTE_ b_ModulNbr : Module number to |
371 | configure (0 to 7) |
372 | BYTE_ b_SelectedPort, : Selection from TTL I/O |
373 | port (0 to 2) |
374 | 0 : Port A selection |
375 | 1 : Port B selection |
376 | 2 : Port C selection |
377 | 3 : Port D selection |
378 | BYTE_ b_InputChannel : Selection from digital |
379 | input ( 0 to 2)
380 APCI1710_TTL_READCHANNEL
381 b_ModulNbr = CR_AREF(insn->chanspec);
382 b_SelectedPort= CR_RANGE(insn->chanspec);
383 b_InputChannel= CR_CHAN(insn->chanspec);
384 b_ReadType = (BYTE) data[0];
385
386 APCI1710_TTL_READPORT|
387 b_ModulNbr = CR_AREF(insn->chanspec);
388 b_SelectedPort= CR_RANGE(insn->chanspec);
389 b_ReadType = (BYTE) data[0];
390
391 +----------------------------------------------------------------------------+
392 | Output Parameters : data[0]
393
394 PBYTE_ pb_ChannelStatus : Digital input channel |
395 | status |
396 | 0 : Channle is not active|
397 | 1 : Channle is active |
398 +----------------------------------------------------------------------------+
399 | Return Value : 0: No error |
400 | -1: The handle parameter of the board is wrong |
401 | -2: The module parameter is wrong |
402 | -3: The module is not a TTL module |
403 | -4: The selected TTL input port is wrong |
404 | -5: The selected TTL digital input is wrong |
405 | -6: TTL I/O not initialised |
406 +----------------------------------------------------------------------------+
407 */
408
409 INT i_APCI1710_InsnBitsReadTTLIO(comedi_device * dev, comedi_subdevice * s,
410 comedi_insn * insn, lsampl_t * data)
411 {
412 INT i_ReturnValue = 0;
413 DWORD dw_StatusReg;
414 BYTE b_ModulNbr;
415 BYTE b_SelectedPort;
416 BYTE b_InputChannel;
417 BYTE b_ReadType;
418 PBYTE pb_ChannelStatus;
419 PBYTE pb_PortValue;
420
421 i_ReturnValue = insn->n;
422 b_ReadType = (BYTE) data[0];
423 b_ModulNbr = CR_AREF(insn->chanspec);
424 b_SelectedPort = CR_RANGE(insn->chanspec);
425 b_InputChannel = CR_CHAN(insn->chanspec);
426
427 /**************************/
428 /* Test the module number */
429 /**************************/
430
431 if (b_ModulNbr < 4) {
432 /**************************/
433 /* Test if TTL I/O module */
434 /**************************/
435
436 if ((devpriv->s_BoardInfos.
437 dw_MolduleConfiguration[b_ModulNbr] &
438 0xFFFF0000UL) == APCI1710_TTL_IO) {
439 switch (b_ReadType) {
440
441 case APCI1710_TTL_READCHANNEL:
442 pb_ChannelStatus = (PBYTE) & data[0];
443 /********************************/
444 /* Test the TTL I/O port number */
445 /********************************/
446
447 if (((b_SelectedPort <= 2)
448 && ((devpriv->s_BoardInfos.
449 dw_MolduleConfiguration
450 [b_ModulNbr] &
451 0xFFFF) ==
452 0x3130))
453 || ((b_SelectedPort <= 3)
454 && ((devpriv->s_BoardInfos.
455 dw_MolduleConfiguration
456 [b_ModulNbr] &
457 0xFFFF) >=
458 0x3230))) {
459 /******************************************/
460 /* Test the digital imnput channel number */
461 /******************************************/
462
463 if (((b_InputChannel <= 7)
464 && (b_SelectedPort < 3))
465 || ((b_InputChannel <= 1)
466 && (b_SelectedPort ==
467 3))) {
468 /******************************************/
469 /* Test if the TTL I/O module initialised */
470 /******************************************/
471
472 if (devpriv->
473 s_ModuleInfo
474 [b_ModulNbr].
475 s_TTLIOInfo.b_TTLInit ==
476 1) {
477 /***********************************/
478 /* Test if TTL port used for input */
479 /***********************************/
480
481 if (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) == 0x3130) || (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3230) && (devpriv->s_ModuleInfo[b_ModulNbr].s_TTLIOInfo.b_PortConfiguration[b_SelectedPort] == 0))) {
482 /**************************/
483 /* Read all digital input */
484 /**************************/
485
486 dw_StatusReg =
487 inl
488 (devpriv->
489 s_BoardInfos.
490 ui_Address
491 +
492 (64 * b_ModulNbr));
493
494 *pb_ChannelStatus
495 =
496 (BYTE) (
497 (dw_StatusReg
498 >>
499 (8 * b_SelectedPort)) >> b_InputChannel) & 1;
500 } else {
501 /*******************************/
502 /* Selected TTL I/O port error */
503 /*******************************/
504
505 DPRINTK("Selected TTL I/O port error\n");
506 i_ReturnValue =
507 -4;
508 }
509 } else {
510 /***************************/
511 /* TTL I/O not initialised */
512 /***************************/
513
514 DPRINTK("TTL I/O not initialised\n");
515 i_ReturnValue = -6;
516 }
517 } else {
518 /********************************/
519 /* Selected digital input error */
520 /********************************/
521
522 DPRINTK("Selected digital input error\n");
523 i_ReturnValue = -5;
524 }
525 } else {
526 /*******************************/
527 /* Selected TTL I/O port error */
528 /*******************************/
529
530 DPRINTK("Selected TTL I/O port error\n");
531 i_ReturnValue = -4;
532 }
533 break;
534
535 case APCI1710_TTL_READPORT:
536 pb_PortValue = (PBYTE) & data[0];
537 /********************************/
538 /* Test the TTL I/O port number */
539 /********************************/
540
541 if (((b_SelectedPort <= 2)
542 && ((devpriv->s_BoardInfos.
543 dw_MolduleConfiguration
544 [b_ModulNbr] &
545 0xFFFF) ==
546 0x3130))
547 || ((b_SelectedPort <= 3)
548 && ((devpriv->s_BoardInfos.
549 dw_MolduleConfiguration
550 [b_ModulNbr] &
551 0xFFFF) >=
552 0x3230))) {
553 /******************************************/
554 /* Test if the TTL I/O module initialised */
555 /******************************************/
556
557 if (devpriv->s_ModuleInfo[b_ModulNbr].
558 s_TTLIOInfo.b_TTLInit == 1) {
559 /***********************************/
560 /* Test if TTL port used for input */
561 /***********************************/
562
563 if (((devpriv->s_BoardInfos.
564 dw_MolduleConfiguration
565 [b_ModulNbr]
566 &
567 0xFFFF)
568 == 0x3130)
569 || (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3230) && (devpriv->s_ModuleInfo[b_ModulNbr].s_TTLIOInfo.b_PortConfiguration[b_SelectedPort] == 0))) {
570 /**************************/
571 /* Read all digital input */
572 /**************************/
573
574 dw_StatusReg =
575 inl(devpriv->
576 s_BoardInfos.
577 ui_Address +
578 (64 * b_ModulNbr));
579
580 *pb_PortValue =
581 (BYTE) (
582 (dw_StatusReg >>
583 (8 * b_SelectedPort)) & 0xFF);
584 } else {
585 /*******************************/
586 /* Selected TTL I/O port error */
587 /*******************************/
588
589 DPRINTK("Selected TTL I/O port error\n");
590 i_ReturnValue = -4;
591 }
592 } else {
593 /***************************/
594 /* TTL I/O not initialised */
595 /***************************/
596
597 DPRINTK("TTL I/O not initialised\n");
598 i_ReturnValue = -5;
599 }
600 } else {
601 /*******************************/
602 /* Selected TTL I/O port error */
603 /*******************************/
604
605 DPRINTK("Selected TTL I/O port error\n");
606 i_ReturnValue = -4;
607 }
608 break;
609
610 default:
611 printk("Bad ReadType\n");
612
613 } //End Switch
614 } else {
615 /**********************************/
616 /* The module is not a TTL module */
617 /**********************************/
618
619 DPRINTK("The module is not a TTL module\n");
620 i_ReturnValue = -3;
621 }
622 } else {
623 /***********************/
624 /* Module number error */
625 /***********************/
626
627 DPRINTK("Module number error\n");
628 i_ReturnValue = -2;
629 }
630
631 return (i_ReturnValue);
632 }
633
634 /*
635 +----------------------------------------------------------------------------+
636 | Function Name : INT i_APCI1710_InsnReadTTLIOAllPortValue(comedi_device
637 *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) |
638 +----------------------------------------------------------------------------+
639 | Task : Read the status from all digital input ports |
640 | (port A, port B and port C) from selected TTL |
641 | module (b_ModulNbr) |
642 +----------------------------------------------------------------------------+
643 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710|
644 | BYTE_ b_ModulNbr : Module number to |
645 | configure (0 to 3) |
646 +----------------------------------------------------------------------------+
647 | Output Parameters : PULONG_ pul_PortValue : Digital TTL inputs port |
648 | status |
649 +----------------------------------------------------------------------------+
650 | Return Value : 0: No error |
651 | -1: The handle parameter of the board is wrong |
652 | -2: The module parameter is wrong |
653 | -3: The module is not a TTL module |
654 | -4: TTL I/O not initialised |
655 +----------------------------------------------------------------------------+
656 */
657
658 INT i_APCI1710_InsnReadTTLIOAllPortValue(comedi_device * dev,
659 comedi_subdevice * s, comedi_insn * insn, lsampl_t * data)
660 {
661 INT i_ReturnValue = 0;
662 DWORD dw_StatusReg;
663 BYTE b_ModulNbr;
664 PULONG pul_PortValue;
665
666 b_ModulNbr = (BYTE) CR_AREF(insn->chanspec);
667 i_ReturnValue = insn->n;
668 pul_PortValue = (PULONG) & data[0];
669
670 /**************************/
671 /* Test the module number */
672 /**************************/
673
674 if (b_ModulNbr < 4) {
675 /**************************/
676 /* Test if TTL I/O module */
677 /**************************/
678
679 if ((devpriv->s_BoardInfos.
680 dw_MolduleConfiguration[b_ModulNbr] &
681 0xFFFF0000UL) == APCI1710_TTL_IO) {
682 /******************************************/
683 /* Test if the TTL I/O module initialised */
684 /******************************************/
685
686 if (devpriv->
687 s_ModuleInfo[b_ModulNbr].
688 s_TTLIOInfo.b_TTLInit == 1) {
689 /**************************/
690 /* Read all digital input */
691 /**************************/
692
693 dw_StatusReg = inl(devpriv->s_BoardInfos.
694 ui_Address + (64 * b_ModulNbr));
695
696 /**********************/
697 /* Test if TTL Rev1.0 */
698 /**********************/
699
700 if ((devpriv->s_BoardInfos.
701 dw_MolduleConfiguration
702 [b_ModulNbr] & 0xFFFF) ==
703 0x3130) {
704 *pul_PortValue =
705 dw_StatusReg & 0xFFFFFFUL;
706 } else {
707 /**************************************/
708 /* Test if port A not used for output */
709 /**************************************/
710
711 if (devpriv->s_ModuleInfo[b_ModulNbr].
712 s_TTLIOInfo.
713 b_PortConfiguration[0] == 1) {
714 *pul_PortValue =
715 dw_StatusReg &
716 0x3FFFF00UL;
717 }
718
719 /**************************************/
720 /* Test if port B not used for output */
721 /**************************************/
722
723 if (devpriv->
724 s_ModuleInfo[b_ModulNbr].
725 s_TTLIOInfo.
726 b_PortConfiguration[1] == 1) {
727 *pul_PortValue =
728 dw_StatusReg &
729 0x3FF00FFUL;
730 }
731
732 /**************************************/
733 /* Test if port C not used for output */
734 /**************************************/
735
736 if (devpriv->
737 s_ModuleInfo[b_ModulNbr].
738 s_TTLIOInfo.
739 b_PortConfiguration[2] == 1) {
740 *pul_PortValue =
741 dw_StatusReg &
742 0x300FFFFUL;
743 }
744
745 /**************************************/
746 /* Test if port D not used for output */
747 /**************************************/
748
749 if (devpriv->
750 s_ModuleInfo[b_ModulNbr].
751 s_TTLIOInfo.
752 b_PortConfiguration[3] == 1) {
753 *pul_PortValue =
754 dw_StatusReg &
755 0xFFFFFFUL;
756 }
757 }
758 } else {
759 /***************************/
760 /* TTL I/O not initialised */
761 /***************************/
762 DPRINTK("TTL I/O not initialised\n");
763 i_ReturnValue = -5;
764 }
765 } else {
766 /**********************************/
767 /* The module is not a TTL module */
768 /**********************************/
769 DPRINTK("The module is not a TTL module\n");
770 i_ReturnValue = -3;
771 }
772 } else {
773 /***********************/
774 /* Module number error */
775 /***********************/
776 DPRINTK("Module number error\n");
777 i_ReturnValue = -2;
778 }
779
780 return (i_ReturnValue);
781 }
782
783 /*
784 +----------------------------------------------------------------------------+
785 | OUTPUT FUNCTIONS |
786 +----------------------------------------------------------------------------+
787 */
788
789 /*
790 +----------------------------------------------------------------------------+
791 | Function Name : _INT_ i_APCI1710_SetTTLIOChlOn |
792 | (BYTE_ b_BoardHandle, |
793 | BYTE_ b_ModulNbr, |
794 | BYTE_ b_OutputChannel)
795 INT i_APCI1710_InsnWriteSetTTLIOChlOnOff(comedi_device *dev,comedi_subdevice *s,
796 comedi_insn *insn,lsampl_t *data) |
797 +----------------------------------------------------------------------------+
798 | Task : Sets or resets the output witch has been passed with the |
799 | parameter b_Channel. Setting an output means setting |
800 | an ouput high. |
801 +----------------------------------------------------------------------------+
802 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 |
803 | BYTE_ b_ModulNbr : Selected module number (0 to 3)|
804 | BYTE_ b_OutputChannel : Selection from digital output |
805 | channel (0 or 1) |
806 | 0 : PD0 |
807 | 1 : PD1 |
808 | 2 to 9 : PA |
809 | 10 to 17: PB |
810 | 18 to 25: PC |
811
812 b_ModulNbr = CR_AREF(insn->chanspec);
813 b_OutputChannel= CR_CHAN(insn->chanspec);
814 ui_State = data[0]; // ON or OFF
815 +----------------------------------------------------------------------------+
816 | Output Parameters : - |
817 +----------------------------------------------------------------------------+
818 | Return Value : 0: No error |
819 | -1: The handle parameter of the board is wrong |
820 | -2: The module parameter is wrong |
821 | -3: The module is not a TTL I/O module |
822 | -4: The selected digital output is wrong |
823 | -5: TTL I/O not initialised see function |
824 | " i_APCI1710_InitTTLIO"
825 +----------------------------------------------------------------------------+
826 */
827
828 INT i_APCI1710_InsnWriteSetTTLIOChlOnOff(comedi_device * dev,
829 comedi_subdevice * s, comedi_insn * insn, lsampl_t * data)
830 {
831 INT i_ReturnValue = 0;
832 DWORD dw_StatusReg = 0;
833 BYTE b_ModulNbr;
834 BYTE b_OutputChannel;
835 UINT ui_State;
836
837 i_ReturnValue = insn->n;
838 b_ModulNbr = CR_AREF(insn->chanspec);
839 b_OutputChannel = CR_CHAN(insn->chanspec);
840 ui_State = data[0]; // ON or OFF
841
842 /**************************/
843 /* Test the module number */
844 /**************************/
845
846 if (b_ModulNbr < 4) {
847 /**************************/
848 /* Test if TTL I/O module */
849 /**************************/
850
851 if ((devpriv->s_BoardInfos.
852 dw_MolduleConfiguration[b_ModulNbr] &
853 0xFFFF0000UL) == APCI1710_TTL_IO) {
854 /******************************************/
855 /* Test if the TTL I/O module initialised */
856 /******************************************/
857
858 if (devpriv->s_ModuleInfo[b_ModulNbr].
859 s_TTLIOInfo.b_TTLInit == 1) {
860 /***********************************/
861 /* Test the TTL I/O channel number */
862 /***********************************/
863
864 if (((b_OutputChannel <= 1)
865 && ((devpriv->s_BoardInfos.
866 dw_MolduleConfiguration
867 [b_ModulNbr] &
868 0xFFFF) ==
869 0x3130))
870 || ((b_OutputChannel <= 25)
871 && ((devpriv->s_BoardInfos.
872 dw_MolduleConfiguration
873 [b_ModulNbr] &
874 0xFFFF) >=
875 0x3230))) {
876 /****************************************************/
877 /* Test if the selected channel is a output channel */
878 /****************************************************/
879
880 if (((b_OutputChannel <= 1)
881 && (devpriv->
882 s_ModuleInfo
883 [b_ModulNbr].
884 s_TTLIOInfo.
885 b_PortConfiguration
886 [3] == 1))
887 || ((b_OutputChannel >= 2)
888 && (b_OutputChannel <=
889 9)
890 && (devpriv->
891 s_ModuleInfo
892 [b_ModulNbr].
893 s_TTLIOInfo.
894 b_PortConfiguration
895 [0] == 1))
896 || ((b_OutputChannel >= 10)
897 && (b_OutputChannel <=
898 17)
899 && (devpriv->
900 s_ModuleInfo
901 [b_ModulNbr].
902 s_TTLIOInfo.
903 b_PortConfiguration
904 [1] == 1))
905 || ((b_OutputChannel >= 18)
906 && (b_OutputChannel <=
907 25)
908 && (devpriv->
909 s_ModuleInfo
910 [b_ModulNbr].
911 s_TTLIOInfo.
912 b_PortConfiguration
913 [2] == 1))) {
914 /************************/
915 /* Test if PD0 selected */
916 /************************/
917
918 if (b_OutputChannel == 0) {
919
920 outl(ui_State,
921 devpriv->
922 s_BoardInfos.
923 ui_Address +
924 (64 * b_ModulNbr));
925 } else {
926 /************************/
927 /* Test if PD1 selected */
928 /************************/
929
930 if (b_OutputChannel ==
931 1) {
932
933 outl(ui_State,
934 devpriv->
935 s_BoardInfos.
936 ui_Address
937 + 4 +
938 (64 * b_ModulNbr));
939 } else {
940 b_OutputChannel
941 =
942 b_OutputChannel
943 - 2;
944
945 /********************/
946 /* Read all channel */
947 /********************/
948
949 dw_StatusReg =
950 inl
951 (devpriv->
952 s_BoardInfos.
953 ui_Address
954 +
955 (64 * b_ModulNbr));
956 if (ui_State) // ON
957 {
958 dw_StatusReg
959 =
960 (dw_StatusReg
961 >>
962 ((b_OutputChannel / 8) * 8)) & 0xFF;
963 dw_StatusReg
964 =
965 dw_StatusReg
966 |
967 (1
968 <<
969 (b_OutputChannel
970 %
971 8));
972 } else // Off
973 {
974 dw_StatusReg
975 =
976 (dw_StatusReg
977 >>
978 ((b_OutputChannel / 8) * 8)) & 0xFF;
979 dw_StatusReg
980 =
981 dw_StatusReg
982 &
983 (0xFF
984 -
985 (1 << (b_OutputChannel % 8)));
986
987 }
988
989 /****************************/
990 /* Set the new output value */
991 /****************************/
992
993 outl(dw_StatusReg, devpriv->s_BoardInfos.ui_Address + 8 + ((b_OutputChannel / 8) * 4) + (64 * b_ModulNbr));
994 }
995 }
996 } else {
997 /************************************/
998 /* The selected TTL output is wrong */
999 /************************************/
1000
1001 DPRINTK(" The selected TTL output is wrong\n");
1002 i_ReturnValue = -4;
1003 }
1004 } else {
1005 /************************************/
1006 /* The selected TTL output is wrong */
1007 /************************************/
1008
1009 DPRINTK("The selected TTL output is wrong\n");
1010 i_ReturnValue = -4;
1011 }
1012 } else {
1013 /***************************/
1014 /* TTL I/O not initialised */
1015 /***************************/
1016
1017 DPRINTK("TTL I/O not initialised\n");
1018 i_ReturnValue = -5;
1019 }
1020 } else {
1021 /**************************************/
1022 /* The module is not a TTL I/O module */
1023 /**************************************/
1024
1025 DPRINTK("The module is not a TTL I/O module\n");
1026 i_ReturnValue = -3;
1027 }
1028 } else {
1029 /***********************/
1030 /* Module number error */
1031 /***********************/
1032
1033 DPRINTK("Module number error\n");
1034 i_ReturnValue = -2;
1035 }
1036
1037 return (i_ReturnValue);
1038 }