Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
hwdrv_apci16xx.c
Go to the documentation of this file.
1 
24 /*
25 
26  +-----------------------------------------------------------------------+
27  | (C) ADDI-DATA GmbH Dieselstraße 3 D-77833 Ottersweier |
28  +-----------------------------------------------------------------------+
29  | Tel : +49 (0) 7223/9493-0 | email : [email protected] |
30  | Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
31  +-----------------------------------------------------------------------+
32  | Project : API APCI1648 | Compiler : gcc |
33  | Module name : TTL.C | Version : 2.96 |
34  +-------------------------------+---------------------------------------+
35  | Project manager: S. Weber | Date : 25/05/2005 |
36  +-----------------------------------------------------------------------+
37  | Description : APCI-16XX TTL I/O module |
38  | |
39  | |
40  +-----------------------------------------------------------------------+
41  | UPDATES |
42  +-----------------------------------------------------------------------+
43  | Date | Author | Description of updates |
44  +----------+-----------+------------------------------------------------+
45  |25.05.2005| S.Weber | Creation |
46  | | | |
47  +-----------------------------------------------------------------------+
48 */
49 
50 /*
51 +----------------------------------------------------------------------------+
52 | Included files |
53 +----------------------------------------------------------------------------+
54 */
55 
56 #include "hwdrv_apci16xx.h"
57 
58 /*
59 +----------------------------------------------------------------------------+
60 | Function Name : int i_APCI16XX_InsnConfigInitTTLIO |
61 | (struct comedi_device *dev, |
62 | struct comedi_subdevice *s, |
63 | struct comedi_insn *insn, |
64 | unsigned int *data) |
65 +----------------------------------------------------------------------------+
66 | Task APCI16XX_TTL_INIT (using defaults) : |
67 | Configure the TTL I/O operating mode from all ports |
68 | You must calling this function be |
69 | for you call any other function witch access of TTL. |
70 | APCI16XX_TTL_INITDIRECTION(user inputs for direction) |
71 +----------------------------------------------------------------------------+
72 | Input Parameters : b_InitType = (unsigned char) data[0]; |
73 | b_Port0Mode = (unsigned char) data[1]; |
74 | b_Port1Mode = (unsigned char) data[2]; |
75 | b_Port2Mode = (unsigned char) data[3]; |
76 | b_Port3Mode = (unsigned char) data[4]; |
77 | ........ |
78 +----------------------------------------------------------------------------+
79 | Output Parameters : - |
80 +----------------------------------------------------------------------------+
81 | Return Value :>0: No error |
82 | -1: Port 0 mode selection is wrong |
83 | -2: Port 1 mode selection is wrong |
84 | -3: Port 2 mode selection is wrong |
85 | -4: Port 3 mode selection is wrong |
86 | -X: Port X-1 mode selection is wrong |
87 | .... |
88 | -100 : Config command error |
89 | -101 : Data size error |
90 +----------------------------------------------------------------------------+
91 */
92 
94  struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
95 {
96  int i_ReturnValue = insn->n;
97  unsigned char b_Command = 0;
98  unsigned char b_Cpt = 0;
99  unsigned char b_NumberOfPort =
100  (unsigned char) (this_board->i_NbrTTLChannel / 8);
101 
102  /************************/
103  /* Test the buffer size */
104  /************************/
105 
106  if (insn->n >= 1) {
107  /*******************/
108  /* Get the command */
109  /* **************** */
110 
111  b_Command = (unsigned char) data[0];
112 
113  /********************/
114  /* Test the command */
115  /********************/
116 
117  if ((b_Command == APCI16XX_TTL_INIT) ||
118  (b_Command == APCI16XX_TTL_INITDIRECTION) ||
119  (b_Command == APCI16XX_TTL_OUTPUTMEMORY)) {
120  /***************************************/
121  /* Test the initialisation buffer size */
122  /***************************************/
123 
124  if ((b_Command == APCI16XX_TTL_INITDIRECTION)
125  && ((unsigned char) (insn->n - 1) != b_NumberOfPort)) {
126  /*******************/
127  /* Data size error */
128  /*******************/
129 
130  printk("\nBuffer size error");
131  i_ReturnValue = -101;
132  }
133 
134  if ((b_Command == APCI16XX_TTL_OUTPUTMEMORY)
135  && ((unsigned char) (insn->n) != 2)) {
136  /*******************/
137  /* Data size error */
138  /*******************/
139 
140  printk("\nBuffer size error");
141  i_ReturnValue = -101;
142  }
143  } else {
144  /************************/
145  /* Config command error */
146  /************************/
147 
148  printk("\nCommand selection error");
149  i_ReturnValue = -100;
150  }
151  } else {
152  /*******************/
153  /* Data size error */
154  /*******************/
155 
156  printk("\nBuffer size error");
157  i_ReturnValue = -101;
158  }
159 
160  /**************************************************************************/
161  /* Test if no error occur and APCI16XX_TTL_INITDIRECTION command selected */
162  /**************************************************************************/
163 
164  if ((i_ReturnValue >= 0) && (b_Command == APCI16XX_TTL_INITDIRECTION)) {
165  memset(devpriv->ul_TTLPortConfiguration, 0,
166  sizeof(devpriv->ul_TTLPortConfiguration));
167 
168  /*************************************/
169  /* Test the port direction selection */
170  /*************************************/
171 
172  for (b_Cpt = 1;
173  (b_Cpt <= b_NumberOfPort) && (i_ReturnValue >= 0);
174  b_Cpt++) {
175  /**********************/
176  /* Test the direction */
177  /**********************/
178 
179  if ((data[b_Cpt] != 0) && (data[b_Cpt] != 0xFF)) {
180  /************************/
181  /* Port direction error */
182  /************************/
183 
184  printk("\nPort %d direction selection error",
185  (int) b_Cpt);
186  i_ReturnValue = -(int) b_Cpt;
187  }
188 
189  /**************************/
190  /* Save the configuration */
191  /**************************/
192 
193  devpriv->ul_TTLPortConfiguration[(b_Cpt - 1) / 4] =
194  devpriv->ul_TTLPortConfiguration[(b_Cpt -
195  1) / 4] | (data[b_Cpt] << (8 * ((b_Cpt -
196  1) % 4)));
197  }
198  }
199 
200  /**************************/
201  /* Test if no error occur */
202  /**************************/
203 
204  if (i_ReturnValue >= 0) {
205  /***********************************/
206  /* Test if TTL port initilaisation */
207  /***********************************/
208 
209  if ((b_Command == APCI16XX_TTL_INIT)
210  || (b_Command == APCI16XX_TTL_INITDIRECTION)) {
211  /******************************/
212  /* Set all port configuration */
213  /******************************/
214 
215  for (b_Cpt = 0; b_Cpt <= b_NumberOfPort; b_Cpt++) {
216  if ((b_Cpt % 4) == 0) {
217  /*************************/
218  /* Set the configuration */
219  /*************************/
220 
221  outl(devpriv->
222  ul_TTLPortConfiguration[b_Cpt /
223  4],
224  devpriv->iobase + 32 + b_Cpt);
225  }
226  }
227  }
228  }
229 
230  /************************************************/
231  /* Test if output memory initialisation command */
232  /************************************************/
233 
234  if (b_Command == APCI16XX_TTL_OUTPUTMEMORY) {
235  if (data[1]) {
236  devpriv->b_OutputMemoryStatus = ADDIDATA_ENABLE;
237  } else {
238  devpriv->b_OutputMemoryStatus = ADDIDATA_DISABLE;
239  }
240  }
241 
242  return i_ReturnValue;
243 }
244 
245 /*
246 +----------------------------------------------------------------------------+
247 | INPUT FUNCTIONS |
248 +----------------------------------------------------------------------------+
249 */
250 
251 /*
252 +----------------------------------------------------------------------------+
253 | Function Name : int i_APCI16XX_InsnBitsReadTTLIO |
254 | (struct comedi_device *dev, |
255 | struct comedi_subdevice *s, |
256 | struct comedi_insn *insn, |
257 | unsigned int *data) |
258 +----------------------------------------------------------------------------+
259 | Task : Read the status from selected TTL digital input |
260 | (b_InputChannel) |
261 +----------------------------------------------------------------------------+
262 | Task : Read the status from digital input port |
263 | (b_SelectedPort) |
264 +----------------------------------------------------------------------------+
265 | Input Parameters : |
266 | APCI16XX_TTL_READCHANNEL |
267 | b_SelectedPort= CR_RANGE(insn->chanspec); |
268 | b_InputChannel= CR_CHAN(insn->chanspec); |
269 | b_ReadType = (unsigned char) data[0]; |
270 | |
271 | APCI16XX_TTL_READPORT |
272 | b_SelectedPort= CR_RANGE(insn->chanspec); |
273 | b_ReadType = (unsigned char) data[0]; |
274 +----------------------------------------------------------------------------+
275 | Output Parameters : data[0] 0 : Channle is not active |
276 | 1 : Channle is active |
277 +----------------------------------------------------------------------------+
278 | Return Value : >0 : No error |
279 | -100 : Config command error |
280 | -101 : Data size error |
281 | -102 : The selected TTL input port is wrong |
282 | -103 : The selected TTL digital input is wrong |
283 +----------------------------------------------------------------------------+
284 */
285 
287  struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
288 {
289  int i_ReturnValue = insn->n;
290  unsigned char b_Command = 0;
291  unsigned char b_NumberOfPort =
292  (unsigned char) (this_board->i_NbrTTLChannel / 8);
293  unsigned char b_SelectedPort = CR_RANGE(insn->chanspec);
294  unsigned char b_InputChannel = CR_CHAN(insn->chanspec);
295  unsigned char *pb_Status;
296  unsigned int dw_Status;
297 
298  /************************/
299  /* Test the buffer size */
300  /************************/
301 
302  if (insn->n >= 1) {
303  /*******************/
304  /* Get the command */
305  /* **************** */
306 
307  b_Command = (unsigned char) data[0];
308 
309  /********************/
310  /* Test the command */
311  /********************/
312 
313  if ((b_Command == APCI16XX_TTL_READCHANNEL)
314  || (b_Command == APCI16XX_TTL_READPORT)) {
315  /**************************/
316  /* Test the selected port */
317  /**************************/
318 
319  if (b_SelectedPort < b_NumberOfPort) {
320  /**********************/
321  /* Test if input port */
322  /**********************/
323 
324  if (((devpriv->ul_TTLPortConfiguration
325  [b_SelectedPort /
326  4] >> (8 *
327  (b_SelectedPort
328  %
329  4))) &
330  0xFF) == 0) {
331  /***************************/
332  /* Test the channel number */
333  /***************************/
334 
335  if ((b_Command ==
337  && (b_InputChannel > 7)) {
338  /*******************************************/
339  /* The selected TTL digital input is wrong */
340  /*******************************************/
341 
342  printk("\nChannel selection error");
343  i_ReturnValue = -103;
344  }
345  } else {
346  /****************************************/
347  /* The selected TTL input port is wrong */
348  /****************************************/
349 
350  printk("\nPort selection error");
351  i_ReturnValue = -102;
352  }
353  } else {
354  /****************************************/
355  /* The selected TTL input port is wrong */
356  /****************************************/
357 
358  printk("\nPort selection error");
359  i_ReturnValue = -102;
360  }
361  } else {
362  /************************/
363  /* Config command error */
364  /************************/
365 
366  printk("\nCommand selection error");
367  i_ReturnValue = -100;
368  }
369  } else {
370  /*******************/
371  /* Data size error */
372  /*******************/
373 
374  printk("\nBuffer size error");
375  i_ReturnValue = -101;
376  }
377 
378  /**************************/
379  /* Test if no error occur */
380  /**************************/
381 
382  if (i_ReturnValue >= 0) {
383  pb_Status = (unsigned char *) &data[0];
384 
385  /*******************************/
386  /* Get the digital inpu status */
387  /*******************************/
388 
389  dw_Status =
390  inl(devpriv->iobase + 8 + ((b_SelectedPort / 4) * 4));
391  dw_Status = (dw_Status >> (8 * (b_SelectedPort % 4))) & 0xFF;
392 
393  /***********************/
394  /* Save the port value */
395  /***********************/
396 
397  *pb_Status = (unsigned char) dw_Status;
398 
399  /***************************************/
400  /* Test if read channel status command */
401  /***************************************/
402 
403  if (b_Command == APCI16XX_TTL_READCHANNEL) {
404  *pb_Status = (*pb_Status >> b_InputChannel) & 1;
405  }
406  }
407 
408  return i_ReturnValue;
409 }
410 
411 /*
412 +----------------------------------------------------------------------------+
413 | Function Name : int i_APCI16XX_InsnReadTTLIOAllPortValue |
414 | (struct comedi_device *dev, |
415 | struct comedi_subdevice *s, |
416 | struct comedi_insn *insn, |
417 | unsigned int *data) |
418 +----------------------------------------------------------------------------+
419 | Task : Read the status from all digital input ports |
420 +----------------------------------------------------------------------------+
421 | Input Parameters : - |
422 +----------------------------------------------------------------------------+
423 | Output Parameters : data[0] : Port 0 to 3 data |
424 | data[1] : Port 4 to 7 data |
425 | .... |
426 +----------------------------------------------------------------------------+
427 | Return Value : 0: No error |
428 | -100 : Read command error |
429 | -101 : Data size error |
430 +----------------------------------------------------------------------------+
431 */
432 
434  struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
435 {
436  unsigned char b_Command = (unsigned char) CR_AREF(insn->chanspec);
437  int i_ReturnValue = insn->n;
438  unsigned char b_Cpt = 0;
439  unsigned char b_NumberOfPort = 0;
440  unsigned int *pls_ReadData = data;
441 
442  /********************/
443  /* Test the command */
444  /********************/
445 
446  if ((b_Command == APCI16XX_TTL_READ_ALL_INPUTS)
447  || (b_Command == APCI16XX_TTL_READ_ALL_OUTPUTS)) {
448  /**********************************/
449  /* Get the number of 32-Bit ports */
450  /**********************************/
451 
452  b_NumberOfPort =
453  (unsigned char) (this_board->i_NbrTTLChannel / 32);
454  if ((b_NumberOfPort * 32) <
455  this_board->i_NbrTTLChannel) {
456  b_NumberOfPort = b_NumberOfPort + 1;
457  }
458 
459  /************************/
460  /* Test the buffer size */
461  /************************/
462 
463  if (insn->n >= b_NumberOfPort) {
464  if (b_Command == APCI16XX_TTL_READ_ALL_INPUTS) {
465  /**************************/
466  /* Read all digital input */
467  /**************************/
468 
469  for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) {
470  /************************/
471  /* Read the 32-Bit port */
472  /************************/
473 
474  pls_ReadData[b_Cpt] =
475  inl(devpriv->iobase + 8 +
476  (b_Cpt * 4));
477 
478  /**************************************/
479  /* Mask all channels used als outputs */
480  /**************************************/
481 
482  pls_ReadData[b_Cpt] =
483  pls_ReadData[b_Cpt] &
484  (~devpriv->
485  ul_TTLPortConfiguration[b_Cpt]);
486  }
487  } else {
488  /****************************/
489  /* Read all digital outputs */
490  /****************************/
491 
492  for (b_Cpt = 0; b_Cpt < b_NumberOfPort; b_Cpt++) {
493  /************************/
494  /* Read the 32-Bit port */
495  /************************/
496 
497  pls_ReadData[b_Cpt] =
498  inl(devpriv->iobase + 20 +
499  (b_Cpt * 4));
500 
501  /**************************************/
502  /* Mask all channels used als outputs */
503  /**************************************/
504 
505  pls_ReadData[b_Cpt] =
506  pls_ReadData[b_Cpt] & devpriv->
507  ul_TTLPortConfiguration[b_Cpt];
508  }
509  }
510  } else {
511  /*******************/
512  /* Data size error */
513  /*******************/
514 
515  printk("\nBuffer size error");
516  i_ReturnValue = -101;
517  }
518  } else {
519  /*****************/
520  /* Command error */
521  /*****************/
522 
523  printk("\nCommand selection error");
524  i_ReturnValue = -100;
525  }
526 
527  return i_ReturnValue;
528 }
529 
530 /*
531 +----------------------------------------------------------------------------+
532 | OUTPUT FUNCTIONS |
533 +----------------------------------------------------------------------------+
534 */
535 
536 /*
537 +----------------------------------------------------------------------------+
538 | Function Name : int i_APCI16XX_InsnBitsWriteTTLIO |
539 | (struct comedi_device *dev, |
540 | struct comedi_subdevice *s, |
541 | struct comedi_insn *insn, |
542 | unsigned int *data) |
543 +----------------------------------------------------------------------------+
544 | Task : Set the state from selected TTL digital output |
545 | (b_OutputChannel) |
546 +----------------------------------------------------------------------------+
547 | Task : Set the state from digital output port |
548 | (b_SelectedPort) |
549 +----------------------------------------------------------------------------+
550 | Input Parameters : |
551 | APCI16XX_TTL_WRITECHANNEL_ON | APCI16XX_TTL_WRITECHANNEL_OFF |
552 | b_SelectedPort = CR_RANGE(insn->chanspec); |
553 | b_OutputChannel= CR_CHAN(insn->chanspec); |
554 | b_Command = (unsigned char) data[0]; |
555 | |
556 | APCI16XX_TTL_WRITEPORT_ON | APCI16XX_TTL_WRITEPORT_OFF |
557 | b_SelectedPort = CR_RANGE(insn->chanspec); |
558 | b_Command = (unsigned char) data[0]; |
559 +----------------------------------------------------------------------------+
560 | Output Parameters : data[0] : TTL output port 0 to 3 data |
561 | data[1] : TTL output port 4 to 7 data |
562 | .... |
563 +----------------------------------------------------------------------------+
564 | Return Value : >0 : No error |
565 | -100 : Command error |
566 | -101 : Data size error |
567 | -102 : The selected TTL output port is wrong |
568 | -103 : The selected TTL digital output is wrong |
569 | -104 : Output memory disabled |
570 +----------------------------------------------------------------------------+
571 */
572 
574  struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data)
575 {
576  int i_ReturnValue = insn->n;
577  unsigned char b_Command = 0;
578  unsigned char b_NumberOfPort =
579  (unsigned char) (this_board->i_NbrTTLChannel / 8);
580  unsigned char b_SelectedPort = CR_RANGE(insn->chanspec);
581  unsigned char b_OutputChannel = CR_CHAN(insn->chanspec);
582  unsigned int dw_Status = 0;
583 
584  /************************/
585  /* Test the buffer size */
586  /************************/
587 
588  if (insn->n >= 1) {
589  /*******************/
590  /* Get the command */
591  /* **************** */
592 
593  b_Command = (unsigned char) data[0];
594 
595  /********************/
596  /* Test the command */
597  /********************/
598 
599  if ((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) ||
600  (b_Command == APCI16XX_TTL_WRITEPORT_ON) ||
601  (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) ||
602  (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) {
603  /**************************/
604  /* Test the selected port */
605  /**************************/
606 
607  if (b_SelectedPort < b_NumberOfPort) {
608  /***********************/
609  /* Test if output port */
610  /***********************/
611 
612  if (((devpriv->ul_TTLPortConfiguration
613  [b_SelectedPort /
614  4] >> (8 *
615  (b_SelectedPort
616  %
617  4))) &
618  0xFF) == 0xFF) {
619  /***************************/
620  /* Test the channel number */
621  /***************************/
622 
623  if (((b_Command == APCI16XX_TTL_WRITECHANNEL_ON) || (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF)) && (b_OutputChannel > 7)) {
624  /********************************************/
625  /* The selected TTL digital output is wrong */
626  /********************************************/
627 
628  printk("\nChannel selection error");
629  i_ReturnValue = -103;
630  }
631 
632  if (((b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE)) {
633  /********************************************/
634  /* The selected TTL digital output is wrong */
635  /********************************************/
636 
637  printk("\nOutput memory disabled");
638  i_ReturnValue = -104;
639  }
640 
641  /************************/
642  /* Test the buffer size */
643  /************************/
644 
645  if (((b_Command == APCI16XX_TTL_WRITEPORT_ON) || (b_Command == APCI16XX_TTL_WRITEPORT_OFF)) && (insn->n < 2)) {
646  /*******************/
647  /* Data size error */
648  /*******************/
649 
650  printk("\nBuffer size error");
651  i_ReturnValue = -101;
652  }
653  } else {
654  /*****************************************/
655  /* The selected TTL output port is wrong */
656  /*****************************************/
657 
658  printk("\nPort selection error %lX",
659  (unsigned long)devpriv->
660  ul_TTLPortConfiguration[0]);
661  i_ReturnValue = -102;
662  }
663  } else {
664  /****************************************/
665  /* The selected TTL output port is wrong */
666  /****************************************/
667 
668  printk("\nPort selection error %d %d",
669  b_SelectedPort, b_NumberOfPort);
670  i_ReturnValue = -102;
671  }
672  } else {
673  /************************/
674  /* Config command error */
675  /************************/
676 
677  printk("\nCommand selection error");
678  i_ReturnValue = -100;
679  }
680  } else {
681  /*******************/
682  /* Data size error */
683  /*******************/
684 
685  printk("\nBuffer size error");
686  i_ReturnValue = -101;
687  }
688 
689  /**************************/
690  /* Test if no error occur */
691  /**************************/
692 
693  if (i_ReturnValue >= 0) {
694  /********************************/
695  /* Get the digital output state */
696  /********************************/
697 
698  dw_Status =
699  inl(devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4));
700 
701  /**********************************/
702  /* Test if output memory not used */
703  /**********************************/
704 
705  if (devpriv->b_OutputMemoryStatus == ADDIDATA_DISABLE) {
706  /*********************************/
707  /* Clear the selected port value */
708  /*********************************/
709 
710  dw_Status =
711  dw_Status & (0xFFFFFFFFUL -
712  (0xFFUL << (8 * (b_SelectedPort % 4))));
713  }
714 
715  /******************************/
716  /* Test if setting channel ON */
717  /******************************/
718 
719  if (b_Command == APCI16XX_TTL_WRITECHANNEL_ON) {
720  dw_Status =
721  dw_Status | (1UL << ((8 * (b_SelectedPort %
722  4)) + b_OutputChannel));
723  }
724 
725  /***************************/
726  /* Test if setting port ON */
727  /***************************/
728 
729  if (b_Command == APCI16XX_TTL_WRITEPORT_ON) {
730  dw_Status =
731  dw_Status | ((data[1] & 0xFF) << (8 *
732  (b_SelectedPort % 4)));
733  }
734 
735  /*******************************/
736  /* Test if setting channel OFF */
737  /*******************************/
738 
739  if (b_Command == APCI16XX_TTL_WRITECHANNEL_OFF) {
740  dw_Status =
741  dw_Status & (0xFFFFFFFFUL -
742  (1UL << ((8 * (b_SelectedPort % 4)) +
743  b_OutputChannel)));
744  }
745 
746  /****************************/
747  /* Test if setting port OFF */
748  /****************************/
749 
750  if (b_Command == APCI16XX_TTL_WRITEPORT_OFF) {
751  dw_Status =
752  dw_Status & (0xFFFFFFFFUL -
753  ((data[1] & 0xFF) << (8 * (b_SelectedPort %
754  4))));
755  }
756 
757  outl(dw_Status,
758  devpriv->iobase + 20 + ((b_SelectedPort / 4) * 4));
759  }
760 
761  return i_ReturnValue;
762 }
763 
764 /*
765 +----------------------------------------------------------------------------+
766 | Function Name : int i_APCI2200_Reset(struct comedi_device *dev) | +----------------------------------------------------------------------------+
767 | Task :resets all the registers |
768 +----------------------------------------------------------------------------+
769 | Input Parameters : struct comedi_device *dev |
770 +----------------------------------------------------------------------------+
771 | Output Parameters : - |
772 +----------------------------------------------------------------------------+
773 | Return Value : - |
774 +----------------------------------------------------------------------------+
775 */
776 
778 {
779  return 0;
780 }