Rev 21 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
21 | f9daq | 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 | } |