4 Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
10 Fax: +49(0)7223/9493-92
11 http://www.addi-data.com
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.
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.
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
20 You should also find the complete GPL in the COPYING file accompanying this source code.
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 : DIG_IO.C | Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-----------------------------------------------------------------------+
37 | Description : APCI-1710 digital I/O module |
40 +-----------------------------------------------------------------------+
42 +-----------------------------------------------------------------------+
43 | Date | Author | Description of updates |
44 +----------+-----------+------------------------------------------------+
45 | 16/06/98 | S. Weber | Digital input / output implementation |
46 |----------|-----------|------------------------------------------------|
47 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
49 +-----------------------------------------------------------------------+
52 +-----------------------------------------------------------------------+
56 +----------------------------------------------------------------------------+
58 +----------------------------------------------------------------------------+
60 #include "APCI1710_Dig_io.h"
63 +----------------------------------------------------------------------------+
64 | Function Name : int i_APCI1710_InsnConfigDigitalIO(struct comedi_device *dev, |
65 | struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)|
66 +----------------------------------------------------------------------------+
67 | Task : Configure the digital I/O operating mode from selected |
68 | module (b_ModulNbr). You must calling this function be|
69 | for you call any other function witch access of digital|
71 +----------------------------------------------------------------------------+
72 | Input Parameters : |
73 | unsigned char_ b_ModulNbr data[0]: Module number to |
74 | configure (0 to 3) |
75 | unsigned char_ b_ChannelAMode data[1] : Channel A mode selection |
76 | 0 : Channel used for digital |
78 | 1 : Channel used for digital |
80 | unsigned char_ b_ChannelBMode data[2] : Channel B mode selection |
81 | 0 : Channel used for digital |
83 | 1 : Channel used for digital |
86 Activates and deactivates the digital output memory.
88 | called up this function with memory on,the output you have previously|
89 | activated with the function are not reset
90 +----------------------------------------------------------------------------+
91 | Output Parameters : - |
92 +----------------------------------------------------------------------------+
93 | Return Value : 0: No error |
94 | -1: The handle parameter of the board is wrong |
95 | -2: The module parameter is wrong |
96 | -3: The module is not a digital I/O module |
97 | -4: Bi-directional channel A configuration error |
98 | -5: Bi-directional channel B configuration error |
99 +----------------------------------------------------------------------------+
102 int i_APCI1710_InsnConfigDigitalIO(struct comedi_device *dev, struct comedi_subdevice *s,
103 struct comedi_insn *insn, unsigned int *data)
105 unsigned char b_ModulNbr, b_ChannelAMode, b_ChannelBMode;
106 unsigned char b_MemoryOnOff, b_ConfigType;
107 int i_ReturnValue = 0;
108 unsigned int dw_WriteConfig = 0;
110 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
111 b_ConfigType = (unsigned char) data[0]; /* Memory or Init */
112 b_ChannelAMode = (unsigned char) data[1];
113 b_ChannelBMode = (unsigned char) data[2];
114 b_MemoryOnOff = (unsigned char) data[1]; /* if memory operation */
115 i_ReturnValue = insn->n;
117 /**************************/
118 /* Test the module number */
119 /**************************/
121 if (b_ModulNbr >= 4) {
122 DPRINTK("Module Number invalid\n");
124 return i_ReturnValue;
126 switch (b_ConfigType) {
127 case APCI1710_DIGIO_MEMORYONOFF:
129 if (b_MemoryOnOff) /* If Memory ON */
131 /****************************/
132 /* Set the output memory on */
133 /****************************/
135 devpriv->s_ModuleInfo[b_ModulNbr].
136 s_DigitalIOInfo.b_OutputMemoryEnabled = 1;
138 /***************************/
139 /* Clear the output memory */
140 /***************************/
141 devpriv->s_ModuleInfo[b_ModulNbr].
142 s_DigitalIOInfo.dw_OutputMemory = 0;
143 } else /* If memory off */
145 /*****************************/
146 /* Set the output memory off */
147 /*****************************/
149 devpriv->s_ModuleInfo[b_ModulNbr].
150 s_DigitalIOInfo.b_OutputMemoryEnabled = 0;
154 case APCI1710_DIGIO_INIT:
156 /*******************************/
157 /* Test if digital I/O counter */
158 /*******************************/
160 if ((devpriv->s_BoardInfos.
161 dw_MolduleConfiguration[b_ModulNbr] &
162 0xFFFF0000UL) == APCI1710_DIGITAL_IO) {
164 /***************************************************/
165 /* Test the bi-directional channel A configuration */
166 /***************************************************/
168 if ((b_ChannelAMode == 0) || (b_ChannelAMode == 1)) {
169 /***************************************************/
170 /* Test the bi-directional channel B configuration */
171 /***************************************************/
173 if ((b_ChannelBMode == 0)
174 || (b_ChannelBMode == 1)) {
175 devpriv->s_ModuleInfo[b_ModulNbr].
176 s_DigitalIOInfo.b_DigitalInit =
179 /********************************/
180 /* Save channel A configuration */
181 /********************************/
183 devpriv->s_ModuleInfo[b_ModulNbr].
185 b_ChannelAMode = b_ChannelAMode;
187 /********************************/
188 /* Save channel B configuration */
189 /********************************/
191 devpriv->s_ModuleInfo[b_ModulNbr].
193 b_ChannelBMode = b_ChannelBMode;
195 /*****************************************/
196 /* Set the channel A and B configuration */
197 /*****************************************/
200 (unsigned int) (b_ChannelAMode |
201 (b_ChannelBMode * 2));
203 /***************************/
204 /* Write the configuration */
205 /***************************/
208 devpriv->s_BoardInfos.
213 /************************************************/
214 /* Bi-directional channel B configuration error */
215 /************************************************/
216 DPRINTK("Bi-directional channel B configuration error\n");
221 /************************************************/
222 /* Bi-directional channel A configuration error */
223 /************************************************/
224 DPRINTK("Bi-directional channel A configuration error\n");
230 /******************************************/
231 /* The module is not a digital I/O module */
232 /******************************************/
233 DPRINTK("The module is not a digital I/O module\n");
236 } /* end of Switch */
237 printk("Return Value %d\n", i_ReturnValue);
238 return i_ReturnValue;
242 +----------------------------------------------------------------------------+
244 +----------------------------------------------------------------------------+
248 +----------------------------------------------------------------------------+
250 |INT i_APCI1710_InsnReadDigitalIOChlValue(struct comedi_device *dev,comedi_subdevice
251 *s, struct comedi_insn *insn,unsigned int *data)
253 +----------------------------------------------------------------------------+
254 | Task : Read the status from selected digital I/O digital input|
256 +----------------------------------------------------------------------------|
260 | unsigned char_ b_ModulNbr CR_AREF(chanspec) : Selected module number |
262 | unsigned char_ b_InputChannel CR_CHAN(chanspec) : Selection from digital |
274 +----------------------------------------------------------------------------+
275 | Output Parameters : data[0] : Digital input channel |
277 | 0 : Channle is not active|
278 | 1 : Channle is active |
279 +----------------------------------------------------------------------------+
280 | Return Value : 0: No error |
281 | -1: The handle parameter of the board is wrong |
282 | -2: The module parameter is wrong |
283 | -3: The module is not a digital I/O module |
284 | -4: The selected digital I/O digital input is wrong |
285 | -5: Digital I/O not initialised |
286 | -6: The digital channel A is used for output |
287 | -7: The digital channel B is used for output |
288 +----------------------------------------------------------------------------+
291 /* _INT_ i_APCI1710_ReadDigitalIOChlValue (unsigned char_ b_BoardHandle, */
293 * unsigned char_ b_ModulNbr, unsigned char_ b_InputChannel,
294 * unsigned char *_ pb_ChannelStatus)
296 int i_APCI1710_InsnReadDigitalIOChlValue(struct comedi_device *dev,
297 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
299 int i_ReturnValue = 0;
300 unsigned int dw_StatusReg;
301 unsigned char b_ModulNbr, b_InputChannel;
302 unsigned char *pb_ChannelStatus;
303 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
304 b_InputChannel = (unsigned char) CR_CHAN(insn->chanspec);
306 pb_ChannelStatus = (unsigned char *) &data[0];
307 i_ReturnValue = insn->n;
309 /**************************/
310 /* Test the module number */
311 /**************************/
313 if (b_ModulNbr < 4) {
314 /*******************************/
315 /* Test if digital I/O counter */
316 /*******************************/
318 if ((devpriv->s_BoardInfos.
319 dw_MolduleConfiguration[b_ModulNbr] &
320 0xFFFF0000UL) == APCI1710_DIGITAL_IO) {
321 /******************************************/
322 /* Test the digital imnput channel number */
323 /******************************************/
325 if (b_InputChannel <= 6) {
326 /**********************************************/
327 /* Test if the digital I/O module initialised */
328 /**********************************************/
330 if (devpriv->s_ModuleInfo[b_ModulNbr].
331 s_DigitalIOInfo.b_DigitalInit == 1) {
332 /**********************************/
333 /* Test if channel A or channel B */
334 /**********************************/
336 if (b_InputChannel > 4) {
337 /*********************/
338 /* Test if channel A */
339 /*********************/
341 if (b_InputChannel == 5) {
342 /***************************/
343 /* Test the channel A mode */
344 /***************************/
352 /********************************************/
353 /* The digital channel A is used for output */
354 /********************************************/
359 } /* if (b_InputChannel == 5) */
361 /***************************/
362 /* Test the channel B mode */
363 /***************************/
371 /********************************************/
372 /* The digital channel B is used for output */
373 /********************************************/
378 } /* if (b_InputChannel == 5) */
379 } /* if (b_InputChannel > 4) */
381 /***********************/
382 /* Test if error occur */
383 /***********************/
385 if (i_ReturnValue >= 0) {
386 /**************************/
387 /* Read all digital input */
388 /**************************/
391 * INPDW (ps_APCI1710Variable-> s_Board [b_BoardHandle].
392 * s_BoardInfos. ui_Address + (64 * b_ModulNbr), &dw_StatusReg);
402 (unsigned char) ((dw_StatusReg ^
406 } /* if (i_ReturnValue == 0) */
408 /*******************************/
409 /* Digital I/O not initialised */
410 /*******************************/
411 DPRINTK("Digital I/O not initialised\n");
415 /********************************/
416 /* Selected digital input error */
417 /********************************/
418 DPRINTK("Selected digital input error\n");
422 /******************************************/
423 /* The module is not a digital I/O module */
424 /******************************************/
425 DPRINTK("The module is not a digital I/O module\n");
429 /***********************/
430 /* Module number error */
431 /***********************/
432 DPRINTK("Module number error\n");
436 return i_ReturnValue;
440 +----------------------------------------------------------------------------+
442 +----------------------------------------------------------------------------+
446 +----------------------------------------------------------------------------+
447 | Function Name : int i_APCI1710_InsnWriteDigitalIOChlOnOff(comedi_device
448 |*dev,struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)
450 +----------------------------------------------------------------------------+
451 | Task : Sets or resets the output witch has been passed with the |
452 | parameter b_Channel. Setting an output means setting |
454 +----------------------------------------------------------------------------+
455 | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
456 | unsigned char_ b_ModulNbr (aref ) : Selected module number (0 to 3)|
457 | unsigned char_ b_OutputChannel (CR_CHAN) : Selection from digital output |
462 +----------------------------------------------------------------------------+
463 | Output Parameters : - |
464 +----------------------------------------------------------------------------+
465 | Return Value : 0: No error |
466 | -1: The handle parameter of the board is wrong |
467 | -2: The module parameter is wrong |
468 | -3: The module is not a digital I/O module |
469 | -4: The selected digital output is wrong |
470 | -5: digital I/O not initialised see function |
471 | " i_APCI1710_InitDigitalIO" |
472 | -6: The digital channel A is used for input |
473 | -7: The digital channel B is used for input
474 -8: Digital Output Memory OFF. |
475 | Use previously the function |
476 | "i_APCI1710_SetDigitalIOMemoryOn". |
477 +----------------------------------------------------------------------------+
481 * _INT_ i_APCI1710_SetDigitalIOChlOn (unsigned char_ b_BoardHandle,
482 * unsigned char_ b_ModulNbr, unsigned char_ b_OutputChannel)
484 int i_APCI1710_InsnWriteDigitalIOChlOnOff(struct comedi_device *dev,
485 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
487 int i_ReturnValue = 0;
488 unsigned int dw_WriteValue = 0;
489 unsigned char b_ModulNbr, b_OutputChannel;
490 i_ReturnValue = insn->n;
491 b_ModulNbr = CR_AREF(insn->chanspec);
492 b_OutputChannel = CR_CHAN(insn->chanspec);
494 /**************************/
495 /* Test the module number */
496 /**************************/
498 if (b_ModulNbr < 4) {
499 /*******************************/
500 /* Test if digital I/O counter */
501 /*******************************/
503 if ((devpriv->s_BoardInfos.
504 dw_MolduleConfiguration[b_ModulNbr] &
505 0xFFFF0000UL) == APCI1710_DIGITAL_IO) {
506 /**********************************************/
507 /* Test if the digital I/O module initialised */
508 /**********************************************/
510 if (devpriv->s_ModuleInfo[b_ModulNbr].
511 s_DigitalIOInfo.b_DigitalInit == 1) {
512 /******************************************/
513 /* Test the digital output channel number */
514 /******************************************/
516 switch (b_OutputChannel) {
529 if (devpriv->s_ModuleInfo[b_ModulNbr].
531 b_ChannelAMode != 1) {
532 /*******************************************/
533 /* The digital channel A is used for input */
534 /*******************************************/
545 if (devpriv->s_ModuleInfo[b_ModulNbr].
547 b_ChannelBMode != 1) {
548 /*******************************************/
549 /* The digital channel B is used for input */
550 /*******************************************/
557 /****************************************/
558 /* The selected digital output is wrong */
559 /****************************************/
565 /***********************/
566 /* Test if error occur */
567 /***********************/
569 if (i_ReturnValue >= 0) {
571 /*********************************/
572 /* Test if set channel ON */
573 /*********************************/
575 /*********************************/
576 /* Test if output memory enabled */
577 /*********************************/
583 b_OutputMemoryEnabled ==
605 } /* set channel off */
611 b_OutputMemoryEnabled ==
621 (1 << b_OutputChannel));
630 /*****************************/
631 /* Digital Output Memory OFF */
632 /*****************************/
633 /* +Use previously the function "i_APCI1710_SetDigitalIOMemoryOn" */
638 /*******************/
639 /* Write the value */
640 /*******************/
642 /* OUTPDW (ps_APCI1710Variable->
643 * s_Board [b_BoardHandle].
644 * s_BoardInfos. ui_Address + (64 * b_ModulNbr),
649 devpriv->s_BoardInfos.
650 ui_Address + (64 * b_ModulNbr));
653 /*******************************/
654 /* Digital I/O not initialised */
655 /*******************************/
660 /******************************************/
661 /* The module is not a digital I/O module */
662 /******************************************/
667 /***********************/
668 /* Module number error */
669 /***********************/
674 return i_ReturnValue;
678 +----------------------------------------------------------------------------+
680 |INT i_APCI1710_InsnBitsDigitalIOPortOnOff(struct comedi_device *dev,comedi_subdevice
681 *s, struct comedi_insn *insn,unsigned int *data)
682 +----------------------------------------------------------------------------+
684 Sets or resets one or several outputs from port. |
685 | Setting an output means setting an output high. |
686 | If you have switched OFF the digital output memory |
687 | (OFF), all the other output are set to "0".
690 Read the status from digital input port |
691 | from selected digital I/O module (b_ModulNbr)
692 +----------------------------------------------------------------------------+
694 unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
695 | unsigned char_ b_ModulNbr CR_AREF(aref) : Selected module number (0 to 3)|
696 | unsigned char_ b_PortValue CR_CHAN(chanspec) : Output Value ( 0 To 7 )
697 | data[0] read or write port
698 | data[1] if write then indicate ON or OFF
700 | if read : data[1] will return port status.
701 +----------------------------------------------------------------------------+
702 | Output Parameters : - |
703 +----------------------------------------------------------------------------+
709 | -1: The handle parameter of the board is wrong |
710 | -2: The module parameter is wrong |
711 | -3: The module is not a digital I/O module |
712 | -4: Digital I/O not initialised
714 OUTPUT: 0: No error |
715 | -1: The handle parameter of the board is wrong |
716 | -2: The module parameter is wrong |
717 | -3: The module is not a digital I/O module |
718 | -4: Output value wrong |
719 | -5: digital I/O not initialised see function |
720 | " i_APCI1710_InitDigitalIO" |
721 | -6: The digital channel A is used for input |
722 | -7: The digital channel B is used for input
723 -8: Digital Output Memory OFF. |
724 | Use previously the function |
725 | "i_APCI1710_SetDigitalIOMemoryOn". |
726 +----------------------------------------------------------------------------+
730 * _INT_ i_APCI1710_SetDigitalIOPortOn (unsigned char_
731 * b_BoardHandle, unsigned char_ b_ModulNbr, unsigned char_
734 int i_APCI1710_InsnBitsDigitalIOPortOnOff(struct comedi_device *dev,
735 struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
737 int i_ReturnValue = 0;
738 unsigned int dw_WriteValue = 0;
739 unsigned int dw_StatusReg;
740 unsigned char b_ModulNbr, b_PortValue;
741 unsigned char b_PortOperation, b_PortOnOFF;
743 unsigned char *pb_PortValue;
745 b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
746 b_PortOperation = (unsigned char) data[0]; /* Input or output */
747 b_PortOnOFF = (unsigned char) data[1]; /* if output then On or Off */
748 b_PortValue = (unsigned char) data[2]; /* if out put then Value */
749 i_ReturnValue = insn->n;
750 pb_PortValue = (unsigned char *) &data[0];
751 /* if input then read value */
753 switch (b_PortOperation) {
755 /**************************/
756 /* Test the module number */
757 /**************************/
759 if (b_ModulNbr < 4) {
760 /*******************************/
761 /* Test if digital I/O counter */
762 /*******************************/
764 if ((devpriv->s_BoardInfos.
765 dw_MolduleConfiguration[b_ModulNbr] &
766 0xFFFF0000UL) == APCI1710_DIGITAL_IO) {
767 /**********************************************/
768 /* Test if the digital I/O module initialised */
769 /**********************************************/
771 if (devpriv->s_ModuleInfo[b_ModulNbr].
772 s_DigitalIOInfo.b_DigitalInit == 1) {
773 /**************************/
774 /* Read all digital input */
775 /**************************/
777 /* INPDW (ps_APCI1710Variable->
778 * s_Board [b_BoardHandle].
780 * ui_Address + (64 * b_ModulNbr),
785 inl(devpriv->s_BoardInfos.
786 ui_Address + (64 * b_ModulNbr));
788 (unsigned char) (dw_StatusReg ^ 0x1C);
791 /*******************************/
792 /* Digital I/O not initialised */
793 /*******************************/
798 /******************************************/
799 /* The module is not a digital I/O module */
800 /******************************************/
805 /***********************/
806 /* Module number error */
807 /***********************/
814 case APCI1710_OUTPUT:
815 /**************************/
816 /* Test the module number */
817 /**************************/
819 if (b_ModulNbr < 4) {
820 /*******************************/
821 /* Test if digital I/O counter */
822 /*******************************/
824 if ((devpriv->s_BoardInfos.
825 dw_MolduleConfiguration[b_ModulNbr] &
826 0xFFFF0000UL) == APCI1710_DIGITAL_IO) {
827 /**********************************************/
828 /* Test if the digital I/O module initialised */
829 /**********************************************/
831 if (devpriv->s_ModuleInfo[b_ModulNbr].
832 s_DigitalIOInfo.b_DigitalInit == 1) {
833 /***********************/
834 /* Test the port value */
835 /***********************/
837 if (b_PortValue <= 7) {
838 /***********************************/
839 /* Test the digital output channel */
840 /***********************************/
842 /**************************/
843 /* Test if channel A used */
844 /**************************/
846 if ((b_PortValue & 2) == 2) {
853 /*******************************************/
854 /* The digital channel A is used for input */
855 /*******************************************/
860 } /* if ((b_PortValue & 2) == 2) */
862 /**************************/
863 /* Test if channel B used */
864 /**************************/
866 if ((b_PortValue & 4) == 4) {
873 /*******************************************/
874 /* The digital channel B is used for input */
875 /*******************************************/
880 } /* if ((b_PortValue & 4) == 4) */
882 /***********************/
883 /* Test if error occur */
884 /***********************/
886 if (i_ReturnValue >= 0) {
890 switch (b_PortOnOFF) {
891 /*********************************/
892 /* Test if set Port ON */
893 /*********************************/
897 /*********************************/
898 /* Test if output memory enabled */
899 /*********************************/
905 b_OutputMemoryEnabled
931 /* If Set PORT OFF */
934 /*********************************/
935 /* Test if output memory enabled */
936 /*********************************/
942 b_OutputMemoryEnabled
964 /*****************************/
965 /* Digital Output Memory OFF */
966 /*****************************/
974 /*******************/
975 /* Write the value */
976 /*******************/
978 /* OUTPDW (ps_APCI1710Variable->
979 * s_Board [b_BoardHandle].
981 * ui_Address + (64 * b_ModulNbr),
991 /**********************/
992 /* Output value wrong */
993 /**********************/
998 /*******************************/
999 /* Digital I/O not initialised */
1000 /*******************************/
1005 /******************************************/
1006 /* The module is not a digital I/O module */
1007 /******************************************/
1012 /***********************/
1013 /* Module number error */
1014 /***********************/
1022 DPRINTK("NO INPUT/OUTPUT specified\n");
1023 } /* switch INPUT / OUTPUT */
1024 return i_ReturnValue;