![]() |
RTXI 1.3
|
00001 00024 /* 00025 00026 +-----------------------------------------------------------------------+ 00027 | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier | 00028 +-----------------------------------------------------------------------+ 00029 | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com | 00030 | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com | 00031 +-----------------------------------------------------------------------+ 00032 | Project : API APCI1710 | Compiler : gcc | 00033 | Module name : TTL.C | Version : 2.96 | 00034 +-------------------------------+---------------------------------------+ 00035 | Project manager: Eric Stolz | Date : 02/12/2002 | 00036 +-----------------------------------------------------------------------+ 00037 | Description : APCI-1710 TTL I/O module | 00038 | | 00039 | | 00040 +-----------------------------------------------------------------------+ 00041 | UPDATES | 00042 +-----------------------------------------------------------------------+ 00043 | Date | Author | Description of updates | 00044 +----------+-----------+------------------------------------------------+ 00045 | 13/05/98 | S. Weber | TTL digital input / output implementation | 00046 |----------|-----------|------------------------------------------------| 00047 | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 | 00048 | | | available | 00049 +-----------------------------------------------------------------------+ 00050 | | | | 00051 | | | | 00052 +-----------------------------------------------------------------------+ 00053 */ 00054 00055 /* 00056 +----------------------------------------------------------------------------+ 00057 | Included files | 00058 +----------------------------------------------------------------------------+ 00059 */ 00060 00061 #include "APCI1710_Ttl.h" 00062 00063 /* 00064 +----------------------------------------------------------------------------+ 00065 | Function Name : _INT_ i_APCI1710_InitTTLIODirection | 00066 | (BYTE_ b_BoardHandle, | 00067 | BYTE_ b_ModulNbr, | 00068 | BYTE_ b_PortAMode, | 00069 | BYTE_ b_PortBMode, | 00070 | BYTE_ b_PortCMode, | 00071 | BYTE_ b_PortDMode) | 00072 +----------------------------------------------------------------------------+ 00073 | Task APCI1710_TTL_INIT (using defaults) : Configure the TTL I/O operating mode from selected | 00074 | module (b_ModulNbr). You must calling this function be| 00075 | for you call any other function witch access of TTL. | 00076 APCI1710_TTL_INITDIRECTION(user inputs for direction) 00077 00078 +----------------------------------------------------------------------------+ 00079 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710| 00080 | BYTE_ b_ModulNbr : Module number to | 00081 | configure (0 to 3) 00082 b_ModulNbr = (BYTE) CR_AREF(insn->chanspec); 00083 b_InitType = (BYTE) data[0]; 00084 b_PortAMode = (BYTE) data[1]; 00085 b_PortBMode = (BYTE) data[2]; 00086 b_PortCMode = (BYTE) data[3]; 00087 b_PortDMode = (BYTE) data[4];| 00088 +----------------------------------------------------------------------------+ 00089 | Output Parameters : - | 00090 +----------------------------------------------------------------------------+ 00091 | Return Value : 0: No error | 00092 | -1: The handle parameter of the board is wrong | 00093 | -2: The module parameter is wrong | 00094 | -3: The module is not a TTL module | 00095 | -4: Function not available for this version | 00096 | -5: Port A mode selection is wrong | 00097 | -6: Port B mode selection is wrong | 00098 | -7: Port C mode selection is wrong | 00099 | -8: Port D mode selection is wrong | 00100 +----------------------------------------------------------------------------+ 00101 */ 00102 00103 INT i_APCI1710_InsnConfigInitTTLIO(comedi_device * dev, comedi_subdevice * s, 00104 comedi_insn * insn, lsampl_t * data) 00105 { 00106 INT i_ReturnValue = 0; 00107 BYTE b_ModulNbr; 00108 BYTE b_InitType; 00109 BYTE b_PortAMode; 00110 BYTE b_PortBMode; 00111 BYTE b_PortCMode; 00112 BYTE b_PortDMode; 00113 00114 b_ModulNbr = (BYTE) CR_AREF(insn->chanspec); 00115 b_InitType = (BYTE) data[0]; 00116 i_ReturnValue = insn->n; 00117 00118 /**************************/ 00119 /* Test the module number */ 00120 /**************************/ 00121 00122 if (b_ModulNbr < 4) { 00123 /**************************/ 00124 /* Test if TTL I/O module */ 00125 /**************************/ 00126 00127 if ((devpriv->s_BoardInfos. 00128 dw_MolduleConfiguration[b_ModulNbr] & 00129 0xFFFF0000UL) == APCI1710_TTL_IO) { 00130 switch (b_InitType) { 00131 case APCI1710_TTL_INIT: 00132 00133 devpriv->s_ModuleInfo[b_ModulNbr]. 00134 s_TTLIOInfo.b_TTLInit = 1; 00135 00136 /***************************/ 00137 /* Set TTL port A to input */ 00138 /***************************/ 00139 00140 devpriv->s_ModuleInfo[b_ModulNbr]. 00141 s_TTLIOInfo.b_PortConfiguration[0] = 0; 00142 00143 /***************************/ 00144 /* Set TTL port B to input */ 00145 /***************************/ 00146 00147 devpriv->s_ModuleInfo[b_ModulNbr]. 00148 s_TTLIOInfo.b_PortConfiguration[1] = 0; 00149 00150 /***************************/ 00151 /* Set TTL port C to input */ 00152 /***************************/ 00153 00154 devpriv->s_ModuleInfo[b_ModulNbr]. 00155 s_TTLIOInfo.b_PortConfiguration[2] = 0; 00156 00157 /****************************/ 00158 /* Set TTL port D to output */ 00159 /****************************/ 00160 00161 devpriv->s_ModuleInfo[b_ModulNbr]. 00162 s_TTLIOInfo.b_PortConfiguration[3] = 1; 00163 00164 /*************************/ 00165 /* Set the configuration */ 00166 /*************************/ 00167 00168 outl(0x8, 00169 devpriv->s_BoardInfos.ui_Address + 20 + 00170 (64 * b_ModulNbr)); 00171 break; 00172 00173 case APCI1710_TTL_INITDIRECTION: 00174 00175 b_PortAMode = (BYTE) data[1]; 00176 b_PortBMode = (BYTE) data[2]; 00177 b_PortCMode = (BYTE) data[3]; 00178 b_PortDMode = (BYTE) data[4]; 00179 00180 /********************/ 00181 /* Test the version */ 00182 /********************/ 00183 00184 if ((devpriv->s_BoardInfos. 00185 dw_MolduleConfiguration 00186 [b_ModulNbr] & 0xFFFF) >= 00187 0x3230) { 00188 /************************/ 00189 /* Test the port A mode */ 00190 /************************/ 00191 00192 if ((b_PortAMode == 0) 00193 || (b_PortAMode == 1)) { 00194 /************************/ 00195 /* Test the port B mode */ 00196 /************************/ 00197 00198 if ((b_PortBMode == 0) 00199 || (b_PortBMode == 1)) { 00200 /************************/ 00201 /* Test the port C mode */ 00202 /************************/ 00203 00204 if ((b_PortCMode == 0) 00205 || (b_PortCMode 00206 == 1)) { 00207 /************************/ 00208 /* Test the port D mode */ 00209 /************************/ 00210 00211 if ((b_PortDMode == 0) || (b_PortDMode == 1)) { 00212 devpriv-> 00213 s_ModuleInfo 00214 [b_ModulNbr]. 00215 s_TTLIOInfo. 00216 b_TTLInit 00217 = 00218 1; 00219 00220 /***********************/ 00221 /* Set TTL port A mode */ 00222 /***********************/ 00223 00224 devpriv-> 00225 s_ModuleInfo 00226 [b_ModulNbr]. 00227 s_TTLIOInfo. 00228 b_PortConfiguration 00229 [0] 00230 = 00231 b_PortAMode; 00232 00233 /***********************/ 00234 /* Set TTL port B mode */ 00235 /***********************/ 00236 00237 devpriv-> 00238 s_ModuleInfo 00239 [b_ModulNbr]. 00240 s_TTLIOInfo. 00241 b_PortConfiguration 00242 [1] 00243 = 00244 b_PortBMode; 00245 00246 /***********************/ 00247 /* Set TTL port C mode */ 00248 /***********************/ 00249 00250 devpriv-> 00251 s_ModuleInfo 00252 [b_ModulNbr]. 00253 s_TTLIOInfo. 00254 b_PortConfiguration 00255 [2] 00256 = 00257 b_PortCMode; 00258 00259 /***********************/ 00260 /* Set TTL port D mode */ 00261 /***********************/ 00262 00263 devpriv-> 00264 s_ModuleInfo 00265 [b_ModulNbr]. 00266 s_TTLIOInfo. 00267 b_PortConfiguration 00268 [3] 00269 = 00270 b_PortDMode; 00271 00272 /*************************/ 00273 /* Set the configuration */ 00274 /*************************/ 00275 00276 outl((b_PortAMode << 0) | (b_PortBMode << 1) | (b_PortCMode << 2) | (b_PortDMode << 3), devpriv->s_BoardInfos.ui_Address + 20 + (64 * b_ModulNbr)); 00277 } else { 00278 /**********************************/ 00279 /* Port D mode selection is wrong */ 00280 /**********************************/ 00281 00282 DPRINTK("Port D mode selection is wrong\n"); 00283 i_ReturnValue 00284 = 00285 -8; 00286 } 00287 } else { 00288 /**********************************/ 00289 /* Port C mode selection is wrong */ 00290 /**********************************/ 00291 00292 DPRINTK("Port C mode selection is wrong\n"); 00293 i_ReturnValue = 00294 -7; 00295 } 00296 } else { 00297 /**********************************/ 00298 /* Port B mode selection is wrong */ 00299 /**********************************/ 00300 00301 DPRINTK("Port B mode selection is wrong\n"); 00302 i_ReturnValue = -6; 00303 } 00304 } else { 00305 /**********************************/ 00306 /* Port A mode selection is wrong */ 00307 /**********************************/ 00308 00309 DPRINTK("Port A mode selection is wrong\n"); 00310 i_ReturnValue = -5; 00311 } 00312 } else { 00313 /*******************************************/ 00314 /* Function not available for this version */ 00315 /*******************************************/ 00316 00317 DPRINTK("Function not available for this version\n"); 00318 i_ReturnValue = -4; 00319 } 00320 break; 00321 00322 DPRINTK("\n"); 00323 default: 00324 printk("Bad Config Type\n"); 00325 } // switch end 00326 } else { 00327 /**********************************/ 00328 /* The module is not a TTL module */ 00329 /**********************************/ 00330 00331 DPRINTK("The module is not a TTL module\n"); 00332 i_ReturnValue = -3; 00333 } 00334 } else { 00335 /***********************/ 00336 /* Module number error */ 00337 /***********************/ 00338 00339 DPRINTK("Module number error\n"); 00340 i_ReturnValue = -2; 00341 } 00342 00343 return (i_ReturnValue); 00344 } 00345 00346 /* 00347 +----------------------------------------------------------------------------+ 00348 | INPUT FUNCTIONS | 00349 +----------------------------------------------------------------------------+ 00350 */ 00351 00352 /* 00353 +----------------------------------------------------------------------------+ 00354 | Function Name : _INT_ i_APCI1710_ReadTTLIOChannelValue | 00355 | (BYTE_ b_BoardHandle, | 00356 | BYTE_ b_ModulNbr, | 00357 | BYTE_ b_SelectedPort, | 00358 | BYTE_ b_InputChannel, | 00359 | PBYTE_ pb_ChannelStatus) | 00360 +----------------------------------------------------------------------------+ 00361 | Task : Read the status from selected TTL digital input | 00362 | (b_InputChannel) 00363 +----------------------------------------------------------------------------+ 00364 | Task : Read the status from digital input port | 00365 | (b_SelectedPort) from selected TTL module (b_ModulNbr) | 00366 +----------------------------------------------------------------------------+ 00367 00368 +----------------------------------------------------------------------------+ 00369 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710| 00370 | BYTE_ b_ModulNbr : Module number to | 00371 | configure (0 to 7) | 00372 | BYTE_ b_SelectedPort, : Selection from TTL I/O | 00373 | port (0 to 2) | 00374 | 0 : Port A selection | 00375 | 1 : Port B selection | 00376 | 2 : Port C selection | 00377 | 3 : Port D selection | 00378 | BYTE_ b_InputChannel : Selection from digital | 00379 | input ( 0 to 2) 00380 APCI1710_TTL_READCHANNEL 00381 b_ModulNbr = CR_AREF(insn->chanspec); 00382 b_SelectedPort= CR_RANGE(insn->chanspec); 00383 b_InputChannel= CR_CHAN(insn->chanspec); 00384 b_ReadType = (BYTE) data[0]; 00385 00386 APCI1710_TTL_READPORT| 00387 b_ModulNbr = CR_AREF(insn->chanspec); 00388 b_SelectedPort= CR_RANGE(insn->chanspec); 00389 b_ReadType = (BYTE) data[0]; 00390 00391 +----------------------------------------------------------------------------+ 00392 | Output Parameters : data[0] 00393 00394 PBYTE_ pb_ChannelStatus : Digital input channel | 00395 | status | 00396 | 0 : Channle is not active| 00397 | 1 : Channle is active | 00398 +----------------------------------------------------------------------------+ 00399 | Return Value : 0: No error | 00400 | -1: The handle parameter of the board is wrong | 00401 | -2: The module parameter is wrong | 00402 | -3: The module is not a TTL module | 00403 | -4: The selected TTL input port is wrong | 00404 | -5: The selected TTL digital input is wrong | 00405 | -6: TTL I/O not initialised | 00406 +----------------------------------------------------------------------------+ 00407 */ 00408 00409 INT i_APCI1710_InsnBitsReadTTLIO(comedi_device * dev, comedi_subdevice * s, 00410 comedi_insn * insn, lsampl_t * data) 00411 { 00412 INT i_ReturnValue = 0; 00413 DWORD dw_StatusReg; 00414 BYTE b_ModulNbr; 00415 BYTE b_SelectedPort; 00416 BYTE b_InputChannel; 00417 BYTE b_ReadType; 00418 PBYTE pb_ChannelStatus; 00419 PBYTE pb_PortValue; 00420 00421 i_ReturnValue = insn->n; 00422 b_ReadType = (BYTE) data[0]; 00423 b_ModulNbr = CR_AREF(insn->chanspec); 00424 b_SelectedPort = CR_RANGE(insn->chanspec); 00425 b_InputChannel = CR_CHAN(insn->chanspec); 00426 00427 /**************************/ 00428 /* Test the module number */ 00429 /**************************/ 00430 00431 if (b_ModulNbr < 4) { 00432 /**************************/ 00433 /* Test if TTL I/O module */ 00434 /**************************/ 00435 00436 if ((devpriv->s_BoardInfos. 00437 dw_MolduleConfiguration[b_ModulNbr] & 00438 0xFFFF0000UL) == APCI1710_TTL_IO) { 00439 switch (b_ReadType) { 00440 00441 case APCI1710_TTL_READCHANNEL: 00442 pb_ChannelStatus = (PBYTE) & data[0]; 00443 /********************************/ 00444 /* Test the TTL I/O port number */ 00445 /********************************/ 00446 00447 if (((b_SelectedPort <= 2) 00448 && ((devpriv->s_BoardInfos. 00449 dw_MolduleConfiguration 00450 [b_ModulNbr] & 00451 0xFFFF) == 00452 0x3130)) 00453 || ((b_SelectedPort <= 3) 00454 && ((devpriv->s_BoardInfos. 00455 dw_MolduleConfiguration 00456 [b_ModulNbr] & 00457 0xFFFF) >= 00458 0x3230))) { 00459 /******************************************/ 00460 /* Test the digital imnput channel number */ 00461 /******************************************/ 00462 00463 if (((b_InputChannel <= 7) 00464 && (b_SelectedPort < 3)) 00465 || ((b_InputChannel <= 1) 00466 && (b_SelectedPort == 00467 3))) { 00468 /******************************************/ 00469 /* Test if the TTL I/O module initialised */ 00470 /******************************************/ 00471 00472 if (devpriv-> 00473 s_ModuleInfo 00474 [b_ModulNbr]. 00475 s_TTLIOInfo.b_TTLInit == 00476 1) { 00477 /***********************************/ 00478 /* Test if TTL port used for input */ 00479 /***********************************/ 00480 00481 if (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) == 0x3130) || (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3230) && (devpriv->s_ModuleInfo[b_ModulNbr].s_TTLIOInfo.b_PortConfiguration[b_SelectedPort] == 0))) { 00482 /**************************/ 00483 /* Read all digital input */ 00484 /**************************/ 00485 00486 dw_StatusReg = 00487 inl 00488 (devpriv-> 00489 s_BoardInfos. 00490 ui_Address 00491 + 00492 (64 * b_ModulNbr)); 00493 00494 *pb_ChannelStatus 00495 = 00496 (BYTE) ( 00497 (dw_StatusReg 00498 >> 00499 (8 * b_SelectedPort)) >> b_InputChannel) & 1; 00500 } else { 00501 /*******************************/ 00502 /* Selected TTL I/O port error */ 00503 /*******************************/ 00504 00505 DPRINTK("Selected TTL I/O port error\n"); 00506 i_ReturnValue = 00507 -4; 00508 } 00509 } else { 00510 /***************************/ 00511 /* TTL I/O not initialised */ 00512 /***************************/ 00513 00514 DPRINTK("TTL I/O not initialised\n"); 00515 i_ReturnValue = -6; 00516 } 00517 } else { 00518 /********************************/ 00519 /* Selected digital input error */ 00520 /********************************/ 00521 00522 DPRINTK("Selected digital input error\n"); 00523 i_ReturnValue = -5; 00524 } 00525 } else { 00526 /*******************************/ 00527 /* Selected TTL I/O port error */ 00528 /*******************************/ 00529 00530 DPRINTK("Selected TTL I/O port error\n"); 00531 i_ReturnValue = -4; 00532 } 00533 break; 00534 00535 case APCI1710_TTL_READPORT: 00536 pb_PortValue = (PBYTE) & data[0]; 00537 /********************************/ 00538 /* Test the TTL I/O port number */ 00539 /********************************/ 00540 00541 if (((b_SelectedPort <= 2) 00542 && ((devpriv->s_BoardInfos. 00543 dw_MolduleConfiguration 00544 [b_ModulNbr] & 00545 0xFFFF) == 00546 0x3130)) 00547 || ((b_SelectedPort <= 3) 00548 && ((devpriv->s_BoardInfos. 00549 dw_MolduleConfiguration 00550 [b_ModulNbr] & 00551 0xFFFF) >= 00552 0x3230))) { 00553 /******************************************/ 00554 /* Test if the TTL I/O module initialised */ 00555 /******************************************/ 00556 00557 if (devpriv->s_ModuleInfo[b_ModulNbr]. 00558 s_TTLIOInfo.b_TTLInit == 1) { 00559 /***********************************/ 00560 /* Test if TTL port used for input */ 00561 /***********************************/ 00562 00563 if (((devpriv->s_BoardInfos. 00564 dw_MolduleConfiguration 00565 [b_ModulNbr] 00566 & 00567 0xFFFF) 00568 == 0x3130) 00569 || (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3230) && (devpriv->s_ModuleInfo[b_ModulNbr].s_TTLIOInfo.b_PortConfiguration[b_SelectedPort] == 0))) { 00570 /**************************/ 00571 /* Read all digital input */ 00572 /**************************/ 00573 00574 dw_StatusReg = 00575 inl(devpriv-> 00576 s_BoardInfos. 00577 ui_Address + 00578 (64 * b_ModulNbr)); 00579 00580 *pb_PortValue = 00581 (BYTE) ( 00582 (dw_StatusReg >> 00583 (8 * b_SelectedPort)) & 0xFF); 00584 } else { 00585 /*******************************/ 00586 /* Selected TTL I/O port error */ 00587 /*******************************/ 00588 00589 DPRINTK("Selected TTL I/O port error\n"); 00590 i_ReturnValue = -4; 00591 } 00592 } else { 00593 /***************************/ 00594 /* TTL I/O not initialised */ 00595 /***************************/ 00596 00597 DPRINTK("TTL I/O not initialised\n"); 00598 i_ReturnValue = -5; 00599 } 00600 } else { 00601 /*******************************/ 00602 /* Selected TTL I/O port error */ 00603 /*******************************/ 00604 00605 DPRINTK("Selected TTL I/O port error\n"); 00606 i_ReturnValue = -4; 00607 } 00608 break; 00609 00610 default: 00611 printk("Bad ReadType\n"); 00612 00613 } //End Switch 00614 } else { 00615 /**********************************/ 00616 /* The module is not a TTL module */ 00617 /**********************************/ 00618 00619 DPRINTK("The module is not a TTL module\n"); 00620 i_ReturnValue = -3; 00621 } 00622 } else { 00623 /***********************/ 00624 /* Module number error */ 00625 /***********************/ 00626 00627 DPRINTK("Module number error\n"); 00628 i_ReturnValue = -2; 00629 } 00630 00631 return (i_ReturnValue); 00632 } 00633 00634 /* 00635 +----------------------------------------------------------------------------+ 00636 | Function Name : INT i_APCI1710_InsnReadTTLIOAllPortValue(comedi_device 00637 *dev,comedi_subdevice *s,comedi_insn *insn,lsampl_t *data) | 00638 +----------------------------------------------------------------------------+ 00639 | Task : Read the status from all digital input ports | 00640 | (port A, port B and port C) from selected TTL | 00641 | module (b_ModulNbr) | 00642 +----------------------------------------------------------------------------+ 00643 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710| 00644 | BYTE_ b_ModulNbr : Module number to | 00645 | configure (0 to 3) | 00646 +----------------------------------------------------------------------------+ 00647 | Output Parameters : PULONG_ pul_PortValue : Digital TTL inputs port | 00648 | status | 00649 +----------------------------------------------------------------------------+ 00650 | Return Value : 0: No error | 00651 | -1: The handle parameter of the board is wrong | 00652 | -2: The module parameter is wrong | 00653 | -3: The module is not a TTL module | 00654 | -4: TTL I/O not initialised | 00655 +----------------------------------------------------------------------------+ 00656 */ 00657 00658 INT i_APCI1710_InsnReadTTLIOAllPortValue(comedi_device * dev, 00659 comedi_subdevice * s, comedi_insn * insn, lsampl_t * data) 00660 { 00661 INT i_ReturnValue = 0; 00662 DWORD dw_StatusReg; 00663 BYTE b_ModulNbr; 00664 PULONG pul_PortValue; 00665 00666 b_ModulNbr = (BYTE) CR_AREF(insn->chanspec); 00667 i_ReturnValue = insn->n; 00668 pul_PortValue = (PULONG) & data[0]; 00669 00670 /**************************/ 00671 /* Test the module number */ 00672 /**************************/ 00673 00674 if (b_ModulNbr < 4) { 00675 /**************************/ 00676 /* Test if TTL I/O module */ 00677 /**************************/ 00678 00679 if ((devpriv->s_BoardInfos. 00680 dw_MolduleConfiguration[b_ModulNbr] & 00681 0xFFFF0000UL) == APCI1710_TTL_IO) { 00682 /******************************************/ 00683 /* Test if the TTL I/O module initialised */ 00684 /******************************************/ 00685 00686 if (devpriv-> 00687 s_ModuleInfo[b_ModulNbr]. 00688 s_TTLIOInfo.b_TTLInit == 1) { 00689 /**************************/ 00690 /* Read all digital input */ 00691 /**************************/ 00692 00693 dw_StatusReg = inl(devpriv->s_BoardInfos. 00694 ui_Address + (64 * b_ModulNbr)); 00695 00696 /**********************/ 00697 /* Test if TTL Rev1.0 */ 00698 /**********************/ 00699 00700 if ((devpriv->s_BoardInfos. 00701 dw_MolduleConfiguration 00702 [b_ModulNbr] & 0xFFFF) == 00703 0x3130) { 00704 *pul_PortValue = 00705 dw_StatusReg & 0xFFFFFFUL; 00706 } else { 00707 /**************************************/ 00708 /* Test if port A not used for output */ 00709 /**************************************/ 00710 00711 if (devpriv->s_ModuleInfo[b_ModulNbr]. 00712 s_TTLIOInfo. 00713 b_PortConfiguration[0] == 1) { 00714 *pul_PortValue = 00715 dw_StatusReg & 00716 0x3FFFF00UL; 00717 } 00718 00719 /**************************************/ 00720 /* Test if port B not used for output */ 00721 /**************************************/ 00722 00723 if (devpriv-> 00724 s_ModuleInfo[b_ModulNbr]. 00725 s_TTLIOInfo. 00726 b_PortConfiguration[1] == 1) { 00727 *pul_PortValue = 00728 dw_StatusReg & 00729 0x3FF00FFUL; 00730 } 00731 00732 /**************************************/ 00733 /* Test if port C not used for output */ 00734 /**************************************/ 00735 00736 if (devpriv-> 00737 s_ModuleInfo[b_ModulNbr]. 00738 s_TTLIOInfo. 00739 b_PortConfiguration[2] == 1) { 00740 *pul_PortValue = 00741 dw_StatusReg & 00742 0x300FFFFUL; 00743 } 00744 00745 /**************************************/ 00746 /* Test if port D not used for output */ 00747 /**************************************/ 00748 00749 if (devpriv-> 00750 s_ModuleInfo[b_ModulNbr]. 00751 s_TTLIOInfo. 00752 b_PortConfiguration[3] == 1) { 00753 *pul_PortValue = 00754 dw_StatusReg & 00755 0xFFFFFFUL; 00756 } 00757 } 00758 } else { 00759 /***************************/ 00760 /* TTL I/O not initialised */ 00761 /***************************/ 00762 DPRINTK("TTL I/O not initialised\n"); 00763 i_ReturnValue = -5; 00764 } 00765 } else { 00766 /**********************************/ 00767 /* The module is not a TTL module */ 00768 /**********************************/ 00769 DPRINTK("The module is not a TTL module\n"); 00770 i_ReturnValue = -3; 00771 } 00772 } else { 00773 /***********************/ 00774 /* Module number error */ 00775 /***********************/ 00776 DPRINTK("Module number error\n"); 00777 i_ReturnValue = -2; 00778 } 00779 00780 return (i_ReturnValue); 00781 } 00782 00783 /* 00784 +----------------------------------------------------------------------------+ 00785 | OUTPUT FUNCTIONS | 00786 +----------------------------------------------------------------------------+ 00787 */ 00788 00789 /* 00790 +----------------------------------------------------------------------------+ 00791 | Function Name : _INT_ i_APCI1710_SetTTLIOChlOn | 00792 | (BYTE_ b_BoardHandle, | 00793 | BYTE_ b_ModulNbr, | 00794 | BYTE_ b_OutputChannel) 00795 INT i_APCI1710_InsnWriteSetTTLIOChlOnOff(comedi_device *dev,comedi_subdevice *s, 00796 comedi_insn *insn,lsampl_t *data) | 00797 +----------------------------------------------------------------------------+ 00798 | Task : Sets or resets the output witch has been passed with the | 00799 | parameter b_Channel. Setting an output means setting | 00800 | an ouput high. | 00801 +----------------------------------------------------------------------------+ 00802 | Input Parameters : BYTE_ b_BoardHandle : Handle of board APCI-1710 | 00803 | BYTE_ b_ModulNbr : Selected module number (0 to 3)| 00804 | BYTE_ b_OutputChannel : Selection from digital output | 00805 | channel (0 or 1) | 00806 | 0 : PD0 | 00807 | 1 : PD1 | 00808 | 2 to 9 : PA | 00809 | 10 to 17: PB | 00810 | 18 to 25: PC | 00811 00812 b_ModulNbr = CR_AREF(insn->chanspec); 00813 b_OutputChannel= CR_CHAN(insn->chanspec); 00814 ui_State = data[0]; // ON or OFF 00815 +----------------------------------------------------------------------------+ 00816 | Output Parameters : - | 00817 +----------------------------------------------------------------------------+ 00818 | Return Value : 0: No error | 00819 | -1: The handle parameter of the board is wrong | 00820 | -2: The module parameter is wrong | 00821 | -3: The module is not a TTL I/O module | 00822 | -4: The selected digital output is wrong | 00823 | -5: TTL I/O not initialised see function | 00824 | " i_APCI1710_InitTTLIO" 00825 +----------------------------------------------------------------------------+ 00826 */ 00827 00828 INT i_APCI1710_InsnWriteSetTTLIOChlOnOff(comedi_device * dev, 00829 comedi_subdevice * s, comedi_insn * insn, lsampl_t * data) 00830 { 00831 INT i_ReturnValue = 0; 00832 DWORD dw_StatusReg = 0; 00833 BYTE b_ModulNbr; 00834 BYTE b_OutputChannel; 00835 UINT ui_State; 00836 00837 i_ReturnValue = insn->n; 00838 b_ModulNbr = CR_AREF(insn->chanspec); 00839 b_OutputChannel = CR_CHAN(insn->chanspec); 00840 ui_State = data[0]; // ON or OFF 00841 00842 /**************************/ 00843 /* Test the module number */ 00844 /**************************/ 00845 00846 if (b_ModulNbr < 4) { 00847 /**************************/ 00848 /* Test if TTL I/O module */ 00849 /**************************/ 00850 00851 if ((devpriv->s_BoardInfos. 00852 dw_MolduleConfiguration[b_ModulNbr] & 00853 0xFFFF0000UL) == APCI1710_TTL_IO) { 00854 /******************************************/ 00855 /* Test if the TTL I/O module initialised */ 00856 /******************************************/ 00857 00858 if (devpriv->s_ModuleInfo[b_ModulNbr]. 00859 s_TTLIOInfo.b_TTLInit == 1) { 00860 /***********************************/ 00861 /* Test the TTL I/O channel number */ 00862 /***********************************/ 00863 00864 if (((b_OutputChannel <= 1) 00865 && ((devpriv->s_BoardInfos. 00866 dw_MolduleConfiguration 00867 [b_ModulNbr] & 00868 0xFFFF) == 00869 0x3130)) 00870 || ((b_OutputChannel <= 25) 00871 && ((devpriv->s_BoardInfos. 00872 dw_MolduleConfiguration 00873 [b_ModulNbr] & 00874 0xFFFF) >= 00875 0x3230))) { 00876 /****************************************************/ 00877 /* Test if the selected channel is a output channel */ 00878 /****************************************************/ 00879 00880 if (((b_OutputChannel <= 1) 00881 && (devpriv-> 00882 s_ModuleInfo 00883 [b_ModulNbr]. 00884 s_TTLIOInfo. 00885 b_PortConfiguration 00886 [3] == 1)) 00887 || ((b_OutputChannel >= 2) 00888 && (b_OutputChannel <= 00889 9) 00890 && (devpriv-> 00891 s_ModuleInfo 00892 [b_ModulNbr]. 00893 s_TTLIOInfo. 00894 b_PortConfiguration 00895 [0] == 1)) 00896 || ((b_OutputChannel >= 10) 00897 && (b_OutputChannel <= 00898 17) 00899 && (devpriv-> 00900 s_ModuleInfo 00901 [b_ModulNbr]. 00902 s_TTLIOInfo. 00903 b_PortConfiguration 00904 [1] == 1)) 00905 || ((b_OutputChannel >= 18) 00906 && (b_OutputChannel <= 00907 25) 00908 && (devpriv-> 00909 s_ModuleInfo 00910 [b_ModulNbr]. 00911 s_TTLIOInfo. 00912 b_PortConfiguration 00913 [2] == 1))) { 00914 /************************/ 00915 /* Test if PD0 selected */ 00916 /************************/ 00917 00918 if (b_OutputChannel == 0) { 00919 00920 outl(ui_State, 00921 devpriv-> 00922 s_BoardInfos. 00923 ui_Address + 00924 (64 * b_ModulNbr)); 00925 } else { 00926 /************************/ 00927 /* Test if PD1 selected */ 00928 /************************/ 00929 00930 if (b_OutputChannel == 00931 1) { 00932 00933 outl(ui_State, 00934 devpriv-> 00935 s_BoardInfos. 00936 ui_Address 00937 + 4 + 00938 (64 * b_ModulNbr)); 00939 } else { 00940 b_OutputChannel 00941 = 00942 b_OutputChannel 00943 - 2; 00944 00945 /********************/ 00946 /* Read all channel */ 00947 /********************/ 00948 00949 dw_StatusReg = 00950 inl 00951 (devpriv-> 00952 s_BoardInfos. 00953 ui_Address 00954 + 00955 (64 * b_ModulNbr)); 00956 if (ui_State) // ON 00957 { 00958 dw_StatusReg 00959 = 00960 (dw_StatusReg 00961 >> 00962 ((b_OutputChannel / 8) * 8)) & 0xFF; 00963 dw_StatusReg 00964 = 00965 dw_StatusReg 00966 | 00967 (1 00968 << 00969 (b_OutputChannel 00970 % 00971 8)); 00972 } else // Off 00973 { 00974 dw_StatusReg 00975 = 00976 (dw_StatusReg 00977 >> 00978 ((b_OutputChannel / 8) * 8)) & 0xFF; 00979 dw_StatusReg 00980 = 00981 dw_StatusReg 00982 & 00983 (0xFF 00984 - 00985 (1 << (b_OutputChannel % 8))); 00986 00987 } 00988 00989 /****************************/ 00990 /* Set the new output value */ 00991 /****************************/ 00992 00993 outl(dw_StatusReg, devpriv->s_BoardInfos.ui_Address + 8 + ((b_OutputChannel / 8) * 4) + (64 * b_ModulNbr)); 00994 } 00995 } 00996 } else { 00997 /************************************/ 00998 /* The selected TTL output is wrong */ 00999 /************************************/ 01000 01001 DPRINTK(" The selected TTL output is wrong\n"); 01002 i_ReturnValue = -4; 01003 } 01004 } else { 01005 /************************************/ 01006 /* The selected TTL output is wrong */ 01007 /************************************/ 01008 01009 DPRINTK("The selected TTL output is wrong\n"); 01010 i_ReturnValue = -4; 01011 } 01012 } else { 01013 /***************************/ 01014 /* TTL I/O not initialised */ 01015 /***************************/ 01016 01017 DPRINTK("TTL I/O not initialised\n"); 01018 i_ReturnValue = -5; 01019 } 01020 } else { 01021 /**************************************/ 01022 /* The module is not a TTL I/O module */ 01023 /**************************************/ 01024 01025 DPRINTK("The module is not a TTL I/O module\n"); 01026 i_ReturnValue = -3; 01027 } 01028 } else { 01029 /***********************/ 01030 /* Module number error */ 01031 /***********************/ 01032 01033 DPRINTK("Module number error\n"); 01034 i_ReturnValue = -2; 01035 } 01036 01037 return (i_ReturnValue); 01038 }