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 : APCI-3200 | Compiler : GCC |
33 | Module name : hwdrv_apci3200.c| Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-------------------------------+---------------------------------------+
37 | Description : Hardware Layer Access For APCI-3200 |
38 +-----------------------------------------------------------------------+
40 +----------+-----------+------------------------------------------------+
41 | Date | Author | Description of updates |
42 +----------+-----------+------------------------------------------------+
43 | 02.07.04 | J. Krauth | Modification from the driver in order to |
44 | | | correct some errors when using several boards. |
47 +----------+-----------+------------------------------------------------+
48 | 26.10.04 | J. Krauth | - Update for COMEDI 0.7.68 |
49 | | | - Read eeprom value |
50 | | | - Append APCI-3300 |
51 +----------+-----------+------------------------------------------------+
54 /* #define PRINT_INFO */
56 /* Card Specific information */
57 /* #define APCI3200_ADDRESS_RANGE 264 */
59 /* Analog Input related Defines */
60 #define APCI3200_AI_OFFSET_GAIN 0
61 #define APCI3200_AI_SC_TEST 4
62 #define APCI3200_AI_IRQ 8
63 #define APCI3200_AI_AUTOCAL 12
64 #define APCI3200_RELOAD_CONV_TIME_VAL 32
65 #define APCI3200_CONV_TIME_TIME_BASE 36
66 #define APCI3200_RELOAD_DELAY_TIME_VAL 40
67 #define APCI3200_DELAY_TIME_TIME_BASE 44
68 #define APCI3200_AI_MODULE1 0
69 #define APCI3200_AI_MODULE2 64
70 #define APCI3200_AI_MODULE3 128
71 #define APCI3200_AI_MODULE4 192
74 #define APCI3200_AI_EOSIRQ 16
75 #define APCI3200_AI_EOS 20
76 #define APCI3200_AI_CHAN_ID 24
77 #define APCI3200_AI_CHAN_VAL 28
78 #define ANALOG_INPUT 0
82 #define ENABLE_EXT_TRIG 1
83 #define ENABLE_EXT_GATE 2
84 #define ENABLE_EXT_TRIG_GATE 3
86 #define APCI3200_MAXVOLT 2.5
87 #define ADDIDATA_GREATER_THAN_TEST 0
88 #define ADDIDATA_LESS_THAN_TEST 1
90 #define ADDIDATA_UNIPOLAR 1
91 #define ADDIDATA_BIPOLAR 2
95 /* ANALOG INPUT RANGE */
96 static const struct comedi_lrange range_apci3200_ai = {
109 static const struct comedi_lrange range_apci3300_ai = {
125 int i_AutoCalibration;
126 unsigned int ui_ReloadValue;
127 unsigned int ui_TimeUnitReloadVal;
129 int i_ModuleSelection;
130 } Config_Parameters_Module1, Config_Parameters_Module2,
131 Config_Parameters_Module3, Config_Parameters_Module4;
134 struct str_ADDIDATA_RTDStruct {
135 unsigned int ul_NumberOfValue;
136 unsigned int *pul_ResistanceValue;
137 unsigned int *pul_TemperatureValue;
141 unsigned long ul_CurrentSourceCJC;
142 unsigned long ul_CurrentSource[5];
143 unsigned long ul_GainFactor[8]; /* Gain Factor */
144 unsigned int w_GainValue[10];
147 struct str_BoardInfos {
153 int i_ADDIDATAPolarity;
155 int i_AutoCalibration;
156 int i_ADDIDATAConversionTime;
157 int i_ADDIDATAConversionTimeUnit;
166 unsigned int ui_Channel_num;
169 unsigned int ui_InterruptChannelValue[144]; /* Buffer */
170 unsigned char b_StructInitialized;
171 /* 7 is the maximal number of channels */
172 unsigned int ui_ScanValueArray[7 + 12];
174 int i_ConnectionType;
176 struct str_Module s_Module[MAX_MODULE];
179 /* BEGIN JK 06.07.04: Management of sevrals boards */
181 int i_CJCAvailable=1;
183 int i_CJCGain=2;/* changed from 0 to 2 */
184 int i_InterruptFlag=0;
185 int i_ADDIDATAPolarity;
187 int i_AutoCalibration=0; /* : auto calibration */
188 int i_ADDIDATAConversionTime;
189 int i_ADDIDATAConversionTimeUnit;
192 int i_ChannelCount=0;
198 unsigned int ui_Channel_num=0;
199 static int i_Count=0;
201 unsigned int ui_InterruptChannelValue[96]; /* Buffer */
203 struct str_BoardInfos s_BoardInfos[100]; /* 100 will be the max number of boards to be used */
204 /* END JK 06.07.04: Management of sevrals boards */
206 #define AMCC_OP_REG_MCSR 0x3c
207 #define EEPROM_BUSY 0x80000000
208 #define NVCMD_LOAD_LOW (0x4 << 5) /* nvRam load low command */
209 #define NVCMD_LOAD_HIGH (0x5 << 5) /* nvRam load high command */
210 #define NVCMD_BEGIN_READ (0x7 << 5) /* nvRam begin read command */
211 #define NVCMD_BEGIN_WRITE (0x6 << 5) /* EEPROM begin write command */
213 static int i_AddiHeaderRW_ReadEeprom(int i_NbOfWordsToRead,
214 unsigned int dw_PCIBoardEepromAddress,
215 unsigned short w_EepromStartAddress,
216 unsigned short *pw_DataRead)
218 unsigned int dw_eeprom_busy = 0;
222 unsigned char pb_ReadByte[1];
223 unsigned char b_ReadLowByte = 0;
224 unsigned char b_ReadHighByte = 0;
225 unsigned char b_SelectedAddressLow = 0;
226 unsigned char b_SelectedAddressHigh = 0;
227 unsigned short w_ReadWord = 0;
229 for (i_WordCounter = 0; i_WordCounter < i_NbOfWordsToRead;
233 inl(dw_PCIBoardEepromAddress +
235 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
236 } while (dw_eeprom_busy == EEPROM_BUSY);
238 for (i_Counter = 0; i_Counter < 2; i_Counter++) {
239 b_SelectedAddressLow = (w_EepromStartAddress + i_Counter) % 256; /* Read the low 8 bit part */
240 b_SelectedAddressHigh = (w_EepromStartAddress + i_Counter) / 256; /* Read the high 8 bit part */
242 /* Select the load low address mode */
244 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
250 inl(dw_PCIBoardEepromAddress +
252 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
253 } while (dw_eeprom_busy == EEPROM_BUSY);
255 /* Load the low address */
256 outb(b_SelectedAddressLow,
257 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
263 inl(dw_PCIBoardEepromAddress +
265 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
266 } while (dw_eeprom_busy == EEPROM_BUSY);
268 /* Select the load high address mode */
269 outb(NVCMD_LOAD_HIGH,
270 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
276 inl(dw_PCIBoardEepromAddress +
278 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
279 } while (dw_eeprom_busy == EEPROM_BUSY);
281 /* Load the high address */
282 outb(b_SelectedAddressHigh,
283 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
289 inl(dw_PCIBoardEepromAddress +
291 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
292 } while (dw_eeprom_busy == EEPROM_BUSY);
294 /* Select the READ mode */
295 outb(NVCMD_BEGIN_READ,
296 dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
302 inl(dw_PCIBoardEepromAddress +
304 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
305 } while (dw_eeprom_busy == EEPROM_BUSY);
307 /* Read data into the EEPROM */
309 inb(dw_PCIBoardEepromAddress +
310 AMCC_OP_REG_MCSR + 2);
315 inl(dw_PCIBoardEepromAddress +
317 dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
318 } while (dw_eeprom_busy == EEPROM_BUSY);
320 /* Select the upper address part */
322 b_ReadLowByte = pb_ReadByte[0];
324 b_ReadHighByte = pb_ReadByte[0];
332 (b_ReadLowByte | (((unsigned short)b_ReadHighByte) *
335 pw_DataRead[i_WordCounter] = w_ReadWord;
337 w_EepromStartAddress += 2; /* to read the next word */
339 } /* for (...) i_NbOfWordsToRead */
343 static void v_GetAPCI3200EepromCalibrationValue(unsigned int dw_PCIBoardEepromAddress,
344 struct str_BoardInfos *BoardInformations)
346 unsigned short w_AnalogInputMainHeaderAddress;
347 unsigned short w_AnalogInputComponentAddress;
348 unsigned short w_NumberOfModuls = 0;
349 unsigned short w_CurrentSources[2];
350 unsigned short w_ModulCounter = 0;
351 unsigned short w_FirstHeaderSize = 0;
352 unsigned short w_NumberOfInputs = 0;
353 unsigned short w_CJCFlag = 0;
354 unsigned short w_NumberOfGainValue = 0;
355 unsigned short w_SingleHeaderAddress = 0;
356 unsigned short w_SingleHeaderSize = 0;
357 unsigned short w_Input = 0;
358 unsigned short w_GainFactorAddress = 0;
359 unsigned short w_GainFactorValue[2];
360 unsigned short w_GainIndex = 0;
361 unsigned short w_GainValue = 0;
363 /*****************************************/
364 /** Get the Analog input header address **/
365 /*****************************************/
366 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
367 dw_PCIBoardEepromAddress, 0x116, /* w_EepromStartAddress: Analog input header address */
368 &w_AnalogInputMainHeaderAddress);
370 /*******************************************/
371 /** Compute the real analog input address **/
372 /*******************************************/
373 w_AnalogInputMainHeaderAddress = w_AnalogInputMainHeaderAddress + 0x100;
375 /******************************/
376 /** Get the number of moduls **/
377 /******************************/
378 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
379 dw_PCIBoardEepromAddress, w_AnalogInputMainHeaderAddress + 0x02, /* w_EepromStartAddress: Number of conponment */
382 for (w_ModulCounter = 0; w_ModulCounter < w_NumberOfModuls;
384 /***********************************/
385 /** Compute the component address **/
386 /***********************************/
387 w_AnalogInputComponentAddress =
388 w_AnalogInputMainHeaderAddress +
389 (w_FirstHeaderSize * w_ModulCounter) + 0x04;
391 /****************************/
392 /** Read first header size **/
393 /****************************/
394 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
395 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress, /* Address of the first header */
398 w_FirstHeaderSize = w_FirstHeaderSize >> 4;
400 /***************************/
401 /** Read number of inputs **/
402 /***************************/
403 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
404 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 0x06, /* Number of inputs for the first modul */
407 w_NumberOfInputs = w_NumberOfInputs >> 4;
409 /***********************/
410 /** Read the CJC flag **/
411 /***********************/
412 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
413 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 0x08, /* CJC flag */
416 w_CJCFlag = (w_CJCFlag >> 3) & 0x1; /* Get only the CJC flag */
418 /*******************************/
419 /** Read number of gain value **/
420 /*******************************/
421 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
422 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 0x44, /* Number of gain value */
423 &w_NumberOfGainValue);
425 w_NumberOfGainValue = w_NumberOfGainValue & 0xFF;
427 /***********************************/
428 /** Compute single header address **/
429 /***********************************/
430 w_SingleHeaderAddress =
431 w_AnalogInputComponentAddress + 0x46 +
432 (((w_NumberOfGainValue / 16) + 1) * 2) +
433 (6 * w_NumberOfGainValue) +
434 (4 * (((w_NumberOfGainValue / 16) + 1) * 2));
436 /********************************************/
437 /** Read current sources value for input 1 **/
438 /********************************************/
439 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
440 dw_PCIBoardEepromAddress, w_SingleHeaderAddress, /* w_EepromStartAddress: Single header address */
441 &w_SingleHeaderSize);
443 w_SingleHeaderSize = w_SingleHeaderSize >> 4;
445 /*************************************/
446 /** Read gain factor for the module **/
447 /*************************************/
448 w_GainFactorAddress = w_AnalogInputComponentAddress;
450 for (w_GainIndex = 0; w_GainIndex < w_NumberOfGainValue;
452 /************************************/
453 /** Read gain value for the module **/
454 /************************************/
455 i_AddiHeaderRW_ReadEeprom(1, /* i_NbOfWordsToRead */
456 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 70 + (2 * (1 + (w_NumberOfGainValue / 16))) + (0x02 * w_GainIndex), /* Gain value */
459 BoardInformations->s_Module[w_ModulCounter].
460 w_GainValue[w_GainIndex] = w_GainValue;
463 printk("\n Gain value = %d",
464 BoardInformations->s_Module[w_ModulCounter].
465 w_GainValue[w_GainIndex]);
468 /*************************************/
469 /** Read gain factor for the module **/
470 /*************************************/
471 i_AddiHeaderRW_ReadEeprom(2, /* i_NbOfWordsToRead */
472 dw_PCIBoardEepromAddress, w_AnalogInputComponentAddress + 70 + ((2 * w_NumberOfGainValue) + (2 * (1 + (w_NumberOfGainValue / 16)))) + (0x04 * w_GainIndex), /* Gain factor */
475 BoardInformations->s_Module[w_ModulCounter].
476 ul_GainFactor[w_GainIndex] =
477 (w_GainFactorValue[1] << 16) +
478 w_GainFactorValue[0];
481 printk("\n w_GainFactorValue [%d] = %lu", w_GainIndex,
482 BoardInformations->s_Module[w_ModulCounter].
483 ul_GainFactor[w_GainIndex]);
487 /***************************************************************/
488 /** Read current source value for each channels of the module **/
489 /***************************************************************/
490 for (w_Input = 0; w_Input < w_NumberOfInputs; w_Input++) {
491 /********************************************/
492 /** Read current sources value for input 1 **/
493 /********************************************/
494 i_AddiHeaderRW_ReadEeprom(2, /* i_NbOfWordsToRead */
495 dw_PCIBoardEepromAddress,
496 (w_Input * w_SingleHeaderSize) +
497 w_SingleHeaderAddress + 0x0C, w_CurrentSources);
499 /************************************/
500 /** Save the current sources value **/
501 /************************************/
502 BoardInformations->s_Module[w_ModulCounter].
503 ul_CurrentSource[w_Input] =
504 (w_CurrentSources[0] +
505 ((w_CurrentSources[1] & 0xFFF) << 16));
508 printk("\n Current sources [%d] = %lu", w_Input,
509 BoardInformations->s_Module[w_ModulCounter].
510 ul_CurrentSource[w_Input]);
514 /***************************************/
515 /** Read the CJC current source value **/
516 /***************************************/
517 i_AddiHeaderRW_ReadEeprom(2, /* i_NbOfWordsToRead */
518 dw_PCIBoardEepromAddress,
519 (w_Input * w_SingleHeaderSize) + w_SingleHeaderAddress +
520 0x0C, w_CurrentSources);
522 /************************************/
523 /** Save the current sources value **/
524 /************************************/
525 BoardInformations->s_Module[w_ModulCounter].
526 ul_CurrentSourceCJC =
527 (w_CurrentSources[0] +
528 ((w_CurrentSources[1] & 0xFFF) << 16));
531 printk("\n Current sources CJC = %lu",
532 BoardInformations->s_Module[w_ModulCounter].
533 ul_CurrentSourceCJC);
538 static int i_APCI3200_GetChannelCalibrationValue(struct comedi_device *dev,
539 unsigned int ui_Channel_num,
540 unsigned int *CJCCurrentSource,
541 unsigned int *ChannelCurrentSource,
542 unsigned int *ChannelGainFactor)
544 int i_DiffChannel = 0;
548 printk("\n Channel = %u", ui_Channel_num);
551 /* Test if single or differential mode */
552 if (s_BoardInfos[dev->minor].i_ConnectionType == 1) {
555 if (ui_Channel_num <= 1)
556 i_DiffChannel = ui_Channel_num, i_Module = 0;
557 else if ((ui_Channel_num >= 2) && (ui_Channel_num <= 3))
558 i_DiffChannel = ui_Channel_num - 2, i_Module = 1;
559 else if ((ui_Channel_num >= 4) && (ui_Channel_num <= 5))
560 i_DiffChannel = ui_Channel_num - 4, i_Module = 2;
561 else if ((ui_Channel_num >= 6) && (ui_Channel_num <= 7))
562 i_DiffChannel = ui_Channel_num - 6, i_Module = 3;
566 if ((ui_Channel_num == 0) || (ui_Channel_num == 1))
567 i_DiffChannel = 0, i_Module = 0;
568 else if ((ui_Channel_num == 2) || (ui_Channel_num == 3))
569 i_DiffChannel = 1, i_Module = 0;
570 else if ((ui_Channel_num == 4) || (ui_Channel_num == 5))
571 i_DiffChannel = 0, i_Module = 1;
572 else if ((ui_Channel_num == 6) || (ui_Channel_num == 7))
573 i_DiffChannel = 1, i_Module = 1;
574 else if ((ui_Channel_num == 8) || (ui_Channel_num == 9))
575 i_DiffChannel = 0, i_Module = 2;
576 else if ((ui_Channel_num == 10) || (ui_Channel_num == 11))
577 i_DiffChannel = 1, i_Module = 2;
578 else if ((ui_Channel_num == 12) || (ui_Channel_num == 13))
579 i_DiffChannel = 0, i_Module = 3;
580 else if ((ui_Channel_num == 14) || (ui_Channel_num == 15))
581 i_DiffChannel = 1, i_Module = 3;
584 /* Test if thermocouple or RTD mode */
586 s_BoardInfos[dev->minor].s_Module[i_Module].ul_CurrentSourceCJC;
588 printk("\n CJCCurrentSource = %lu", *CJCCurrentSource);
591 *ChannelCurrentSource =
592 s_BoardInfos[dev->minor].s_Module[i_Module].
593 ul_CurrentSource[i_DiffChannel];
595 printk("\n ChannelCurrentSource = %lu", *ChannelCurrentSource);
600 /* Channle gain factor */
602 s_BoardInfos[dev->minor].s_Module[i_Module].
603 ul_GainFactor[s_BoardInfos[dev->minor].i_ADDIDATAGain];
605 printk("\n ChannelGainFactor = %lu", *ChannelGainFactor);
607 /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
612 static int apci3200_di_insn_bits(struct comedi_device *dev,
613 struct comedi_subdevice *s,
614 struct comedi_insn *insn,
617 struct addi_private *devpriv = dev->private;
619 data[1] = inl(devpriv->i_IobaseReserved) & 0xf;
624 static int apci3200_do_insn_bits(struct comedi_device *dev,
625 struct comedi_subdevice *s,
626 struct comedi_insn *insn,
629 struct addi_private *devpriv = dev->private;
630 unsigned int mask = data[0];
631 unsigned int bits = data[1];
633 s->state = inl(devpriv->i_IobaseAddon) & 0xf;
636 s->state |= (bits & mask);
638 outl(s->state, devpriv->i_IobaseAddon);
646 static int i_APCI3200_Read1AnalogInputChannel(struct comedi_device *dev,
647 struct comedi_subdevice *s,
648 struct comedi_insn *insn,
651 struct addi_private *devpriv = dev->private;
652 unsigned int ui_EOC = 0;
653 unsigned int ui_ChannelNo = 0;
654 unsigned int ui_CommandRegister = 0;
656 /* BEGIN JK 06.07.04: Management of sevrals boards */
657 /* ui_ChannelNo=i_ChannelNo; */
658 ui_ChannelNo = s_BoardInfos[dev->minor].i_ChannelNo;
660 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
661 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
662 12) >> 19) & 1) != 1) ;
663 /*********************************/
664 /* Write the channel to configure */
665 /*********************************/
666 /* Begin JK 20.10.2004: Bad channel value is used when using differential mode */
667 /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
668 /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
669 outl(0 | s_BoardInfos[dev->minor].i_ChannelNo,
670 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
671 /* End JK 20.10.2004: Bad channel value is used when using differential mode */
673 /*******************************/
674 /* Set the convert timing unit */
675 /*******************************/
676 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
677 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
678 12) >> 19) & 1) != 1) ;
680 /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
681 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
682 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
684 /**************************/
685 /* Set the convert timing */
686 /**************************/
687 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
688 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
689 12) >> 19) & 1) != 1) ;
691 /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
692 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
693 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
695 /**************************************************************************/
696 /* Set the start end stop index to the selected channel and set the start */
697 /**************************************************************************/
699 ui_CommandRegister = ui_ChannelNo | (ui_ChannelNo << 8) | 0x80000;
701 /*********************************/
702 /*Test if the interrupt is enable */
703 /*********************************/
705 /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
706 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
707 /************************/
708 /* Enable the interrupt */
709 /************************/
710 ui_CommandRegister = ui_CommandRegister | 0x00100000;
711 } /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
713 /******************************/
714 /* Write the command register */
715 /******************************/
716 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
717 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
718 12) >> 19) & 1) != 1) ;
720 /* outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8); */
721 outl(ui_CommandRegister,
722 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
724 /*****************************/
725 /*Test if interrupt is enable */
726 /*****************************/
727 /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
728 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
730 /*************************/
731 /*Read the EOC Status bit */
732 /*************************/
734 /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
735 ui_EOC = inl(devpriv->iobase +
736 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
738 } while (ui_EOC != 1);
740 /***************************************/
741 /* Read the digital value of the input */
742 /***************************************/
744 /* data[0] = inl (devpriv->iobase+i_Offset + 28); */
746 inl(devpriv->iobase +
747 s_BoardInfos[dev->minor].i_Offset + 28);
748 /* END JK 06.07.04: Management of sevrals boards */
750 } /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
754 static int i_APCI3200_ReadCalibrationOffsetValue(struct comedi_device *dev,
757 struct addi_private *devpriv = dev->private;
758 unsigned int ui_Temp = 0, ui_EOC = 0;
759 unsigned int ui_CommandRegister = 0;
761 /* BEGIN JK 06.07.04: Management of sevrals boards */
762 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
763 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
764 12) >> 19) & 1) != 1) ;
765 /*********************************/
766 /* Write the channel to configure */
767 /*********************************/
768 /* Begin JK 20.10.2004: This seems not necessary ! */
769 /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
770 /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
771 /* End JK 20.10.2004: This seems not necessary ! */
773 /*******************************/
774 /* Set the convert timing unit */
775 /*******************************/
776 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
777 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
778 12) >> 19) & 1) != 1) ;
779 /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
780 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
781 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
782 /**************************/
783 /* Set the convert timing */
784 /**************************/
785 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
786 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
787 12) >> 19) & 1) != 1) ;
788 /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
789 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
790 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
791 /*****************************/
792 /*Read the calibration offset */
793 /*****************************/
794 /* ui_Temp = inl(devpriv->iobase+i_Offset + 12); */
795 ui_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
797 /*********************************/
798 /*Configure the Offset Conversion */
799 /*********************************/
800 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
801 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
802 12) >> 19) & 1) != 1) ;
803 /* outl((ui_Temp | 0x00020000), devpriv->iobase+i_Offset + 12); */
804 outl((ui_Temp | 0x00020000),
805 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
806 /*******************************/
807 /*Initialise ui_CommandRegister */
808 /*******************************/
810 ui_CommandRegister = 0;
812 /*********************************/
813 /*Test if the interrupt is enable */
814 /*********************************/
816 /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
817 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
819 /**********************/
820 /*Enable the interrupt */
821 /**********************/
823 ui_CommandRegister = ui_CommandRegister | 0x00100000;
825 } /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
827 /**********************/
828 /*Start the conversion */
829 /**********************/
830 ui_CommandRegister = ui_CommandRegister | 0x00080000;
832 /***************************/
833 /*Write the command regiter */
834 /***************************/
835 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
836 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
837 12) >> 19) & 1) != 1) ;
838 /* outl(ui_CommandRegister, devpriv->iobase+i_Offset + 8); */
839 outl(ui_CommandRegister,
840 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
842 /*****************************/
843 /*Test if interrupt is enable */
844 /*****************************/
846 /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
847 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
850 /*******************/
851 /*Read the EOC flag */
852 /*******************/
854 /* ui_EOC = inl (devpriv->iobase+i_Offset + 20) & 1; */
855 ui_EOC = inl(devpriv->iobase +
856 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
858 } while (ui_EOC != 1);
860 /**************************************************/
861 /*Read the digital value of the calibration Offset */
862 /**************************************************/
864 /* data[0] = inl(devpriv->iobase+i_Offset+ 28); */
866 inl(devpriv->iobase +
867 s_BoardInfos[dev->minor].i_Offset + 28);
868 } /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
872 static int i_APCI3200_ReadCalibrationGainValue(struct comedi_device *dev,
875 struct addi_private *devpriv = dev->private;
876 unsigned int ui_EOC = 0;
877 int ui_CommandRegister = 0;
879 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
880 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
881 12) >> 19) & 1) != 1) ;
882 /*********************************/
883 /* Write the channel to configure */
884 /*********************************/
885 /* Begin JK 20.10.2004: This seems not necessary ! */
886 /* outl(0 | ui_Channel_num , devpriv->iobase+i_Offset + 0x4); */
887 /* outl(0 | s_BoardInfos [dev->minor].ui_Channel_num , devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 0x4); */
888 /* End JK 20.10.2004: This seems not necessary ! */
890 /***************************/
891 /*Read the calibration gain */
892 /***************************/
893 /*******************************/
894 /* Set the convert timing unit */
895 /*******************************/
896 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
897 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
898 12) >> 19) & 1) != 1) ;
899 /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
900 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
901 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
902 /**************************/
903 /* Set the convert timing */
904 /**************************/
905 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
906 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
907 12) >> 19) & 1) != 1) ;
908 /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
909 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
910 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
911 /*******************************/
912 /*Configure the Gain Conversion */
913 /*******************************/
914 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
915 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
916 12) >> 19) & 1) != 1) ;
917 /* outl(0x00040000 , devpriv->iobase+i_Offset + 12); */
919 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
921 /*******************************/
922 /*Initialise ui_CommandRegister */
923 /*******************************/
925 ui_CommandRegister = 0;
927 /*********************************/
928 /*Test if the interrupt is enable */
929 /*********************************/
931 /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
932 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
934 /**********************/
935 /*Enable the interrupt */
936 /**********************/
938 ui_CommandRegister = ui_CommandRegister | 0x00100000;
940 } /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
942 /**********************/
943 /*Start the conversion */
944 /**********************/
946 ui_CommandRegister = ui_CommandRegister | 0x00080000;
947 /***************************/
948 /*Write the command regiter */
949 /***************************/
950 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
951 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
952 12) >> 19) & 1) != 1) ;
953 /* outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8); */
954 outl(ui_CommandRegister,
955 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
957 /*****************************/
958 /*Test if interrupt is enable */
959 /*****************************/
961 /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
962 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
966 /*******************/
967 /*Read the EOC flag */
968 /*******************/
970 /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
971 ui_EOC = inl(devpriv->iobase +
972 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
974 } while (ui_EOC != 1);
976 /************************************************/
977 /*Read the digital value of the calibration Gain */
978 /************************************************/
980 /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
982 inl(devpriv->iobase +
983 s_BoardInfos[dev->minor].i_Offset + 28);
985 } /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
989 static int i_APCI3200_ReadCJCValue(struct comedi_device *dev,
992 struct addi_private *devpriv = dev->private;
993 unsigned int ui_EOC = 0;
994 int ui_CommandRegister = 0;
996 /******************************/
997 /*Set the converting time unit */
998 /******************************/
1000 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1001 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1002 12) >> 19) & 1) != 1) ;
1004 /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
1005 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
1006 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
1007 /**************************/
1008 /* Set the convert timing */
1009 /**************************/
1010 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1011 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1012 12) >> 19) & 1) != 1) ;
1014 /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
1015 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
1016 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
1018 /******************************/
1019 /*Configure the CJC Conversion */
1020 /******************************/
1021 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1022 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1023 12) >> 19) & 1) != 1) ;
1025 /* outl( 0x00000400 , devpriv->iobase+i_Offset + 4); */
1027 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
1028 /*******************************/
1029 /*Initialise dw_CommandRegister */
1030 /*******************************/
1031 ui_CommandRegister = 0;
1032 /*********************************/
1033 /*Test if the interrupt is enable */
1034 /*********************************/
1035 /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
1036 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
1037 /**********************/
1038 /*Enable the interrupt */
1039 /**********************/
1040 ui_CommandRegister = ui_CommandRegister | 0x00100000;
1043 /**********************/
1044 /*Start the conversion */
1045 /**********************/
1047 ui_CommandRegister = ui_CommandRegister | 0x00080000;
1049 /***************************/
1050 /*Write the command regiter */
1051 /***************************/
1052 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1053 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1054 12) >> 19) & 1) != 1) ;
1055 /* outl(ui_CommandRegister , devpriv->iobase+i_Offset + 8); */
1056 outl(ui_CommandRegister,
1057 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
1059 /*****************************/
1060 /*Test if interrupt is enable */
1061 /*****************************/
1063 /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
1064 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
1067 /*******************/
1068 /*Read the EOC flag */
1069 /*******************/
1071 /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
1072 ui_EOC = inl(devpriv->iobase +
1073 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
1075 } while (ui_EOC != 1);
1077 /***********************************/
1078 /*Read the digital value of the CJC */
1079 /***********************************/
1081 /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
1083 inl(devpriv->iobase +
1084 s_BoardInfos[dev->minor].i_Offset + 28);
1086 } /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
1090 static int i_APCI3200_ReadCJCCalOffset(struct comedi_device *dev,
1093 struct addi_private *devpriv = dev->private;
1094 unsigned int ui_EOC = 0;
1095 int ui_CommandRegister = 0;
1097 /*******************************************/
1098 /*Read calibration offset value for the CJC */
1099 /*******************************************/
1100 /*******************************/
1101 /* Set the convert timing unit */
1102 /*******************************/
1103 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1104 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1105 12) >> 19) & 1) != 1) ;
1106 /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
1107 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
1108 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
1109 /**************************/
1110 /* Set the convert timing */
1111 /**************************/
1112 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1113 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1114 12) >> 19) & 1) != 1) ;
1115 /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
1116 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
1117 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
1118 /******************************/
1119 /*Configure the CJC Conversion */
1120 /******************************/
1121 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1122 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1123 12) >> 19) & 1) != 1) ;
1124 /* outl(0x00000400 , devpriv->iobase+i_Offset + 4); */
1126 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
1127 /*********************************/
1128 /*Configure the Offset Conversion */
1129 /*********************************/
1130 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1131 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1132 12) >> 19) & 1) != 1) ;
1133 /* outl(0x00020000, devpriv->iobase+i_Offset + 12); */
1135 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
1136 /*******************************/
1137 /*Initialise ui_CommandRegister */
1138 /*******************************/
1139 ui_CommandRegister = 0;
1140 /*********************************/
1141 /*Test if the interrupt is enable */
1142 /*********************************/
1144 /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
1145 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
1146 /**********************/
1147 /*Enable the interrupt */
1148 /**********************/
1149 ui_CommandRegister = ui_CommandRegister | 0x00100000;
1153 /**********************/
1154 /*Start the conversion */
1155 /**********************/
1156 ui_CommandRegister = ui_CommandRegister | 0x00080000;
1157 /***************************/
1158 /*Write the command regiter */
1159 /***************************/
1160 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1161 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1162 12) >> 19) & 1) != 1) ;
1163 /* outl(ui_CommandRegister,devpriv->iobase+i_Offset + 8); */
1164 outl(ui_CommandRegister,
1165 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
1166 /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
1167 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
1169 /*******************/
1170 /*Read the EOC flag */
1171 /*******************/
1172 /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
1173 ui_EOC = inl(devpriv->iobase +
1174 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
1175 } while (ui_EOC != 1);
1177 /**************************************************/
1178 /*Read the digital value of the calibration Offset */
1179 /**************************************************/
1180 /* data[0] = inl(devpriv->iobase+i_Offset + 28); */
1182 inl(devpriv->iobase +
1183 s_BoardInfos[dev->minor].i_Offset + 28);
1184 } /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
1188 static int i_APCI3200_ReadCJCCalGain(struct comedi_device *dev,
1191 struct addi_private *devpriv = dev->private;
1192 unsigned int ui_EOC = 0;
1193 int ui_CommandRegister = 0;
1195 /*******************************/
1196 /* Set the convert timing unit */
1197 /*******************************/
1198 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1199 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1200 12) >> 19) & 1) != 1) ;
1201 /* outl(i_ADDIDATAConversionTimeUnit , devpriv->iobase+i_Offset + 36); */
1202 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit,
1203 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
1204 /**************************/
1205 /* Set the convert timing */
1206 /**************************/
1207 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1208 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1209 12) >> 19) & 1) != 1) ;
1210 /* outl(i_ADDIDATAConversionTime , devpriv->iobase+i_Offset + 32); */
1211 outl(s_BoardInfos[dev->minor].i_ADDIDATAConversionTime,
1212 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
1213 /******************************/
1214 /*Configure the CJC Conversion */
1215 /******************************/
1216 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1217 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1218 12) >> 19) & 1) != 1) ;
1219 /* outl(0x00000400,devpriv->iobase+i_Offset + 4); */
1221 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
1222 /*******************************/
1223 /*Configure the Gain Conversion */
1224 /*******************************/
1225 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1226 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1227 12) >> 19) & 1) != 1) ;
1228 /* outl(0x00040000,devpriv->iobase+i_Offset + 12); */
1230 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
1232 /*******************************/
1233 /*Initialise dw_CommandRegister */
1234 /*******************************/
1235 ui_CommandRegister = 0;
1236 /*********************************/
1237 /*Test if the interrupt is enable */
1238 /*********************************/
1239 /* if (i_InterruptFlag == ADDIDATA_ENABLE) */
1240 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_ENABLE) {
1241 /**********************/
1242 /*Enable the interrupt */
1243 /**********************/
1244 ui_CommandRegister = ui_CommandRegister | 0x00100000;
1246 /**********************/
1247 /*Start the conversion */
1248 /**********************/
1249 ui_CommandRegister = ui_CommandRegister | 0x00080000;
1250 /***************************/
1251 /*Write the command regiter */
1252 /***************************/
1253 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
1254 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
1255 12) >> 19) & 1) != 1) ;
1256 /* outl(ui_CommandRegister ,devpriv->iobase+i_Offset + 8); */
1257 outl(ui_CommandRegister,
1258 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
1259 /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
1260 if (s_BoardInfos[dev->minor].i_InterruptFlag == ADDIDATA_DISABLE) {
1262 /*******************/
1263 /*Read the EOC flag */
1264 /*******************/
1265 /* ui_EOC = inl(devpriv->iobase+i_Offset + 20) & 1; */
1266 ui_EOC = inl(devpriv->iobase +
1267 s_BoardInfos[dev->minor].i_Offset + 20) & 1;
1268 } while (ui_EOC != 1);
1269 /************************************************/
1270 /*Read the digital value of the calibration Gain */
1271 /************************************************/
1272 /* data[0] = inl (devpriv->iobase+i_Offset + 28); */
1274 inl(devpriv->iobase +
1275 s_BoardInfos[dev->minor].i_Offset + 28);
1276 } /* if (i_InterruptFlag == ADDIDATA_DISABLE) */
1280 static int i_APCI3200_Reset(struct comedi_device *dev)
1282 struct addi_private *devpriv = dev->private;
1284 unsigned int dw_Dummy;
1286 /* i_InterruptFlag=0; */
1287 /* i_Initialised==0; */
1291 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
1292 s_BoardInfos[dev->minor].i_Initialised = 0;
1293 s_BoardInfos[dev->minor].i_Count = 0;
1294 s_BoardInfos[dev->minor].i_Sum = 0;
1295 s_BoardInfos[dev->minor].b_StructInitialized = 0;
1297 outl(0x83838383, devpriv->i_IobaseAmcc + 0x60);
1299 /* Enable the interrupt for the controller */
1300 dw_Dummy = inl(devpriv->i_IobaseAmcc + 0x38);
1301 outl(dw_Dummy | 0x2000, devpriv->i_IobaseAmcc + 0x38);
1302 outl(0, devpriv->i_IobaseAddon); /* Resets the output */
1304 /*Empty the buffer */
1306 for (i_Temp = 0; i_Temp <= 95; i_Temp++) {
1307 /* ui_InterruptChannelValue[i_Temp]=0; */
1308 s_BoardInfos[dev->minor].ui_InterruptChannelValue[i_Temp] = 0;
1309 } /* for(i_Temp=0;i_Temp<=95;i_Temp++) */
1310 /*****************************/
1311 /*Reset the START and IRQ bit */
1312 /*****************************/
1313 for (i_Temp = 0; i_Temp <= 192;) {
1314 while (((inl(devpriv->iobase + i_Temp + 12) >> 19) & 1) != 1) ;
1315 outl(0, devpriv->iobase + i_Temp + 8);
1316 i_Temp = i_Temp + 64;
1317 } /* for(i_Temp=0;i_Temp<=192;i_Temp+64) */
1322 * Read value of the selected channel
1324 * data[0] : Digital Value Of Input
1325 * data[1] : Calibration Offset Value
1326 * data[2] : Calibration Gain Value
1327 * data[3] : CJC value
1328 * data[4] : CJC offset value
1329 * data[5] : CJC gain value
1330 * data[6] : CJC current source from eeprom
1331 * data[7] : Channel current source from eeprom
1332 * data[8] : Channle gain factor from eeprom
1334 static int i_APCI3200_ReadAnalogInput(struct comedi_device *dev,
1335 struct comedi_subdevice *s,
1336 struct comedi_insn *insn,
1339 unsigned int ui_DummyValue = 0;
1340 int i_ConvertCJCCalibration;
1343 /* BEGIN JK 06.07.04: Management of sevrals boards */
1344 /* if(i_Initialised==0) */
1345 if (s_BoardInfos[dev->minor].i_Initialised == 0)
1346 /* END JK 06.07.04: Management of sevrals boards */
1348 i_APCI3200_Reset(dev);
1350 } /* if(i_Initialised==0); */
1353 printk("\n insn->unused[0] = %i", insn->unused[0]);
1356 switch (insn->unused[0]) {
1359 i_APCI3200_Read1AnalogInputChannel(dev, s, insn,
1361 /* BEGIN JK 06.07.04: Management of sevrals boards */
1362 /* ui_InterruptChannelValue[i_Count+0]=ui_DummyValue; */
1363 s_BoardInfos[dev->minor].
1364 ui_InterruptChannelValue[s_BoardInfos[dev->minor].
1365 i_Count + 0] = ui_DummyValue;
1366 /* END JK 06.07.04: Management of sevrals boards */
1368 /* Begin JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1369 i_APCI3200_GetChannelCalibrationValue(dev,
1370 s_BoardInfos[dev->minor].ui_Channel_num,
1371 &s_BoardInfos[dev->minor].
1372 ui_InterruptChannelValue[s_BoardInfos[dev->minor].
1374 &s_BoardInfos[dev->minor].
1375 ui_InterruptChannelValue[s_BoardInfos[dev->minor].
1377 &s_BoardInfos[dev->minor].
1378 ui_InterruptChannelValue[s_BoardInfos[dev->minor].
1382 printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+6] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 6]);
1384 printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+7] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 7]);
1386 printk("\n s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count+8] = %lu", s_BoardInfos[dev->minor].ui_InterruptChannelValue[s_BoardInfos[dev->minor].i_Count + 8]);
1389 /* End JK 25.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1391 /* BEGIN JK 06.07.04: Management of sevrals boards */
1392 /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1)) */
1393 if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
1394 && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
1395 && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
1396 /* END JK 06.07.04: Management of sevrals boards */
1398 i_APCI3200_ReadCJCValue(dev, &ui_DummyValue);
1399 /* BEGIN JK 06.07.04: Management of sevrals boards */
1400 /* ui_InterruptChannelValue[i_Count + 3]=ui_DummyValue; */
1401 s_BoardInfos[dev->minor].
1402 ui_InterruptChannelValue[s_BoardInfos[dev->
1403 minor].i_Count + 3] = ui_DummyValue;
1404 /* END JK 06.07.04: Management of sevrals boards */
1405 } /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)) */
1407 /* BEGIN JK 06.07.04: Management of sevrals boards */
1408 /* ui_InterruptChannelValue[i_Count + 3]=0; */
1409 s_BoardInfos[dev->minor].
1410 ui_InterruptChannelValue[s_BoardInfos[dev->
1411 minor].i_Count + 3] = 0;
1412 /* END JK 06.07.04: Management of sevrals boards */
1413 } /* elseif((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE) && (i_CJCAvailable==1)) */
1415 /* BEGIN JK 06.07.04: Management of sevrals boards */
1416 /* if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE)) */
1417 if ((s_BoardInfos[dev->minor].i_AutoCalibration == FALSE)
1418 && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE))
1419 /* END JK 06.07.04: Management of sevrals boards */
1421 i_APCI3200_ReadCalibrationOffsetValue(dev,
1423 /* BEGIN JK 06.07.04: Management of sevrals boards */
1424 /* ui_InterruptChannelValue[i_Count + 1]=ui_DummyValue; */
1425 s_BoardInfos[dev->minor].
1426 ui_InterruptChannelValue[s_BoardInfos[dev->
1427 minor].i_Count + 1] = ui_DummyValue;
1428 /* END JK 06.07.04: Management of sevrals boards */
1429 i_APCI3200_ReadCalibrationGainValue(dev,
1431 /* BEGIN JK 06.07.04: Management of sevrals boards */
1432 /* ui_InterruptChannelValue[i_Count + 2]=ui_DummyValue; */
1433 s_BoardInfos[dev->minor].
1434 ui_InterruptChannelValue[s_BoardInfos[dev->
1435 minor].i_Count + 2] = ui_DummyValue;
1436 /* END JK 06.07.04: Management of sevrals boards */
1437 } /* if (( i_AutoCalibration == FALSE) && (i_InterruptFlag == FALSE)) */
1439 /* BEGIN JK 06.07.04: Management of sevrals boards */
1440 /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)&& (i_CJCAvailable==1)) */
1441 if ((s_BoardInfos[dev->minor].i_ADDIDATAType == 2)
1442 && (s_BoardInfos[dev->minor].i_InterruptFlag == FALSE)
1443 && (s_BoardInfos[dev->minor].i_CJCAvailable == 1))
1444 /* END JK 06.07.04: Management of sevrals boards */
1446 /**********************************************************/
1447 /*Test if the Calibration channel must be read for the CJC */
1448 /**********************************************************/
1449 /**********************************/
1450 /*Test if the polarity is the same */
1451 /**********************************/
1452 /* BEGIN JK 06.07.04: Management of sevrals boards */
1453 /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
1454 if (s_BoardInfos[dev->minor].i_CJCPolarity !=
1455 s_BoardInfos[dev->minor].i_ADDIDATAPolarity)
1456 /* END JK 06.07.04: Management of sevrals boards */
1458 i_ConvertCJCCalibration = 1;
1459 } /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
1461 /* BEGIN JK 06.07.04: Management of sevrals boards */
1462 /* if(i_CJCGain==i_ADDIDATAGain) */
1463 if (s_BoardInfos[dev->minor].i_CJCGain ==
1464 s_BoardInfos[dev->minor].i_ADDIDATAGain)
1465 /* END JK 06.07.04: Management of sevrals boards */
1467 i_ConvertCJCCalibration = 0;
1468 } /* if(i_CJCGain==i_ADDIDATAGain) */
1470 i_ConvertCJCCalibration = 1;
1471 } /* elseif(i_CJCGain==i_ADDIDATAGain) */
1472 } /* elseif(i_CJCPolarity!=i_ADDIDATAPolarity) */
1473 if (i_ConvertCJCCalibration == 1) {
1474 i_APCI3200_ReadCJCCalOffset(dev,
1476 /* BEGIN JK 06.07.04: Management of sevrals boards */
1477 /* ui_InterruptChannelValue[i_Count+4]=ui_DummyValue; */
1478 s_BoardInfos[dev->minor].
1479 ui_InterruptChannelValue[s_BoardInfos
1480 [dev->minor].i_Count + 4] =
1482 /* END JK 06.07.04: Management of sevrals boards */
1484 i_APCI3200_ReadCJCCalGain(dev, &ui_DummyValue);
1486 /* BEGIN JK 06.07.04: Management of sevrals boards */
1487 /* ui_InterruptChannelValue[i_Count+5]=ui_DummyValue; */
1488 s_BoardInfos[dev->minor].
1489 ui_InterruptChannelValue[s_BoardInfos
1490 [dev->minor].i_Count + 5] =
1492 /* END JK 06.07.04: Management of sevrals boards */
1493 } /* if(i_ConvertCJCCalibration==1) */
1495 /* BEGIN JK 06.07.04: Management of sevrals boards */
1496 /* ui_InterruptChannelValue[i_Count+4]=0; */
1497 /* ui_InterruptChannelValue[i_Count+5]=0; */
1499 s_BoardInfos[dev->minor].
1500 ui_InterruptChannelValue[s_BoardInfos
1501 [dev->minor].i_Count + 4] = 0;
1502 s_BoardInfos[dev->minor].
1503 ui_InterruptChannelValue[s_BoardInfos
1504 [dev->minor].i_Count + 5] = 0;
1505 /* END JK 06.07.04: Management of sevrals boards */
1506 } /* elseif(i_ConvertCJCCalibration==1) */
1507 } /* if((i_ADDIDATAType==2) && (i_InterruptFlag == FALSE)) */
1509 /* BEGIN JK 06.07.04: Management of sevrals boards */
1510 /* if(i_ScanType!=1) */
1511 if (s_BoardInfos[dev->minor].i_ScanType != 1) {
1513 s_BoardInfos[dev->minor].i_Count = 0;
1514 } /* if(i_ScanType!=1) */
1516 /* i_Count=i_Count +6; */
1517 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1518 /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count +6; */
1519 s_BoardInfos[dev->minor].i_Count =
1520 s_BoardInfos[dev->minor].i_Count + 9;
1521 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1522 } /* else if(i_ScanType!=1) */
1524 /* if((i_ScanType==1) &&(i_InterruptFlag==1)) */
1525 if ((s_BoardInfos[dev->minor].i_ScanType == 1)
1526 && (s_BoardInfos[dev->minor].i_InterruptFlag == 1)) {
1527 /* i_Count=i_Count-6; */
1528 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1529 /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count-6; */
1530 s_BoardInfos[dev->minor].i_Count =
1531 s_BoardInfos[dev->minor].i_Count - 9;
1532 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1534 /* if(i_ScanType==0) */
1535 if (s_BoardInfos[dev->minor].i_ScanType == 0) {
1537 data[0]= ui_InterruptChannelValue[0];
1538 data[1]= ui_InterruptChannelValue[1];
1539 data[2]= ui_InterruptChannelValue[2];
1540 data[3]= ui_InterruptChannelValue[3];
1541 data[4]= ui_InterruptChannelValue[4];
1542 data[5]= ui_InterruptChannelValue[5];
1545 printk("\n data[0]= s_BoardInfos [dev->minor].ui_InterruptChannelValue[0];");
1548 s_BoardInfos[dev->minor].
1549 ui_InterruptChannelValue[0];
1551 s_BoardInfos[dev->minor].
1552 ui_InterruptChannelValue[1];
1554 s_BoardInfos[dev->minor].
1555 ui_InterruptChannelValue[2];
1557 s_BoardInfos[dev->minor].
1558 ui_InterruptChannelValue[3];
1560 s_BoardInfos[dev->minor].
1561 ui_InterruptChannelValue[4];
1563 s_BoardInfos[dev->minor].
1564 ui_InterruptChannelValue[5];
1566 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1567 /* printk("\n 0 - i_APCI3200_GetChannelCalibrationValue data [6] = %lu, data [7] = %lu, data [8] = %lu", data [6], data [7], data [8]); */
1568 i_APCI3200_GetChannelCalibrationValue(dev,
1569 s_BoardInfos[dev->minor].ui_Channel_num,
1570 &data[6], &data[7], &data[8]);
1571 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1576 for (i = 0; i < insn->n; i++) {
1577 /* data[i]=ui_InterruptChannelValue[i]; */
1579 s_BoardInfos[dev->minor].
1580 ui_InterruptChannelValue[i];
1585 /* if(i_ScanType==1) */
1586 s_BoardInfos[dev->minor].i_Count = 0;
1587 s_BoardInfos[dev->minor].i_Sum = 0;
1588 if (s_BoardInfos[dev->minor].i_ScanType == 1) {
1589 /* i_Initialised=0; */
1590 /* i_InterruptFlag=0; */
1591 s_BoardInfos[dev->minor].i_Initialised = 0;
1592 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
1593 /* END JK 06.07.04: Management of sevrals boards */
1597 printk("\nThe parameters passed are in error\n");
1598 i_APCI3200_Reset(dev);
1600 } /* switch(insn->unused[0]) */
1606 * Configures The Analog Input Subdevice
1608 * data[0] = 0 Normal AI
1611 * data[1] = Gain To Use
1612 * data[2] = 0 Bipolar
1614 * data[3] = Offset Range
1615 * data[4] = 0 DC Coupling
1617 * data[5] = 0 Single
1619 * data[6] = TimerReloadValue
1620 * data[7] = ConvertingTimeUnit
1621 * data[8] = 0 Analog voltage measurement
1622 * = 1 Resistance measurement
1623 * = 2 Temperature measurement
1624 * data[9] = 0 Interrupt Disable
1625 * = 1 INterrupt Enable
1626 * data[10] = Type of Thermocouple
1627 * data[11] = single channel Module Number
1628 * data[12] = 0 Single Read
1629 * = 1 Read more channel
1631 * = 3 Continuous Scan
1632 * data[13] = Number of channels to read
1633 * data[14] = 0 RTD not used
1634 * = 1 RTD 2 wire connection
1635 * = 2 RTD 3 wire connection
1636 * = 3 RTD 4 wire connection
1638 static int i_APCI3200_ConfigAnalogInput(struct comedi_device *dev,
1639 struct comedi_subdevice *s,
1640 struct comedi_insn *insn,
1643 struct addi_private *devpriv = dev->private;
1644 unsigned int ul_Config = 0, ul_Temp = 0;
1645 unsigned int ui_ChannelNo = 0;
1646 unsigned int ui_Dummy = 0;
1649 /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1654 /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1656 /* BEGIN JK 06.07.04: Management of sevrals boards */
1657 /* Initialize the structure */
1658 if (s_BoardInfos[dev->minor].b_StructInitialized != 1) {
1659 s_BoardInfos[dev->minor].i_CJCAvailable = 1;
1660 s_BoardInfos[dev->minor].i_CJCPolarity = 0;
1661 s_BoardInfos[dev->minor].i_CJCGain = 2; /* changed from 0 to 2 */
1662 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
1663 s_BoardInfos[dev->minor].i_AutoCalibration = 0; /* : auto calibration */
1664 s_BoardInfos[dev->minor].i_ChannelCount = 0;
1665 s_BoardInfos[dev->minor].i_Sum = 0;
1666 s_BoardInfos[dev->minor].ui_Channel_num = 0;
1667 s_BoardInfos[dev->minor].i_Count = 0;
1668 s_BoardInfos[dev->minor].i_Initialised = 0;
1669 s_BoardInfos[dev->minor].b_StructInitialized = 1;
1671 /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1672 s_BoardInfos[dev->minor].i_ConnectionType = 0;
1673 /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1675 /* Begin JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1676 memset(s_BoardInfos[dev->minor].s_Module, 0,
1677 sizeof(s_BoardInfos[dev->minor].s_Module[MAX_MODULE]));
1679 v_GetAPCI3200EepromCalibrationValue(devpriv->i_IobaseAmcc,
1680 &s_BoardInfos[dev->minor]);
1683 for (i = 0; i < MAX_MODULE; i++) {
1684 printk("\n s_Module[%i].ul_CurrentSourceCJC = %lu", i,
1685 s_BoardInfos[dev->minor].s_Module[i].
1686 ul_CurrentSourceCJC);
1688 for (i2 = 0; i2 < 5; i2++) {
1689 printk("\n s_Module[%i].ul_CurrentSource [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_CurrentSource[i2]);
1692 for (i2 = 0; i2 < 8; i2++) {
1693 printk("\n s_Module[%i].ul_GainFactor [%i] = %lu", i, i2, s_BoardInfos[dev->minor].s_Module[i].ul_GainFactor[i2]);
1696 for (i2 = 0; i2 < 8; i2++) {
1697 printk("\n s_Module[%i].w_GainValue [%i] = %u",
1699 s_BoardInfos[dev->minor].s_Module[i].
1704 /* End JK 21.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
1707 if (data[0] != 0 && data[0] != 1 && data[0] != 2) {
1708 printk("\nThe selection of acquisition type is in error\n");
1710 } /* if(data[0]!=0 && data[0]!=1 && data[0]!=2) */
1712 if (data[14] != 0 && data[14] != 1 && data[14] != 2
1714 printk("\n Error in selection of RTD connection type\n");
1716 } /* if(data[14]!=0 && data[14]!=1 && data[14]!=2 && data[14]!=4) */
1717 } /* if(data[0]==1 ) */
1718 if (data[1] < 0 || data[1] > 7) {
1719 printk("\nThe selection of gain is in error\n");
1721 } /* if(data[1]<0 || data[1]>7) */
1722 if (data[2] != 0 && data[2] != 1) {
1723 printk("\nThe selection of polarity is in error\n");
1725 } /* if(data[2]!=0 && data[2]!=1) */
1727 printk("\nThe selection of offset range is in error\n");
1729 } /* if(data[3]!=0) */
1730 if (data[4] != 0 && data[4] != 1) {
1731 printk("\nThe selection of coupling is in error\n");
1733 } /* if(data[4]!=0 && data[4]!=1) */
1734 if (data[5] != 0 && data[5] != 1) {
1735 printk("\nThe selection of single/differential mode is in error\n");
1737 } /* if(data[5]!=0 && data[5]!=1) */
1738 if (data[8] != 0 && data[8] != 1 && data[2] != 2) {
1739 printk("\nError in selection of functionality\n");
1740 } /* if(data[8]!=0 && data[8]!=1 && data[2]!=2) */
1741 if (data[12] == 0 || data[12] == 1) {
1742 if (data[6] != 20 && data[6] != 40 && data[6] != 80
1743 && data[6] != 160) {
1744 printk("\nThe selection of conversion time reload value is in error\n");
1746 } /* if (data[6]!=20 && data[6]!=40 && data[6]!=80 && data[6]!=160 ) */
1748 printk("\nThe selection of conversion time unit is in error\n");
1750 } /* if(data[7]!=2) */
1752 if (data[9] != 0 && data[9] != 1) {
1753 printk("\nThe selection of interrupt enable is in error\n");
1755 } /* if(data[9]!=0 && data[9]!=1) */
1756 if (data[11] < 0 || data[11] > 4) {
1757 printk("\nThe selection of module is in error\n");
1759 } /* if(data[11] <0 || data[11]>1) */
1760 if (data[12] < 0 || data[12] > 3) {
1761 printk("\nThe selection of singlechannel/scan selection is in error\n");
1763 } /* if(data[12] < 0 || data[12]> 3) */
1764 if (data[13] < 0 || data[13] > 16) {
1765 printk("\nThe selection of number of channels is in error\n");
1767 } /* if(data[13] <0 ||data[13] >15) */
1769 /* BEGIN JK 06.07.04: Management of sevrals boards */
1771 i_ChannelCount=data[13];
1772 i_ScanType=data[12];
1773 i_ADDIDATAPolarity = data[2];
1774 i_ADDIDATAGain=data[1];
1775 i_ADDIDATAConversionTime=data[6];
1776 i_ADDIDATAConversionTimeUnit=data[7];
1777 i_ADDIDATAType=data[0];
1780 /* Save acquisition configuration for the actual board */
1781 s_BoardInfos[dev->minor].i_ChannelCount = data[13];
1782 s_BoardInfos[dev->minor].i_ScanType = data[12];
1783 s_BoardInfos[dev->minor].i_ADDIDATAPolarity = data[2];
1784 s_BoardInfos[dev->minor].i_ADDIDATAGain = data[1];
1785 s_BoardInfos[dev->minor].i_ADDIDATAConversionTime = data[6];
1786 s_BoardInfos[dev->minor].i_ADDIDATAConversionTimeUnit = data[7];
1787 s_BoardInfos[dev->minor].i_ADDIDATAType = data[0];
1788 /* Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
1789 s_BoardInfos[dev->minor].i_ConnectionType = data[5];
1790 /* End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
1791 /* END JK 06.07.04: Management of sevrals boards */
1793 /* Begin JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
1794 memset(s_BoardInfos[dev->minor].ui_ScanValueArray, 0, (7 + 12) * sizeof(unsigned int)); /* 7 is the maximal number of channels */
1795 /* End JK 19.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
1797 /* BEGIN JK 02.07.04 : This while can't be do, it block the process when using severals boards */
1798 /* while(i_InterruptFlag==1) */
1799 while (s_BoardInfos[dev->minor].i_InterruptFlag == 1) {
1803 /* In the case where the driver is compiled for the MSX-Box */
1804 /* we used a printk to have a little delay because udelay */
1805 /* seems to be broken under the MSX-Box. */
1806 /* This solution hat to be studied. */
1810 /* END JK 02.07.04 : This while can't be do, it block the process when using severals boards */
1812 ui_ChannelNo = CR_CHAN(insn->chanspec); /* get the channel */
1813 /* BEGIN JK 06.07.04: Management of sevrals boards */
1814 /* i_ChannelNo=ui_ChannelNo; */
1815 /* ui_Channel_num =ui_ChannelNo; */
1817 s_BoardInfos[dev->minor].i_ChannelNo = ui_ChannelNo;
1818 s_BoardInfos[dev->minor].ui_Channel_num = ui_ChannelNo;
1820 /* END JK 06.07.04: Management of sevrals boards */
1823 if (ui_ChannelNo < 0 || ui_ChannelNo > 15) {
1824 printk("\nThe Selection of the channel is in error\n");
1826 } /* if(ui_ChannelNo<0 || ui_ChannelNo>15) */
1827 } /* if(data[5]==0) */
1829 if (data[14] == 2) {
1830 if (ui_ChannelNo < 0 || ui_ChannelNo > 3) {
1831 printk("\nThe Selection of the channel is in error\n");
1833 } /* if(ui_ChannelNo<0 || ui_ChannelNo>3) */
1834 } /* if(data[14]==2) */
1836 if (ui_ChannelNo < 0 || ui_ChannelNo > 7) {
1837 printk("\nThe Selection of the channel is in error\n");
1839 } /* if(ui_ChannelNo<0 || ui_ChannelNo>7) */
1840 } /* elseif(data[14]==2) */
1841 } /* elseif(data[5]==0) */
1842 if (data[12] == 0 || data[12] == 1) {
1845 if (ui_ChannelNo >= 0 && ui_ChannelNo <= 3) {
1846 /* BEGIN JK 06.07.04: Management of sevrals boards */
1848 s_BoardInfos[dev->minor].i_Offset = 0;
1849 /* END JK 06.07.04: Management of sevrals boards */
1850 } /* if(ui_ChannelNo >=0 && ui_ChannelNo <=3) */
1851 if (ui_ChannelNo >= 4 && ui_ChannelNo <= 7) {
1852 /* BEGIN JK 06.07.04: Management of sevrals boards */
1854 s_BoardInfos[dev->minor].i_Offset = 64;
1855 /* END JK 06.07.04: Management of sevrals boards */
1856 } /* if(ui_ChannelNo >=4 && ui_ChannelNo <=7) */
1857 if (ui_ChannelNo >= 8 && ui_ChannelNo <= 11) {
1858 /* BEGIN JK 06.07.04: Management of sevrals boards */
1860 s_BoardInfos[dev->minor].i_Offset = 128;
1861 /* END JK 06.07.04: Management of sevrals boards */
1862 } /* if(ui_ChannelNo >=8 && ui_ChannelNo <=11) */
1863 if (ui_ChannelNo >= 12 && ui_ChannelNo <= 15) {
1864 /* BEGIN JK 06.07.04: Management of sevrals boards */
1866 s_BoardInfos[dev->minor].i_Offset = 192;
1867 /* END JK 06.07.04: Management of sevrals boards */
1868 } /* if(ui_ChannelNo >=12 && ui_ChannelNo <=15) */
1871 if (data[14] == 2) {
1872 if (ui_ChannelNo == 0) {
1873 /* BEGIN JK 06.07.04: Management of sevrals boards */
1875 s_BoardInfos[dev->minor].i_Offset = 0;
1876 /* END JK 06.07.04: Management of sevrals boards */
1877 } /* if(ui_ChannelNo ==0 ) */
1878 if (ui_ChannelNo == 1) {
1879 /* BEGIN JK 06.07.04: Management of sevrals boards */
1881 s_BoardInfos[dev->minor].i_Offset = 64;
1882 /* END JK 06.07.04: Management of sevrals boards */
1883 } /* if(ui_ChannelNo ==1) */
1884 if (ui_ChannelNo == 2) {
1885 /* BEGIN JK 06.07.04: Management of sevrals boards */
1887 s_BoardInfos[dev->minor].i_Offset = 128;
1888 /* END JK 06.07.04: Management of sevrals boards */
1889 } /* if(ui_ChannelNo ==2 ) */
1890 if (ui_ChannelNo == 3) {
1891 /* BEGIN JK 06.07.04: Management of sevrals boards */
1893 s_BoardInfos[dev->minor].i_Offset = 192;
1894 /* END JK 06.07.04: Management of sevrals boards */
1895 } /* if(ui_ChannelNo ==3) */
1897 /* BEGIN JK 06.07.04: Management of sevrals boards */
1898 /* i_ChannelNo=0; */
1899 s_BoardInfos[dev->minor].i_ChannelNo = 0;
1900 /* END JK 06.07.04: Management of sevrals boards */
1903 } /* if(data[14]==2) */
1904 if (ui_ChannelNo >= 0 && ui_ChannelNo <= 1) {
1905 /* BEGIN JK 06.07.04: Management of sevrals boards */
1907 s_BoardInfos[dev->minor].i_Offset = 0;
1908 /* END JK 06.07.04: Management of sevrals boards */
1909 } /* if(ui_ChannelNo >=0 && ui_ChannelNo <=1) */
1910 if (ui_ChannelNo >= 2 && ui_ChannelNo <= 3) {
1911 /* BEGIN JK 06.07.04: Management of sevrals boards */
1912 /* i_ChannelNo=i_ChannelNo-2; */
1914 s_BoardInfos[dev->minor].i_ChannelNo =
1915 s_BoardInfos[dev->minor].i_ChannelNo -
1917 s_BoardInfos[dev->minor].i_Offset = 64;
1918 /* END JK 06.07.04: Management of sevrals boards */
1919 ui_ChannelNo = ui_ChannelNo - 2;
1920 } /* if(ui_ChannelNo >=2 && ui_ChannelNo <=3) */
1921 if (ui_ChannelNo >= 4 && ui_ChannelNo <= 5) {
1922 /* BEGIN JK 06.07.04: Management of sevrals boards */
1923 /* i_ChannelNo=i_ChannelNo-4; */
1925 s_BoardInfos[dev->minor].i_ChannelNo =
1926 s_BoardInfos[dev->minor].i_ChannelNo -
1928 s_BoardInfos[dev->minor].i_Offset = 128;
1929 /* END JK 06.07.04: Management of sevrals boards */
1930 ui_ChannelNo = ui_ChannelNo - 4;
1931 } /* if(ui_ChannelNo >=4 && ui_ChannelNo <=5) */
1932 if (ui_ChannelNo >= 6 && ui_ChannelNo <= 7) {
1933 /* BEGIN JK 06.07.04: Management of sevrals boards */
1934 /* i_ChannelNo=i_ChannelNo-6; */
1936 s_BoardInfos[dev->minor].i_ChannelNo =
1937 s_BoardInfos[dev->minor].i_ChannelNo -
1939 s_BoardInfos[dev->minor].i_Offset = 192;
1940 /* END JK 06.07.04: Management of sevrals boards */
1941 ui_ChannelNo = ui_ChannelNo - 6;
1942 } /* if(ui_ChannelNo >=6 && ui_ChannelNo <=7) */
1946 printk("\n This selection of polarity does not exist\n");
1948 } /* switch(data[2]) */
1949 } /* if(data[12]==0 || data[12]==1) */
1953 /* BEGIN JK 06.07.04: Management of sevrals boards */
1955 s_BoardInfos[dev->minor].i_Offset = 0;
1956 /* END JK 06.07.04: Management of sevrals boards */
1959 /* BEGIN JK 06.07.04: Management of sevrals boards */
1961 s_BoardInfos[dev->minor].i_Offset = 64;
1962 /* END JK 06.07.04: Management of sevrals boards */
1965 /* BEGIN JK 06.07.04: Management of sevrals boards */
1967 s_BoardInfos[dev->minor].i_Offset = 128;
1968 /* END JK 06.07.04: Management of sevrals boards */
1971 /* BEGIN JK 06.07.04: Management of sevrals boards */
1973 s_BoardInfos[dev->minor].i_Offset = 192;
1974 /* END JK 06.07.04: Management of sevrals boards */
1977 printk("\nError in module selection\n");
1979 } /* switch(data[11]) */
1980 } /* elseif(data[12]==0 || data[12]==1) */
1982 i_APCI3200_Reset(dev);
1985 /* if(i_ScanType!=1) */
1986 if (s_BoardInfos[dev->minor].i_ScanType != 1) {
1987 /* BEGIN JK 06.07.04: Management of sevrals boards */
1990 s_BoardInfos[dev->minor].i_Count = 0;
1991 s_BoardInfos[dev->minor].i_Sum = 0;
1992 /* END JK 06.07.04: Management of sevrals boards */
1993 } /* if(i_ScanType!=1) */
1996 data[1] | (data[2] << 6) | (data[5] << 7) | (data[3] << 8) |
1998 /* BEGIN JK 06.07.04: Management of sevrals boards */
1999 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2000 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2001 12) >> 19) & 1) != 1) ;
2002 /* END JK 06.07.04: Management of sevrals boards */
2003 /*********************************/
2004 /* Write the channel to configure */
2005 /*********************************/
2006 /* BEGIN JK 06.07.04: Management of sevrals boards */
2007 /* outl(0 | ui_ChannelNo , devpriv->iobase+i_Offset + 0x4); */
2008 outl(0 | ui_ChannelNo,
2009 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x4);
2010 /* END JK 06.07.04: Management of sevrals boards */
2012 /* BEGIN JK 06.07.04: Management of sevrals boards */
2013 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2014 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2015 12) >> 19) & 1) != 1) ;
2016 /* END JK 06.07.04: Management of sevrals boards */
2017 /**************************/
2018 /* Reset the configuration */
2019 /**************************/
2020 /* BEGIN JK 06.07.04: Management of sevrals boards */
2021 /* outl(0 , devpriv->iobase+i_Offset + 0x0); */
2022 outl(0, devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
2023 /* END JK 06.07.04: Management of sevrals boards */
2025 /* BEGIN JK 06.07.04: Management of sevrals boards */
2026 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2027 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2028 12) >> 19) & 1) != 1) ;
2029 /* END JK 06.07.04: Management of sevrals boards */
2031 /***************************/
2032 /* Write the configuration */
2033 /***************************/
2034 /* BEGIN JK 06.07.04: Management of sevrals boards */
2035 /* outl(ul_Config , devpriv->iobase+i_Offset + 0x0); */
2037 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x0);
2038 /* END JK 06.07.04: Management of sevrals boards */
2040 /***************************/
2041 /*Reset the calibration bit */
2042 /***************************/
2043 /* BEGIN JK 06.07.04: Management of sevrals boards */
2044 /* ul_Temp = inl(devpriv->iobase+i_Offset + 12); */
2045 ul_Temp = inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
2046 /* END JK 06.07.04: Management of sevrals boards */
2048 /* BEGIN JK 06.07.04: Management of sevrals boards */
2049 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2050 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2051 12) >> 19) & 1) != 1) ;
2052 /* END JK 06.07.04: Management of sevrals boards */
2054 /* BEGIN JK 06.07.04: Management of sevrals boards */
2055 /* outl((ul_Temp & 0xFFF9FFFF) , devpriv->iobase+.i_Offset + 12); */
2056 outl((ul_Temp & 0xFFF9FFFF),
2057 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
2058 /* END JK 06.07.04: Management of sevrals boards */
2061 devpriv->tsk_Current = current;
2062 /* BEGIN JK 06.07.04: Management of sevrals boards */
2063 /* i_InterruptFlag=1; */
2064 s_BoardInfos[dev->minor].i_InterruptFlag = 1;
2065 /* END JK 06.07.04: Management of sevrals boards */
2066 } /* if(data[9]==1) */
2068 /* BEGIN JK 06.07.04: Management of sevrals boards */
2069 /* i_InterruptFlag=0; */
2070 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
2071 /* END JK 06.07.04: Management of sevrals boards */
2072 } /* else if(data[9]==1) */
2074 /* BEGIN JK 06.07.04: Management of sevrals boards */
2075 /* i_Initialised=1; */
2076 s_BoardInfos[dev->minor].i_Initialised = 1;
2077 /* END JK 06.07.04: Management of sevrals boards */
2079 /* BEGIN JK 06.07.04: Management of sevrals boards */
2080 /* if(i_ScanType==1) */
2081 if (s_BoardInfos[dev->minor].i_ScanType == 1)
2082 /* END JK 06.07.04: Management of sevrals boards */
2084 /* BEGIN JK 06.07.04: Management of sevrals boards */
2085 /* i_Sum=i_Sum+1; */
2086 s_BoardInfos[dev->minor].i_Sum =
2087 s_BoardInfos[dev->minor].i_Sum + 1;
2088 /* END JK 06.07.04: Management of sevrals boards */
2090 insn->unused[0] = 0;
2091 i_APCI3200_ReadAnalogInput(dev, s, insn, &ui_Dummy);
2098 * Tests the Selected Anlog Input Channel
2100 * data[0] = 0 TestAnalogInputShortCircuit
2101 * = 1 TestAnalogInputConnection
2103 * data[0] : Digital value obtained
2104 * data[1] : calibration offset
2105 * data[2] : calibration gain
2107 static int i_APCI3200_InsnBits_AnalogInput_Test(struct comedi_device *dev,
2108 struct comedi_subdevice *s,
2109 struct comedi_insn *insn,
2112 struct addi_private *devpriv = dev->private;
2113 unsigned int ui_Configuration = 0;
2114 int i_Temp; /* ,i_TimeUnit; */
2116 /* if(i_Initialised==0) */
2118 if (s_BoardInfos[dev->minor].i_Initialised == 0) {
2119 i_APCI3200_Reset(dev);
2121 } /* if(i_Initialised==0); */
2122 if (data[0] != 0 && data[0] != 1) {
2123 printk("\nError in selection of functionality\n");
2124 i_APCI3200_Reset(dev);
2126 } /* if(data[0]!=0 && data[0]!=1) */
2128 if (data[0] == 1) /* Perform Short Circuit TEST */
2130 /**************************/
2131 /*Set the short-cicuit bit */
2132 /**************************/
2133 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2134 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
2135 i_Offset + 12) >> 19) & 1) !=
2137 /* outl((0x00001000 |i_ChannelNo) , devpriv->iobase+i_Offset + 4); */
2138 outl((0x00001000 | s_BoardInfos[dev->minor].i_ChannelNo),
2139 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2141 /*************************/
2142 /*Set the time unit to ns */
2143 /*************************/
2144 /* i_TimeUnit= i_ADDIDATAConversionTimeUnit;
2145 i_ADDIDATAConversionTimeUnit= 1; */
2146 /* i_Temp= i_InterruptFlag ; */
2147 i_Temp = s_BoardInfos[dev->minor].i_InterruptFlag;
2148 /* i_InterruptFlag = ADDIDATA_DISABLE; */
2149 s_BoardInfos[dev->minor].i_InterruptFlag = ADDIDATA_DISABLE;
2150 i_APCI3200_Read1AnalogInputChannel(dev, s, insn, data);
2151 /* if(i_AutoCalibration == FALSE) */
2152 if (s_BoardInfos[dev->minor].i_AutoCalibration == FALSE) {
2153 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2154 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
2156 12) >> 19) & 1) != 1) ;
2158 /* outl((0x00001000 |i_ChannelNo) , devpriv->iobase+i_Offset + 4); */
2159 outl((0x00001000 | s_BoardInfos[dev->minor].
2162 s_BoardInfos[dev->minor].i_Offset + 4);
2164 i_APCI3200_ReadCalibrationOffsetValue(dev, data);
2166 i_APCI3200_ReadCalibrationGainValue(dev, data);
2169 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2170 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
2171 i_Offset + 12) >> 19) & 1) !=
2173 /* outl((0x00000800|i_ChannelNo) , devpriv->iobase+i_Offset + 4); */
2174 outl((0x00000800 | s_BoardInfos[dev->minor].i_ChannelNo),
2175 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2177 /* ui_Configuration = inl(devpriv->iobase+i_Offset + 0); */
2179 inl(devpriv->iobase +
2180 s_BoardInfos[dev->minor].i_Offset + 0);
2181 /*************************/
2182 /*Set the time unit to ns */
2183 /*************************/
2184 /* i_TimeUnit= i_ADDIDATAConversionTimeUnit;
2185 i_ADDIDATAConversionTimeUnit= 1; */
2186 /* i_Temp= i_InterruptFlag ; */
2187 i_Temp = s_BoardInfos[dev->minor].i_InterruptFlag;
2188 /* i_InterruptFlag = ADDIDATA_DISABLE; */
2189 s_BoardInfos[dev->minor].i_InterruptFlag = ADDIDATA_DISABLE;
2190 i_APCI3200_Read1AnalogInputChannel(dev, s, insn, data);
2191 /* if(i_AutoCalibration == FALSE) */
2192 if (s_BoardInfos[dev->minor].i_AutoCalibration == FALSE) {
2193 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2194 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].
2196 12) >> 19) & 1) != 1) ;
2197 /* outl((0x00000800|i_ChannelNo) , devpriv->iobase+i_Offset + 4); */
2198 outl((0x00000800 | s_BoardInfos[dev->minor].
2201 s_BoardInfos[dev->minor].i_Offset + 4);
2203 i_APCI3200_ReadCalibrationOffsetValue(dev, data);
2205 i_APCI3200_ReadCalibrationGainValue(dev, data);
2208 /* i_InterruptFlag=i_Temp ; */
2209 s_BoardInfos[dev->minor].i_InterruptFlag = i_Temp;
2210 /* printk("\ni_InterruptFlag=%d\n",i_InterruptFlag); */
2214 static int i_APCI3200_InsnWriteReleaseAnalogInput(struct comedi_device *dev,
2215 struct comedi_subdevice *s,
2216 struct comedi_insn *insn,
2219 i_APCI3200_Reset(dev);
2223 static int i_APCI3200_CommandTestAnalogInput(struct comedi_device *dev,
2224 struct comedi_subdevice *s,
2225 struct comedi_cmd *cmd)
2229 unsigned int ui_ConvertTime = 0;
2230 unsigned int ui_ConvertTimeBase = 0;
2231 unsigned int ui_DelayTime = 0;
2232 unsigned int ui_DelayTimeBase = 0;
2233 int i_Triggermode = 0;
2234 int i_TriggerEdge = 0;
2235 int i_NbrOfChannel = 0;
2237 double d_ConversionTimeForAllChannels = 0.0;
2238 double d_SCANTimeNewUnit = 0.0;
2240 /* Step 1 : check if triggers are trivially valid */
2242 err |= cfc_check_trigger_src(&cmd->start_src, TRIG_NOW | TRIG_EXT);
2243 err |= cfc_check_trigger_src(&cmd->scan_begin_src,
2244 TRIG_TIMER | TRIG_FOLLOW);
2245 err |= cfc_check_trigger_src(&cmd->convert_src, TRIG_TIMER);
2246 err |= cfc_check_trigger_src(&cmd->scan_end_src, TRIG_COUNT);
2247 err |= cfc_check_trigger_src(&cmd->stop_src, TRIG_COUNT | TRIG_NONE);
2249 if (s_BoardInfos[dev->minor].i_InterruptFlag == 0)
2253 i_APCI3200_Reset(dev);
2257 /* Step 2a : make sure trigger sources are unique */
2259 err |= cfc_check_trigger_is_unique(&cmd->start_src);
2260 err |= cfc_check_trigger_is_unique(&cmd->scan_begin_src);
2261 err |= cfc_check_trigger_is_unique(&cmd->stop_src);
2263 /* Step 2b : and mutually compatible */
2265 if (cmd->start_src == TRIG_EXT) {
2266 i_TriggerEdge = cmd->start_arg & 0xFFFF;
2267 i_Triggermode = cmd->start_arg >> 16;
2268 if (i_TriggerEdge < 1 || i_TriggerEdge > 3) {
2270 printk("\nThe trigger edge selection is in error\n");
2272 if (i_Triggermode != 2) {
2274 printk("\nThe trigger mode selection is in error\n");
2279 i_APCI3200_Reset(dev);
2282 /* i_FirstChannel=cmd->chanlist[0]; */
2283 s_BoardInfos[dev->minor].i_FirstChannel = cmd->chanlist[0];
2284 /* i_LastChannel=cmd->chanlist[1]; */
2285 s_BoardInfos[dev->minor].i_LastChannel = cmd->chanlist[1];
2287 if (cmd->convert_src == TRIG_TIMER) {
2288 ui_ConvertTime = cmd->convert_arg & 0xFFFF;
2289 ui_ConvertTimeBase = cmd->convert_arg >> 16;
2290 if (ui_ConvertTime != 20 && ui_ConvertTime != 40
2291 && ui_ConvertTime != 80 && ui_ConvertTime != 160)
2293 printk("\nThe selection of conversion time reload value is in error\n");
2295 } /* if (ui_ConvertTime!=20 && ui_ConvertTime!=40 && ui_ConvertTime!=80 && ui_ConvertTime!=160 ) */
2296 if (ui_ConvertTimeBase != 2) {
2297 printk("\nThe selection of conversion time unit is in error\n");
2299 } /* if(ui_ConvertTimeBase!=2) */
2302 ui_ConvertTimeBase = 0;
2304 if (cmd->scan_begin_src == TRIG_FOLLOW) {
2306 ui_DelayTimeBase = 0;
2307 } /* if(cmd->scan_begin_src==TRIG_FOLLOW) */
2309 ui_DelayTime = cmd->scan_begin_arg & 0xFFFF;
2310 ui_DelayTimeBase = cmd->scan_begin_arg >> 16;
2311 if (ui_DelayTimeBase != 2 && ui_DelayTimeBase != 3) {
2313 printk("\nThe Delay time base selection is in error\n");
2315 if (ui_DelayTime < 1 || ui_DelayTime > 1023) {
2317 printk("\nThe Delay time value is in error\n");
2320 i_APCI3200_Reset(dev);
2324 d_SCANTimeNewUnit = (double)ui_DelayTime;
2325 /* i_NbrOfChannel= i_LastChannel-i_FirstChannel + 4; */
2327 s_BoardInfos[dev->minor].i_LastChannel -
2328 s_BoardInfos[dev->minor].i_FirstChannel + 4;
2329 /**********************************************************/
2330 /*calculate the total conversion time for all the channels */
2331 /**********************************************************/
2332 d_ConversionTimeForAllChannels =
2333 (double)((double)ui_ConvertTime /
2334 (double)i_NbrOfChannel);
2336 /*******************************/
2337 /*Convert the frequence in time */
2338 /*******************************/
2339 d_ConversionTimeForAllChannels =
2340 (double)1.0 / d_ConversionTimeForAllChannels;
2341 ui_ConvertTimeBase = 3;
2342 /***********************************/
2343 /*Test if the time unit is the same */
2344 /***********************************/
2346 if (ui_DelayTimeBase <= ui_ConvertTimeBase) {
2349 i_Cpt < (ui_ConvertTimeBase - ui_DelayTimeBase);
2352 d_ConversionTimeForAllChannels =
2353 d_ConversionTimeForAllChannels * 1000;
2354 d_ConversionTimeForAllChannels =
2355 d_ConversionTimeForAllChannels + 1;
2359 i_Cpt < (ui_DelayTimeBase - ui_ConvertTimeBase);
2361 d_SCANTimeNewUnit = d_SCANTimeNewUnit * 1000;
2366 if (d_ConversionTimeForAllChannels >= d_SCANTimeNewUnit) {
2368 printk("\nSCAN Delay value cannot be used\n");
2369 /*********************************/
2370 /*SCAN Delay value cannot be used */
2371 /*********************************/
2375 } /* else if(cmd->scan_begin_src==TRIG_FOLLOW) */
2378 i_APCI3200_Reset(dev);
2385 static int i_APCI3200_StopCyclicAcquisition(struct comedi_device *dev,
2386 struct comedi_subdevice *s)
2388 struct addi_private *devpriv = dev->private;
2389 unsigned int ui_Configuration = 0;
2391 /* i_InterruptFlag=0; */
2392 /* i_Initialised=0; */
2395 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
2396 s_BoardInfos[dev->minor].i_Initialised = 0;
2397 s_BoardInfos[dev->minor].i_Count = 0;
2398 s_BoardInfos[dev->minor].i_Sum = 0;
2400 /*******************/
2401 /*Read the register */
2402 /*******************/
2403 /* ui_Configuration = inl(devpriv->iobase+i_Offset + 8); */
2405 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
2406 /*****************************/
2407 /*Reset the START and IRQ bit */
2408 /*****************************/
2409 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2410 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2411 12) >> 19) & 1) != 1) ;
2412 /* outl((ui_Configuration & 0xFFE7FFFF),devpriv->iobase+i_Offset + 8); */
2413 outl((ui_Configuration & 0xFFE7FFFF),
2414 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
2419 * Does asynchronous acquisition
2420 * Determines the mode 1 or 2.
2422 static int i_APCI3200_CommandAnalogInput(struct comedi_device *dev,
2423 struct comedi_subdevice *s)
2425 struct addi_private *devpriv = dev->private;
2426 struct comedi_cmd *cmd = &s->async->cmd;
2427 unsigned int ui_Configuration = 0;
2428 /* INT i_CurrentSource = 0; */
2429 unsigned int ui_Trigger = 0;
2430 unsigned int ui_TriggerEdge = 0;
2431 unsigned int ui_Triggermode = 0;
2432 unsigned int ui_ScanMode = 0;
2433 unsigned int ui_ConvertTime = 0;
2434 unsigned int ui_ConvertTimeBase = 0;
2435 unsigned int ui_DelayTime = 0;
2436 unsigned int ui_DelayTimeBase = 0;
2437 unsigned int ui_DelayMode = 0;
2439 /* i_FirstChannel=cmd->chanlist[0]; */
2440 /* i_LastChannel=cmd->chanlist[1]; */
2441 s_BoardInfos[dev->minor].i_FirstChannel = cmd->chanlist[0];
2442 s_BoardInfos[dev->minor].i_LastChannel = cmd->chanlist[1];
2443 if (cmd->start_src == TRIG_EXT) {
2445 ui_TriggerEdge = cmd->start_arg & 0xFFFF;
2446 ui_Triggermode = cmd->start_arg >> 16;
2447 } /* if(cmd->start_src==TRIG_EXT) */
2450 } /* elseif(cmd->start_src==TRIG_EXT) */
2452 if (cmd->stop_src == TRIG_COUNT) {
2454 } /* if (cmd->stop_src==TRIG_COUNT) */
2457 } /* else if (cmd->stop_src==TRIG_COUNT) */
2459 if (cmd->scan_begin_src == TRIG_FOLLOW) {
2461 ui_DelayTimeBase = 0;
2463 } /* if(cmd->scan_begin_src==TRIG_FOLLOW) */
2465 ui_DelayTime = cmd->scan_begin_arg & 0xFFFF;
2466 ui_DelayTimeBase = cmd->scan_begin_arg >> 16;
2468 } /* else if(cmd->scan_begin_src==TRIG_FOLLOW) */
2469 /* printk("\nui_DelayTime=%u\n",ui_DelayTime); */
2470 /* printk("\nui_DelayTimeBase=%u\n",ui_DelayTimeBase); */
2471 if (cmd->convert_src == TRIG_TIMER) {
2472 ui_ConvertTime = cmd->convert_arg & 0xFFFF;
2473 ui_ConvertTimeBase = cmd->convert_arg >> 16;
2476 ui_ConvertTimeBase = 0;
2479 /* if(i_ADDIDATAType ==1 || ((i_ADDIDATAType==2))) */
2481 /**************************************************/
2482 /*Read the old configuration of the current source */
2483 /**************************************************/
2484 /* ui_Configuration = inl(devpriv->iobase+i_Offset + 12); */
2486 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
2487 /***********************************************/
2488 /*Write the configuration of the current source */
2489 /***********************************************/
2490 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2491 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2492 12) >> 19) & 1) != 1) ;
2493 /* outl((ui_Configuration & 0xFFC00000 ), devpriv->iobase+i_Offset +12); */
2494 outl((ui_Configuration & 0xFFC00000),
2495 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 12);
2497 ui_Configuration = 0;
2498 /* printk("\nfirstchannel=%u\n",i_FirstChannel); */
2499 /* printk("\nlastchannel=%u\n",i_LastChannel); */
2500 /* printk("\nui_Trigger=%u\n",ui_Trigger); */
2501 /* printk("\nui_TriggerEdge=%u\n",ui_TriggerEdge); */
2502 /* printk("\nui_Triggermode=%u\n",ui_Triggermode); */
2503 /* printk("\nui_DelayMode=%u\n",ui_DelayMode); */
2504 /* printk("\nui_ScanMode=%u\n",ui_ScanMode); */
2506 /* ui_Configuration = i_FirstChannel |(i_LastChannel << 8)| 0x00100000 | */
2508 s_BoardInfos[dev->minor].i_FirstChannel | (s_BoardInfos[dev->
2510 i_LastChannel << 8) | 0x00100000 | (ui_Trigger << 24) |
2511 (ui_TriggerEdge << 25) | (ui_Triggermode << 27) | (ui_DelayMode
2512 << 18) | (ui_ScanMode << 16);
2514 /*************************/
2515 /*Write the Configuration */
2516 /*************************/
2517 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2518 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2519 12) >> 19) & 1) != 1) ;
2520 /* outl( ui_Configuration, devpriv->iobase+i_Offset + 0x8); */
2521 outl(ui_Configuration,
2522 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 0x8);
2523 /***********************/
2524 /*Write the Delay Value */
2525 /***********************/
2526 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2527 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2528 12) >> 19) & 1) != 1) ;
2529 /* outl(ui_DelayTime,devpriv->iobase+i_Offset + 40); */
2531 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 40);
2532 /***************************/
2533 /*Write the Delay time base */
2534 /***************************/
2535 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2536 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2537 12) >> 19) & 1) != 1) ;
2538 /* outl(ui_DelayTimeBase,devpriv->iobase+i_Offset + 44); */
2539 outl(ui_DelayTimeBase,
2540 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 44);
2541 /*********************************/
2542 /*Write the conversion time value */
2543 /*********************************/
2544 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2545 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2546 12) >> 19) & 1) != 1) ;
2547 /* outl(ui_ConvertTime,devpriv->iobase+i_Offset + 32); */
2548 outl(ui_ConvertTime,
2549 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 32);
2551 /********************************/
2552 /*Write the conversion time base */
2553 /********************************/
2554 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2555 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2556 12) >> 19) & 1) != 1) ;
2557 /* outl(ui_ConvertTimeBase,devpriv->iobase+i_Offset + 36); */
2558 outl(ui_ConvertTimeBase,
2559 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 36);
2560 /*******************/
2561 /*Read the register */
2562 /*******************/
2563 /* ui_Configuration = inl(devpriv->iobase+i_Offset + 4); */
2565 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
2566 /******************/
2567 /*Set the SCAN bit */
2568 /******************/
2569 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2570 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2571 12) >> 19) & 1) != 1) ;
2573 /* outl(((ui_Configuration & 0x1E0FF) | 0x00002000),devpriv->iobase+i_Offset + 4); */
2574 outl(((ui_Configuration & 0x1E0FF) | 0x00002000),
2575 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 4);
2576 /*******************/
2577 /*Read the register */
2578 /*******************/
2579 ui_Configuration = 0;
2580 /* ui_Configuration = inl(devpriv->iobase+i_Offset + 8); */
2582 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
2584 /*******************/
2585 /*Set the START bit */
2586 /*******************/
2587 /* while (((inl(devpriv->iobase+i_Offset+12)>>19) & 1) != 1); */
2588 while (((inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset +
2589 12) >> 19) & 1) != 1) ;
2590 /* outl((ui_Configuration | 0x00080000),devpriv->iobase+i_Offset + 8); */
2591 outl((ui_Configuration | 0x00080000),
2592 devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 8);
2597 * This function copies the acquired data(from FIFO) to Comedi buffer.
2599 static int i_APCI3200_InterruptHandleEos(struct comedi_device *dev)
2601 struct addi_private *devpriv = dev->private;
2602 unsigned int ui_StatusRegister = 0;
2603 struct comedi_subdevice *s = &dev->subdevices[0];
2605 /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2606 /* comedi_async *async = s->async; */
2608 /* data=async->data+async->buf_int_ptr;//new samples added from here onwards */
2610 /* END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2612 /************************************/
2613 /*Read the interrupt status register */
2614 /************************************/
2615 /* ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16); */
2617 inl(devpriv->iobase + s_BoardInfos[dev->minor].i_Offset + 16);
2619 /*************************/
2620 /*Test if interrupt occur */
2621 /*************************/
2623 if ((ui_StatusRegister & 0x2) == 0x2) {
2624 /*************************/
2625 /*Read the channel number */
2626 /*************************/
2627 /* ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24); */
2628 /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2629 /* This value is not used */
2630 /* ui_ChannelNumber = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 24); */
2631 s->async->events = 0;
2632 /* END JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2634 /*************************************/
2635 /*Read the digital Analog Input value */
2636 /*************************************/
2638 /* data[i_Count] = inl(devpriv->iobase+i_Offset + 28); */
2639 /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2640 /* data[s_BoardInfos [dev->minor].i_Count] = inl(devpriv->iobase+s_BoardInfos [dev->minor].i_Offset + 28); */
2641 s_BoardInfos[dev->minor].ui_ScanValueArray[s_BoardInfos[dev->
2643 inl(devpriv->iobase +
2644 s_BoardInfos[dev->minor].i_Offset + 28);
2645 /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2647 /* if((i_Count == (i_LastChannel-i_FirstChannel+3))) */
2648 if ((s_BoardInfos[dev->minor].i_Count ==
2649 (s_BoardInfos[dev->minor].i_LastChannel -
2650 s_BoardInfos[dev->minor].
2651 i_FirstChannel + 3))) {
2653 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2654 s_BoardInfos[dev->minor].i_Count++;
2656 for (i = s_BoardInfos[dev->minor].i_FirstChannel;
2657 i <= s_BoardInfos[dev->minor].i_LastChannel;
2659 i_APCI3200_GetChannelCalibrationValue(dev, i,
2660 &s_BoardInfos[dev->minor].
2661 ui_ScanValueArray[s_BoardInfos[dev->
2662 minor].i_Count + ((i -
2667 &s_BoardInfos[dev->minor].
2668 ui_ScanValueArray[s_BoardInfos[dev->
2669 minor].i_Count + ((i -
2674 &s_BoardInfos[dev->minor].
2675 ui_ScanValueArray[s_BoardInfos[dev->
2676 minor].i_Count + ((i -
2683 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2687 s_BoardInfos[dev->minor].i_Count = -1;
2689 /* async->buf_int_count+=(i_LastChannel-i_FirstChannel+4)*sizeof(unsigned int); */
2690 /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2691 /* async->buf_int_count+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(unsigned int); */
2692 /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2693 /* async->buf_int_ptr+=(i_LastChannel-i_FirstChannel+4)*sizeof(unsigned int); */
2694 /* Begin JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2695 /* async->buf_int_ptr+=(s_BoardInfos [dev->minor].i_LastChannel-s_BoardInfos [dev->minor].i_FirstChannel+4)*sizeof(unsigned int); */
2696 /* comedi_eos(dev,s); */
2698 /* Set the event type (Comedi Buffer End Of Scan) */
2699 s->async->events |= COMEDI_CB_EOS;
2701 /* Test if enougth memory is available and allocate it for 7 values */
2702 /* n = comedi_buf_write_alloc(s->async, 7*sizeof(unsigned int)); */
2703 n = comedi_buf_write_alloc(s->async,
2704 (7 + 12) * sizeof(unsigned int));
2706 /* If not enough memory available, event is set to Comedi Buffer Error */
2707 if (n > ((7 + 12) * sizeof(unsigned int))) {
2708 printk("\ncomedi_buf_write_alloc n = %i", n);
2709 s->async->events |= COMEDI_CB_ERROR;
2711 /* Write all 7 scan values in the comedi buffer */
2712 comedi_buf_memcpy_to(s->async, 0,
2713 (unsigned int *) s_BoardInfos[dev->minor].
2714 ui_ScanValueArray, (7 + 12) * sizeof(unsigned int));
2716 /* Update comedi buffer pinters indexes */
2717 comedi_buf_write_free(s->async,
2718 (7 + 12) * sizeof(unsigned int));
2721 comedi_event(dev, s);
2722 /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2724 /* BEGIN JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2726 /* if (s->async->buf_int_ptr>=s->async->data_len) // for buffer rool over */
2728 /* /* buffer rollover */ */
2729 /* s->async->buf_int_ptr=0; */
2730 /* comedi_eobuf(dev,s); */
2732 /* End JK 18.10.2004: APCI-3200 Driver update 0.7.57 -> 0.7.68 */
2735 s_BoardInfos[dev->minor].i_Count++;
2737 /* i_InterruptFlag=0; */
2738 s_BoardInfos[dev->minor].i_InterruptFlag = 0;
2742 static void v_APCI3200_Interrupt(int irq, void *d)
2744 struct comedi_device *dev = d;
2745 struct addi_private *devpriv = dev->private;
2746 unsigned int ui_StatusRegister = 0;
2747 unsigned int ui_ChannelNumber = 0;
2748 int i_CalibrationFlag = 0;
2750 unsigned int ui_DummyValue = 0;
2751 unsigned int ui_DigitalTemperature = 0;
2752 unsigned int ui_DigitalInput = 0;
2753 int i_ConvertCJCCalibration;
2755 int i_ReturnValue = 0;
2758 /* printk ("\n i_ScanType = %i i_ADDIDATAType = %i", s_BoardInfos [dev->minor].i_ScanType, s_BoardInfos [dev->minor].i_ADDIDATAType); */
2760 /* switch(i_ScanType) */
2761 switch (s_BoardInfos[dev->minor].i_ScanType) {
2764 /* switch(i_ADDIDATAType) */
2765 switch (s_BoardInfos[dev->minor].i_ADDIDATAType) {
2769 /************************************/
2770 /*Read the interrupt status register */
2771 /************************************/
2772 /* ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16); */
2774 inl(devpriv->iobase +
2775 s_BoardInfos[dev->minor].i_Offset + 16);
2776 if ((ui_StatusRegister & 0x2) == 0x2) {
2777 /* i_CalibrationFlag = ((inl(devpriv->iobase+i_Offset + 12) & 0x00060000) >> 17); */
2779 ((inl(devpriv->iobase +
2783 12) & 0x00060000) >>
2785 /*************************/
2786 /*Read the channel number */
2787 /*************************/
2788 /* ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24); */
2790 /*************************************/
2791 /*Read the digital analog input value */
2792 /*************************************/
2793 /* ui_DigitalInput = inl(devpriv->iobase+i_Offset + 28); */
2795 inl(devpriv->iobase +
2796 s_BoardInfos[dev->minor].i_Offset + 28);
2798 /***********************************************/
2799 /* Test if the value read is the channel value */
2800 /***********************************************/
2801 if (i_CalibrationFlag == 0) {
2802 /* ui_InterruptChannelValue[i_Count + 0] = ui_DigitalInput; */
2803 s_BoardInfos[dev->minor].
2804 ui_InterruptChannelValue
2805 [s_BoardInfos[dev->minor].
2806 i_Count + 0] = ui_DigitalInput;
2808 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2810 printk("\n 1 - i_APCI3200_GetChannelCalibrationValue (dev, s_BoardInfos %i", ui_ChannelNumber);
2811 i_APCI3200_GetChannelCalibrationValue (dev, s_BoardInfos [dev->minor].ui_Channel_num,
2812 &s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count + 6],
2813 &s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count + 7],
2814 &s_BoardInfos [dev->minor].ui_InterruptChannelValue[s_BoardInfos [dev->minor].i_Count + 8]);
2816 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2818 /******************************************************/
2819 /*Start the conversion of the calibration offset value */
2820 /******************************************************/
2821 i_APCI3200_ReadCalibrationOffsetValue
2822 (dev, &ui_DummyValue);
2823 } /* if (i_CalibrationFlag == 0) */
2824 /**********************************************************/
2825 /* Test if the value read is the calibration offset value */
2826 /**********************************************************/
2828 if (i_CalibrationFlag == 1) {
2830 /******************/
2831 /* Save the value */
2832 /******************/
2834 /* ui_InterruptChannelValue[i_Count + 1] = ui_DigitalInput; */
2835 s_BoardInfos[dev->minor].
2836 ui_InterruptChannelValue
2837 [s_BoardInfos[dev->minor].
2838 i_Count + 1] = ui_DigitalInput;
2840 /******************************************************/
2841 /* Start the conversion of the calibration gain value */
2842 /******************************************************/
2843 i_APCI3200_ReadCalibrationGainValue(dev,
2845 } /* if (i_CalibrationFlag == 1) */
2846 /******************************************************/
2847 /*Test if the value read is the calibration gain value */
2848 /******************************************************/
2850 if (i_CalibrationFlag == 2) {
2855 /* ui_InterruptChannelValue[i_Count + 2] = ui_DigitalInput; */
2856 s_BoardInfos[dev->minor].
2857 ui_InterruptChannelValue
2858 [s_BoardInfos[dev->minor].
2859 i_Count + 2] = ui_DigitalInput;
2860 /* if(i_ScanType==1) */
2861 if (s_BoardInfos[dev->minor].
2864 /* i_InterruptFlag=0; */
2865 s_BoardInfos[dev->minor].
2866 i_InterruptFlag = 0;
2867 /* i_Count=i_Count + 6; */
2868 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2869 /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count + 6; */
2870 s_BoardInfos[dev->minor].
2874 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2875 } /* if(i_ScanType==1) */
2878 s_BoardInfos[dev->minor].
2880 } /* elseif(i_ScanType==1) */
2881 /* if(i_ScanType!=1) */
2882 if (s_BoardInfos[dev->minor].
2884 i_ReturnValue = send_sig(SIGIO, devpriv->tsk_Current, 0); /* send signal to the sample */
2885 } /* if(i_ScanType!=1) */
2887 /* if(i_ChannelCount==i_Sum) */
2888 if (s_BoardInfos[dev->minor].
2892 send_sig(SIGIO, devpriv->tsk_Current, 0); /* send signal to the sample */
2894 } /* if(i_ScanType!=1) */
2895 } /* if (i_CalibrationFlag == 2) */
2896 } /* if ((ui_StatusRegister & 0x2) == 0x2) */
2901 /************************************/
2902 /*Read the interrupt status register */
2903 /************************************/
2905 /* ui_StatusRegister = inl(devpriv->iobase+i_Offset + 16); */
2907 inl(devpriv->iobase +
2908 s_BoardInfos[dev->minor].i_Offset + 16);
2909 /*************************/
2910 /*Test if interrupt occur */
2911 /*************************/
2913 if ((ui_StatusRegister & 0x2) == 0x2) {
2915 /* i_CJCFlag = ((inl(devpriv->iobase+i_Offset + 4) & 0x00000400) >> 10); */
2917 ((inl(devpriv->iobase +
2921 4) & 0x00000400) >> 10);
2923 /* i_CalibrationFlag = ((inl(devpriv->iobase+i_Offset + 12) & 0x00060000) >> 17); */
2925 ((inl(devpriv->iobase +
2929 12) & 0x00060000) >>
2932 /*************************/
2933 /*Read the channel number */
2934 /*************************/
2936 /* ui_ChannelNumber = inl(devpriv->iobase+i_Offset + 24); */
2938 inl(devpriv->iobase +
2939 s_BoardInfos[dev->minor].i_Offset + 24);
2940 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2941 s_BoardInfos[dev->minor].ui_Channel_num =
2943 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
2945 /************************************/
2946 /*Read the digital temperature value */
2947 /************************************/
2948 /* ui_DigitalTemperature = inl(devpriv->iobase+i_Offset + 28); */
2949 ui_DigitalTemperature =
2950 inl(devpriv->iobase +
2951 s_BoardInfos[dev->minor].i_Offset + 28);
2953 /*********************************************/
2954 /*Test if the value read is the channel value */
2955 /*********************************************/
2957 if ((i_CalibrationFlag == 0)
2958 && (i_CJCFlag == 0)) {
2959 /* ui_InterruptChannelValue[i_Count + 0]=ui_DigitalTemperature; */
2960 s_BoardInfos[dev->minor].
2961 ui_InterruptChannelValue
2962 [s_BoardInfos[dev->minor].
2964 ui_DigitalTemperature;
2966 /*********************************/
2967 /*Start the conversion of the CJC */
2968 /*********************************/
2969 i_APCI3200_ReadCJCValue(dev,
2972 } /* if ((i_CalibrationFlag == 0) && (i_CJCFlag == 0)) */
2974 /*****************************************/
2975 /*Test if the value read is the CJC value */
2976 /*****************************************/
2978 if ((i_CJCFlag == 1)
2979 && (i_CalibrationFlag == 0)) {
2980 /* ui_InterruptChannelValue[i_Count + 3]=ui_DigitalTemperature; */
2981 s_BoardInfos[dev->minor].
2982 ui_InterruptChannelValue
2983 [s_BoardInfos[dev->minor].
2985 ui_DigitalTemperature;
2987 /******************************************************/
2988 /*Start the conversion of the calibration offset value */
2989 /******************************************************/
2990 i_APCI3200_ReadCalibrationOffsetValue
2991 (dev, &ui_DummyValue);
2992 } /* if ((i_CJCFlag == 1) && (i_CalibrationFlag == 0)) */
2994 /********************************************************/
2995 /*Test if the value read is the calibration offset value */
2996 /********************************************************/
2998 if ((i_CalibrationFlag == 1)
2999 && (i_CJCFlag == 0)) {
3000 /* ui_InterruptChannelValue[i_Count + 1]=ui_DigitalTemperature; */
3001 s_BoardInfos[dev->minor].
3002 ui_InterruptChannelValue
3003 [s_BoardInfos[dev->minor].
3005 ui_DigitalTemperature;
3007 /****************************************************/
3008 /*Start the conversion of the calibration gain value */
3009 /****************************************************/
3010 i_APCI3200_ReadCalibrationGainValue(dev,
3013 } /* if ((i_CalibrationFlag == 1) && (i_CJCFlag == 0)) */
3015 /******************************************************/
3016 /*Test if the value read is the calibration gain value */
3017 /******************************************************/
3019 if ((i_CalibrationFlag == 2)
3020 && (i_CJCFlag == 0)) {
3021 /* ui_InterruptChannelValue[i_Count + 2]=ui_DigitalTemperature; */
3022 s_BoardInfos[dev->minor].
3023 ui_InterruptChannelValue
3024 [s_BoardInfos[dev->minor].
3026 ui_DigitalTemperature;
3028 /**********************************************************/
3029 /*Test if the Calibration channel must be read for the CJC */
3030 /**********************************************************/
3032 /*Test if the polarity is the same */
3033 /**********************************/
3034 /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
3035 if (s_BoardInfos[dev->minor].
3037 s_BoardInfos[dev->minor].
3038 i_ADDIDATAPolarity) {
3039 i_ConvertCJCCalibration = 1;
3040 } /* if(i_CJCPolarity!=i_ADDIDATAPolarity) */
3042 /* if(i_CJCGain==i_ADDIDATAGain) */
3043 if (s_BoardInfos[dev->minor].
3048 i_ConvertCJCCalibration
3050 } /* if(i_CJCGain==i_ADDIDATAGain) */
3052 i_ConvertCJCCalibration
3054 } /* elseif(i_CJCGain==i_ADDIDATAGain) */
3055 } /* elseif(i_CJCPolarity!=i_ADDIDATAPolarity) */
3056 if (i_ConvertCJCCalibration == 1) {
3057 /****************************************************************/
3058 /*Start the conversion of the calibration gain value for the CJC */
3059 /****************************************************************/
3060 i_APCI3200_ReadCJCCalOffset(dev,
3063 } /* if(i_ConvertCJCCalibration==1) */
3065 /* ui_InterruptChannelValue[i_Count + 4]=0; */
3066 /* ui_InterruptChannelValue[i_Count + 5]=0; */
3067 s_BoardInfos[dev->minor].
3068 ui_InterruptChannelValue
3072 s_BoardInfos[dev->minor].
3073 ui_InterruptChannelValue
3077 } /* elseif(i_ConvertCJCCalibration==1) */
3078 } /* else if ((i_CalibrationFlag == 2) && (i_CJCFlag == 0)) */
3080 /********************************************************************/
3081 /*Test if the value read is the calibration offset value for the CJC */
3082 /********************************************************************/
3084 if ((i_CalibrationFlag == 1)
3085 && (i_CJCFlag == 1)) {
3086 /* ui_InterruptChannelValue[i_Count + 4]=ui_DigitalTemperature; */
3087 s_BoardInfos[dev->minor].
3088 ui_InterruptChannelValue
3089 [s_BoardInfos[dev->minor].
3091 ui_DigitalTemperature;
3093 /****************************************************************/
3094 /*Start the conversion of the calibration gain value for the CJC */
3095 /****************************************************************/
3096 i_APCI3200_ReadCJCCalGain(dev,
3099 } /* if ((i_CalibrationFlag == 1) && (i_CJCFlag == 1)) */
3101 /******************************************************************/
3102 /*Test if the value read is the calibration gain value for the CJC */
3103 /******************************************************************/
3105 if ((i_CalibrationFlag == 2)
3106 && (i_CJCFlag == 1)) {
3107 /* ui_InterruptChannelValue[i_Count + 5]=ui_DigitalTemperature; */
3108 s_BoardInfos[dev->minor].
3109 ui_InterruptChannelValue
3110 [s_BoardInfos[dev->minor].
3112 ui_DigitalTemperature;
3114 /* if(i_ScanType==1) */
3115 if (s_BoardInfos[dev->minor].
3118 /* i_InterruptFlag=0; */
3119 s_BoardInfos[dev->minor].
3120 i_InterruptFlag = 0;
3121 /* i_Count=i_Count + 6; */
3122 /* Begin JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
3123 /* s_BoardInfos [dev->minor].i_Count=s_BoardInfos [dev->minor].i_Count + 6; */
3124 s_BoardInfos[dev->minor].
3128 /* End JK 22.10.2004: APCI-3200 / APCI-3300 Reading of EEPROM values */
3129 } /* if(i_ScanType==1) */
3132 s_BoardInfos[dev->minor].
3134 } /* elseif(i_ScanType==1) */
3136 /* if(i_ScanType!=1) */
3137 if (s_BoardInfos[dev->minor].
3139 send_sig(SIGIO, devpriv->tsk_Current, 0); /* send signal to the sample */
3140 } /* if(i_ScanType!=1) */
3142 /* if(i_ChannelCount==i_Sum) */
3143 if (s_BoardInfos[dev->minor].
3147 send_sig(SIGIO, devpriv->tsk_Current, 0); /* send signal to the sample */
3149 } /* if(i_ChannelCount==i_Sum) */
3150 } /* else if(i_ScanType!=1) */
3151 } /* if ((i_CalibrationFlag == 2) && (i_CJCFlag == 1)) */
3153 } /* else if ((ui_StatusRegister & 0x2) == 0x2) */
3155 } /* switch(i_ADDIDATAType) */
3159 i_APCI3200_InterruptHandleEos(dev);
3161 } /* switch(i_ScanType) */