Staging: comedi: Remove comedi_insn typedef
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / comedi / drivers / addi-data / hwdrv_apci1500.c
1 /**
2 @verbatim
3
4 Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
5
6 ADDI-DATA GmbH
7 Dieselstrasse 3
8 D-77833 Ottersweier
9 Tel: +19(0)7223/9493-0
10 Fax: +49(0)7223/9493-92
11 http://www.addi-data-com
12 info@addi-data.com
13
14 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 You shoud also find the complete GPL in the COPYING file accompanying this source code.
21
22 @endverbatim
23 */
24 /*
25
26 +-----------------------------------------------------------------------+
27 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
28 +-----------------------------------------------------------------------+
29 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
30 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
31 +-------------------------------+---------------------------------------+
32 | Project : APCI-1500 | Compiler : GCC |
33 | Module name : hwdrv_apci1500.c| Version : 2.96 |
34 +-------------------------------+---------------------------------------+
35 | Project manager: Eric Stolz | Date : 02/12/2002 |
36 +-------------------------------+---------------------------------------+
37 | Description : Hardware Layer Acces For APCI-1500 |
38 +-----------------------------------------------------------------------+
39 | UPDATES |
40 +----------+-----------+------------------------------------------------+
41 | Date | Author | Description of updates |
42 +----------+-----------+------------------------------------------------+
43 | | | |
44 | | | |
45 | | | |
46 +----------+-----------+------------------------------------------------+
47 */
48 #include "hwdrv_apci1500.h"
49
50 int i_TimerCounter1Init = 0;
51 int i_TimerCounter2Init = 0;
52 int i_WatchdogCounter3Init = 0;
53 int i_Event1Status = 0, i_Event2Status = 0;
54 int i_TimerCounterWatchdogInterrupt = 0;
55 int i_Logic = 0, i_CounterLogic = 0;
56 int i_InterruptMask = 0;
57 int i_InputChannel = 0;
58 int i_TimerCounter1Enabled = 0, i_TimerCounter2Enabled =
59 0, i_WatchdogCounter3Enabled = 0;
60
61 /*
62 +----------------------------------------------------------------------------+
63 | Function Name : int i_APCI1500_ConfigDigitalInputEvent |
64 | (struct comedi_device *dev,struct comedi_subdevice *s, |
65 | struct comedi_insn *insn,unsigned int *data) |
66 +----------------------------------------------------------------------------+
67 | Task : An event can be generated for each port. |
68 | The first event is related to the first 8 channels |
69 | (port 1) and the second to the following 6 channels |
70 | (port 2). An interrupt is generated when one or both |
71 | events have occurred |
72 +----------------------------------------------------------------------------+
73 | Input Parameters : struct comedi_device *dev : Driver handle |
74 | unsigned int *data : Data Pointer contains |
75 | configuration parameters as below |
76 | |
77 | data[0] :Number of the input port on |
78 | which the event will take place |
79 | (1 or 2)
80 data[1] : The event logic for port 1 has |
81 | three possibilities |
82 | :0 APCI1500_AND :This logic |
83 | links |
84 | the inputs |
85 | with an AND |
86 | logic. |
87 | 1 APCI1500_OR :This logic |
88 | links |
89 | the inputs |
90 | with a |
91 | OR logic. |
92 | 2 APCI1500_OR_PRIORITY |
93 | :This logic |
94 | links |
95 | the inputs |
96 | with a |
97 | priority |
98 | OR logic. |
99 | Input 1 |
100 | has the |
101 | highest |
102 | priority |
103 | level and |
104 | input 8 |
105 | the smallest|
106 | For the second port the user has|
107 | 1 possibility: |
108 | APCI1500_OR :This logic |
109 | links |
110 | the inputs |
111 | with a |
112 | polarity |
113 | OR logic |
114 | data[2] : These 8-character word for port1|
115 | and 6-character word for port 2 |
116 | give the mask of the event. |
117 | Each place gives the state |
118 | of the input channels and can |
119 | have one of these six characters|
120 | |
121 | 0 : This input must be on 0 |
122 | 1 : This input must be on 1 |
123 | 2 : This input reacts to |
124 | a falling edge |
125 | 3 : This input reacts to a |
126 | rising edge |
127 | 4 : This input reacts to both edges |
128 |
129 | 5 : This input is not |
130 | used for event |
131 +----------------------------------------------------------------------------+
132 | Output Parameters : -- |
133 +----------------------------------------------------------------------------+
134 | Return Value : TRUE : No error occur |
135 | : FALSE : Error occur. Return the error |
136 | |
137 +----------------------------------------------------------------------------+
138 */
139
140 INT i_APCI1500_ConfigDigitalInputEvent(struct comedi_device * dev,
141 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
142 {
143 int i_PatternPolarity = 0, i_PatternTransition = 0, i_PatternMask = 0;
144 int i_MaxChannel = 0, i_Count = 0, i_EventMask = 0;
145 int i_PatternTransitionCount = 0, i_RegValue;
146 int i;
147
148 /*************************************************/
149 /* Selects the master interrupt control register */
150 /*************************************************/
151 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL,
152 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
153 /**********************************************/
154 /* Disables the main interrupt on the board */
155 /**********************************************/
156 outb(0x00, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
157
158 if (data[0] == 1) {
159 i_MaxChannel = 8;
160 } // if (data[0] == 1)
161 else {
162 if (data[0] == 2) {
163 i_MaxChannel = 6;
164 } // if(data[0]==2)
165 else {
166 printk("\nThe specified port event does not exist\n");
167 return -EINVAL;
168 } //else if(data[0]==2)
169 } //else if (data[0] == 1)
170 switch (data[1]) {
171 case 0:
172 data[1] = APCI1500_AND;
173 break;
174 case 1:
175 data[1] = APCI1500_OR;
176 break;
177 case 2:
178 data[1] = APCI1500_OR_PRIORITY;
179 break;
180 default:
181 printk("\nThe specified interrupt logic does not exist\n");
182 return -EINVAL;
183 } //switch(data[1]);
184
185 i_Logic = data[1];
186 for (i_Count = i_MaxChannel, i = 0; i_Count > 0; i_Count--, i++) {
187 i_EventMask = data[2 + i];
188 switch (i_EventMask) {
189 case 0:
190 i_PatternMask =
191 i_PatternMask | (1 << (i_MaxChannel - i_Count));
192 break;
193 case 1:
194 i_PatternMask =
195 i_PatternMask | (1 << (i_MaxChannel - i_Count));
196 i_PatternPolarity =
197 i_PatternPolarity | (1 << (i_MaxChannel -
198 i_Count));
199 break;
200 case 2:
201 i_PatternMask =
202 i_PatternMask | (1 << (i_MaxChannel - i_Count));
203 i_PatternTransition =
204 i_PatternTransition | (1 << (i_MaxChannel -
205 i_Count));
206 break;
207 case 3:
208 i_PatternMask =
209 i_PatternMask | (1 << (i_MaxChannel - i_Count));
210 i_PatternPolarity =
211 i_PatternPolarity | (1 << (i_MaxChannel -
212 i_Count));
213 i_PatternTransition =
214 i_PatternTransition | (1 << (i_MaxChannel -
215 i_Count));
216 break;
217 case 4:
218 i_PatternTransition =
219 i_PatternTransition | (1 << (i_MaxChannel -
220 i_Count));
221 break;
222 case 5:
223 break;
224 default:
225 printk("\nThe option indicated in the event mask does not exist\n");
226 return -EINVAL;
227 } // switch(i_EventMask)
228 } //for (i_Count = i_MaxChannel; i_Count >0;i_Count --)
229
230 if (data[0] == 1) {
231 /****************************/
232 /* Test the interrupt logic */
233 /****************************/
234
235 if (data[1] == APCI1500_AND ||
236 data[1] == APCI1500_OR ||
237 data[1] == APCI1500_OR_PRIORITY) {
238 /**************************************/
239 /* Tests if a transition was declared */
240 /* for a OR PRIORITY logic */
241 /**************************************/
242
243 if (data[1] == APCI1500_OR_PRIORITY
244 && i_PatternTransition != 0) {
245 /********************************************/
246 /* Transition error on an OR PRIORITY logic */
247 /********************************************/
248 printk("\nTransition error on an OR PRIORITY logic\n");
249 return -EINVAL;
250 } // if (data[1]== APCI1500_OR_PRIORITY && i_PatternTransition != 0)
251
252 /*************************************/
253 /* Tests if more than one transition */
254 /* was declared for an AND logic */
255 /*************************************/
256
257 if (data[1] == APCI1500_AND) {
258 for (i_Count = 0; i_Count < 8; i_Count++) {
259 i_PatternTransitionCount =
260 i_PatternTransitionCount +
261 ((i_PatternTransition >>
262 i_Count) & 0x1);
263
264 } //for (i_Count = 0; i_Count < 8; i_Count++)
265
266 if (i_PatternTransitionCount > 1) {
267 /****************************************/
268 /* Transition error on an AND logic */
269 /****************************************/
270 printk("\n Transition error on an AND logic\n");
271 return -EINVAL;
272 } // if (i_PatternTransitionCount > 1)
273 } // if (data[1]== APCI1500_AND)
274
275 /*****************************************************************/
276 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
277 /*****************************************************************/
278 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
279 devpriv->iobase +
280 APCI1500_Z8536_CONTROL_REGISTER);
281 /******************/
282 /* Disable Port A */
283 /******************/
284 outb(0xF0,
285 devpriv->iobase +
286 APCI1500_Z8536_CONTROL_REGISTER);
287 /**********************************************/
288 /* Selects the polarity register of port 1 */
289 /**********************************************/
290 outb(APCI1500_RW_PORT_A_PATTERN_POLARITY,
291 devpriv->iobase +
292 APCI1500_Z8536_CONTROL_REGISTER);
293 outb(i_PatternPolarity,
294 devpriv->iobase +
295 APCI1500_Z8536_CONTROL_REGISTER);
296
297 /*********************************************/
298 /* Selects the pattern mask register of */
299 /* port 1 */
300 /*********************************************/
301 outb(APCI1500_RW_PORT_A_PATTERN_MASK,
302 devpriv->iobase +
303 APCI1500_Z8536_CONTROL_REGISTER);
304 outb(i_PatternMask,
305 devpriv->iobase +
306 APCI1500_Z8536_CONTROL_REGISTER);
307 /********************************************/
308 /* Selects the pattern transition register */
309 /* of port 1 */
310 /********************************************/
311 outb(APCI1500_RW_PORT_A_PATTERN_TRANSITION,
312 devpriv->iobase +
313 APCI1500_Z8536_CONTROL_REGISTER);
314 outb(i_PatternTransition,
315 devpriv->iobase +
316 APCI1500_Z8536_CONTROL_REGISTER);
317
318 /******************************************/
319 /* Selects the mode specification mask */
320 /* register of port 1 */
321 /******************************************/
322 outb(APCI1500_RW_PORT_A_SPECIFICATION,
323 devpriv->iobase +
324 APCI1500_Z8536_CONTROL_REGISTER);
325 i_RegValue =
326 inb(devpriv->iobase +
327 APCI1500_Z8536_CONTROL_REGISTER);
328
329 /******************************************/
330 /* Selects the mode specification mask */
331 /* register of port 1 */
332 /******************************************/
333 outb(APCI1500_RW_PORT_A_SPECIFICATION,
334 devpriv->iobase +
335 APCI1500_Z8536_CONTROL_REGISTER);
336
337 /**********************/
338 /* Port A new mode */
339 /**********************/
340
341 i_RegValue = (i_RegValue & 0xF9) | data[1] | 0x9;
342 outb(i_RegValue,
343 devpriv->iobase +
344 APCI1500_Z8536_CONTROL_REGISTER);
345
346 i_Event1Status = 1;
347
348 /*****************************************************************/
349 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
350 /*****************************************************************/
351
352 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
353 devpriv->iobase +
354 APCI1500_Z8536_CONTROL_REGISTER);
355 /*****************/
356 /* Enable Port A */
357 /*****************/
358 outb(0xF4,
359 devpriv->iobase +
360 APCI1500_Z8536_CONTROL_REGISTER);
361
362 } // if(data[1]==APCI1500_AND||data[1]==APCI1500_OR||data[1]==APCI1500_OR_PRIORITY)
363 else {
364 printk("\nThe choice for interrupt logic does not exist\n");
365 return -EINVAL;
366 } // else }// if(data[1]==APCI1500_AND||data[1]==APCI1500_OR||data[1]==APCI1500_OR_PRIORITY)
367 } // if (data[0]== 1)
368
369 /************************************/
370 /* Test if event setting for port 2 */
371 /************************************/
372
373 if (data[0] == 2) {
374 /************************/
375 /* Test the event logic */
376 /************************/
377
378 if (data[1] == APCI1500_OR) {
379 /*****************************************************************/
380 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
381 /*****************************************************************/
382 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
383 devpriv->iobase +
384 APCI1500_Z8536_CONTROL_REGISTER);
385 /******************/
386 /* Disable Port B */
387 /******************/
388 outb(0x74,
389 devpriv->iobase +
390 APCI1500_Z8536_CONTROL_REGISTER);
391 /****************************************/
392 /* Selects the mode specification mask */
393 /* register of port B */
394 /****************************************/
395 outb(APCI1500_RW_PORT_B_SPECIFICATION,
396 devpriv->iobase +
397 APCI1500_Z8536_CONTROL_REGISTER);
398 i_RegValue =
399 inb(devpriv->iobase +
400 APCI1500_Z8536_CONTROL_REGISTER);
401
402 /******************************************/
403 /* Selects the mode specification mask */
404 /* register of port B */
405 /******************************************/
406 outb(APCI1500_RW_PORT_B_SPECIFICATION,
407 devpriv->iobase +
408 APCI1500_Z8536_CONTROL_REGISTER);
409 i_RegValue = i_RegValue & 0xF9;
410 outb(i_RegValue,
411 devpriv->iobase +
412 APCI1500_Z8536_CONTROL_REGISTER);
413
414 /**********************************/
415 /* Selects error channels 1 and 2 */
416 /**********************************/
417
418 i_PatternMask = (i_PatternMask | 0xC0);
419 i_PatternPolarity = (i_PatternPolarity | 0xC0);
420 i_PatternTransition = (i_PatternTransition | 0xC0);
421
422 /**********************************************/
423 /* Selects the polarity register of port 2 */
424 /**********************************************/
425 outb(APCI1500_RW_PORT_B_PATTERN_POLARITY,
426 devpriv->iobase +
427 APCI1500_Z8536_CONTROL_REGISTER);
428 outb(i_PatternPolarity,
429 devpriv->iobase +
430 APCI1500_Z8536_CONTROL_REGISTER);
431 /**********************************************/
432 /* Selects the pattern transition register */
433 /* of port 2 */
434 /**********************************************/
435 outb(APCI1500_RW_PORT_B_PATTERN_TRANSITION,
436 devpriv->iobase +
437 APCI1500_Z8536_CONTROL_REGISTER);
438 outb(i_PatternTransition,
439 devpriv->iobase +
440 APCI1500_Z8536_CONTROL_REGISTER);
441 /**********************************************/
442 /* Selects the pattern Mask register */
443 /* of port 2 */
444 /**********************************************/
445
446 outb(APCI1500_RW_PORT_B_PATTERN_MASK,
447 devpriv->iobase +
448 APCI1500_Z8536_CONTROL_REGISTER);
449 outb(i_PatternMask,
450 devpriv->iobase +
451 APCI1500_Z8536_CONTROL_REGISTER);
452
453 /******************************************/
454 /* Selects the mode specification mask */
455 /* register of port 2 */
456 /******************************************/
457 outb(APCI1500_RW_PORT_B_SPECIFICATION,
458 devpriv->iobase +
459 APCI1500_Z8536_CONTROL_REGISTER);
460 i_RegValue =
461 inb(devpriv->iobase +
462 APCI1500_Z8536_CONTROL_REGISTER);
463 /******************************************/
464 /* Selects the mode specification mask */
465 /* register of port 2 */
466 /******************************************/
467 outb(APCI1500_RW_PORT_B_SPECIFICATION,
468 devpriv->iobase +
469 APCI1500_Z8536_CONTROL_REGISTER);
470 i_RegValue = (i_RegValue & 0xF9) | 4;
471 outb(i_RegValue,
472 devpriv->iobase +
473 APCI1500_Z8536_CONTROL_REGISTER);
474
475 i_Event2Status = 1;
476 /*****************************************************************/
477 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
478 /*****************************************************************/
479
480 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
481 devpriv->iobase +
482 APCI1500_Z8536_CONTROL_REGISTER);
483 /*****************/
484 /* Enable Port B */
485 /*****************/
486
487 outb(0xF4,
488 devpriv->iobase +
489 APCI1500_Z8536_CONTROL_REGISTER);
490 } // if (data[1] == APCI1500_OR)
491 else {
492 printk("\nThe choice for interrupt logic does not exist\n");
493 return -EINVAL;
494 } //elseif (data[1] == APCI1500_OR)
495 } //if(data[0]==2)
496
497 return insn->n;
498 }
499
500 /*
501 +----------------------------------------------------------------------------+
502 | Function Name : int i_APCI1500_StartStopInputEvent |
503 | (struct comedi_device *dev,struct comedi_subdevice *s, |
504 | struct comedi_insn *insn,unsigned int *data) |
505 +----------------------------------------------------------------------------+
506 | Task : Allows or disallows a port event |
507 +----------------------------------------------------------------------------+
508 | Input Parameters : struct comedi_device *dev : Driver handle |
509 | UINT ui_Channel : Channel number to read |
510 | unsigned int *data : Data Pointer to read status |
511 data[0] :0 Start input event
512 1 Stop input event
513 data[1] :No of port (1 or 2)
514 +----------------------------------------------------------------------------+
515 | Output Parameters : -- |
516 +----------------------------------------------------------------------------+
517 | Return Value : TRUE : No error occur |
518 | : FALSE : Error occur. Return the error |
519 | |
520 +----------------------------------------------------------------------------+
521 */
522 int i_APCI1500_StartStopInputEvent(struct comedi_device * dev, struct comedi_subdevice * s,
523 struct comedi_insn * insn, unsigned int * data)
524 {
525 int i_Event1InterruptStatus = 0, i_Event2InterruptStatus =
526 0, i_RegValue;
527 switch (data[0]) {
528 case START:
529 /*************************/
530 /* Tests the port number */
531 /*************************/
532
533 if (data[1] == 1 || data[1] == 2) {
534 /***************************/
535 /* Test if port 1 selected */
536 /***************************/
537
538 if (data[1] == 1) {
539 /*****************************/
540 /* Test if event initialised */
541 /*****************************/
542 if (i_Event1Status == 1) {
543 /*****************************************************************/
544 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
545 /*****************************************************************/
546 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
547 /******************/
548 /* Disable Port A */
549 /******************/
550 outb(0xF0,
551 devpriv->iobase +
552 APCI1500_Z8536_CONTROL_REGISTER);
553 /***************************************************/
554 /* Selects the command and status register of */
555 /* port 1 */
556 /***************************************************/
557 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
558 /*************************************/
559 /* Allows the pattern interrupt */
560 /*************************************/
561 outb(0xC0,
562 devpriv->iobase +
563 APCI1500_Z8536_CONTROL_REGISTER);
564 /*****************************************************************/
565 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
566 /*****************************************************************/
567 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
568 /*****************/
569 /* Enable Port A */
570 /*****************/
571 outb(0xF4,
572 devpriv->iobase +
573 APCI1500_Z8536_CONTROL_REGISTER);
574 i_Event1InterruptStatus = 1;
575 outb(APCI1500_RW_PORT_A_SPECIFICATION,
576 devpriv->iobase +
577 APCI1500_Z8536_CONTROL_REGISTER);
578 i_RegValue =
579 inb(devpriv->iobase +
580 APCI1500_Z8536_CONTROL_REGISTER);
581
582 /* Selects the master interrupt control register */
583 /*************************************************/
584 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
585 /**********************************************/
586 /* Authorizes the main interrupt on the board */
587 /**********************************************/
588 outb(0xD0,
589 devpriv->iobase +
590 APCI1500_Z8536_CONTROL_REGISTER);
591
592 } // if(i_Event1Status==1)
593 else {
594 printk("\nEvent 1 not initialised\n");
595 return -EINVAL;
596 } //else if(i_Event1Status==1)
597 } //if (data[1]==1)
598 if (data[1] == 2) {
599
600 if (i_Event2Status == 1) {
601 /*****************************************************************/
602 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
603 /*****************************************************************/
604 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
605 /******************/
606 /* Disable Port B */
607 /******************/
608 outb(0x74,
609 devpriv->iobase +
610 APCI1500_Z8536_CONTROL_REGISTER);
611 /***************************************************/
612 /* Selects the command and status register of */
613 /* port 2 */
614 /***************************************************/
615 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
616 /*************************************/
617 /* Allows the pattern interrupt */
618 /*************************************/
619 outb(0xC0,
620 devpriv->iobase +
621 APCI1500_Z8536_CONTROL_REGISTER);
622 /*****************************************************************/
623 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
624 /*****************************************************************/
625 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
626 /*****************/
627 /* Enable Port B */
628 /*****************/
629 outb(0xF4,
630 devpriv->iobase +
631 APCI1500_Z8536_CONTROL_REGISTER);
632
633 /* Selects the master interrupt control register */
634 /*************************************************/
635 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
636 /**********************************************/
637 /* Authorizes the main interrupt on the board */
638 /**********************************************/
639 outb(0xD0,
640 devpriv->iobase +
641 APCI1500_Z8536_CONTROL_REGISTER);
642 i_Event2InterruptStatus = 1;
643 } // if(i_Event2Status==1)
644 else {
645 printk("\nEvent 2 not initialised\n");
646 return -EINVAL;
647 } //else if(i_Event2Status==1)
648 } // if(data[1]==2)
649 } // if (data[1] == 1 || data[0] == 2)
650 else {
651 printk("\nThe port parameter is in error\n");
652 return -EINVAL;
653 } //else if (data[1] == 1 || data[0] == 2)
654
655 break;
656
657 case STOP:
658 /*************************/
659 /* Tests the port number */
660 /*************************/
661
662 if (data[1] == 1 || data[1] == 2) {
663 /***************************/
664 /* Test if port 1 selected */
665 /***************************/
666
667 if (data[1] == 1) {
668 /*****************************/
669 /* Test if event initialised */
670 /*****************************/
671 if (i_Event1Status == 1) {
672 /*****************************************************************/
673 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
674 /*****************************************************************/
675 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
676 /******************/
677 /* Disable Port A */
678 /******************/
679 outb(0xF0,
680 devpriv->iobase +
681 APCI1500_Z8536_CONTROL_REGISTER);
682 /***************************************************/
683 /* Selects the command and status register of */
684 /* port 1 */
685 /***************************************************/
686 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
687 /*************************************/
688 /* Inhibits the pattern interrupt */
689 /*************************************/
690 outb(0xE0,
691 devpriv->iobase +
692 APCI1500_Z8536_CONTROL_REGISTER);
693 /*****************************************************************/
694 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
695 /*****************************************************************/
696 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
697 /*****************/
698 /* Enable Port A */
699 /*****************/
700 outb(0xF4,
701 devpriv->iobase +
702 APCI1500_Z8536_CONTROL_REGISTER);
703 i_Event1InterruptStatus = 0;
704 } // if(i_Event1Status==1)
705 else {
706 printk("\nEvent 1 not initialised\n");
707 return -EINVAL;
708 } //else if(i_Event1Status==1)
709 } //if (data[1]==1)
710 if (data[1] == 2) {
711 /*****************************/
712 /* Test if event initialised */
713 /*****************************/
714 if (i_Event2Status == 1) {
715 /*****************************************************************/
716 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
717 /*****************************************************************/
718 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
719 /******************/
720 /* Disable Port B */
721 /******************/
722 outb(0x74,
723 devpriv->iobase +
724 APCI1500_Z8536_CONTROL_REGISTER);
725 /***************************************************/
726 /* Selects the command and status register of */
727 /* port 2 */
728 /***************************************************/
729 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
730 /*************************************/
731 /* Inhibits the pattern interrupt */
732 /*************************************/
733 outb(0xE0,
734 devpriv->iobase +
735 APCI1500_Z8536_CONTROL_REGISTER);
736 /*****************************************************************/
737 /* Selects the APCI1500_RW_MASTER_CONFIGURATION_CONTROL register */
738 /*****************************************************************/
739 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
740 /*****************/
741 /* Enable Port B */
742 /*****************/
743 outb(0xF4,
744 devpriv->iobase +
745 APCI1500_Z8536_CONTROL_REGISTER);
746 i_Event2InterruptStatus = 0;
747 } // if(i_Event2Status==1)
748 else {
749 printk("\nEvent 2 not initialised\n");
750 return -EINVAL;
751 } //else if(i_Event2Status==1)
752 } //if(data[1]==2)
753
754 } // if (data[1] == 1 || data[1] == 2)
755 else {
756 printk("\nThe port parameter is in error\n");
757 return -EINVAL;
758 } //else if (data[1] == 1 || data[1] == 2)
759 break;
760 default:
761 printk("\nThe option of START/STOP logic does not exist\n");
762 return -EINVAL;
763 } //switch(data[0])
764
765 return insn->n;
766 }
767
768 /*
769 +----------------------------------------------------------------------------+
770 | Function Name : int i_APCI1500_Initialisation |
771 | (struct comedi_device *dev,struct comedi_subdevice *s, |
772 | struct comedi_insn *insn,unsigned int *data) |
773 +----------------------------------------------------------------------------+
774 | Task : Return the status of the digital input |
775 +----------------------------------------------------------------------------+
776 | Input Parameters : struct comedi_device *dev : Driver handle |
777 | UINT ui_Channel : Channel number to read |
778 | unsigned int *data : Data Pointer to read status |
779 +----------------------------------------------------------------------------+
780 | Output Parameters : -- |
781 +----------------------------------------------------------------------------+
782 | Return Value : TRUE : No error occur |
783 | : FALSE : Error occur. Return the error |
784 | |
785 +----------------------------------------------------------------------------+
786 */
787 INT i_APCI1500_Initialisation(struct comedi_device * dev, struct comedi_subdevice * s,
788 struct comedi_insn * insn, unsigned int * data)
789 {
790 int i_DummyRead = 0;
791 /******************/
792 /* Software reset */
793 /******************/
794 i_DummyRead = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
795 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
796 i_DummyRead = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
797 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
798 outb(1, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
799 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
800
801 /*****************************************************/
802 /* Selects the master configuration control register */
803 /*****************************************************/
804 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
805 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
806 outb(0xF4, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
807
808 /*****************************************************/
809 /* Selects the mode specification register of port A */
810 /*****************************************************/
811 outb(APCI1500_RW_PORT_A_SPECIFICATION,
812 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
813 outb(0x10, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
814
815 /* Selects the data path polarity register of port A */
816 outb(APCI1500_RW_PORT_A_DATA_PCITCH_POLARITY,
817 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
818 /* High level of port A means 1 */
819 outb(0xFF, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
820
821 /* Selects the data direction register of port A */
822 outb(APCI1500_RW_PORT_A_DATA_DIRECTION,
823 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
824 /* All bits used as inputs */
825 outb(0xFF, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
826 /* Selects the command and status register of port A */
827 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
828 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
829 /* Deletes IP and IUS */
830 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
831 /* Selects the command and status register of port A */
832 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
833 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
834 /* Deactivates the interrupt management of port A: */
835 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
836 /* Selects the handshake specification register of port A */
837 outb(APCI1500_RW_PORT_A_HANDSHAKE_SPECIFICATION,
838 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
839 /* Deletes the register */
840 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
841
842 /*****************************************************/
843 /* Selects the mode specification register of port B */
844 /*****************************************************/
845 outb(APCI1500_RW_PORT_B_SPECIFICATION,
846 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
847 outb(0x10, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
848 /* Selects the data path polarity register of port B */
849 outb(APCI1500_RW_PORT_B_DATA_PCITCH_POLARITY,
850 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
851 /* A high level of port B means 1 */
852 outb(0x7F, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
853 /* Selects the data direction register of port B */
854 outb(APCI1500_RW_PORT_B_DATA_DIRECTION,
855 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
856 /* All bits used as inputs */
857 outb(0xFF, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
858 /* Selects the command and status register of port B */
859 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
860 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
861 /* Deletes IP and IUS */
862 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
863 /* Selects the command and status register of port B */
864 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
865 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
866 /* Deactivates the interrupt management of port B: */
867 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
868 /* Selects the handshake specification register of port B */
869 outb(APCI1500_RW_PORT_B_HANDSHAKE_SPECIFICATION,
870 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
871 /* Deletes the register */
872 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
873
874 /*****************************************************/
875 /* Selects the data path polarity register of port C */
876 /*****************************************************/
877 outb(APCI1500_RW_PORT_C_DATA_PCITCH_POLARITY,
878 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
879 /* High level of port C means 1 */
880 outb(0x9, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
881 /* Selects the data direction register of port C */
882 outb(APCI1500_RW_PORT_C_DATA_DIRECTION,
883 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
884 /* All bits used as inputs except channel 1 */
885 outb(0x0E, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
886 /* Selects the special IO register of port C */
887 outb(APCI1500_RW_PORT_C_SPECIAL_IO_CONTROL,
888 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
889 /* Deletes it */
890 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
891 /******************************************************/
892 /* Selects the command and status register of timer 1 */
893 /******************************************************/
894 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
895 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
896 /* Deletes IP and IUS */
897 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
898 /* Selects the command and status register of timer 1 */
899 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
900 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
901 /* Deactivates the interrupt management of timer 1 */
902 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
903 /******************************************************/
904 /* Selects the command and status register of timer 2 */
905 /******************************************************/
906 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
907 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
908 /* Deletes IP and IUS */
909 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
910 /* Selects the command and status register of timer 2 */
911 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
912 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
913 /* Deactivates Timer 2 interrupt management: */
914 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
915 /******************************************************/
916 /* Selects the command and status register of timer 3 */
917 /******************************************************/
918 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
919 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
920 /* Deletes IP and IUS */
921 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
922 /* Selects the command and status register of Timer 3 */
923 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
924 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
925 /* Deactivates interrupt management of timer 3: */
926 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
927 /*************************************************/
928 /* Selects the master interrupt control register */
929 /*************************************************/
930 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL,
931 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
932 /* Deletes all interrupts */
933 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
934 return insn->n;
935 }
936
937 /*
938 +----------------------------------------------------------------------------+
939 | Function Name : int i_APCI1500_ReadMoreDigitalInput |
940 | (struct comedi_device *dev,struct comedi_subdevice *s, |
941 | struct comedi_insn *insn,unsigned int *data) |
942 +----------------------------------------------------------------------------+
943 | Task : Return the status of the Requested digital inputs |
944 +----------------------------------------------------------------------------+
945 | Input Parameters : struct comedi_device *dev : Driver handle |
946 | UINT ui_NoOfChannels : No Of Channels To be Read |
947 | UINT *data : Data Pointer
948 data[0] : 0 Read a single channel
949 1 read a port value
950 data[1] : port value
951 +----------------------------------------------------------------------------+
952 | Output Parameters : -- data[0] :The read status value
953 +----------------------------------------------------------------------------+
954 | Return Value : TRUE : No error occur |
955 | : FALSE : Error occur. Return the error |
956 | |
957 +----------------------------------------------------------------------------+
958 */
959
960 INT i_APCI1500_ReadMoreDigitalInput(struct comedi_device * dev, struct comedi_subdevice * s,
961 struct comedi_insn * insn, unsigned int * data)
962 {
963 UINT ui_PortValue = data[1];
964 UINT ui_Mask = 0;
965 UINT ui_Channel;
966 UINT ui_TmpValue = 0;
967 ui_Channel = CR_CHAN(insn->chanspec);
968
969 switch (data[0]) {
970 case 0:
971 if (ui_Channel >= 0 && ui_Channel <= 15) {
972 ui_TmpValue =
973 (UINT) inw(devpriv->i_IobaseAddon +
974 APCI1500_DIGITAL_IP);
975 *data = (ui_TmpValue >> ui_Channel) & 0x1;
976 } //if(ui_Channel >= 0 && ui_Channel <=15)
977 else {
978 printk("\nThe channel specification are in error\n");
979 return -EINVAL; // "sorry channel spec wrong "
980 } //else if(ui_Channel >= 0 && ui_Channel <=15)
981 break;
982 case 1:
983
984 *data = (UINT) inw(devpriv->i_IobaseAddon +
985 APCI1500_DIGITAL_IP);
986 switch (ui_Channel) {
987 case 2:
988 ui_Mask = 3;
989 *data = (*data >> (2 * ui_PortValue)) & ui_Mask;
990 break;
991 case 4:
992 ui_Mask = 15;
993 *data = (*data >> (4 * ui_PortValue)) & ui_Mask;
994 break;
995 case 8:
996 ui_Mask = 255;
997 *data = (*data >> (8 * ui_PortValue)) & ui_Mask;
998 break;
999 case 15:
1000 break;
1001
1002 default:
1003 printk("\nSpecified channel cannot be read \n");
1004 return -EINVAL; // "sorry channel spec wrong "
1005 break;
1006 } //switch(ui_Channel)
1007 break;
1008 default:
1009 printk("\nThe specified functionality does not exist\n");
1010 return -EINVAL;
1011 } //switch(data[0])
1012 return insn->n;
1013 }
1014
1015 /*
1016 +----------------------------------------------------------------------------+
1017 | Function Name : int i_APCI1500_ConfigDigitalOutputErrorInterrupt
1018 (struct comedi_device *dev,struct comedi_subdevice *s struct comedi_insn
1019 *insn,unsigned int *data) |
1020 | |
1021 +----------------------------------------------------------------------------+
1022 | Task : Configures the digital output memory and the digital
1023 output error interrupt |
1024 +----------------------------------------------------------------------------+
1025 | Input Parameters : struct comedi_device *dev : Driver handle |
1026 | unsigned int *data : Data Pointer contains |
1027 | configuration parameters as below |
1028 | struct comedi_subdevice *s, :pointer to subdevice structure
1029 struct comedi_insn *insn :pointer to insn structure |
1030 | data[0] :1:Memory on |
1031 | 0:Memory off |
1032 data[1] :1 Enable the voltage error interrupt
1033 | :0 Disable the voltage error interrupt |
1034 | |
1035 +----------------------------------------------------------------------------+
1036 | Output Parameters : -- |
1037 +----------------------------------------------------------------------------+
1038 | Return Value : TRUE : No error occur |
1039 | : FALSE : Error occur. Return the error |
1040 | |
1041 +----------------------------------------------------------------------------+
1042 */
1043 int i_APCI1500_ConfigDigitalOutputErrorInterrupt(struct comedi_device * dev,
1044 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
1045 {
1046 devpriv->b_OutputMemoryStatus = data[0];
1047 return insn->n;
1048 }
1049
1050 /*
1051 +----------------------------------------------------------------------------+
1052 | Function Name : int i_APCI1500_WriteDigitalOutput |
1053 | (struct comedi_device *dev,struct comedi_subdevice *s, |
1054 | struct comedi_insn *insn,unsigned int *data) |
1055 +----------------------------------------------------------------------------+
1056 | Task : Writes port value To the selected port |
1057 +----------------------------------------------------------------------------+
1058 | Input Parameters : struct comedi_device *dev : Driver handle |
1059 | UINT ui_NoOfChannels : No Of Channels To Write |
1060 | UINT *data : Data Pointer to read status |
1061 +----------------------------------------------------------------------------+
1062 | Output Parameters : -- |
1063 +----------------------------------------------------------------------------+
1064 | Return Value : TRUE : No error occur |
1065 | : FALSE : Error occur. Return the error |
1066 | |
1067 +----------------------------------------------------------------------------+
1068 */
1069
1070 INT i_APCI1500_WriteDigitalOutput(struct comedi_device * dev, struct comedi_subdevice * s,
1071 struct comedi_insn * insn, unsigned int * data)
1072 {
1073 static UINT ui_Temp = 0;
1074 UINT ui_Temp1;
1075
1076 UINT ui_NoOfChannel = CR_CHAN(insn->chanspec); // get the channel
1077
1078 if (!devpriv->b_OutputMemoryStatus) {
1079 ui_Temp = 0;
1080
1081 } //if(!devpriv->b_OutputMemoryStatus )
1082 if (data[3] == 0) {
1083 if (data[1] == 0) {
1084 data[0] = (data[0] << ui_NoOfChannel) | ui_Temp;
1085 outw(data[0],
1086 devpriv->i_IobaseAddon + APCI1500_DIGITAL_OP);
1087 } //if(data[1]==0)
1088 else {
1089 if (data[1] == 1) {
1090 switch (ui_NoOfChannel) {
1091
1092 case 2:
1093 data[0] =
1094 (data[0] << (2 *
1095 data[2])) | ui_Temp;
1096 break;
1097
1098 case 4:
1099 data[0] =
1100 (data[0] << (4 *
1101 data[2])) | ui_Temp;
1102 break;
1103
1104 case 8:
1105 data[0] =
1106 (data[0] << (8 *
1107 data[2])) | ui_Temp;
1108 break;
1109
1110 case 15:
1111 data[0] = data[0] | ui_Temp;
1112 break;
1113
1114 default:
1115 comedi_error(dev, " chan spec wrong");
1116 return -EINVAL; // "sorry channel spec wrong "
1117
1118 } //switch(ui_NoOfChannels)
1119
1120 outw(data[0],
1121 devpriv->i_IobaseAddon +
1122 APCI1500_DIGITAL_OP);
1123 } // if(data[1]==1)
1124 else {
1125 printk("\nSpecified channel not supported\n");
1126 } //else if(data[1]==1)
1127 } //elseif(data[1]==0)
1128 } //if(data[3]==0)
1129 else {
1130 if (data[3] == 1) {
1131 if (data[1] == 0) {
1132 data[0] = ~data[0] & 0x1;
1133 ui_Temp1 = 1;
1134 ui_Temp1 = ui_Temp1 << ui_NoOfChannel;
1135 ui_Temp = ui_Temp | ui_Temp1;
1136 data[0] =
1137 (data[0] << ui_NoOfChannel) ^
1138 0xffffffff;
1139 data[0] = data[0] & ui_Temp;
1140 outw(data[0],
1141 devpriv->i_IobaseAddon +
1142 APCI1500_DIGITAL_OP);
1143 } //if(data[1]==0)
1144 else {
1145 if (data[1] == 1) {
1146 switch (ui_NoOfChannel) {
1147
1148 case 2:
1149 data[0] = ~data[0] & 0x3;
1150 ui_Temp1 = 3;
1151 ui_Temp1 =
1152 ui_Temp1 << 2 * data[2];
1153 ui_Temp = ui_Temp | ui_Temp1;
1154 data[0] =
1155 ((data[0] << (2 *
1156 data
1157 [2])) ^
1158 0xffffffff) & ui_Temp;
1159 break;
1160
1161 case 4:
1162 data[0] = ~data[0] & 0xf;
1163 ui_Temp1 = 15;
1164 ui_Temp1 =
1165 ui_Temp1 << 4 * data[2];
1166 ui_Temp = ui_Temp | ui_Temp1;
1167 data[0] =
1168 ((data[0] << (4 *
1169 data
1170 [2])) ^
1171 0xffffffff) & ui_Temp;
1172 break;
1173
1174 case 8:
1175 data[0] = ~data[0] & 0xff;
1176 ui_Temp1 = 255;
1177 ui_Temp1 =
1178 ui_Temp1 << 8 * data[2];
1179 ui_Temp = ui_Temp | ui_Temp1;
1180 data[0] =
1181 ((data[0] << (8 *
1182 data
1183 [2])) ^
1184 0xffffffff) & ui_Temp;
1185 break;
1186
1187 case 15:
1188 break;
1189
1190 default:
1191 comedi_error(dev,
1192 " chan spec wrong");
1193 return -EINVAL; // "sorry channel spec wrong "
1194
1195 } //switch(ui_NoOfChannels)
1196
1197 outw(data[0],
1198 devpriv->i_IobaseAddon +
1199 APCI1500_DIGITAL_OP);
1200 } // if(data[1]==1)
1201 else {
1202 printk("\nSpecified channel not supported\n");
1203 } //else if(data[1]==1)
1204 } //elseif(data[1]==0)
1205 } //if(data[3]==1);
1206 else {
1207 printk("\nSpecified functionality does not exist\n");
1208 return -EINVAL;
1209 } //if else data[3]==1)
1210 } //if else data[3]==0)
1211 ui_Temp = data[0];
1212 return (insn->n);;
1213 }
1214
1215 /*
1216 +----------------------------------------------------------------------------+
1217 | Function Name : int i_APCI1500_ConfigCounterTimerWatchdog(comedi_device
1218 *dev,struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data)|
1219 | |
1220 +----------------------------------------------------------------------------+
1221 | Task : Configures The Watchdog |
1222 +----------------------------------------------------------------------------+
1223 | Input Parameters : struct comedi_device *dev : Driver handle |
1224 | struct comedi_subdevice *s, :pointer to subdevice structure
1225 struct comedi_insn *insn :pointer to insn structure |
1226 | unsigned int *data : Data Pointer to read status data[0] : 2 APCI1500_1_8_KHZ
1227 | 1 APCI1500_3_6_KHZ |
1228 | 0 APCI1500_115_KHZ
1229 data[1] : 0 Counter1/Timer1
1230 1 Counter2/Timer2
1231 2 Counter3/Watchdog
1232 data[2] : 0 Counter
1233 1 Timer/Watchdog
1234 data[3] : This parameter has |
1235 | two meanings. |
1236 | - If the counter/timer |
1237 | is used as a counter |
1238 | the limit value of |
1239 | the counter is given |
1240 | |
1241 | - If the counter/timer |
1242 | is used as a timer, |
1243 | the divider factor |
1244 | for the output is |
1245 | given.
1246 data[4] : 0 APCI1500_CONTINUOUS
1247 1 APCI1500_SINGLE
1248 data[5] : 0 Software Trigger
1249 1 Hardware Trigger
1250
1251 data[6] :0 Software gate
1252 1 Hardware gate
1253 data[7] :0 Interrupt Disable
1254 1 Interrupt Enable
1255 +----------------------------------------------------------------------------+
1256 | Output Parameters : -- |
1257 +----------------------------------------------------------------------------+
1258 | Return Value : TRUE : No error occur |
1259 | : FALSE : Error occur. Return the error |
1260 | |
1261 +----------------------------------------------------------------------------+
1262 */
1263
1264 int i_APCI1500_ConfigCounterTimerWatchdog(struct comedi_device * dev,
1265 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
1266 {
1267 int i_TimerCounterMode, i_MasterConfiguration;
1268
1269 devpriv->tsk_Current = current;
1270
1271 //Selection of the input clock
1272 if (data[0] == 0 || data[0] == 1 || data[0] == 2) {
1273 outw(data[0], devpriv->i_IobaseAddon + APCI1500_CLK_SELECT);
1274 } // if(data[0]==0||data[0]==1||data[0]==2)
1275 else {
1276 if (data[0] != 3) {
1277 printk("\nThe option for input clock selection does not exist\n");
1278 return -EINVAL;
1279 } // if(data[0]!=3)
1280 } //elseif(data[0]==0||data[0]==1||data[0]==2)
1281 //Select the counter/timer
1282 switch (data[1]) {
1283 case COUNTER1:
1284 //selecting counter or timer
1285 switch (data[2]) {
1286 case 0:
1287 data[2] = APCI1500_COUNTER;
1288 break;
1289 case 1:
1290 data[2] = APCI1500_TIMER;
1291 break;
1292 default:
1293 printk("\nThis choice is not a timer nor a counter\n");
1294 return -EINVAL;
1295 } // switch(data[2])
1296
1297 //Selecting single or continuous mode
1298 switch (data[4]) {
1299 case 0:
1300 data[4] = APCI1500_CONTINUOUS;
1301 break;
1302 case 1:
1303 data[4] = APCI1500_SINGLE;
1304 break;
1305 default:
1306 printk("\nThis option for single/continuous mode does not exist\n");
1307 return -EINVAL;
1308 } // switch(data[4])
1309
1310 i_TimerCounterMode = data[2] | data[4] | 7;
1311 /*************************/
1312 /* Test the reload value */
1313 /*************************/
1314
1315 if ((data[3] >= 0) && (data[3] <= 65535)) {
1316 if (data[7] == APCI1500_ENABLE
1317 || data[7] == APCI1500_DISABLE) {
1318
1319 /************************************************/
1320 /* Selects the mode register of timer/counter 1 */
1321 /************************************************/
1322 outb(APCI1500_RW_CPT_TMR1_MODE_SPECIFICATION,
1323 devpriv->iobase +
1324 APCI1500_Z8536_CONTROL_REGISTER);
1325 /***********************/
1326 /* Writes the new mode */
1327 /***********************/
1328 outb(i_TimerCounterMode,
1329 devpriv->iobase +
1330 APCI1500_Z8536_CONTROL_REGISTER);
1331
1332 /****************************************************/
1333 /* Selects the constant register of timer/counter 1 */
1334 /****************************************************/
1335
1336 outb(APCI1500_RW_CPT_TMR1_TIME_CST_LOW,
1337 devpriv->iobase +
1338 APCI1500_Z8536_CONTROL_REGISTER);
1339
1340 /*************************/
1341 /* Writes the low value */
1342 /*************************/
1343
1344 outb(data[3],
1345 devpriv->iobase +
1346 APCI1500_Z8536_CONTROL_REGISTER);
1347
1348 /****************************************************/
1349 /* Selects the constant register of timer/counter 1 */
1350 /****************************************************/
1351
1352 outb(APCI1500_RW_CPT_TMR1_TIME_CST_HIGH,
1353 devpriv->iobase +
1354 APCI1500_Z8536_CONTROL_REGISTER);
1355
1356 /**************************/
1357 /* Writes the high value */
1358 /**************************/
1359
1360 data[3] = data[3] >> 8;
1361 outb(data[3],
1362 devpriv->iobase +
1363 APCI1500_Z8536_CONTROL_REGISTER);
1364
1365 /*********************************************/
1366 /* Selects the master configuration register */
1367 /*********************************************/
1368
1369 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
1370 devpriv->iobase +
1371 APCI1500_Z8536_CONTROL_REGISTER);
1372
1373 /**********************/
1374 /* Reads the register */
1375 /**********************/
1376
1377 i_MasterConfiguration =
1378 inb(devpriv->iobase +
1379 APCI1500_Z8536_CONTROL_REGISTER);
1380
1381 /********************************************************/
1382 /* Enables timer/counter 1 and triggers timer/counter 1 */
1383 /********************************************************/
1384
1385 i_MasterConfiguration =
1386 i_MasterConfiguration | 0x40;
1387
1388 /*********************************************/
1389 /* Selects the master configuration register */
1390 /*********************************************/
1391 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
1392 devpriv->iobase +
1393 APCI1500_Z8536_CONTROL_REGISTER);
1394
1395 /********************************/
1396 /* Writes the new configuration */
1397 /********************************/
1398 outb(i_MasterConfiguration,
1399 devpriv->iobase +
1400 APCI1500_Z8536_CONTROL_REGISTER);
1401 /****************************************/
1402 /* Selects the commands register of */
1403 /* timer/counter 1 */
1404 /****************************************/
1405
1406 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
1407 devpriv->iobase +
1408 APCI1500_Z8536_CONTROL_REGISTER);
1409
1410 /***************************/
1411 /* Disable timer/counter 1 */
1412 /***************************/
1413
1414 outb(0x0,
1415 devpriv->iobase +
1416 APCI1500_Z8536_CONTROL_REGISTER);
1417 /****************************************/
1418 /* Selects the commands register of */
1419 /* timer/counter 1 */
1420 /****************************************/
1421 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
1422 devpriv->iobase +
1423 APCI1500_Z8536_CONTROL_REGISTER);
1424
1425 /***************************/
1426 /* Trigger timer/counter 1 */
1427 /***************************/
1428 outb(0x2,
1429 devpriv->iobase +
1430 APCI1500_Z8536_CONTROL_REGISTER);
1431 } //if(data[7]== APCI1500_ENABLE ||data[7]== APCI1500_DISABLE)
1432 else {
1433 printk("\nError in selection of interrupt enable or disable\n");
1434 return -EINVAL;
1435 } //elseif(data[7]== APCI1500_ENABLE ||data[7]== APCI1500_DISABLE)
1436 } // if ((data[3]>= 0) && (data[3] <= 65535))
1437 else {
1438 printk("\nError in selection of reload value\n");
1439 return -EINVAL;
1440 } //else if ((data[3]>= 0) && (data[3] <= 65535))
1441 i_TimerCounterWatchdogInterrupt = data[7];
1442 i_TimerCounter1Init = 1;
1443 break;
1444
1445 case COUNTER2: //selecting counter or timer
1446 switch (data[2]) {
1447 case 0:
1448 data[2] = APCI1500_COUNTER;
1449 break;
1450 case 1:
1451 data[2] = APCI1500_TIMER;
1452 break;
1453 default:
1454 printk("\nThis choice is not a timer nor a counter\n");
1455 return -EINVAL;
1456 } // switch(data[2])
1457
1458 //Selecting single or continuous mode
1459 switch (data[4]) {
1460 case 0:
1461 data[4] = APCI1500_CONTINUOUS;
1462 break;
1463 case 1:
1464 data[4] = APCI1500_SINGLE;
1465 break;
1466 default:
1467 printk("\nThis option for single/continuous mode does not exist\n");
1468 return -EINVAL;
1469 } // switch(data[4])
1470
1471 //Selecting software or hardware trigger
1472 switch (data[5]) {
1473 case 0:
1474 data[5] = APCI1500_SOFTWARE_TRIGGER;
1475 break;
1476 case 1:
1477 data[5] = APCI1500_HARDWARE_TRIGGER;
1478 break;
1479 default:
1480 printk("\nThis choice for software or hardware trigger does not exist\n");
1481 return -EINVAL;
1482 } // switch(data[5])
1483
1484 //Selecting software or hardware gate
1485 switch (data[6]) {
1486 case 0:
1487 data[6] = APCI1500_SOFTWARE_GATE;
1488 break;
1489 case 1:
1490 data[6] = APCI1500_HARDWARE_GATE;
1491 break;
1492 default:
1493 printk("\nThis choice for software or hardware gate does not exist\n");
1494 return -EINVAL;
1495 } // switch(data[6])
1496
1497 i_TimerCounterMode = data[2] | data[4] | data[5] | data[6] | 7;
1498
1499 /*************************/
1500 /* Test the reload value */
1501 /*************************/
1502
1503 if ((data[3] >= 0) && (data[3] <= 65535)) {
1504 if (data[7] == APCI1500_ENABLE
1505 || data[7] == APCI1500_DISABLE) {
1506
1507 /************************************************/
1508 /* Selects the mode register of timer/counter 2 */
1509 /************************************************/
1510 outb(APCI1500_RW_CPT_TMR2_MODE_SPECIFICATION,
1511 devpriv->iobase +
1512 APCI1500_Z8536_CONTROL_REGISTER);
1513 /***********************/
1514 /* Writes the new mode */
1515 /***********************/
1516 outb(i_TimerCounterMode,
1517 devpriv->iobase +
1518 APCI1500_Z8536_CONTROL_REGISTER);
1519
1520 /****************************************************/
1521 /* Selects the constant register of timer/counter 2 */
1522 /****************************************************/
1523
1524 outb(APCI1500_RW_CPT_TMR2_TIME_CST_LOW,
1525 devpriv->iobase +
1526 APCI1500_Z8536_CONTROL_REGISTER);
1527
1528 /*************************/
1529 /* Writes the low value */
1530 /*************************/
1531
1532 outb(data[3],
1533 devpriv->iobase +
1534 APCI1500_Z8536_CONTROL_REGISTER);
1535
1536 /****************************************************/
1537 /* Selects the constant register of timer/counter 2 */
1538 /****************************************************/
1539
1540 outb(APCI1500_RW_CPT_TMR2_TIME_CST_HIGH,
1541 devpriv->iobase +
1542 APCI1500_Z8536_CONTROL_REGISTER);
1543
1544 /**************************/
1545 /* Writes the high value */
1546 /**************************/
1547
1548 data[3] = data[3] >> 8;
1549 outb(data[3],
1550 devpriv->iobase +
1551 APCI1500_Z8536_CONTROL_REGISTER);
1552
1553 /*********************************************/
1554 /* Selects the master configuration register */
1555 /*********************************************/
1556
1557 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
1558 devpriv->iobase +
1559 APCI1500_Z8536_CONTROL_REGISTER);
1560
1561 /**********************/
1562 /* Reads the register */
1563 /**********************/
1564
1565 i_MasterConfiguration =
1566 inb(devpriv->iobase +
1567 APCI1500_Z8536_CONTROL_REGISTER);
1568
1569 /********************************************************/
1570 /* Enables timer/counter 2 and triggers timer/counter 2 */
1571 /********************************************************/
1572
1573 i_MasterConfiguration =
1574 i_MasterConfiguration | 0x20;
1575
1576 /*********************************************/
1577 /* Selects the master configuration register */
1578 /*********************************************/
1579 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
1580 devpriv->iobase +
1581 APCI1500_Z8536_CONTROL_REGISTER);
1582
1583 /********************************/
1584 /* Writes the new configuration */
1585 /********************************/
1586 outb(i_MasterConfiguration,
1587 devpriv->iobase +
1588 APCI1500_Z8536_CONTROL_REGISTER);
1589 /****************************************/
1590 /* Selects the commands register of */
1591 /* timer/counter 2 */
1592 /****************************************/
1593
1594 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
1595 devpriv->iobase +
1596 APCI1500_Z8536_CONTROL_REGISTER);
1597
1598 /***************************/
1599 /* Disable timer/counter 2 */
1600 /***************************/
1601
1602 outb(0x0,
1603 devpriv->iobase +
1604 APCI1500_Z8536_CONTROL_REGISTER);
1605 /****************************************/
1606 /* Selects the commands register of */
1607 /* timer/counter 2 */
1608 /****************************************/
1609 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
1610 devpriv->iobase +
1611 APCI1500_Z8536_CONTROL_REGISTER);
1612
1613 /***************************/
1614 /* Trigger timer/counter 1 */
1615 /***************************/
1616 outb(0x2,
1617 devpriv->iobase +
1618 APCI1500_Z8536_CONTROL_REGISTER);
1619 } //if(data[7]== APCI1500_ENABLE ||data[7]== APCI1500_DISABLE)
1620 else {
1621 printk("\nError in selection of interrupt enable or disable\n");
1622 return -EINVAL;
1623 } //elseif(data[7]== APCI1500_ENABLE ||data[7]== APCI1500_DISABLE)
1624 } // if ((data[3]>= 0) && (data[3] <= 65535))
1625 else {
1626 printk("\nError in selection of reload value\n");
1627 return -EINVAL;
1628 } //else if ((data[3]>= 0) && (data[3] <= 65535))
1629 i_TimerCounterWatchdogInterrupt = data[7];
1630 i_TimerCounter2Init = 1;
1631 break;
1632
1633 case COUNTER3: //selecting counter or watchdog
1634 switch (data[2]) {
1635 case 0:
1636 data[2] = APCI1500_COUNTER;
1637 break;
1638 case 1:
1639 data[2] = APCI1500_WATCHDOG;
1640 break;
1641 default:
1642 printk("\nThis choice is not a watchdog nor a counter\n");
1643 return -EINVAL;
1644 } // switch(data[2])
1645
1646 //Selecting single or continuous mode
1647 switch (data[4]) {
1648 case 0:
1649 data[4] = APCI1500_CONTINUOUS;
1650 break;
1651 case 1:
1652 data[4] = APCI1500_SINGLE;
1653 break;
1654 default:
1655 printk("\nThis option for single/continuous mode does not exist\n");
1656 return -EINVAL;
1657 } // switch(data[4])
1658
1659 //Selecting software or hardware gate
1660 switch (data[6]) {
1661 case 0:
1662 data[6] = APCI1500_SOFTWARE_GATE;
1663 break;
1664 case 1:
1665 data[6] = APCI1500_HARDWARE_GATE;
1666 break;
1667 default:
1668 printk("\nThis choice for software or hardware gate does not exist\n");
1669 return -EINVAL;
1670 } // switch(data[6])
1671
1672 /*****************************/
1673 /* Test if used for watchdog */
1674 /*****************************/
1675
1676 if (data[2] == APCI1500_WATCHDOG) {
1677 /*****************************/
1678 /* - Enables the output line */
1679 /* - Enables retrigger */
1680 /* - Pulses output */
1681 /*****************************/
1682 i_TimerCounterMode = data[2] | data[4] | 0x54;
1683 } //if (data[2] == APCI1500_WATCHDOG)
1684 else {
1685 i_TimerCounterMode = data[2] | data[4] | data[6] | 7;
1686 } //elseif (data[2] == APCI1500_WATCHDOG)
1687 /*************************/
1688 /* Test the reload value */
1689 /*************************/
1690
1691 if ((data[3] >= 0) && (data[3] <= 65535)) {
1692 if (data[7] == APCI1500_ENABLE
1693 || data[7] == APCI1500_DISABLE) {
1694
1695 /************************************************/
1696 /* Selects the mode register of watchdog/counter 3 */
1697 /************************************************/
1698 outb(APCI1500_RW_CPT_TMR3_MODE_SPECIFICATION,
1699 devpriv->iobase +
1700 APCI1500_Z8536_CONTROL_REGISTER);
1701 /***********************/
1702 /* Writes the new mode */
1703 /***********************/
1704 outb(i_TimerCounterMode,
1705 devpriv->iobase +
1706 APCI1500_Z8536_CONTROL_REGISTER);
1707
1708 /****************************************************/
1709 /* Selects the constant register of watchdog/counter 3 */
1710 /****************************************************/
1711
1712 outb(APCI1500_RW_CPT_TMR3_TIME_CST_LOW,
1713 devpriv->iobase +
1714 APCI1500_Z8536_CONTROL_REGISTER);
1715
1716 /*************************/
1717 /* Writes the low value */
1718 /*************************/
1719
1720 outb(data[3],
1721 devpriv->iobase +
1722 APCI1500_Z8536_CONTROL_REGISTER);
1723
1724 /****************************************************/
1725 /* Selects the constant register of watchdog/counter 3 */
1726 /****************************************************/
1727
1728 outb(APCI1500_RW_CPT_TMR3_TIME_CST_HIGH,
1729 devpriv->iobase +
1730 APCI1500_Z8536_CONTROL_REGISTER);
1731
1732 /**************************/
1733 /* Writes the high value */
1734 /**************************/
1735
1736 data[3] = data[3] >> 8;
1737 outb(data[3],
1738 devpriv->iobase +
1739 APCI1500_Z8536_CONTROL_REGISTER);
1740
1741 /*********************************************/
1742 /* Selects the master configuration register */
1743 /*********************************************/
1744
1745 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
1746 devpriv->iobase +
1747 APCI1500_Z8536_CONTROL_REGISTER);
1748
1749 /**********************/
1750 /* Reads the register */
1751 /**********************/
1752
1753 i_MasterConfiguration =
1754 inb(devpriv->iobase +
1755 APCI1500_Z8536_CONTROL_REGISTER);
1756
1757 /********************************************************/
1758 /* Enables watchdog/counter 3 and triggers watchdog/counter 3 */
1759 /********************************************************/
1760
1761 i_MasterConfiguration =
1762 i_MasterConfiguration | 0x10;
1763
1764 /*********************************************/
1765 /* Selects the master configuration register */
1766 /*********************************************/
1767 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
1768 devpriv->iobase +
1769 APCI1500_Z8536_CONTROL_REGISTER);
1770
1771 /********************************/
1772 /* Writes the new configuration */
1773 /********************************/
1774 outb(i_MasterConfiguration,
1775 devpriv->iobase +
1776 APCI1500_Z8536_CONTROL_REGISTER);
1777
1778 /********************/
1779 /* Test if COUNTER */
1780 /********************/
1781 if (data[2] == APCI1500_COUNTER) {
1782
1783 /*************************************/
1784 /* Selects the command register of */
1785 /* watchdog/counter 3 */
1786 /*************************************/
1787 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
1788 devpriv->iobase +
1789 APCI1500_Z8536_CONTROL_REGISTER);
1790 /*************************************************/
1791 /* Disable the watchdog/counter 3 and starts it */
1792 /*************************************************/
1793 outb(0x0,
1794 devpriv->iobase +
1795 APCI1500_Z8536_CONTROL_REGISTER);
1796
1797 /*************************************/
1798 /* Selects the command register of */
1799 /* watchdog/counter 3 */
1800 /*************************************/
1801
1802 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
1803 devpriv->iobase +
1804 APCI1500_Z8536_CONTROL_REGISTER);
1805 /*************************************************/
1806 /* Trigger the watchdog/counter 3 and starts it */
1807 /*************************************************/
1808 outb(0x2,
1809 devpriv->iobase +
1810 APCI1500_Z8536_CONTROL_REGISTER);
1811
1812 } //elseif(data[2]==APCI1500_COUNTER)
1813
1814 } //if(data[7]== APCI1500_ENABLE ||data[7]== APCI1500_DISABLE)
1815 else {
1816 printk("\nError in selection of interrupt enable or disable\n");
1817 return -EINVAL;
1818 } //elseif(data[7]== APCI1500_ENABLE ||data[7]== APCI1500_DISABLE)
1819 } // if ((data[3]>= 0) && (data[3] <= 65535))
1820 else {
1821 printk("\nError in selection of reload value\n");
1822 return -EINVAL;
1823 } //else if ((data[3]>= 0) && (data[3] <= 65535))
1824 i_TimerCounterWatchdogInterrupt = data[7];
1825 i_WatchdogCounter3Init = 1;
1826 break;
1827
1828 default:
1829 printk("\nThe specified counter\timer option does not exist\n");
1830 } //switch(data[1])
1831 i_CounterLogic = data[2];
1832 return insn->n;
1833 }
1834
1835 /*
1836 +----------------------------------------------------------------------------+
1837 | Function Name : int i_APCI1500_StartStopTriggerTimerCounterWatchdog |
1838 | (struct comedi_device *dev,struct comedi_subdevice *s,
1839 struct comedi_insn *insn,unsigned int *data); |
1840 +----------------------------------------------------------------------------+
1841 | Task : Start / Stop or trigger the timer counter or Watchdog |
1842 +----------------------------------------------------------------------------+
1843 | Input Parameters : struct comedi_device *dev : Driver handle |
1844 | struct comedi_subdevice *s, :pointer to subdevice structure
1845 struct comedi_insn *insn :pointer to insn structure |
1846 | unsigned int *data : Data Pointer to read status |
1847 data[0] : 0 Counter1/Timer1
1848 1 Counter2/Timer2
1849 2 Counter3/Watchdog
1850 data[1] : 0 start
1851 1 stop
1852 2 Trigger
1853 data[2] : 0 Counter
1854 1 Timer/Watchdog
1855 +----------------------------------------------------------------------------+
1856 | Output Parameters : -- |
1857 +----------------------------------------------------------------------------+
1858 | Return Value : TRUE : No error occur |
1859 | : FALSE : Error occur. Return the error |
1860 | |
1861 +----------------------------------------------------------------------------+
1862 */
1863 int i_APCI1500_StartStopTriggerTimerCounterWatchdog(struct comedi_device * dev,
1864 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
1865 {
1866 int i_CommandAndStatusValue;
1867
1868 switch (data[0]) {
1869 case COUNTER1:
1870 switch (data[1]) {
1871 case START:
1872 if (i_TimerCounter1Init == 1) {
1873 if (i_TimerCounterWatchdogInterrupt == 1) {
1874 i_CommandAndStatusValue = 0xC4; //Enable the interrupt
1875 } // if(i_TimerCounterWatchdogInterrupt==1)
1876 else {
1877 i_CommandAndStatusValue = 0xE4; //disable the interrupt
1878 } //elseif(i_TimerCounterWatchdogInterrupt==1)
1879 /**************************/
1880 /* Starts timer/counter 1 */
1881 /**************************/
1882 i_TimerCounter1Enabled = 1;
1883 /********************************************/
1884 /* Selects the commands and status register */
1885 /********************************************/
1886 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
1887 devpriv->iobase +
1888 APCI1500_Z8536_CONTROL_REGISTER);
1889 outb(i_CommandAndStatusValue,
1890 devpriv->iobase +
1891 APCI1500_Z8536_CONTROL_REGISTER);
1892 } //if( i_TimerCounter1Init==1)
1893 else {
1894 printk("\nCounter/Timer1 not configured\n");
1895 return -EINVAL;
1896 }
1897 break;
1898
1899 case STOP:
1900
1901 /**************************/
1902 /* Stop timer/counter 1 */
1903 /**************************/
1904
1905 /********************************************/
1906 /* Selects the commands and status register */
1907 /********************************************/
1908 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
1909 devpriv->iobase +
1910 APCI1500_Z8536_CONTROL_REGISTER);
1911 outb(0x00,
1912 devpriv->iobase +
1913 APCI1500_Z8536_CONTROL_REGISTER);
1914 i_TimerCounter1Enabled = 0;
1915 break;
1916
1917 case TRIGGER:
1918 if (i_TimerCounter1Init == 1) {
1919 if (i_TimerCounter1Enabled == 1) {
1920 /************************/
1921 /* Set Trigger and gate */
1922 /************************/
1923
1924 i_CommandAndStatusValue = 0x6;
1925 } //if( i_TimerCounter1Enabled==1)
1926 else {
1927 /***************/
1928 /* Set Trigger */
1929 /***************/
1930
1931 i_CommandAndStatusValue = 0x2;
1932 } //elseif(i_TimerCounter1Enabled==1)
1933
1934 /********************************************/
1935 /* Selects the commands and status register */
1936 /********************************************/
1937 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
1938 devpriv->iobase +
1939 APCI1500_Z8536_CONTROL_REGISTER);
1940 outb(i_CommandAndStatusValue,
1941 devpriv->iobase +
1942 APCI1500_Z8536_CONTROL_REGISTER);
1943 } //if( i_TimerCounter1Init==1)
1944 else {
1945 printk("\nCounter/Timer1 not configured\n");
1946 return -EINVAL;
1947 }
1948 break;
1949
1950 default:
1951 printk("\nThe specified option for start/stop/trigger does not exist\n");
1952 return -EINVAL;
1953 } //switch(data[1])
1954 break;
1955
1956 case COUNTER2:
1957 switch (data[1]) {
1958 case START:
1959 if (i_TimerCounter2Init == 1) {
1960 if (i_TimerCounterWatchdogInterrupt == 1) {
1961 i_CommandAndStatusValue = 0xC4; //Enable the interrupt
1962 } // if(i_TimerCounterWatchdogInterrupt==1)
1963 else {
1964 i_CommandAndStatusValue = 0xE4; //disable the interrupt
1965 } //elseif(i_TimerCounterWatchdogInterrupt==1)
1966 /**************************/
1967 /* Starts timer/counter 2 */
1968 /**************************/
1969 i_TimerCounter2Enabled = 1;
1970 /********************************************/
1971 /* Selects the commands and status register */
1972 /********************************************/
1973 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
1974 devpriv->iobase +
1975 APCI1500_Z8536_CONTROL_REGISTER);
1976 outb(i_CommandAndStatusValue,
1977 devpriv->iobase +
1978 APCI1500_Z8536_CONTROL_REGISTER);
1979 } //if( i_TimerCounter2Init==1)
1980 else {
1981 printk("\nCounter/Timer2 not configured\n");
1982 return -EINVAL;
1983 }
1984 break;
1985
1986 case STOP:
1987
1988 /**************************/
1989 /* Stop timer/counter 2 */
1990 /**************************/
1991
1992 /********************************************/
1993 /* Selects the commands and status register */
1994 /********************************************/
1995 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
1996 devpriv->iobase +
1997 APCI1500_Z8536_CONTROL_REGISTER);
1998 outb(0x00,
1999 devpriv->iobase +
2000 APCI1500_Z8536_CONTROL_REGISTER);
2001 i_TimerCounter2Enabled = 0;
2002 break;
2003 case TRIGGER:
2004 if (i_TimerCounter2Init == 1) {
2005 if (i_TimerCounter2Enabled == 1) {
2006 /************************/
2007 /* Set Trigger and gate */
2008 /************************/
2009
2010 i_CommandAndStatusValue = 0x6;
2011 } //if( i_TimerCounter2Enabled==1)
2012 else {
2013 /***************/
2014 /* Set Trigger */
2015 /***************/
2016
2017 i_CommandAndStatusValue = 0x2;
2018 } //elseif(i_TimerCounter2Enabled==1)
2019
2020 /********************************************/
2021 /* Selects the commands and status register */
2022 /********************************************/
2023 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2024 devpriv->iobase +
2025 APCI1500_Z8536_CONTROL_REGISTER);
2026 outb(i_CommandAndStatusValue,
2027 devpriv->iobase +
2028 APCI1500_Z8536_CONTROL_REGISTER);
2029 } //if( i_TimerCounter2Init==1)
2030 else {
2031 printk("\nCounter/Timer2 not configured\n");
2032 return -EINVAL;
2033 }
2034 break;
2035 default:
2036 printk("\nThe specified option for start/stop/trigger does not exist\n");
2037 return -EINVAL;
2038 } //switch(data[1])
2039 break;
2040 case COUNTER3:
2041 switch (data[1]) {
2042 case START:
2043 if (i_WatchdogCounter3Init == 1) {
2044
2045 if (i_TimerCounterWatchdogInterrupt == 1) {
2046 i_CommandAndStatusValue = 0xC4; //Enable the interrupt
2047 } // if(i_TimerCounterWatchdogInterrupt==1)
2048 else {
2049 i_CommandAndStatusValue = 0xE4; //disable the interrupt
2050 } //elseif(i_TimerCounterWatchdogInterrupt==1)
2051 /**************************/
2052 /* Starts Watchdog/counter 3 */
2053 /**************************/
2054 i_WatchdogCounter3Enabled = 1;
2055 /********************************************/
2056 /* Selects the commands and status register */
2057 /********************************************/
2058 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2059 devpriv->iobase +
2060 APCI1500_Z8536_CONTROL_REGISTER);
2061 outb(i_CommandAndStatusValue,
2062 devpriv->iobase +
2063 APCI1500_Z8536_CONTROL_REGISTER);
2064
2065 } // if( i_WatchdogCounter3init==1)
2066 else {
2067 printk("\nWatchdog/Counter3 not configured\n");
2068 return -EINVAL;
2069 }
2070 break;
2071
2072 case STOP:
2073
2074 /**************************/
2075 /* Stop Watchdog/counter 3 */
2076 /**************************/
2077
2078 /********************************************/
2079 /* Selects the commands and status register */
2080 /********************************************/
2081 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2082 devpriv->iobase +
2083 APCI1500_Z8536_CONTROL_REGISTER);
2084 outb(0x00,
2085 devpriv->iobase +
2086 APCI1500_Z8536_CONTROL_REGISTER);
2087 i_WatchdogCounter3Enabled = 0;
2088 break;
2089
2090 case TRIGGER:
2091 switch (data[2]) {
2092 case 0: //triggering counter 3
2093 if (i_WatchdogCounter3Init == 1) {
2094 if (i_WatchdogCounter3Enabled == 1) {
2095 /************************/
2096 /* Set Trigger and gate */
2097 /************************/
2098
2099 i_CommandAndStatusValue = 0x6;
2100 } //if( i_WatchdogCounter3Enabled==1)
2101 else {
2102 /***************/
2103 /* Set Trigger */
2104 /***************/
2105
2106 i_CommandAndStatusValue = 0x2;
2107 } //elseif(i_WatchdogCounter3Enabled==1)
2108
2109 /********************************************/
2110 /* Selects the commands and status register */
2111 /********************************************/
2112 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2113 devpriv->iobase +
2114 APCI1500_Z8536_CONTROL_REGISTER);
2115 outb(i_CommandAndStatusValue,
2116 devpriv->iobase +
2117 APCI1500_Z8536_CONTROL_REGISTER);
2118 } //if( i_WatchdogCounter3Init==1)
2119 else {
2120 printk("\nCounter3 not configured\n");
2121 return -EINVAL;
2122 }
2123 break;
2124 case 1:
2125 //triggering Watchdog 3
2126 if (i_WatchdogCounter3Init == 1) {
2127
2128 /********************************************/
2129 /* Selects the commands and status register */
2130 /********************************************/
2131 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2132 devpriv->iobase +
2133 APCI1500_Z8536_CONTROL_REGISTER);
2134 outb(0x6,
2135 devpriv->iobase +
2136 APCI1500_Z8536_CONTROL_REGISTER);
2137 } //if( i_WatchdogCounter3Init==1)
2138 else {
2139 printk("\nWatchdog 3 not configured\n");
2140 return -EINVAL;
2141 }
2142 break;
2143 default:
2144 printk("\nWrong choice of watchdog/counter3\n");
2145 return -EINVAL;
2146 } //switch(data[2])
2147 break;
2148 default:
2149 printk("\nThe specified option for start/stop/trigger does not exist\n");
2150 return -EINVAL;
2151 } //switch(data[1])
2152 break;
2153 default:
2154 printk("\nThe specified choice for counter/watchdog/timer does not exist\n");
2155 return -EINVAL;
2156 } //switch(data[0])
2157 return insn->n;
2158 }
2159
2160 /*
2161 +----------------------------------------------------------------------------+
2162 | Function Name : int i_APCI1500_ReadCounterTimerWatchdog |
2163 | (struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
2164 unsigned int *data); |
2165 +----------------------------------------------------------------------------+
2166 | Task : Read The Watchdog |
2167 +----------------------------------------------------------------------------+
2168 | Input Parameters : struct comedi_device *dev : Driver handle |
2169 | struct comedi_subdevice *s, :pointer to subdevice structure
2170 struct comedi_insn *insn :pointer to insn structure |
2171 | unsigned int *data : Data Pointer to read status |
2172 data[0] : 0 Counter1/Timer1
2173 1 Counter2/Timer2
2174 2 Counter3/Watchdog
2175
2176 +----------------------------------------------------------------------------+
2177 | Output Parameters : -- |
2178 +----------------------------------------------------------------------------+
2179 | Return Value : TRUE : No error occur |
2180 | : FALSE : Error occur. Return the error |
2181 | |
2182 +----------------------------------------------------------------------------+
2183 */
2184
2185 int i_APCI1500_ReadCounterTimerWatchdog(struct comedi_device * dev,
2186 struct comedi_subdevice * s, struct comedi_insn * insn, unsigned int * data)
2187 {
2188 int i_CommandAndStatusValue;
2189 switch (data[0]) {
2190 case COUNTER1:
2191 //Read counter/timer1
2192 if (i_TimerCounter1Init == 1) {
2193 if (i_TimerCounter1Enabled == 1) {
2194 /************************/
2195 /* Set RCC and gate */
2196 /************************/
2197
2198 i_CommandAndStatusValue = 0xC;
2199 } //if( i_TimerCounter1Init==1)
2200 else {
2201 /***************/
2202 /* Set RCC */
2203 /***************/
2204
2205 i_CommandAndStatusValue = 0x8;
2206 } //elseif(i_TimerCounter1Init==1)
2207
2208 /********************************************/
2209 /* Selects the commands and status register */
2210 /********************************************/
2211 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
2212 devpriv->iobase +
2213 APCI1500_Z8536_CONTROL_REGISTER);
2214 outb(i_CommandAndStatusValue,
2215 devpriv->iobase +
2216 APCI1500_Z8536_CONTROL_REGISTER);
2217
2218 /***************************************/
2219 /* Selects the counter register (high) */
2220 /***************************************/
2221 outb(APCI1500_R_CPT_TMR1_VALUE_HIGH,
2222 devpriv->iobase +
2223 APCI1500_Z8536_CONTROL_REGISTER);
2224 data[0] =
2225 inb(devpriv->iobase +
2226 APCI1500_Z8536_CONTROL_REGISTER);
2227 data[0] = data[0] << 8;
2228 data[0] = data[0] & 0xff00;
2229 outb(APCI1500_R_CPT_TMR1_VALUE_LOW,
2230 devpriv->iobase +
2231 APCI1500_Z8536_CONTROL_REGISTER);
2232 data[0] =
2233 data[0] | inb(devpriv->iobase +
2234 APCI1500_Z8536_CONTROL_REGISTER);
2235 } //if( i_TimerCounter1Init==1)
2236 else {
2237 printk("\nTimer/Counter1 not configured\n");
2238 return -EINVAL;
2239 } //elseif( i_TimerCounter1Init==1)
2240 break;
2241 case COUNTER2:
2242 //Read counter/timer2
2243 if (i_TimerCounter2Init == 1) {
2244 if (i_TimerCounter2Enabled == 1) {
2245 /************************/
2246 /* Set RCC and gate */
2247 /************************/
2248
2249 i_CommandAndStatusValue = 0xC;
2250 } //if( i_TimerCounter2Init==1)
2251 else {
2252 /***************/
2253 /* Set RCC */
2254 /***************/
2255
2256 i_CommandAndStatusValue = 0x8;
2257 } //elseif(i_TimerCounter2Init==1)
2258
2259 /********************************************/
2260 /* Selects the commands and status register */
2261 /********************************************/
2262 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2263 devpriv->iobase +
2264 APCI1500_Z8536_CONTROL_REGISTER);
2265 outb(i_CommandAndStatusValue,
2266 devpriv->iobase +
2267 APCI1500_Z8536_CONTROL_REGISTER);
2268
2269 /***************************************/
2270 /* Selects the counter register (high) */
2271 /***************************************/
2272 outb(APCI1500_R_CPT_TMR2_VALUE_HIGH,
2273 devpriv->iobase +
2274 APCI1500_Z8536_CONTROL_REGISTER);
2275 data[0] =
2276 inb(devpriv->iobase +
2277 APCI1500_Z8536_CONTROL_REGISTER);
2278 data[0] = data[0] << 8;
2279 data[0] = data[0] & 0xff00;
2280 outb(APCI1500_R_CPT_TMR2_VALUE_LOW,
2281 devpriv->iobase +
2282 APCI1500_Z8536_CONTROL_REGISTER);
2283 data[0] =
2284 data[0] | inb(devpriv->iobase +
2285 APCI1500_Z8536_CONTROL_REGISTER);
2286 } //if( i_TimerCounter2Init==1)
2287 else {
2288 printk("\nTimer/Counter2 not configured\n");
2289 return -EINVAL;
2290 } //elseif( i_TimerCounter2Init==1)
2291 break;
2292 case COUNTER3:
2293 //Read counter/watchdog2
2294 if (i_WatchdogCounter3Init == 1) {
2295 if (i_WatchdogCounter3Enabled == 1) {
2296 /************************/
2297 /* Set RCC and gate */
2298 /************************/
2299
2300 i_CommandAndStatusValue = 0xC;
2301 } //if( i_TimerCounter2Init==1)
2302 else {
2303 /***************/
2304 /* Set RCC */
2305 /***************/
2306
2307 i_CommandAndStatusValue = 0x8;
2308 } //elseif(i_WatchdogCounter3Init==1)
2309
2310 /********************************************/
2311 /* Selects the commands and status register */
2312 /********************************************/
2313 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2314 devpriv->iobase +
2315 APCI1500_Z8536_CONTROL_REGISTER);
2316 outb(i_CommandAndStatusValue,
2317 devpriv->iobase +
2318 APCI1500_Z8536_CONTROL_REGISTER);
2319
2320 /***************************************/
2321 /* Selects the counter register (high) */
2322 /***************************************/
2323 outb(APCI1500_R_CPT_TMR3_VALUE_HIGH,
2324 devpriv->iobase +
2325 APCI1500_Z8536_CONTROL_REGISTER);
2326 data[0] =
2327 inb(devpriv->iobase +
2328 APCI1500_Z8536_CONTROL_REGISTER);
2329 data[0] = data[0] << 8;
2330 data[0] = data[0] & 0xff00;
2331 outb(APCI1500_R_CPT_TMR3_VALUE_LOW,
2332 devpriv->iobase +
2333 APCI1500_Z8536_CONTROL_REGISTER);
2334 data[0] =
2335 data[0] | inb(devpriv->iobase +
2336 APCI1500_Z8536_CONTROL_REGISTER);
2337 } //if( i_WatchdogCounter3Init==1)
2338 else {
2339 printk("\nWatchdogCounter3 not configured\n");
2340 return -EINVAL;
2341 } //elseif( i_WatchdogCounter3Init==1)
2342 break;
2343 default:
2344 printk("\nThe choice of timer/counter/watchdog does not exist\n");
2345 return -EINVAL;
2346 } //switch(data[0])
2347
2348 return insn->n;
2349 }
2350
2351 /*
2352 +----------------------------------------------------------------------------+
2353 | Function Name : int i_APCI1500_ReadInterruptMask |
2354 | (struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
2355 unsigned int *data); |
2356 +----------------------------------------------------------------------------+
2357 | Task : Read the interrupt mask |
2358 +----------------------------------------------------------------------------+
2359 | Input Parameters : struct comedi_device *dev : Driver handle |
2360 | struct comedi_subdevice *s, :pointer to subdevice structure
2361 struct comedi_insn *insn :pointer to insn structure |
2362 | unsigned int *data : Data Pointer to read status |
2363
2364
2365 +----------------------------------------------------------------------------+
2366 | Output Parameters : -- data[0]:The interrupt mask value data[1]:Channel no
2367 +----------------------------------------------------------------------------+
2368 | Return Value : TRUE : No error occur |
2369 | : FALSE : Error occur. Return the error |
2370 | |
2371 +----------------------------------------------------------------------------+
2372 */
2373 int i_APCI1500_ReadInterruptMask(struct comedi_device * dev, struct comedi_subdevice * s,
2374 struct comedi_insn * insn, unsigned int * data)
2375 {
2376 data[0] = i_InterruptMask;
2377 data[1] = i_InputChannel;
2378 i_InterruptMask = 0;
2379 return insn->n;
2380 }
2381
2382 /*
2383 +----------------------------------------------------------------------------+
2384 | Function Name : int i_APCI1500_ConfigureInterrupt |
2385 | (struct comedi_device *dev,struct comedi_subdevice *s,struct comedi_insn *insn,
2386 unsigned int *data); |
2387 +----------------------------------------------------------------------------+
2388 | Task : Configures the interrupt registers |
2389 +----------------------------------------------------------------------------+
2390 | Input Parameters : struct comedi_device *dev : Driver handle |
2391 | struct comedi_subdevice *s, :pointer to subdevice structure
2392 struct comedi_insn *insn :pointer to insn structure |
2393 | unsigned int *data : Data Pointer |
2394
2395
2396 +----------------------------------------------------------------------------+
2397 | Output Parameters : --
2398 +----------------------------------------------------------------------------+
2399 | Return Value : TRUE : No error occur |
2400 | : FALSE : Error occur. Return the error |
2401 | |
2402 +----------------------------------------------------------------------------+
2403 */
2404 int i_APCI1500_ConfigureInterrupt(struct comedi_device * dev, struct comedi_subdevice * s,
2405 struct comedi_insn * insn, unsigned int * data)
2406 {
2407 UINT ui_Status;
2408 int i_RegValue;
2409 int i_Constant;
2410 devpriv->tsk_Current = current;
2411 outl(0x0, devpriv->i_IobaseAmcc + 0x38);
2412 if (data[0] == 1) {
2413 i_Constant = 0xC0;
2414 } //if(data[0]==1)
2415 else {
2416 if (data[0] == 0) {
2417 i_Constant = 0x00;
2418 } //if{data[0]==0)
2419 else {
2420 printk("\nThe parameter passed to driver is in error for enabling the voltage interrupt\n");
2421 return -EINVAL;
2422 } //else if(data[0]==0)
2423 } //elseif(data[0]==1)
2424
2425 /*****************************************************/
2426 /* Selects the mode specification register of port B */
2427 /*****************************************************/
2428 outb(APCI1500_RW_PORT_B_SPECIFICATION,
2429 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2430 i_RegValue = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2431 outb(APCI1500_RW_PORT_B_SPECIFICATION,
2432 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2433 /*********************************************/
2434 /* Writes the new configuration (APCI1500_OR) */
2435 /*********************************************/
2436 i_RegValue = (i_RegValue & 0xF9) | APCI1500_OR;
2437
2438 outb(i_RegValue, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2439 /*****************************************************/
2440 /* Selects the command and status register of port B */
2441 /*****************************************************/
2442 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
2443 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2444 /*****************************************/
2445 /* Authorises the interrupt on the board */
2446 /*****************************************/
2447 outb(0xC0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2448 /***************************************************/
2449 /* Selects the pattern polarity register of port B */
2450 /***************************************************/
2451 outb(APCI1500_RW_PORT_B_PATTERN_POLARITY,
2452 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2453 outb(i_Constant, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2454 /*****************************************************/
2455 /* Selects the pattern transition register of port B */
2456 /*****************************************************/
2457 outb(APCI1500_RW_PORT_B_PATTERN_TRANSITION,
2458 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2459 outb(i_Constant, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2460 /***********************************************/
2461 /* Selects the pattern mask register of port B */
2462 /***********************************************/
2463 outb(APCI1500_RW_PORT_B_PATTERN_MASK,
2464 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2465 outb(i_Constant, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2466
2467 /*****************************************************/
2468 /* Selects the command and status register of port A */
2469 /*****************************************************/
2470 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
2471 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2472 i_RegValue = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2473 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
2474 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2475 /***********************************/
2476 /* Deletes the interrupt of port A */
2477 /***********************************/
2478
2479 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2480 outb(i_RegValue, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2481 /*****************************************************/
2482 /* Selects the command and status register of port B */
2483 /*****************************************************/
2484 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
2485 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2486 i_RegValue = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2487 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
2488 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2489 /***********************************/
2490 /* Deletes the interrupt of port B */
2491 /***********************************/
2492
2493 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2494 outb(i_RegValue, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2495
2496 /*****************************************************/
2497 /* Selects the command and status register of timer 1 */
2498 /*****************************************************/
2499 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
2500 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2501 i_RegValue = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2502 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
2503 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2504 /***********************************/
2505 /* Deletes the interrupt of timer 1 */
2506 /***********************************/
2507
2508 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2509 outb(i_RegValue, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2510
2511 /*****************************************************/
2512 /* Selects the command and status register of timer 2 */
2513 /*****************************************************/
2514 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2515 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2516 i_RegValue = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2517 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2518 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2519 /***********************************/
2520 /* Deletes the interrupt of timer 2 */
2521 /***********************************/
2522
2523 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2524 outb(i_RegValue, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2525
2526 /*****************************************************/
2527 /* Selects the command and status register of timer 3 */
2528 /*****************************************************/
2529 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2530 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2531 i_RegValue = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2532 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2533 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2534 /***********************************/
2535 /* Deletes the interrupt of timer 3 */
2536 /***********************************/
2537
2538 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2539 outb(i_RegValue, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2540
2541 /*************************************************/
2542 /* Selects the master interrupt control register */
2543 /*************************************************/
2544 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL,
2545 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2546 /**********************************************/
2547 /* Authorizes the main interrupt on the board */
2548 /**********************************************/
2549 outb(0xD0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2550
2551 /***************************/
2552 /* Enables the PCI interrupt */
2553 /*****************************/
2554 outl(0x3000, devpriv->i_IobaseAmcc + 0x38);
2555 ui_Status = inl(devpriv->i_IobaseAmcc + 0x10);
2556 ui_Status = inl(devpriv->i_IobaseAmcc + 0x38);
2557 outl(0x23000, devpriv->i_IobaseAmcc + 0x38);
2558
2559 return insn->n;
2560 }
2561
2562 /*
2563 +----------------------------------------------------------------------------+
2564 | Function Name : static void v_APCI1500_Interrupt |
2565 | (int irq , void *d) |
2566 +----------------------------------------------------------------------------+
2567 | Task : Interrupt handler |
2568 +----------------------------------------------------------------------------+
2569 | Input Parameters : int irq : irq number |
2570 | void *d : void pointer |
2571 +----------------------------------------------------------------------------+
2572 | Output Parameters : -- |
2573 +----------------------------------------------------------------------------+
2574 | Return Value : TRUE : No error occur |
2575 | : FALSE : Error occur. Return the error |
2576 | |
2577 +----------------------------------------------------------------------------+
2578 */
2579 static VOID v_APCI1500_Interrupt(int irq, void *d)
2580 {
2581
2582 struct comedi_device *dev = d;
2583 UINT ui_InterruptStatus = 0;
2584 int i_RegValue = 0;
2585 i_InterruptMask = 0;
2586
2587 /***********************************/
2588 /* Read the board interrupt status */
2589 /***********************************/
2590 ui_InterruptStatus = inl(devpriv->i_IobaseAmcc + 0x38);
2591
2592 /***************************************/
2593 /* Test if board generated a interrupt */
2594 /***************************************/
2595 if ((ui_InterruptStatus & 0x800000) == 0x800000) {
2596 /************************/
2597 /* Disable all Interrupt */
2598 /************************/
2599 /*************************************************/
2600 /* Selects the master interrupt control register */
2601 /*************************************************/
2602 //outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER);
2603 /**********************************************/
2604 /* Disables the main interrupt on the board */
2605 /**********************************************/
2606 //outb(0x00,devpriv->iobase+APCI1500_Z8536_CONTROL_REGISTER);
2607
2608 /*****************************************************/
2609 /* Selects the command and status register of port A */
2610 /*****************************************************/
2611 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
2612 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2613 i_RegValue =
2614 inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2615 if ((i_RegValue & 0x60) == 0x60) {
2616 /*****************************************************/
2617 /* Selects the command and status register of port A */
2618 /*****************************************************/
2619 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
2620 devpriv->iobase +
2621 APCI1500_Z8536_CONTROL_REGISTER);
2622 /***********************************/
2623 /* Deletes the interrupt of port A */
2624 /***********************************/
2625 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2626 outb(i_RegValue,
2627 devpriv->iobase +
2628 APCI1500_Z8536_CONTROL_REGISTER);
2629 i_InterruptMask = i_InterruptMask | 1;
2630 if (i_Logic == APCI1500_OR_PRIORITY) {
2631 outb(APCI1500_RW_PORT_A_SPECIFICATION,
2632 devpriv->iobase +
2633 APCI1500_Z8536_CONTROL_REGISTER);
2634 i_RegValue =
2635 inb(devpriv->iobase +
2636 APCI1500_Z8536_CONTROL_REGISTER);
2637
2638 /***************************************************/
2639 /* Selects the interrupt vector register of port A */
2640 /***************************************************/
2641 outb(APCI1500_RW_PORT_A_INTERRUPT_CONTROL,
2642 devpriv->iobase +
2643 APCI1500_Z8536_CONTROL_REGISTER);
2644 i_RegValue =
2645 inb(devpriv->iobase +
2646 APCI1500_Z8536_CONTROL_REGISTER);
2647
2648 i_InputChannel = 1 + (i_RegValue >> 1);
2649
2650 } // if(i_Logic==APCI1500_OR_PRIORITY)
2651 else {
2652 i_InputChannel = 0;
2653 } //elseif(i_Logic==APCI1500_OR_PRIORITY)
2654 } // if ((i_RegValue & 0x60) == 0x60)
2655
2656 /*****************************************************/
2657 /* Selects the command and status register of port B */
2658 /*****************************************************/
2659 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
2660 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2661 i_RegValue =
2662 inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2663 if ((i_RegValue & 0x60) == 0x60) {
2664 /*****************************************************/
2665 /* Selects the command and status register of port B */
2666 /*****************************************************/
2667 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
2668 devpriv->iobase +
2669 APCI1500_Z8536_CONTROL_REGISTER);
2670 /***********************************/
2671 /* Deletes the interrupt of port B */
2672 /***********************************/
2673 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2674 outb(i_RegValue,
2675 devpriv->iobase +
2676 APCI1500_Z8536_CONTROL_REGISTER);
2677 printk("\n\n\n");
2678 /****************/
2679 /* Reads port B */
2680 /****************/
2681 i_RegValue =
2682 inb((UINT) devpriv->iobase +
2683 APCI1500_Z8536_PORT_B);
2684
2685 i_RegValue = i_RegValue & 0xC0;
2686 /**************************************/
2687 /* Tests if this is an external error */
2688 /**************************************/
2689
2690 if (i_RegValue) {
2691 //Disable the interrupt
2692 /*****************************************************/
2693 /* Selects the command and status register of port B */
2694 /*****************************************************/
2695 outl(0x0, devpriv->i_IobaseAmcc + 0x38);
2696
2697 if (i_RegValue & 0x80) {
2698 i_InterruptMask =
2699 i_InterruptMask | 0x40;
2700 } //if (i_RegValue & 0x80)
2701
2702 if (i_RegValue & 0x40) {
2703 i_InterruptMask =
2704 i_InterruptMask | 0x80;
2705 } //if (i_RegValue & 0x40)
2706 } // if (i_RegValue)
2707 else {
2708 i_InterruptMask = i_InterruptMask | 2;
2709 } // if (i_RegValue)
2710 } //if ((i_RegValue & 0x60) == 0x60)
2711
2712 /*****************************************************/
2713 /* Selects the command and status register of timer 1 */
2714 /*****************************************************/
2715 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
2716 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2717 i_RegValue =
2718 inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2719 if ((i_RegValue & 0x60) == 0x60) {
2720 /*****************************************************/
2721 /* Selects the command and status register of timer 1 */
2722 /*****************************************************/
2723 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
2724 devpriv->iobase +
2725 APCI1500_Z8536_CONTROL_REGISTER);
2726 /***********************************/
2727 /* Deletes the interrupt of timer 1 */
2728 /***********************************/
2729 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2730 outb(i_RegValue,
2731 devpriv->iobase +
2732 APCI1500_Z8536_CONTROL_REGISTER);
2733 i_InterruptMask = i_InterruptMask | 4;
2734 } // if ((i_RegValue & 0x60) == 0x60)
2735 /*****************************************************/
2736 /* Selects the command and status register of timer 2 */
2737 /*****************************************************/
2738 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2739 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2740 i_RegValue =
2741 inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2742 if ((i_RegValue & 0x60) == 0x60) {
2743 /*****************************************************/
2744 /* Selects the command and status register of timer 2 */
2745 /*****************************************************/
2746 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2747 devpriv->iobase +
2748 APCI1500_Z8536_CONTROL_REGISTER);
2749 /***********************************/
2750 /* Deletes the interrupt of timer 2 */
2751 /***********************************/
2752 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2753 outb(i_RegValue,
2754 devpriv->iobase +
2755 APCI1500_Z8536_CONTROL_REGISTER);
2756 i_InterruptMask = i_InterruptMask | 8;
2757 } // if ((i_RegValue & 0x60) == 0x60)
2758
2759 /*****************************************************/
2760 /* Selects the command and status register of timer 3 */
2761 /*****************************************************/
2762 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2763 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2764 i_RegValue =
2765 inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2766 if ((i_RegValue & 0x60) == 0x60) {
2767 /*****************************************************/
2768 /* Selects the command and status register of timer 3 */
2769 /*****************************************************/
2770 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2771 devpriv->iobase +
2772 APCI1500_Z8536_CONTROL_REGISTER);
2773 /***********************************/
2774 /* Deletes the interrupt of timer 3 */
2775 /***********************************/
2776 i_RegValue = (i_RegValue & 0x0F) | 0x20;
2777 outb(i_RegValue,
2778 devpriv->iobase +
2779 APCI1500_Z8536_CONTROL_REGISTER);
2780 if (i_CounterLogic == APCI1500_COUNTER) {
2781 i_InterruptMask = i_InterruptMask | 0x10;
2782 } //if(i_CounterLogic==APCI1500_COUNTER)
2783 else {
2784 i_InterruptMask = i_InterruptMask | 0x20;
2785 }
2786 } // if ((i_RegValue & 0x60) == 0x60)
2787
2788 send_sig(SIGIO, devpriv->tsk_Current, 0); // send signal to the sample
2789 /***********************/
2790 /* Enable all Interrupts */
2791 /***********************/
2792
2793 /*************************************************/
2794 /* Selects the master interrupt control register */
2795 /*************************************************/
2796 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL,
2797 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2798 /**********************************************/
2799 /* Authorizes the main interrupt on the board */
2800 /**********************************************/
2801 outb(0xD0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2802 } // if ((ui_InterruptStatus & 0x800000) == 0x800000)
2803 else {
2804 printk("\nInterrupt from unknown source\n");
2805
2806 } //else if ((ui_InterruptStatus & 0x800000) == 0x800000)
2807 return;
2808 }
2809
2810 /*
2811 +----------------------------------------------------------------------------+
2812 | Function Name : int i_APCI1500_Reset(struct comedi_device *dev) | |
2813 +----------------------------------------------------------------------------+
2814 | Task :resets all the registers |
2815 +----------------------------------------------------------------------------+
2816 | Input Parameters : struct comedi_device *dev
2817 +----------------------------------------------------------------------------+
2818 | Output Parameters : -- |
2819 +----------------------------------------------------------------------------+
2820 | Return Value : |
2821 | |
2822 +----------------------------------------------------------------------------+
2823 */
2824
2825 INT i_APCI1500_Reset(struct comedi_device * dev)
2826 {
2827 int i_DummyRead = 0;
2828 i_TimerCounter1Init = 0;
2829 i_TimerCounter2Init = 0;
2830 i_WatchdogCounter3Init = 0;
2831 i_Event1Status = 0;
2832 i_Event2Status = 0;
2833 i_TimerCounterWatchdogInterrupt = 0;
2834 i_Logic = 0;
2835 i_CounterLogic = 0;
2836 i_InterruptMask = 0;
2837 i_InputChannel = 0;;
2838 i_TimerCounter1Enabled = 0;
2839 i_TimerCounter2Enabled = 0;
2840 i_WatchdogCounter3Enabled = 0;
2841
2842 /******************/
2843 /* Software reset */
2844 /******************/
2845 i_DummyRead = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2846 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2847 i_DummyRead = inb(devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2848 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2849 outb(1, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2850 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2851
2852 /*****************************************************/
2853 /* Selects the master configuration control register */
2854 /*****************************************************/
2855 outb(APCI1500_RW_MASTER_CONFIGURATION_CONTROL,
2856 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2857 outb(0xF4, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2858
2859 /*****************************************************/
2860 /* Selects the mode specification register of port A */
2861 /*****************************************************/
2862 outb(APCI1500_RW_PORT_A_SPECIFICATION,
2863 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2864 outb(0x10, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2865
2866 /* Selects the data path polarity register of port A */
2867 outb(APCI1500_RW_PORT_A_DATA_PCITCH_POLARITY,
2868 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2869 /* High level of port A means 1 */
2870 outb(0xFF, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2871
2872 /* Selects the data direction register of port A */
2873 outb(APCI1500_RW_PORT_A_DATA_DIRECTION,
2874 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2875 /* All bits used as inputs */
2876 outb(0xFF, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2877 /* Selects the command and status register of port A */
2878 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
2879 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2880 /* Deletes IP and IUS */
2881 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2882 /* Selects the command and status register of port A */
2883 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
2884 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2885 /* Deactivates the interrupt management of port A: */
2886 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2887 /* Selects the handshake specification register of port A */
2888 outb(APCI1500_RW_PORT_A_HANDSHAKE_SPECIFICATION,
2889 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2890 /* Deletes the register */
2891 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2892
2893 /*****************************************************/
2894 /* Selects the mode specification register of port B */
2895 /*****************************************************/
2896 outb(APCI1500_RW_PORT_B_SPECIFICATION,
2897 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2898 outb(0x10, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2899 /* Selects the data path polarity register of port B */
2900 outb(APCI1500_RW_PORT_B_DATA_PCITCH_POLARITY,
2901 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2902 /* A high level of port B means 1 */
2903 outb(0x7F, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2904 /* Selects the data direction register of port B */
2905 outb(APCI1500_RW_PORT_B_DATA_DIRECTION,
2906 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2907 /* All bits used as inputs */
2908 outb(0xFF, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2909 /* Selects the command and status register of port B */
2910 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
2911 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2912 /* Deletes IP and IUS */
2913 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2914 /* Selects the command and status register of port B */
2915 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
2916 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2917 /* Deactivates the interrupt management of port B: */
2918 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2919 /* Selects the handshake specification register of port B */
2920 outb(APCI1500_RW_PORT_B_HANDSHAKE_SPECIFICATION,
2921 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2922 /* Deletes the register */
2923 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2924
2925 /*****************************************************/
2926 /* Selects the data path polarity register of port C */
2927 /*****************************************************/
2928 outb(APCI1500_RW_PORT_C_DATA_PCITCH_POLARITY,
2929 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2930 /* High level of port C means 1 */
2931 outb(0x9, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2932 /* Selects the data direction register of port C */
2933 outb(APCI1500_RW_PORT_C_DATA_DIRECTION,
2934 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2935 /* All bits used as inputs except channel 1 */
2936 outb(0x0E, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2937 /* Selects the special IO register of port C */
2938 outb(APCI1500_RW_PORT_C_SPECIAL_IO_CONTROL,
2939 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2940 /* Deletes it */
2941 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2942 /******************************************************/
2943 /* Selects the command and status register of timer 1 */
2944 /******************************************************/
2945 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
2946 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2947 /* Deletes IP and IUS */
2948 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2949 /* Selects the command and status register of timer 1 */
2950 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
2951 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2952 /* Deactivates the interrupt management of timer 1 */
2953 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2954 /******************************************************/
2955 /* Selects the command and status register of timer 2 */
2956 /******************************************************/
2957 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2958 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2959 /* Deletes IP and IUS */
2960 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2961 /* Selects the command and status register of timer 2 */
2962 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
2963 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2964 /* Deactivates Timer 2 interrupt management: */
2965 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2966 /******************************************************/
2967 /* Selects the command and status register of timer 3 */
2968 /******************************************************/
2969 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2970 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2971 /* Deletes IP and IUS */
2972 outb(0x20, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2973 /* Selects the command and status register of Timer 3 */
2974 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
2975 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2976 /* Deactivates interrupt management of timer 3: */
2977 outb(0xE0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2978 /*************************************************/
2979 /* Selects the master interrupt control register */
2980 /*************************************************/
2981 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL,
2982 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2983 /* Deletes all interrupts */
2984 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2985 //reset all the digital outputs
2986 outw(0x0, devpriv->i_IobaseAddon + APCI1500_DIGITAL_OP);
2987 /*******************************/
2988 /* Disable the board interrupt */
2989 /*******************************/
2990 /*************************************************/
2991 /* Selects the master interrupt control register */
2992 /*************************************************/
2993 outb(APCI1500_RW_MASTER_INTERRUPT_CONTROL,
2994 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2995 /****************************/
2996 /* Deactivates all interrupts */
2997 /******************************/
2998 outb(0, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
2999 /*****************************************************/
3000 /* Selects the command and status register of port A */
3001 /*****************************************************/
3002 outb(APCI1500_RW_PORT_A_COMMAND_AND_STATUS,
3003 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3004 /****************************/
3005 /* Deactivates all interrupts */
3006 /******************************/
3007 outb(0x00, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3008 /*****************************************************/
3009 /* Selects the command and status register of port B */
3010 /*****************************************************/
3011 outb(APCI1500_RW_PORT_B_COMMAND_AND_STATUS,
3012 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3013 /****************************/
3014 /* Deactivates all interrupts */
3015 /******************************/
3016 outb(0x00, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3017 /*****************************************************/
3018 /* Selects the command and status register of timer 1 */
3019 /*****************************************************/
3020 outb(APCI1500_RW_CPT_TMR1_CMD_STATUS,
3021 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3022 /****************************/
3023 /* Deactivates all interrupts */
3024 /******************************/
3025 outb(0x00, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3026 /*****************************************************/
3027 /* Selects the command and status register of timer 2 */
3028 /*****************************************************/
3029 outb(APCI1500_RW_CPT_TMR2_CMD_STATUS,
3030 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3031 /****************************/
3032 /* Deactivates all interrupts */
3033 /******************************/
3034 outb(0x00, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3035 /*****************************************************/
3036 /* Selects the command and status register of timer 3*/
3037 /*****************************************************/
3038 outb(APCI1500_RW_CPT_TMR3_CMD_STATUS,
3039 devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3040 /****************************/
3041 /* Deactivates all interrupts */
3042 /******************************/
3043 outb(0x00, devpriv->iobase + APCI1500_Z8536_CONTROL_REGISTER);
3044 return 0;
3045 }