Subversion Repositories f9daq

Rev

Rev 21 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.    cc32lib.c -- a simple access library for the PCICC32 PCI to CAMAC Interface from ARW Elektronik
  3.  
  4.    (c) 2000 ARW Elektronik
  5.  
  6.    this source code is published under GPL (Open Source). You can use, redistrubute and
  7.    modify it unless this header   is not modified or deleted. No warranty is given that
  8.    this software will work like expected.
  9.    This product is not authorized for use as critical component in life support systems
  10.    wihout the express written approval of ARW Elektronik Germany.
  11.  
  12.    Please announce changes and hints to ARW Elektronik
  13.  
  14.    first steps derived from the LINUX pcicc32 library                   AR   16.03.2000
  15.    new architecture - added WINNT to DLL                                AR   30.07.2000
  16.    added buffer, UNTIL_NOT_Q and AUTOREAD functionality                 AR   17.03.2001
  17.    added interrupt handling                                             AR   08.06.2002
  18. */
  19.  
  20. /*--- INCLUDES -----------------------------------------------------------------------------------*/
  21. #include <windows.h>
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <errno.h>
  26.  
  27. #include "os_info.h"      /* to determine the underlaying OS                                      */
  28. #include "libcc32_95.h"   /* the win95 + 98 parts                                                 */
  29. #include "libcc32_NT.h"   /* the winnt part                                                       */
  30. #include "libcc32.h"      /* shared header bewteen applictaion and library                        */
  31.  
  32. /*--- DEFINES ------------------------------------------------------------------------------------*/
  33.  
  34. /*--- EXTERNALS ----------------------------------------------------------------------------------*/
  35.  
  36. /*--- TYPEDEFS -----------------------------------------------------------------------------------*/
  37. typedef struct
  38. {
  39.         int            (*cc32_open)(char *cszPath, int nModuleNumber, void **handle);
  40.         int            (*cc32_close)(void *handle);
  41.         unsigned short (*cc32_read_word)(void *handle, unsigned int N, unsigned int A, unsigned int F);
  42.         unsigned long  (*cc32_read_long)(void *handle, unsigned int N, unsigned int A, unsigned int F, char *Q, char *X);
  43.         unsigned long  (*cc32_read_long_all)(void *handle, unsigned int N, unsigned int A, unsigned int F);
  44.         void           (*cc32_write_word)(void *handle, unsigned int N, unsigned int A, unsigned int F, unsigned short uwData);
  45.         void           (*cc32_write_long)(void *handle, unsigned int N, unsigned int A, unsigned int F, unsigned long ulData);
  46.         int            (*cc32_poll_error)(void *handle, char *nTimeout, char *nLam);
  47.         int            (*cc32_read_word_buffer)(void * handle, unsigned int N, unsigned int A, unsigned int F, unsigned short *pwBuffer, unsigned long *pdwLen);
  48.         int            (*cc32_read_long_buffer)(void * handle, unsigned int N, unsigned int A, unsigned int F, unsigned long *pdwBuffer, unsigned long *pdwLen);
  49.         int            (*cc32_read_long_all_buffer)(void * handle, unsigned int N, unsigned int A, unsigned int F, unsigned long *pdwBuffer, unsigned long *pdwLen);
  50.         int            (*cc32_access_switch)(void *handle, unsigned short uwSwitch);
  51.         int            (*cc32_enable_interrupt)(void *handle);
  52.         int            (*cc32_disable_interrupt)(void *handle);
  53.         int            (*cc32_get_interrupt)(void *handle, unsigned long *dwStatus);
  54. } MY_ACTIONS;
  55.  
  56. /*--- GLOBALS ------------------------------------------------------------------------------------*/
  57. MY_ACTIONS  ma;
  58. static BOOLEAN firstime = TRUE;
  59.  
  60. /*--- FUNCTIONS -----------------------------------------------------------------------*/
  61.  
  62. //--------------------------------------------------------------------------------------
  63. // open the device
  64. //
  65. int __declspec(dllexport) cc32_open(char *cszPath, int nModuleNumber, CC32_HANDLE *handle)
  66. {
  67.         if (firstime)
  68.         {
  69.                 if (IsWindowsNT())
  70.                 {
  71.                         ma.cc32_open                                            = cc32_open_NT;
  72.                         ma.cc32_close                                           = cc32_close_NT;
  73.                         ma.cc32_read_word                                       = cc32_read_word_NT;
  74.                         ma.cc32_read_long                                       = cc32_read_long_NT;
  75.                         ma.cc32_read_long_all                           = cc32_read_long_all_NT;
  76.                         ma.cc32_write_word                                      = cc32_write_word_NT;
  77.                         ma.cc32_write_long                                      = cc32_write_long_NT;
  78.                         ma.cc32_poll_error                                      = cc32_poll_error_NT;
  79.                         ma.cc32_read_word_buffer                        = cc32_read_word_buffer_NT;
  80.                         ma.cc32_read_long_buffer                        = cc32_read_long_buffer_NT;
  81.                         ma.cc32_read_long_all_buffer            = cc32_read_long_all_buffer_NT;
  82.                         ma.cc32_access_switch                           = cc32_access_switch_NT;
  83.                         ma.cc32_enable_interrupt            = cc32_enable_interrupt_NT;
  84.                         ma.cc32_disable_interrupt           = cc32_disable_interrupt_NT;
  85.                         ma.cc32_get_interrupt               = cc32_get_interrupt_NT;
  86.                 }
  87.                 else
  88.                         if (IsWindows95() || IsWindows98())
  89.                         {
  90.                                 ma.cc32_open                                            = cc32_open_95;
  91.                                 ma.cc32_close                                           = cc32_close_95;
  92.                                 ma.cc32_read_word                                       = cc32_read_word_95;
  93.                                 ma.cc32_read_long                                       = cc32_read_long_95;
  94.                                 ma.cc32_read_long_all                           = cc32_read_long_all_95;
  95.                                 ma.cc32_write_word                                      = cc32_write_word_95;
  96.                                 ma.cc32_write_long                                      = cc32_write_long_95;
  97.                                 ma.cc32_poll_error                                      = cc32_poll_error_95;
  98.                                 ma.cc32_read_word_buffer                        = cc32_read_word_buffer_95;
  99.                                 ma.cc32_read_long_buffer                        = cc32_read_long_buffer_95;
  100.                                 ma.cc32_read_long_all_buffer            = cc32_read_long_all_buffer_95;
  101.                                 ma.cc32_access_switch                           = cc32_access_switch_95;
  102.                                 ma.cc32_enable_interrupt            = cc32_enable_interrupt_95;
  103.                                 ma.cc32_disable_interrupt           = cc32_disable_interrupt_95;
  104.                                 ma.cc32_get_interrupt               = cc32_get_interrupt_95;
  105.                         }
  106.                         else
  107.                                 return -1;
  108.  
  109.                 firstime = FALSE;
  110.         }
  111.  
  112.         return ma.cc32_open(cszPath, nModuleNumber, (CC32_HANDLE *)handle);
  113. }
  114.  
  115. //--------------------------------------------------------------------------------------
  116. // close the device
  117. //
  118. int __declspec(dllexport) cc32_close(CC32_HANDLE handle)
  119. {
  120.         return ma.cc32_close((CC32_HANDLE)handle);
  121. }
  122.  
  123. //--------------------------------------------------------------------------------------
  124. // read a word
  125. //
  126. unsigned short __declspec(dllexport) cc32_read_word(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F)
  127. {
  128.         return ma.cc32_read_word((CC32_HANDLE) handle, N, A, F);
  129. }
  130.  
  131. //--------------------------------------------------------------------------------------
  132. // read a long
  133. //
  134. unsigned long __declspec(dllexport) cc32_read_long_all(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F)
  135. {
  136.         return ma.cc32_read_long_all((CC32_HANDLE) handle, N, A, F);
  137. }
  138.  
  139. //--------------------------------------------------------------------------------------
  140. // read a long and get Q and X
  141. //
  142. unsigned long __declspec(dllexport) cc32_read_long(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F, char *Q, char *X)
  143. {
  144.         return ma.cc32_read_long((CC32_HANDLE) handle, N, A, F, Q, X);
  145. }
  146.  
  147. //--------------------------------------------------------------------------------------
  148. // write a word
  149. //
  150. void __declspec(dllexport) cc32_write_word(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F, unsigned short uwData)
  151. {
  152.         ma.cc32_write_word((CC32_HANDLE) handle, N, A, F, uwData);
  153. }
  154.  
  155. //--------------------------------------------------------------------------------------
  156. // write a long
  157. //
  158. void __declspec(dllexport) cc32_write_long(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F, unsigned long ulData)
  159. {
  160.         ma.cc32_write_long((CC32_HANDLE) handle, N, A, F, ulData);
  161. }
  162.  
  163. //--------------------------------------------------------------------------------------
  164. // read and clear the PCIADA status
  165. //
  166. int __declspec(dllexport) cc32_poll_error(CC32_HANDLE handle, char *nTimeout, char *nLam)
  167. {
  168.         return ma.cc32_poll_error((CC32_HANDLE) handle, nTimeout, nLam);
  169. }
  170.  
  171. //--------------------------------------------------------------------------------------
  172. // read 'len' words or 'UNTIL_NOT_Q' from a address made out of N,A,F into a buffer
  173. //
  174. int __declspec(dllexport) cc32_read_word_buffer(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F,
  175.                                                                                                                                 unsigned short *pwBuffer, unsigned long *pdwLen)
  176. {
  177.         return ma.cc32_read_word_buffer(handle, N, A, F, pwBuffer, pdwLen);
  178. }
  179.  
  180. //--------------------------------------------------------------------------------------
  181. // read 'len' longs or 'UNTIL_NOT_Q' from a address made out of N,A,F into a buffer, mask 24 bits out
  182. //
  183. int __declspec(dllexport) cc32_read_long_buffer(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F,
  184.                                                                                                                                 unsigned long *pdwBuffer, unsigned long *pdwLen)
  185. {
  186.         return ma.cc32_read_long_buffer(handle, N, A, F, pdwBuffer, pdwLen);
  187. }
  188.  
  189. //--------------------------------------------------------------------------------------
  190. // read 'len' longs or 'UNTIL_NOT_Q' from a address made out of N,A,F into a buffer, without interpretation
  191. //
  192. int __declspec(dllexport) cc32_read_long_all_buffer(CC32_HANDLE handle, unsigned int N, unsigned int A, unsigned int F,
  193.                                                                                                                                 unsigned long *pdwBuffer, unsigned long *pdwLen)
  194. {
  195.         return ma.cc32_read_long_all_buffer(handle, N, A, F, pdwBuffer, pdwLen);
  196. }
  197.  
  198. //--------------------------------------------------------------------------------------
  199. // set the accessmode for the path, e.g. UNTIL_NOT_Q or AUTOREAD or ...
  200. //
  201. int __declspec(dllexport) cc32_access_switch(CC32_HANDLE handle, unsigned short uwSwitch)
  202. {
  203.         return ma.cc32_access_switch(handle, uwSwitch);
  204. }
  205.  
  206. //--------------------------------------------------------------------------------------
  207. // switch interrupts on
  208. //
  209. int __declspec(dllexport) cc32_enable_interrupt(CC32_HANDLE handle)
  210. {
  211.         return ma.cc32_enable_interrupt(handle);
  212. }
  213.  
  214. //--------------------------------------------------------------------------------------
  215. // switch interrupts off
  216. //
  217. int __declspec(dllexport) cc32_disable_interrupt(CC32_HANDLE handle)
  218. {
  219.         return ma.cc32_disable_interrupt(handle);
  220. }
  221.  
  222. //--------------------------------------------------------------------------------------
  223. // wait blocking for the next interrupt
  224. //
  225. int __declspec(dllexport) cc32_get_interrupt(CC32_HANDLE handle, unsigned long *dwStatus)
  226. {
  227.         return ma.cc32_get_interrupt(handle, dwStatus);
  228. }
  229.