Staging: comedi: Remove DWORD and *PDWORD typedefs in addi-data
[safe/jmp/linux-2.6] / drivers / staging / comedi / drivers / addi-data / hwdrv_apci16xx.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 APCI1648    | Compiler : gcc                        |
33   | Module name : TTL.C           | Version  : 2.96                       |
34   +-------------------------------+---------------------------------------+
35   | Project manager: S. Weber     | Date     :  25/05/2005                |
36   +-----------------------------------------------------------------------+
37   | Description :   APCI-16XX TTL I/O module                              |
38   |                                                                       |
39   |                                                                       |
40   +-----------------------------------------------------------------------+
41   |                             UPDATES                                   |
42   +-----------------------------------------------------------------------+
43   |   Date   |   Author  |          Description of updates                |
44   +----------+-----------+------------------------------------------------+
45   |25.05.2005| S.Weber   | Creation                                       |
46   |          |           |                                                |
47   +-----------------------------------------------------------------------+
48 */
49
50 /*
51 +----------------------------------------------------------------------------+
52 |                               Included files                               |
53 +----------------------------------------------------------------------------+
54 */
55
56 #include "hwdrv_apci16xx.h"
57
58 /*
59 +----------------------------------------------------------------------------+
60 | Function Name     : int   i_APCI16XX_InsnConfigInitTTLIO                   |
61 |                          (struct comedi_device    *dev,                           |
62 |                           struct comedi_subdevice *s,                             |
63 |                           struct comedi_insn      *insn,                          |
64 |                           unsigned int         *data)                          |
65 +----------------------------------------------------------------------------+
66 | Task           APCI16XX_TTL_INIT (using defaults)   :                      |
67 |                Configure the TTL I/O operating mode from all ports         |
68 |                You must calling this function be                           |
69 |                for you call any other function witch access of TTL.        |
70 |                APCI16XX_TTL_INITDIRECTION(user inputs for direction)       |
71 +----------------------------------------------------------------------------+
72 | Input Parameters  : b_InitType    = (unsigned char) data[0];                        |
73 |                     b_Port0Mode   = (unsigned char) data[1];                        |
74 |                     b_Port1Mode   = (unsigned char) data[2];                        |
75 |                     b_Port2Mode   = (unsigned char) data[3];                        |
76 |                     b_Port3Mode   = (unsigned char) data[4];                        |
77 |                     ........                                               |
78 +----------------------------------------------------------------------------+
79 | Output Parameters : -                                                      |
80 +----------------------------------------------------------------------------+
81 | Return Value      :>0: No error                                            |
82 |                    -1: Port 0 mode selection is wrong                      |
83 |                    -2: Port 1 mode selection is wrong                      |
84 |                    -3: Port 2 mode selection is wrong                      |
85 |                    -4: Port 3 mode selection is wrong                      |
86 |                    -X: Port X-1 mode selection is wrong                    |
87 |                    ....                                                    |
88 |                    -100 : Config command error                             |
89 |                    -101 : Data size error                                  |
90 +----------------------------------------------------------------------------+
91 */
92
93 int i_APCI16XX_InsnConfigInitTTLIO(struct comedi_device * dev,
94         struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
95 {
96         int i_ReturnValue = insn->n;
97         unsigned char b_Command = 0;
98         unsigned char b_Cpt = 0;
99         unsigned char b_NumberOfPort =
100                 (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);
101
102         /************************/
103         /* Test the buffer size */
104         /************************/
105
106         if (insn->n >= 1) {
107            /*******************/
108                 /* Get the command */
109                 /* **************** */
110
111                 b_Command = (unsigned char) data[0];
112
113            /********************/
114                 /* Test the command */
115            /********************/
116
117                 if ((b_Command == APCI16XX_TTL_INIT) ||
118                         (b_Command == APCI16XX_TTL_INITDIRECTION) ||
119                         (b_Command == APCI16XX_TTL_OUTPUTMEMORY)) {
120               /***************************************/
121                         /* Test the initialisation buffer size */
122               /***************************************/
123
124                         if ((b_Command == APCI16XX_TTL_INITDIRECTION)
125                                 && ((unsigned char) (insn->n - 1) != b_NumberOfPort)) {
126                  /*******************/
127                                 /* Data size error */
128                  /*******************/
129
130                                 printk("\nBuffer size error");
131                                 i_ReturnValue = -101;
132                         }
133
134                         if ((b_Command == APCI16XX_TTL_OUTPUTMEMORY)
135                                 && ((unsigned char) (insn->n) != 2)) {
136                  /*******************/
137                                 /* Data size error */
138                  /*******************/
139
140                                 printk("\nBuffer size error");
141                                 i_ReturnValue = -101;
142                         }
143                 } else {
144               /************************/
145                         /* Config command error */
146               /************************/
147
148                         printk("\nCommand selection error");
149                         i_ReturnValue = -100;
150                 }
151         } else {
152            /*******************/
153                 /* Data size error */
154            /*******************/
155
156                 printk("\nBuffer size error");
157                 i_ReturnValue = -101;
158         }
159
160         /**************************************************************************/
161         /* Test if no error occur and APCI16XX_TTL_INITDIRECTION command selected */
162         /**************************************************************************/
163
164         if ((i_ReturnValue >= 0) && (b_Command == APCI16XX_TTL_INITDIRECTION)) {
165                 memset(devpriv->ul_TTLPortConfiguration, 0,
166                         sizeof(devpriv->ul_TTLPortConfiguration));
167
168            /*************************************/
169                 /* Test the port direction selection */
170            /*************************************/
171
172                 for (b_Cpt = 1;
173                         (b_Cpt <= b_NumberOfPort) && (i_ReturnValue >= 0);
174                         b_Cpt++) {
175               /**********************/
176                         /* Test the direction */
177               /**********************/
178
179                         if ((data[b_Cpt] != 0) && (data[b_Cpt] != 0xFF)) {
180                  /************************/
181                                 /* Port direction error */
182                  /************************/
183
184                                 printk("\nPort %d direction selection error",
185                                         (int) b_Cpt);
186                                 i_ReturnValue = -(int) b_Cpt;
187                         }
188
189               /**************************/
190                         /* Save the configuration */
191               /**************************/
192
193                         devpriv->ul_TTLPortConfiguration[(b_Cpt - 1) / 4] =
194                                 devpriv->ul_TTLPortConfiguration[(b_Cpt -
195                                         1) / 4] | (data[b_Cpt] << (8 * ((b_Cpt -
196                                                         1) % 4)));
197                 }
198         }
199
200         /**************************/
201         /* Test if no error occur */
202         /**************************/
203
204         if (i_ReturnValue >= 0) {
205            /***********************************/
206                 /* Test if TTL port initilaisation */
207            /***********************************/
208
209                 if ((b_Command == APCI16XX_TTL_INIT)
210                         || (b_Command == APCI16XX_TTL_INITDIRECTION)) {
211               /******************************/
212                         /* Set all port configuration */
213               /******************************/
214
215                         for (b_Cpt = 0; b_Cpt <= b_NumberOfPort; b_Cpt++) {
216                                 if ((b_Cpt % 4) == 0) {
217                     /*************************/
218                                         /* Set the configuration */
219                     /*************************/
220
221                                         outl(devpriv->
222                                                 ul_TTLPortConfiguration[b_Cpt /
223                                                         4],
224                                                 devpriv->iobase + 32 + b_Cpt);
225                                 }
226                         }
227                 }
228         }
229
230         /************************************************/
231         /* Test if output memory initialisation command */
232         /************************************************/
233
234         if (b_Command == APCI16XX_TTL_OUTPUTMEMORY) {
235                 if (data[1]) {
236                         devpriv->b_OutputMemoryStatus = ADDIDATA_ENABLE;
237                 } else {
238                         devpriv->b_OutputMemoryStatus = ADDIDATA_DISABLE;
239                 }
240         }
241
242         return (i_ReturnValue);
243 }
244
245 /*
246 +----------------------------------------------------------------------------+
247 |                            INPUT FUNCTIONS                                 |
248 +----------------------------------------------------------------------------+
249 */
250
251 /*
252 +----------------------------------------------------------------------------+
253 | Function Name     : int     i_APCI16XX_InsnBitsReadTTLIO                   |
254 |                          (struct comedi_device    *dev,                           |
255 |                           struct comedi_subdevice *s,                             |
256 |                           struct comedi_insn      *insn,                          |
257 |                           unsigned int         *data)                          |
258 +----------------------------------------------------------------------------+
259 | Task              : Read the status from selected TTL digital input        |
260 |                     (b_InputChannel)                                       |
261 +----------------------------------------------------------------------------+
262 | Task              : Read the status from digital input port                |
263 |                     (b_SelectedPort)                                       |
264 +----------------------------------------------------------------------------+
265 | Input Parameters  :                                                        |
266 |              APCI16XX_TTL_READCHANNEL                                      |
267 |                    b_SelectedPort= CR_RANGE(insn->chanspec);               |
268 |                    b_InputChannel= CR_CHAN(insn->chanspec);                |
269 |                    b_ReadType   = (unsigned char) data[0];                          |
270 |                                                                            |
271 |              APCI16XX_TTL_READPORT                                         |
272 |                    b_SelectedPort= CR_RANGE(insn->chanspec);               |
273 |                    b_ReadType   = (unsigned char) data[0];                          |
274 +----------------------------------------------------------------------------+
275 | Output Parameters : data[0]    0 : Channle is not active                   |
276 |                                1 : Channle is active                       |
277 +----------------------------------------------------------------------------+
278 | Return Value      : >0  : No error                                         |
279 |                    -100 : Config command error                             |
280 |                    -101 : Data size error                                  |
281 |                    -102 : The selected TTL input port is wrong             |
282 |                    -103 : The selected TTL digital input is wrong          |
283 +----------------------------------------------------------------------------+
284 */
285
286 int i_APCI16XX_InsnBitsReadTTLIO(struct comedi_device * dev,
287         struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
288 {
289         int i_ReturnValue = insn->n;
290         unsigned char b_Command = 0;
291         unsigned char b_NumberOfPort =
292                 (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);
293         unsigned char b_SelectedPort = CR_RANGE(insn->chanspec);
294         unsigned char b_InputChannel = CR_CHAN(insn->chanspec);
295         unsigned char *pb_Status;
296         unsigned int dw_Status;
297
298         /************************/
299         /* Test the buffer size */
300         /************************/
301
302         if (insn->n >= 1) {
303            /*******************/
304                 /* Get the command */
305                 /* **************** */
306
307                 b_Command = (unsigned char) data[0];
308
309            /********************/
310                 /* Test the command */
311            /********************/
312
313                 if ((b_Command == APCI16XX_TTL_READCHANNEL)
314                         || (b_Command == APCI16XX_TTL_READPORT)) {
315               /**************************/
316                         /* Test the selected port */
317               /**************************/
318
319                         if (b_SelectedPort < b_NumberOfPort) {
320                  /**********************/
321                                 /* Test if input port */
322                  /**********************/
323
324                                 if (((devpriv->ul_TTLPortConfiguration
325                                                         [b_SelectedPort /
326                                                                 4] >> (8 *
327                                                                 (b_SelectedPort
328                                                                         %
329                                                                         4))) &
330                                                 0xFF) == 0) {
331                     /***************************/
332                                         /* Test the channel number */
333                     /***************************/
334
335                                         if ((b_Command ==
336                                                         APCI16XX_TTL_READCHANNEL)
337                                                 && (b_InputChannel > 7)) {
338                        /*******************************************/
339                                                 /* The selected TTL digital input is wrong */
340                        /*******************************************/
341
342                                                 printk("\nChannel selection error");
343                                                 i_ReturnValue = -103;
344                                         }
345                                 } else {
346                     /****************************************/
347                                         /* The selected TTL input port is wrong */
348                     /****************************************/
349
350                                         printk("\nPort selection error");
351                                         i_ReturnValue = -102;
352                                 }
353                         } else {
354                  /****************************************/
355                                 /* The selected TTL input port is wrong */
356                  /****************************************/
357
358                                 printk("\nPort selection error");
359                                 i_ReturnValue = -102;
360                         }
361                 } else {
362               /************************/
363                         /* Config command error */
364               /************************/
365
366                         printk("\nCommand selection error");
367                         i_ReturnValue = -100;
368                 }
369         } else {
370            /*******************/
371                 /* Data size error */
372            /*******************/
373
374                 printk("\nBuffer size error");
375                 i_ReturnValue = -101;
376         }
377
378         /**************************/
379         /* Test if no error occur */
380         /**************************/
381
382         if (i_ReturnValue >= 0) {
383                 pb_Status = (unsigned char *) & data[0];
384
385            /*******************************/
386                 /* Get the digital inpu status */
387            /*******************************/
388
389                 dw_Status =
390                         inl(devpriv->iobase + 8 + ((b_SelectedPort / 4) * 4));
391                 dw_Status = (dw_Status >> (8 * (b_SelectedPort % 4))) & 0xFF;
392
393            /***********************/
394                 /* Save the port value */
395            /***********************/
396
397                 *pb_Status = (unsigned char) dw_Status;
398
399            /***************************************/
400                 /* Test if read channel status command */
401            /***************************************/
402
403                 if (b_Command == APCI16XX_TTL_READCHANNEL) {
404                         *pb_Status = (*pb_Status >> b_InputChannel) & 1;
405                 }
406         }
407
408         return (i_ReturnValue);
409 }
410
411 /*
412 +----------------------------------------------------------------------------+
413 | Function Name     : int i_APCI16XX_InsnReadTTLIOAllPortValue               |
414 |                          (struct comedi_device    *dev,                           |
415 |                           struct comedi_subdevice *s,                             |
416 |                           struct comedi_insn      *insn,                          |
417 |                           unsigned int         *data)                          |
418 +----------------------------------------------------------------------------+
419 | Task              : Read the status from all digital input ports           |
420 +----------------------------------------------------------------------------+
421 | Input Parameters  : -                                                      |
422 +----------------------------------------------------------------------------+
423 | Output Parameters : data[0] : Port 0 to 3 data                             |
424 |                     data[1] : Port 4 to 7 data                             |
425 |                     ....                                                   |
426 +----------------------------------------------------------------------------+
427 | Return Value      : 0: No error                                            |
428 |                    -100 : Read command error                               |
429 |                    -101 : Data size error                                  |
430 +----------------------------------------------------------------------------+
431 */
432
433 int i_APCI16XX_InsnReadTTLIOAllPortValue(struct comedi_device * dev,
434         struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
435 {
436         unsigned char b_Command = (unsigned char) CR_AREF(insn->chanspec);
437         int i_ReturnValue = insn->n;
438         unsigned char b_Cpt = 0;
439         unsigned char b_NumberOfPort = 0;
440         unsigned int *pls_ReadData = data;
441
442         /********************/
443         /* Test the command */
444         /********************/
445
446         if ((b_Command == APCI16XX_TTL_READ_ALL_INPUTS)
447                 || (b_Command == APCI16XX_TTL_READ_ALL_OUTPUTS)) {
448            /**********************************/
449                 /* Get the number of 32-Bit ports */
450            /**********************************/
451
452                 b_NumberOfPort =
453                         (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 32);
454                 if ((b_NumberOfPort * 32) <
455                         devpriv->ps_BoardInfo->i_NbrTTLChannel) {
456                         b_NumberOfPort = b_NumberOfPort + 1;
457                 }
458
459            /************************/
460                 /* Test the buffer size */
461            /************************/
462
463                 if (insn->n >= b_NumberOfPort) {
464                         if (b_Command == APCI16XX_TTL_READ_ALL_INPUTS) {
465                  /**************************/
466                                 /* Read all digital input */
467                  /**************************/
468
469                                 for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) {
470                     /************************/
471                                         /* Read the 32-Bit port */
472                     /************************/
473
474                                         pls_ReadData[b_Cpt] =
475                                                 inl(devpriv->iobase + 8 +
476                                                 (b_Cpt * 4));
477
478                     /**************************************/
479                                         /* Mask all channels used als outputs */
480                     /**************************************/
481
482                                         pls_ReadData[b_Cpt] =
483                                                 pls_ReadData[b_Cpt] &
484                                                 (~devpriv->
485                                                 ul_TTLPortConfiguration[b_Cpt]);
486                                 }
487                         } else {
488                  /****************************/
489                                 /* Read all digital outputs */
490                  /****************************/
491
492                                 for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) {
493                     /************************/
494                                         /* Read the 32-Bit port */
495                     /************************/
496
497                                         pls_ReadData[b_Cpt] =
498                                                 inl(devpriv->iobase + 20 +
499                                                 (b_Cpt * 4));
500
501                     /**************************************/
502                                         /* Mask all channels used als outputs */
503                     /**************************************/
504
505                                         pls_ReadData[b_Cpt] =
506                                                 pls_ReadData[b_Cpt] & devpriv->
507                                                 ul_TTLPortConfiguration[b_Cpt];
508                                 }
509                         }
510                 } else {
511               /*******************/
512                         /* Data size error */
513               /*******************/
514
515                         printk("\nBuffer size error");
516                         i_ReturnValue = -101;
517                 }
518         } else {
519            /*****************/
520                 /* Command error */
521            /*****************/
522
523                 printk("\nCommand selection error");
524                 i_ReturnValue = -100;
525         }
526
527         return (i_ReturnValue);
528 }
529
530 /*
531 +----------------------------------------------------------------------------+
532 |                            OUTPUT FUNCTIONS                                |
533 +----------------------------------------------------------------------------+
534 */
535
536 /*
537 +----------------------------------------------------------------------------+
538 | Function Name     : int     i_APCI16XX_InsnBitsWriteTTLIO                  |
539 |                          (struct comedi_device    *dev,                           |
540 |                           struct comedi_subdevice *s,                             |
541 |                           struct comedi_insn      *insn,                          |
542 |                           unsigned int         *data)                          |
543 +----------------------------------------------------------------------------+
544 | Task              : Set the state from selected TTL digital output         |
545 |                     (b_OutputChannel)                                      |
546 +----------------------------------------------------------------------------+
547 | Task              : Set the state from digital output port                 |
548 |                     (b_SelectedPort)                                       |
549 +----------------------------------------------------------------------------+
550 | Input Parameters  :                                                        |
551 |              APCI16XX_TTL_WRITECHANNEL_ON | APCI16XX_TTL_WRITECHANNEL_OFF  |
552 |                    b_SelectedPort = CR_RANGE(insn->chanspec);              |
553 |                    b_OutputChannel= CR_CHAN(insn->chanspec);               |
554 |                    b_Command      = (unsigned char) data[0];                        |
555 |                                                                            |
556 |              APCI16XX_TTL_WRITEPORT_ON | APCI16XX_TTL_WRITEPORT_OFF        |
557 |                    b_SelectedPort = CR_RANGE(insn->chanspec);              |
558 |                    b_Command      = (unsigned char) data[0];                        |
559 +----------------------------------------------------------------------------+
560 | Output Parameters : data[0] : TTL output port 0 to 3 data                  |
561 |                     data[1] : TTL output port 4 to 7 data                  |
562 |                     ....                                                   |
563 +----------------------------------------------------------------------------+
564 | Return Value      : >0  : No error                                         |
565 |                    -100 : Command error                                    |
566 |                    -101 : Data size error                                  |
567 |                    -102 : The selected TTL output port is wrong            |
568 |                    -103 : The selected TTL digital output is wrong         |
569 |                    -104 : Output memory disabled                           |
570 +----------------------------------------------------------------------------+
571 */
572
573 int i_APCI16XX_InsnBitsWriteTTLIO(struct comedi_device * dev,
574         struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
575 {
576         int i_ReturnValue = insn->n;
577         unsigned char b_Command = 0;
578         unsigned char b_NumberOfPort =
579                 (unsigned char) (devpriv->ps_BoardInfo->i_NbrTTLChannel / 8);
580         unsigned char b_SelectedPort = CR_RANGE(insn->chanspec);
581         unsigned char b_OutputChannel = CR_CHAN(insn->chanspec);
582         unsigned int dw_Status = 0;
583
584         /************************/
585         /* Test the buffer size */
586         /************************/
587
588         if (insn->n >= 1) {
589            /*******************/
590                 /* Get the command */
591                 /* **************** */
592
593                 b_Command = (unsigned char) data[0];
594
595            /********************/
596                 /* Test the command */
597            /********************/
598
599                 if ((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) ||
600                         (b_Command == APCI16XX_TTL_WRITEPORT_ON) ||
601                         (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) ||
602                         (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) {
603               /**************************/
604                         /* Test the selected port */
605               /**************************/
606
607                         if (b_SelectedPort < b_NumberOfPort) {
608                  /***********************/
609                                 /* Test if output port */
610                  /***********************/
611
612                                 if (((devpriv->ul_TTLPortConfiguration
613                                                         [b_SelectedPort /
614                                                                 4] >> (8 *
615                                                                 (b_SelectedPort
616                                                                         %
617                                                                         4))) &
618                                                 0xFF) == 0xFF) {
619                     /***************************/
620                                         /* Test the channel number */
621                     /***************************/
622
623                                         if (((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) || (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF)) && (b_OutputChannel > 7)) {
624                        /********************************************/
625                                                 /* The selected TTL digital output is wrong */
626                        /********************************************/
627
628                                                 printk("\nChannel selection error");
629                                                 i_ReturnValue = -103;
630                                         }
631
632                                         if (((b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE)) {
633                        /********************************************/
634                                                 /* The selected TTL digital output is wrong */
635                        /********************************************/
636
637                                                 printk("\nOutput memory disabled");
638                                                 i_ReturnValue = -104;
639                                         }
640
641                     /************************/
642                                         /* Test the buffer size */
643                     /************************/
644
645                                         if (((b_Command == APCI16XX_TTL_WRITEPORT_ON) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (insn->n < 2)) {
646                        /*******************/
647                                                 /* Data size error */
648                        /*******************/
649
650                                                 printk("\nBuffer size error");
651                                                 i_ReturnValue = -101;
652                                         }
653                                 } else {
654                     /*****************************************/
655                                         /* The selected TTL output port is wrong */
656                     /*****************************************/
657
658                                         printk("\nPort selection error %lX",
659                                                 (unsigned long)devpriv->
660                                                 ul_TTLPortConfiguration[0]);
661                                         i_ReturnValue = -102;
662                                 }
663                         } else {
664                  /****************************************/
665                                 /* The selected TTL output port is wrong */
666                  /****************************************/
667
668                                 printk("\nPort selection error %d %d",
669                                         b_SelectedPort, b_NumberOfPort);
670                                 i_ReturnValue = -102;
671                         }
672                 } else {
673               /************************/
674                         /* Config command error */
675               /************************/
676
677                         printk("\nCommand selection error");
678                         i_ReturnValue = -100;
679                 }
680         } else {
681            /*******************/
682                 /* Data size error */
683            /*******************/
684
685                 printk("\nBuffer size error");
686                 i_ReturnValue = -101;
687         }
688
689         /**************************/
690         /* Test if no error occur */
691         /**************************/
692
693         if (i_ReturnValue >= 0) {
694            /********************************/
695                 /* Get the digital output state */
696            /********************************/
697
698                 dw_Status =
699                         inl(devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4));
700
701            /**********************************/
702                 /* Test if output memory not used */
703            /**********************************/
704
705                 if (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE) {
706               /*********************************/
707                         /* Clear the selected port value */
708               /*********************************/
709
710                         dw_Status =
711                                 dw_Status & (0xFFFFFFFFUL -
712                                 (0xFFUL << (8 * (b_SelectedPort % 4))));
713                 }
714
715            /******************************/
716                 /* Test if setting channel ON */
717            /******************************/
718
719                 if (b_Command == APCI16XX_TTL_WRITECHANNEL_ON) {
720                         dw_Status =
721                                 dw_Status | (1UL << ((8 * (b_SelectedPort %
722                                                         4)) + b_OutputChannel));
723                 }
724
725            /***************************/
726                 /* Test if setting port ON */
727            /***************************/
728
729                 if (b_Command == APCI16XX_TTL_WRITEPORT_ON) {
730                         dw_Status =
731                                 dw_Status | ((data[1] & 0xFF) << (8 *
732                                         (b_SelectedPort % 4)));
733                 }
734
735            /*******************************/
736                 /* Test if setting channel OFF */
737            /*******************************/
738
739                 if (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) {
740                         dw_Status =
741                                 dw_Status & (0xFFFFFFFFUL -
742                                 (1UL << ((8 * (b_SelectedPort % 4)) +
743                                                 b_OutputChannel)));
744                 }
745
746            /****************************/
747                 /* Test if setting port OFF */
748            /****************************/
749
750                 if (b_Command == APCI16XX_TTL_WRITEPORT_OFF) {
751                         dw_Status =
752                                 dw_Status & (0xFFFFFFFFUL -
753                                 ((data[1] & 0xFF) << (8 * (b_SelectedPort %
754                                                         4))));
755                 }
756
757                 outl(dw_Status,
758                         devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4));
759         }
760
761         return (i_ReturnValue);
762 }
763
764 /*
765 +----------------------------------------------------------------------------+
766 | Function   Name   : int i_APCI2200_Reset(struct comedi_device *dev)               |                                                         +----------------------------------------------------------------------------+
767 | Task              :resets all the registers                                |
768 +----------------------------------------------------------------------------+
769 | Input Parameters  : struct comedi_device *dev                                     |
770 +----------------------------------------------------------------------------+
771 | Output Parameters : -                                                      |
772 +----------------------------------------------------------------------------+
773 | Return Value      : -                                                      |
774 +----------------------------------------------------------------------------+
775 */
776
777 int i_APCI16XX_Reset(struct comedi_device * dev)
778 {
779         return 0;
780 }