/drivers/staging/comedi/drivers/addi-data/APCI1710_Ttl.c

https://bitbucket.org/cyanogenmod/android_kernel_asus_tf300t · C · 1038 lines · 495 code · 121 blank · 422 comment · 119 complexity · 5b563b21044bb610b3e985c0c223daa2 MD5 · raw file

  1. /**
  2. @verbatim
  3. Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
  4. ADDI-DATA GmbH
  5. Dieselstrasse 3
  6. D-77833 Ottersweier
  7. Tel: +19(0)7223/9493-0
  8. Fax: +49(0)7223/9493-92
  9. http://www.addi-data.com
  10. info@addi-data.com
  11. 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.
  12. 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.
  13. 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
  14. You should also find the complete GPL in the COPYING file accompanying this source code.
  15. @endverbatim
  16. */
  17. /*
  18. +-----------------------------------------------------------------------+
  19. | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
  20. +-----------------------------------------------------------------------+
  21. | Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
  22. | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
  23. +-----------------------------------------------------------------------+
  24. | Project : API APCI1710 | Compiler : gcc |
  25. | Module name : TTL.C | Version : 2.96 |
  26. +-------------------------------+---------------------------------------+
  27. | Project manager: Eric Stolz | Date : 02/12/2002 |
  28. +-----------------------------------------------------------------------+
  29. | Description : APCI-1710 TTL I/O module |
  30. | |
  31. | |
  32. +-----------------------------------------------------------------------+
  33. | UPDATES |
  34. +-----------------------------------------------------------------------+
  35. | Date | Author | Description of updates |
  36. +----------+-----------+------------------------------------------------+
  37. | 13/05/98 | S. Weber | TTL digital input / output implementation |
  38. |----------|-----------|------------------------------------------------|
  39. | 08/05/00 | Guinot C | - 0400/0228 All Function in RING 0 |
  40. | | | available |
  41. +-----------------------------------------------------------------------+
  42. | | | |
  43. | | | |
  44. +-----------------------------------------------------------------------+
  45. */
  46. /*
  47. +----------------------------------------------------------------------------+
  48. | Included files |
  49. +----------------------------------------------------------------------------+
  50. */
  51. #include "APCI1710_Ttl.h"
  52. /*
  53. +----------------------------------------------------------------------------+
  54. | Function Name : _INT_ i_APCI1710_InitTTLIODirection |
  55. | (unsigned char_ b_BoardHandle, |
  56. | unsigned char_ b_ModulNbr, |
  57. | unsigned char_ b_PortAMode, |
  58. | unsigned char_ b_PortBMode, |
  59. | unsigned char_ b_PortCMode, |
  60. | unsigned char_ b_PortDMode) |
  61. +----------------------------------------------------------------------------+
  62. | Task APCI1710_TTL_INIT (using defaults) : Configure the TTL I/O operating mode from selected |
  63. | module (b_ModulNbr). You must calling this function be|
  64. | for you call any other function witch access of TTL. |
  65. APCI1710_TTL_INITDIRECTION(user inputs for direction)
  66. +----------------------------------------------------------------------------+
  67. | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710|
  68. | unsigned char_ b_ModulNbr : Module number to |
  69. | configure (0 to 3)
  70. b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
  71. b_InitType = (unsigned char) data[0];
  72. b_PortAMode = (unsigned char) data[1];
  73. b_PortBMode = (unsigned char) data[2];
  74. b_PortCMode = (unsigned char) data[3];
  75. b_PortDMode = (unsigned char) data[4];|
  76. +----------------------------------------------------------------------------+
  77. | Output Parameters : - |
  78. +----------------------------------------------------------------------------+
  79. | Return Value : 0: No error |
  80. | -1: The handle parameter of the board is wrong |
  81. | -2: The module parameter is wrong |
  82. | -3: The module is not a TTL module |
  83. | -4: Function not available for this version |
  84. | -5: Port A mode selection is wrong |
  85. | -6: Port B mode selection is wrong |
  86. | -7: Port C mode selection is wrong |
  87. | -8: Port D mode selection is wrong |
  88. +----------------------------------------------------------------------------+
  89. */
  90. int i_APCI1710_InsnConfigInitTTLIO(struct comedi_device *dev, struct comedi_subdevice *s,
  91. struct comedi_insn *insn, unsigned int *data)
  92. {
  93. int i_ReturnValue = 0;
  94. unsigned char b_ModulNbr;
  95. unsigned char b_InitType;
  96. unsigned char b_PortAMode;
  97. unsigned char b_PortBMode;
  98. unsigned char b_PortCMode;
  99. unsigned char b_PortDMode;
  100. b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
  101. b_InitType = (unsigned char) data[0];
  102. i_ReturnValue = insn->n;
  103. /**************************/
  104. /* Test the module number */
  105. /**************************/
  106. if (b_ModulNbr < 4) {
  107. /**************************/
  108. /* Test if TTL I/O module */
  109. /**************************/
  110. if ((devpriv->s_BoardInfos.
  111. dw_MolduleConfiguration[b_ModulNbr] &
  112. 0xFFFF0000UL) == APCI1710_TTL_IO) {
  113. switch (b_InitType) {
  114. case APCI1710_TTL_INIT:
  115. devpriv->s_ModuleInfo[b_ModulNbr].
  116. s_TTLIOInfo.b_TTLInit = 1;
  117. /***************************/
  118. /* Set TTL port A to input */
  119. /***************************/
  120. devpriv->s_ModuleInfo[b_ModulNbr].
  121. s_TTLIOInfo.b_PortConfiguration[0] = 0;
  122. /***************************/
  123. /* Set TTL port B to input */
  124. /***************************/
  125. devpriv->s_ModuleInfo[b_ModulNbr].
  126. s_TTLIOInfo.b_PortConfiguration[1] = 0;
  127. /***************************/
  128. /* Set TTL port C to input */
  129. /***************************/
  130. devpriv->s_ModuleInfo[b_ModulNbr].
  131. s_TTLIOInfo.b_PortConfiguration[2] = 0;
  132. /****************************/
  133. /* Set TTL port D to output */
  134. /****************************/
  135. devpriv->s_ModuleInfo[b_ModulNbr].
  136. s_TTLIOInfo.b_PortConfiguration[3] = 1;
  137. /*************************/
  138. /* Set the configuration */
  139. /*************************/
  140. outl(0x8,
  141. devpriv->s_BoardInfos.ui_Address + 20 +
  142. (64 * b_ModulNbr));
  143. break;
  144. case APCI1710_TTL_INITDIRECTION:
  145. b_PortAMode = (unsigned char) data[1];
  146. b_PortBMode = (unsigned char) data[2];
  147. b_PortCMode = (unsigned char) data[3];
  148. b_PortDMode = (unsigned char) data[4];
  149. /********************/
  150. /* Test the version */
  151. /********************/
  152. if ((devpriv->s_BoardInfos.
  153. dw_MolduleConfiguration
  154. [b_ModulNbr] & 0xFFFF) >=
  155. 0x3230) {
  156. /************************/
  157. /* Test the port A mode */
  158. /************************/
  159. if ((b_PortAMode == 0)
  160. || (b_PortAMode == 1)) {
  161. /************************/
  162. /* Test the port B mode */
  163. /************************/
  164. if ((b_PortBMode == 0)
  165. || (b_PortBMode == 1)) {
  166. /************************/
  167. /* Test the port C mode */
  168. /************************/
  169. if ((b_PortCMode == 0)
  170. || (b_PortCMode
  171. == 1)) {
  172. /************************/
  173. /* Test the port D mode */
  174. /************************/
  175. if ((b_PortDMode == 0) || (b_PortDMode == 1)) {
  176. devpriv->
  177. s_ModuleInfo
  178. [b_ModulNbr].
  179. s_TTLIOInfo.
  180. b_TTLInit
  181. =
  182. 1;
  183. /***********************/
  184. /* Set TTL port A mode */
  185. /***********************/
  186. devpriv->
  187. s_ModuleInfo
  188. [b_ModulNbr].
  189. s_TTLIOInfo.
  190. b_PortConfiguration
  191. [0]
  192. =
  193. b_PortAMode;
  194. /***********************/
  195. /* Set TTL port B mode */
  196. /***********************/
  197. devpriv->
  198. s_ModuleInfo
  199. [b_ModulNbr].
  200. s_TTLIOInfo.
  201. b_PortConfiguration
  202. [1]
  203. =
  204. b_PortBMode;
  205. /***********************/
  206. /* Set TTL port C mode */
  207. /***********************/
  208. devpriv->
  209. s_ModuleInfo
  210. [b_ModulNbr].
  211. s_TTLIOInfo.
  212. b_PortConfiguration
  213. [2]
  214. =
  215. b_PortCMode;
  216. /***********************/
  217. /* Set TTL port D mode */
  218. /***********************/
  219. devpriv->
  220. s_ModuleInfo
  221. [b_ModulNbr].
  222. s_TTLIOInfo.
  223. b_PortConfiguration
  224. [3]
  225. =
  226. b_PortDMode;
  227. /*************************/
  228. /* Set the configuration */
  229. /*************************/
  230. outl((b_PortAMode << 0) | (b_PortBMode << 1) | (b_PortCMode << 2) | (b_PortDMode << 3), devpriv->s_BoardInfos.ui_Address + 20 + (64 * b_ModulNbr));
  231. } else {
  232. /**********************************/
  233. /* Port D mode selection is wrong */
  234. /**********************************/
  235. DPRINTK("Port D mode selection is wrong\n");
  236. i_ReturnValue
  237. =
  238. -8;
  239. }
  240. } else {
  241. /**********************************/
  242. /* Port C mode selection is wrong */
  243. /**********************************/
  244. DPRINTK("Port C mode selection is wrong\n");
  245. i_ReturnValue =
  246. -7;
  247. }
  248. } else {
  249. /**********************************/
  250. /* Port B mode selection is wrong */
  251. /**********************************/
  252. DPRINTK("Port B mode selection is wrong\n");
  253. i_ReturnValue = -6;
  254. }
  255. } else {
  256. /**********************************/
  257. /* Port A mode selection is wrong */
  258. /**********************************/
  259. DPRINTK("Port A mode selection is wrong\n");
  260. i_ReturnValue = -5;
  261. }
  262. } else {
  263. /*******************************************/
  264. /* Function not available for this version */
  265. /*******************************************/
  266. DPRINTK("Function not available for this version\n");
  267. i_ReturnValue = -4;
  268. }
  269. break;
  270. DPRINTK("\n");
  271. default:
  272. printk("Bad Config Type\n");
  273. } /* switch end */
  274. } else {
  275. /**********************************/
  276. /* The module is not a TTL module */
  277. /**********************************/
  278. DPRINTK("The module is not a TTL module\n");
  279. i_ReturnValue = -3;
  280. }
  281. } else {
  282. /***********************/
  283. /* Module number error */
  284. /***********************/
  285. DPRINTK("Module number error\n");
  286. i_ReturnValue = -2;
  287. }
  288. return i_ReturnValue;
  289. }
  290. /*
  291. +----------------------------------------------------------------------------+
  292. | INPUT FUNCTIONS |
  293. +----------------------------------------------------------------------------+
  294. */
  295. /*
  296. +----------------------------------------------------------------------------+
  297. | Function Name : _INT_ i_APCI1710_ReadTTLIOChannelValue |
  298. | (unsigned char_ b_BoardHandle, |
  299. | unsigned char_ b_ModulNbr, |
  300. | unsigned char_ b_SelectedPort, |
  301. | unsigned char_ b_InputChannel, |
  302. | unsigned char *_ pb_ChannelStatus) |
  303. +----------------------------------------------------------------------------+
  304. | Task : Read the status from selected TTL digital input |
  305. | (b_InputChannel)
  306. +----------------------------------------------------------------------------+
  307. | Task : Read the status from digital input port |
  308. | (b_SelectedPort) from selected TTL module (b_ModulNbr) |
  309. +----------------------------------------------------------------------------+
  310. +----------------------------------------------------------------------------+
  311. | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710|
  312. | unsigned char_ b_ModulNbr : Module number to |
  313. | configure (0 to 7) |
  314. | unsigned char_ b_SelectedPort, : Selection from TTL I/O |
  315. | port (0 to 2) |
  316. | 0 : Port A selection |
  317. | 1 : Port B selection |
  318. | 2 : Port C selection |
  319. | 3 : Port D selection |
  320. | unsigned char_ b_InputChannel : Selection from digital |
  321. | input ( 0 to 2)
  322. APCI1710_TTL_READCHANNEL
  323. b_ModulNbr = CR_AREF(insn->chanspec);
  324. b_SelectedPort= CR_RANGE(insn->chanspec);
  325. b_InputChannel= CR_CHAN(insn->chanspec);
  326. b_ReadType = (unsigned char) data[0];
  327. APCI1710_TTL_READPORT|
  328. b_ModulNbr = CR_AREF(insn->chanspec);
  329. b_SelectedPort= CR_RANGE(insn->chanspec);
  330. b_ReadType = (unsigned char) data[0];
  331. +----------------------------------------------------------------------------+
  332. | Output Parameters : data[0]
  333. unsigned char *_ pb_ChannelStatus : Digital input channel |
  334. | status |
  335. | 0 : Channle is not active|
  336. | 1 : Channle is active |
  337. +----------------------------------------------------------------------------+
  338. | Return Value : 0: No error |
  339. | -1: The handle parameter of the board is wrong |
  340. | -2: The module parameter is wrong |
  341. | -3: The module is not a TTL module |
  342. | -4: The selected TTL input port is wrong |
  343. | -5: The selected TTL digital input is wrong |
  344. | -6: TTL I/O not initialised |
  345. +----------------------------------------------------------------------------+
  346. */
  347. int i_APCI1710_InsnBitsReadTTLIO(struct comedi_device *dev, struct comedi_subdevice *s,
  348. struct comedi_insn *insn, unsigned int *data)
  349. {
  350. int i_ReturnValue = 0;
  351. unsigned int dw_StatusReg;
  352. unsigned char b_ModulNbr;
  353. unsigned char b_SelectedPort;
  354. unsigned char b_InputChannel;
  355. unsigned char b_ReadType;
  356. unsigned char *pb_ChannelStatus;
  357. unsigned char *pb_PortValue;
  358. i_ReturnValue = insn->n;
  359. b_ReadType = (unsigned char) data[0];
  360. b_ModulNbr = CR_AREF(insn->chanspec);
  361. b_SelectedPort = CR_RANGE(insn->chanspec);
  362. b_InputChannel = CR_CHAN(insn->chanspec);
  363. /**************************/
  364. /* Test the module number */
  365. /**************************/
  366. if (b_ModulNbr < 4) {
  367. /**************************/
  368. /* Test if TTL I/O module */
  369. /**************************/
  370. if ((devpriv->s_BoardInfos.
  371. dw_MolduleConfiguration[b_ModulNbr] &
  372. 0xFFFF0000UL) == APCI1710_TTL_IO) {
  373. switch (b_ReadType) {
  374. case APCI1710_TTL_READCHANNEL:
  375. pb_ChannelStatus = (unsigned char *) &data[0];
  376. /********************************/
  377. /* Test the TTL I/O port number */
  378. /********************************/
  379. if (((b_SelectedPort <= 2)
  380. && ((devpriv->s_BoardInfos.
  381. dw_MolduleConfiguration
  382. [b_ModulNbr] &
  383. 0xFFFF) ==
  384. 0x3130))
  385. || ((b_SelectedPort <= 3)
  386. && ((devpriv->s_BoardInfos.
  387. dw_MolduleConfiguration
  388. [b_ModulNbr] &
  389. 0xFFFF) >=
  390. 0x3230))) {
  391. /******************************************/
  392. /* Test the digital imnput channel number */
  393. /******************************************/
  394. if (((b_InputChannel <= 7)
  395. && (b_SelectedPort < 3))
  396. || ((b_InputChannel <= 1)
  397. && (b_SelectedPort ==
  398. 3))) {
  399. /******************************************/
  400. /* Test if the TTL I/O module initialised */
  401. /******************************************/
  402. if (devpriv->
  403. s_ModuleInfo
  404. [b_ModulNbr].
  405. s_TTLIOInfo.b_TTLInit ==
  406. 1) {
  407. /***********************************/
  408. /* Test if TTL port used for input */
  409. /***********************************/
  410. 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))) {
  411. /**************************/
  412. /* Read all digital input */
  413. /**************************/
  414. dw_StatusReg =
  415. inl
  416. (devpriv->
  417. s_BoardInfos.
  418. ui_Address
  419. +
  420. (64 * b_ModulNbr));
  421. *pb_ChannelStatus
  422. =
  423. (unsigned char) (
  424. (dw_StatusReg
  425. >>
  426. (8 * b_SelectedPort)) >> b_InputChannel) & 1;
  427. } else {
  428. /*******************************/
  429. /* Selected TTL I/O port error */
  430. /*******************************/
  431. DPRINTK("Selected TTL I/O port error\n");
  432. i_ReturnValue =
  433. -4;
  434. }
  435. } else {
  436. /***************************/
  437. /* TTL I/O not initialised */
  438. /***************************/
  439. DPRINTK("TTL I/O not initialised\n");
  440. i_ReturnValue = -6;
  441. }
  442. } else {
  443. /********************************/
  444. /* Selected digital input error */
  445. /********************************/
  446. DPRINTK("Selected digital input error\n");
  447. i_ReturnValue = -5;
  448. }
  449. } else {
  450. /*******************************/
  451. /* Selected TTL I/O port error */
  452. /*******************************/
  453. DPRINTK("Selected TTL I/O port error\n");
  454. i_ReturnValue = -4;
  455. }
  456. break;
  457. case APCI1710_TTL_READPORT:
  458. pb_PortValue = (unsigned char *) &data[0];
  459. /********************************/
  460. /* Test the TTL I/O port number */
  461. /********************************/
  462. if (((b_SelectedPort <= 2)
  463. && ((devpriv->s_BoardInfos.
  464. dw_MolduleConfiguration
  465. [b_ModulNbr] &
  466. 0xFFFF) ==
  467. 0x3130))
  468. || ((b_SelectedPort <= 3)
  469. && ((devpriv->s_BoardInfos.
  470. dw_MolduleConfiguration
  471. [b_ModulNbr] &
  472. 0xFFFF) >=
  473. 0x3230))) {
  474. /******************************************/
  475. /* Test if the TTL I/O module initialised */
  476. /******************************************/
  477. if (devpriv->s_ModuleInfo[b_ModulNbr].
  478. s_TTLIOInfo.b_TTLInit == 1) {
  479. /***********************************/
  480. /* Test if TTL port used for input */
  481. /***********************************/
  482. if (((devpriv->s_BoardInfos.
  483. dw_MolduleConfiguration
  484. [b_ModulNbr]
  485. &
  486. 0xFFFF)
  487. == 0x3130)
  488. || (((devpriv->s_BoardInfos.dw_MolduleConfiguration[b_ModulNbr] & 0xFFFF) >= 0x3230) && (devpriv->s_ModuleInfo[b_ModulNbr].s_TTLIOInfo.b_PortConfiguration[b_SelectedPort] == 0))) {
  489. /**************************/
  490. /* Read all digital input */
  491. /**************************/
  492. dw_StatusReg =
  493. inl(devpriv->
  494. s_BoardInfos.
  495. ui_Address +
  496. (64 * b_ModulNbr));
  497. *pb_PortValue =
  498. (unsigned char) (
  499. (dw_StatusReg >>
  500. (8 * b_SelectedPort)) & 0xFF);
  501. } else {
  502. /*******************************/
  503. /* Selected TTL I/O port error */
  504. /*******************************/
  505. DPRINTK("Selected TTL I/O port error\n");
  506. i_ReturnValue = -4;
  507. }
  508. } else {
  509. /***************************/
  510. /* TTL I/O not initialised */
  511. /***************************/
  512. DPRINTK("TTL I/O not initialised\n");
  513. i_ReturnValue = -5;
  514. }
  515. } else {
  516. /*******************************/
  517. /* Selected TTL I/O port error */
  518. /*******************************/
  519. DPRINTK("Selected TTL I/O port error\n");
  520. i_ReturnValue = -4;
  521. }
  522. break;
  523. default:
  524. printk("Bad ReadType\n");
  525. } /* End Switch */
  526. } else {
  527. /**********************************/
  528. /* The module is not a TTL module */
  529. /**********************************/
  530. DPRINTK("The module is not a TTL module\n");
  531. i_ReturnValue = -3;
  532. }
  533. } else {
  534. /***********************/
  535. /* Module number error */
  536. /***********************/
  537. DPRINTK("Module number error\n");
  538. i_ReturnValue = -2;
  539. }
  540. return i_ReturnValue;
  541. }
  542. /*
  543. +----------------------------------------------------------------------------+
  544. | Function Name : int i_APCI1710_InsnReadTTLIOAllPortValue(comedi_device
  545. *dev,struct comedi_subdevice *s,struct comedi_insn *insn,unsigned int *data) |
  546. +----------------------------------------------------------------------------+
  547. | Task : Read the status from all digital input ports |
  548. | (port A, port B and port C) from selected TTL |
  549. | module (b_ModulNbr) |
  550. +----------------------------------------------------------------------------+
  551. | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710|
  552. | unsigned char_ b_ModulNbr : Module number to |
  553. | configure (0 to 3) |
  554. +----------------------------------------------------------------------------+
  555. | Output Parameters : PULONG_ pul_PortValue : Digital TTL inputs port |
  556. | status |
  557. +----------------------------------------------------------------------------+
  558. | Return Value : 0: No error |
  559. | -1: The handle parameter of the board is wrong |
  560. | -2: The module parameter is wrong |
  561. | -3: The module is not a TTL module |
  562. | -4: TTL I/O not initialised |
  563. +----------------------------------------------------------------------------+
  564. */
  565. int i_APCI1710_InsnReadTTLIOAllPortValue(struct comedi_device *dev,
  566. struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
  567. {
  568. int i_ReturnValue = 0;
  569. unsigned int dw_StatusReg;
  570. unsigned char b_ModulNbr;
  571. unsigned int *pul_PortValue;
  572. b_ModulNbr = (unsigned char) CR_AREF(insn->chanspec);
  573. i_ReturnValue = insn->n;
  574. pul_PortValue = (unsigned int *) &data[0];
  575. /**************************/
  576. /* Test the module number */
  577. /**************************/
  578. if (b_ModulNbr < 4) {
  579. /**************************/
  580. /* Test if TTL I/O module */
  581. /**************************/
  582. if ((devpriv->s_BoardInfos.
  583. dw_MolduleConfiguration[b_ModulNbr] &
  584. 0xFFFF0000UL) == APCI1710_TTL_IO) {
  585. /******************************************/
  586. /* Test if the TTL I/O module initialised */
  587. /******************************************/
  588. if (devpriv->
  589. s_ModuleInfo[b_ModulNbr].
  590. s_TTLIOInfo.b_TTLInit == 1) {
  591. /**************************/
  592. /* Read all digital input */
  593. /**************************/
  594. dw_StatusReg = inl(devpriv->s_BoardInfos.
  595. ui_Address + (64 * b_ModulNbr));
  596. /**********************/
  597. /* Test if TTL Rev1.0 */
  598. /**********************/
  599. if ((devpriv->s_BoardInfos.
  600. dw_MolduleConfiguration
  601. [b_ModulNbr] & 0xFFFF) ==
  602. 0x3130) {
  603. *pul_PortValue =
  604. dw_StatusReg & 0xFFFFFFUL;
  605. } else {
  606. /**************************************/
  607. /* Test if port A not used for output */
  608. /**************************************/
  609. if (devpriv->s_ModuleInfo[b_ModulNbr].
  610. s_TTLIOInfo.
  611. b_PortConfiguration[0] == 1) {
  612. *pul_PortValue =
  613. dw_StatusReg &
  614. 0x3FFFF00UL;
  615. }
  616. /**************************************/
  617. /* Test if port B not used for output */
  618. /**************************************/
  619. if (devpriv->
  620. s_ModuleInfo[b_ModulNbr].
  621. s_TTLIOInfo.
  622. b_PortConfiguration[1] == 1) {
  623. *pul_PortValue =
  624. dw_StatusReg &
  625. 0x3FF00FFUL;
  626. }
  627. /**************************************/
  628. /* Test if port C not used for output */
  629. /**************************************/
  630. if (devpriv->
  631. s_ModuleInfo[b_ModulNbr].
  632. s_TTLIOInfo.
  633. b_PortConfiguration[2] == 1) {
  634. *pul_PortValue =
  635. dw_StatusReg &
  636. 0x300FFFFUL;
  637. }
  638. /**************************************/
  639. /* Test if port D not used for output */
  640. /**************************************/
  641. if (devpriv->
  642. s_ModuleInfo[b_ModulNbr].
  643. s_TTLIOInfo.
  644. b_PortConfiguration[3] == 1) {
  645. *pul_PortValue =
  646. dw_StatusReg &
  647. 0xFFFFFFUL;
  648. }
  649. }
  650. } else {
  651. /***************************/
  652. /* TTL I/O not initialised */
  653. /***************************/
  654. DPRINTK("TTL I/O not initialised\n");
  655. i_ReturnValue = -5;
  656. }
  657. } else {
  658. /**********************************/
  659. /* The module is not a TTL module */
  660. /**********************************/
  661. DPRINTK("The module is not a TTL module\n");
  662. i_ReturnValue = -3;
  663. }
  664. } else {
  665. /***********************/
  666. /* Module number error */
  667. /***********************/
  668. DPRINTK("Module number error\n");
  669. i_ReturnValue = -2;
  670. }
  671. return i_ReturnValue;
  672. }
  673. /*
  674. +----------------------------------------------------------------------------+
  675. | OUTPUT FUNCTIONS |
  676. +----------------------------------------------------------------------------+
  677. */
  678. /*
  679. +----------------------------------------------------------------------------+
  680. | Function Name : _INT_ i_APCI1710_SetTTLIOChlOn |
  681. | (unsigned char_ b_BoardHandle, |
  682. | unsigned char_ b_ModulNbr, |
  683. | unsigned char_ b_OutputChannel)
  684. int i_APCI1710_InsnWriteSetTTLIOChlOnOff(struct comedi_device *dev,struct comedi_subdevice *s,
  685. struct comedi_insn *insn,unsigned int *data) |
  686. +----------------------------------------------------------------------------+
  687. | Task : Sets or resets the output witch has been passed with the |
  688. | parameter b_Channel. Setting an output means setting |
  689. | an ouput high. |
  690. +----------------------------------------------------------------------------+
  691. | Input Parameters : unsigned char_ b_BoardHandle : Handle of board APCI-1710 |
  692. | unsigned char_ b_ModulNbr : Selected module number (0 to 3)|
  693. | unsigned char_ b_OutputChannel : Selection from digital output |
  694. | channel (0 or 1) |
  695. | 0 : PD0 |
  696. | 1 : PD1 |
  697. | 2 to 9 : PA |
  698. | 10 to 17: PB |
  699. | 18 to 25: PC |
  700. b_ModulNbr = CR_AREF(insn->chanspec);
  701. b_OutputChannel= CR_CHAN(insn->chanspec);
  702. ui_State = data[0]; /* ON or OFF */
  703. +----------------------------------------------------------------------------+
  704. | Output Parameters : - |
  705. +----------------------------------------------------------------------------+
  706. | Return Value : 0: No error |
  707. | -1: The handle parameter of the board is wrong |
  708. | -2: The module parameter is wrong |
  709. | -3: The module is not a TTL I/O module |
  710. | -4: The selected digital output is wrong |
  711. | -5: TTL I/O not initialised see function |
  712. | " i_APCI1710_InitTTLIO"
  713. +----------------------------------------------------------------------------+
  714. */
  715. int i_APCI1710_InsnWriteSetTTLIOChlOnOff(struct comedi_device *dev,
  716. struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
  717. {
  718. int i_ReturnValue = 0;
  719. unsigned int dw_StatusReg = 0;
  720. unsigned char b_ModulNbr;
  721. unsigned char b_OutputChannel;
  722. unsigned int ui_State;
  723. i_ReturnValue = insn->n;
  724. b_ModulNbr = CR_AREF(insn->chanspec);
  725. b_OutputChannel = CR_CHAN(insn->chanspec);
  726. ui_State = data[0]; /* ON or OFF */
  727. /**************************/
  728. /* Test the module number */
  729. /**************************/
  730. if (b_ModulNbr < 4) {
  731. /**************************/
  732. /* Test if TTL I/O module */
  733. /**************************/
  734. if ((devpriv->s_BoardInfos.
  735. dw_MolduleConfiguration[b_ModulNbr] &
  736. 0xFFFF0000UL) == APCI1710_TTL_IO) {
  737. /******************************************/
  738. /* Test if the TTL I/O module initialised */
  739. /******************************************/
  740. if (devpriv->s_ModuleInfo[b_ModulNbr].
  741. s_TTLIOInfo.b_TTLInit == 1) {
  742. /***********************************/
  743. /* Test the TTL I/O channel number */
  744. /***********************************/
  745. if (((b_OutputChannel <= 1)
  746. && ((devpriv->s_BoardInfos.
  747. dw_MolduleConfiguration
  748. [b_ModulNbr] &
  749. 0xFFFF) ==
  750. 0x3130))
  751. || ((b_OutputChannel <= 25)
  752. && ((devpriv->s_BoardInfos.
  753. dw_MolduleConfiguration
  754. [b_ModulNbr] &
  755. 0xFFFF) >=
  756. 0x3230))) {
  757. /****************************************************/
  758. /* Test if the selected channel is a output channel */
  759. /****************************************************/
  760. if (((b_OutputChannel <= 1)
  761. && (devpriv->
  762. s_ModuleInfo
  763. [b_ModulNbr].
  764. s_TTLIOInfo.
  765. b_PortConfiguration
  766. [3] == 1))
  767. || ((b_OutputChannel >= 2)
  768. && (b_OutputChannel <=
  769. 9)
  770. && (devpriv->
  771. s_ModuleInfo
  772. [b_ModulNbr].
  773. s_TTLIOInfo.
  774. b_PortConfiguration
  775. [0] == 1))
  776. || ((b_OutputChannel >= 10)
  777. && (b_OutputChannel <=
  778. 17)
  779. && (devpriv->
  780. s_ModuleInfo
  781. [b_ModulNbr].
  782. s_TTLIOInfo.
  783. b_PortConfiguration
  784. [1] == 1))
  785. || ((b_OutputChannel >= 18)
  786. && (b_OutputChannel <=
  787. 25)
  788. && (devpriv->
  789. s_ModuleInfo
  790. [b_ModulNbr].
  791. s_TTLIOInfo.
  792. b_PortConfiguration
  793. [2] == 1))) {
  794. /************************/
  795. /* Test if PD0 selected */
  796. /************************/
  797. if (b_OutputChannel == 0) {
  798. outl(ui_State,
  799. devpriv->
  800. s_BoardInfos.
  801. ui_Address +
  802. (64 * b_ModulNbr));
  803. } else {
  804. /************************/
  805. /* Test if PD1 selected */
  806. /************************/
  807. if (b_OutputChannel ==
  808. 1) {
  809. outl(ui_State,
  810. devpriv->
  811. s_BoardInfos.
  812. ui_Address
  813. + 4 +
  814. (64 * b_ModulNbr));
  815. } else {
  816. b_OutputChannel
  817. =
  818. b_OutputChannel
  819. - 2;
  820. /********************/
  821. /* Read all channel */
  822. /********************/
  823. dw_StatusReg =
  824. inl
  825. (devpriv->
  826. s_BoardInfos.
  827. ui_Address
  828. +
  829. (64 * b_ModulNbr));
  830. if (ui_State) /* ON */
  831. {
  832. dw_StatusReg
  833. =
  834. (dw_StatusReg
  835. >>
  836. ((b_OutputChannel / 8) * 8)) & 0xFF;
  837. dw_StatusReg
  838. =
  839. dw_StatusReg
  840. |
  841. (1
  842. <<
  843. (b_OutputChannel
  844. %
  845. 8));
  846. } else /* Off */
  847. {
  848. dw_StatusReg
  849. =
  850. (dw_StatusReg
  851. >>
  852. ((b_OutputChannel / 8) * 8)) & 0xFF;
  853. dw_StatusReg
  854. =
  855. dw_StatusReg
  856. &
  857. (0xFF
  858. -
  859. (1 << (b_OutputChannel % 8)));
  860. }
  861. /****************************/
  862. /* Set the new output value */
  863. /****************************/
  864. outl(dw_StatusReg, devpriv->s_BoardInfos.ui_Address + 8 + ((b_OutputChannel / 8) * 4) + (64 * b_ModulNbr));
  865. }
  866. }
  867. } else {
  868. /************************************/
  869. /* The selected TTL output is wrong */
  870. /************************************/
  871. DPRINTK(" The selected TTL output is wrong\n");
  872. i_ReturnValue = -4;
  873. }
  874. } else {
  875. /************************************/
  876. /* The selected TTL output is wrong */
  877. /************************************/
  878. DPRINTK("The selected TTL output is wrong\n");
  879. i_ReturnValue = -4;
  880. }
  881. } else {
  882. /***************************/
  883. /* TTL I/O not initialised */
  884. /***************************/
  885. DPRINTK("TTL I/O not initialised\n");
  886. i_ReturnValue = -5;
  887. }
  888. } else {
  889. /**************************************/
  890. /* The module is not a TTL I/O module */
  891. /**************************************/
  892. DPRINTK("The module is not a TTL I/O module\n");
  893. i_ReturnValue = -3;
  894. }
  895. } else {
  896. /***********************/
  897. /* Module number error */
  898. /***********************/
  899. DPRINTK("Module number error\n");
  900. i_ReturnValue = -2;
  901. }
  902. return i_ReturnValue;
  903. }