1 | /*-----------------------------------------------------------------------------
|
---|
2 | dpm.h -- Linux driver of DPM interface to VMOD
|
---|
3 |
|
---|
4 | Copyright (c) 1996 JANZ Computer AG
|
---|
5 | All Rights Reserved
|
---|
6 |
|
---|
7 | Created 96/01/23 by Stefan Althoefer
|
---|
8 |
|
---|
9 | Version 1.12 of 96/09/27
|
---|
10 |
|
---|
11 | This file is for both, the "dpm" and the "dpmw" driver.
|
---|
12 | The only difference, besides the names of the driver functions, are the in
|
---|
13 | the INKERNEL structures. But these are not visible to the user.
|
---|
14 |
|
---|
15 | -----------------------------------------------------------------------------*/
|
---|
16 |
|
---|
17 | #ifndef __INCdpmh
|
---|
18 | #define __INCdpmh
|
---|
19 |
|
---|
20 | #ifdef __cplusplus
|
---|
21 | extern "C" {
|
---|
22 | #endif
|
---|
23 |
|
---|
24 | #include "defs.h"
|
---|
25 | #include "vmod.h"
|
---|
26 |
|
---|
27 | /* Max. Count of Devices for the dpm driver. */
|
---|
28 | /*#define DPM_MAJOR_NUMBER 57 */
|
---|
29 | #define MAX_BOARDS 16 /* max. # of boards supported */
|
---|
30 | #define MAX_MODUL_BOARDS 4 /* max. # of modules supported */
|
---|
31 | /* with one board */
|
---|
32 | #define MAX_DPM_DEV (MAX_BOARDS * MAX_MODUL_BOARDS)
|
---|
33 |
|
---|
34 | #define FAST_QUEUE '\0' /* flag for fast queue */
|
---|
35 | #define PLAIN_QUEUE '\1' /* flag for normal queue */
|
---|
36 |
|
---|
37 | /* Data type of messages */
|
---|
38 | #define MSGLEN 252 /* Maximum length of a message */
|
---|
39 | #define MSGHDLEN 4 /* Length of message head */
|
---|
40 |
|
---|
41 | #define ICAN2 1
|
---|
42 | #define ICAN3 2
|
---|
43 |
|
---|
44 | /* -*-Struct-*-
|
---|
45 | *
|
---|
46 | * Message - local message buffer for standard host interface
|
---|
47 | *
|
---|
48 | * This structure stores a message to be send to or received from
|
---|
49 | * a VMOD-ICAN module via the standard host interface.
|
---|
50 | *
|
---|
51 | * <cmd> is a 8 bit command specifier. Refer to the VMOD-ICAN manual
|
---|
52 | * to find out which services are provided by the different <cmd>
|
---|
53 | * specifiers. The data length to be transfered is stored in <len>, thereby
|
---|
54 | * <len> specifies how many bytes of the vector <data> are valid. The data
|
---|
55 | * have to be interpreted by means of <cmd>.
|
---|
56 | *
|
---|
57 | * At most MSGLEN bytes can be stored in a message. MSGLEN is 252 bytes
|
---|
58 | * for all current VMOD-ICAN modules.
|
---|
59 | */
|
---|
60 | typedef struct {
|
---|
61 | BYTE_t cmd; /* Message specifier */
|
---|
62 | BYTE_t gap1;
|
---|
63 | WORD_t len; /* Message length (<= MSGLEN) */
|
---|
64 | BYTE_t data[MSGLEN]; /* Data array of Message */
|
---|
65 | } Message;
|
---|
66 |
|
---|
67 |
|
---|
68 | /* -*-Struct-*-
|
---|
69 | *
|
---|
70 | * FastMessage - local message buffer for fast host interface
|
---|
71 | *
|
---|
72 | * This structure stores a CANbus message to be send to or received from
|
---|
73 | * a VMOD-ICAN modules fast interface.
|
---|
74 | *
|
---|
75 | * <cmd> is a 8 bit service multiplexor. Currently only <cmd>='0' is used.
|
---|
76 | *
|
---|
77 | * Through <data> the actual CANbus message is transfered if <cmd> equals '0'.
|
---|
78 | * The first two bytes store the message descriptor, that contains the
|
---|
79 | * ID, RTR-flag and CANbus data length code (DLC), the remaining bytes store
|
---|
80 | * the CANbus data bytes.
|
---|
81 | *
|
---|
82 | * .CS
|
---|
83 | * data[0] = ID/8;
|
---|
84 | * data[1] = 32(ID%8) + 16RTR + DLC
|
---|
85 | * data[2] = CAN BYTE 1
|
---|
86 | * data[:] = :
|
---|
87 | * data[9] = CAN BYTE 8
|
---|
88 | * data[10] = unused
|
---|
89 | * data[:] = :
|
---|
90 | * data[13] = unused
|
---|
91 | * .CE
|
---|
92 | *
|
---|
93 | */
|
---|
94 | typedef struct {
|
---|
95 | BYTE_t unused;
|
---|
96 | BYTE_t cmd; /* Service specifier */
|
---|
97 | BYTE_t data[14]; /* Data array */
|
---|
98 | } FastMessage;
|
---|
99 |
|
---|
100 |
|
---|
101 |
|
---|
102 | /*** DPM: Special Driver Functions (Driver management) *********************/
|
---|
103 | #ifdef nodef
|
---|
104 |
|
---|
105 | /* Create the dpm driver. */
|
---|
106 | extern STATUS dpmDrv(void);
|
---|
107 |
|
---|
108 | /* Remove the dpm driver from the system. */
|
---|
109 | extern STATUS dpmDrvRemove(void);
|
---|
110 |
|
---|
111 | /* Add a dpm device. */
|
---|
112 | extern STATUS dpmDevCreate(
|
---|
113 | int modno,
|
---|
114 | UINT baddr
|
---|
115 | );
|
---|
116 |
|
---|
117 | /* Delete a dpm device. */
|
---|
118 | extern STATUS dpmDevDelete(
|
---|
119 | const char *name
|
---|
120 | );
|
---|
121 |
|
---|
122 | /* Main ioctl function. */
|
---|
123 | extern dpmIoctl(
|
---|
124 | int modno,
|
---|
125 | int cmd,
|
---|
126 | int arg
|
---|
127 | );
|
---|
128 |
|
---|
129 | /* interrupt function. */
|
---|
130 | extern void dpmInt (int modno);
|
---|
131 |
|
---|
132 |
|
---|
133 | /*** DPMW: Special Driver Functions (Driver management) *********************/
|
---|
134 |
|
---|
135 | /* Create the dpmw driver. */
|
---|
136 | extern STATUS dpmwDrv(void);
|
---|
137 |
|
---|
138 | /* Remove the dpmw driver from the system. */
|
---|
139 | extern STATUS dpmwDrvRemove(void);
|
---|
140 |
|
---|
141 | /* Add a dpmw device. */
|
---|
142 | extern STATUS dpmwDevCreate(
|
---|
143 | const char *name,
|
---|
144 | int modno,
|
---|
145 | UINT baddr,
|
---|
146 | int vector,
|
---|
147 | int level
|
---|
148 | );
|
---|
149 |
|
---|
150 | /* Delete a dpmw device. */
|
---|
151 | extern STATUS dpmwDevDelete(
|
---|
152 | const char *name
|
---|
153 | );
|
---|
154 | #endif
|
---|
155 |
|
---|
156 | /*** IOCTL commands *****************************************************/
|
---|
157 | #define WOS 0x8000 /* offset into user fuction codes */
|
---|
158 |
|
---|
159 | /* getstat: */
|
---|
160 | #define DPM_READ_MBOX (128 + WOS) /* function code READ */
|
---|
161 | #define DPM_COPY_FROM (129 + WOS) /* copy data from dpm */
|
---|
162 | #define DPM_READ_FAST_MBOX (130 + WOS) /* function code READ FAST */
|
---|
163 |
|
---|
164 | /* putstat: */
|
---|
165 | #define DPM_WRITE_MBOX (528 + WOS) /* function code WRITE mid prio */
|
---|
166 | #define DPM_WRITE_MBOX_HI (539 + WOS) /* function code WRITE high prio*/
|
---|
167 | #define DPM_WRITE_MBOX_LOW (540 + WOS) /* function code WRITE low prio */
|
---|
168 | #define DPM_COPY_TO (529 + WOS) /* copy data to dpm */
|
---|
169 | #define DPM_DEL_SIGNAL (530 + WOS) /* delete signal entry */
|
---|
170 | #define DPM_SET_SIGNAL (531 + WOS) /* set signal entry */
|
---|
171 | #define DPM_RESET (532 + WOS) /* reset the module */
|
---|
172 | #define DPM_INIT_NEW_HOSTIF (533 + WOS) /* init new hostif */
|
---|
173 | #define DPM_INIT_NEW_HOSTIF_PRIO (545 + WOS) /* init new hostif (priorized) */
|
---|
174 | #define DPM_SET_SEM (534 + WOS) /* create semaphor for read */
|
---|
175 | #define DPM_INIT_FAST_CAN (535 + WOS) /* init fast CAN access */
|
---|
176 | #define DPM_INIT_FAST_CAN_PRIO (551 + WOS) /* init fast CAN access */
|
---|
177 | #define DPM_WRITE_FAST_CAN (536 + WOS) /* send trougth fast interface */
|
---|
178 | #define DPM_WRITE_FAST_CAN_PRIO (552 + WOS) /* send trougth prioritized fast interface */
|
---|
179 |
|
---|
180 | #define DPM_DEINIT_FAST_CAN (537 + WOS) /* deinit fast CAN access */
|
---|
181 | #define DPM_DEL_SEM (538 + WOS) /* delete semaphor for read */
|
---|
182 | /* (539 + WOS) see above! */
|
---|
183 | /* (540 + WOS) see above! */
|
---|
184 | #define DPM_INIT_ID_MSG_Q_TABLE (541 + WOS) /* allocates memory for table, */
|
---|
185 | /* where message-queue-Ids for */
|
---|
186 | /* fast can access are stored */
|
---|
187 | #define DPM_DEINIT_ID_MSG_Q_TABLE (542 + WOS) /* deallocates memory for table */
|
---|
188 | #define DPM_ADD_ID_TO_MSG_Q_TABLE (543 + WOS) /* adds queue entry to ID-table */
|
---|
189 | #define DPM_REM_ID_FROM_MSG_Q_TABLE (544 + WOS) /* removes entry from ID-table */
|
---|
190 | /* (545 + WOS) see above! */
|
---|
191 | #define DPM_INIT_L2_ROUTING (546 + WOS) /* inits the Layer2 routing cap */
|
---|
192 | #define DPM_DEINIT_L2_ROUTING (547 + WOS) /* deinits Layer2 routing cap */
|
---|
193 | #define DPM_INIT_ROUTE_ID (548 + WOS) /* lets _one_ ID being routable */
|
---|
194 | #define DPM_ADD_ROUTE_TO_ID (549 + WOS) /* adds _one_ routing way to ID */
|
---|
195 | #define DPM_MAP_FD_TO_MOD (550 + WOS) /* map the fd to board/module */
|
---|
196 |
|
---|
197 | #define DPM_DEV_CREATE (600 + WOS) /* WINDOWS specific ioctl function code */
|
---|
198 | #define DPM_DEV_DELETE (601 + WOS) /* deletes device from slot */
|
---|
199 | #define DPM_READ_INTCOUNT (602 + WOS)
|
---|
200 | #define DPM_REGISTER_APC (603 + WOS) /* Register APC function */
|
---|
201 | #define DPM_TPU_REQ (604 + WOS) /* initiates TPU request IR */
|
---|
202 | #define DPM_OBJDIC_REQ (605 + WOS) /* access to object dict. */
|
---|
203 |
|
---|
204 | #define DPM_DRV_IDVERS (606 + WOS) /* get driver version */
|
---|
205 | #define DPM_WRITE_PP (607 + WOS) /* write CANopen process picture */
|
---|
206 | #define DPM_READ_PP (608 + WOS) /* read CANopen process picture */
|
---|
207 |
|
---|
208 |
|
---|
209 | struct signal_dpm {
|
---|
210 | int task_id;
|
---|
211 | int signal_code;
|
---|
212 | unsigned char *param_addr;
|
---|
213 | };
|
---|
214 |
|
---|
215 | struct dpm_copy_desc {
|
---|
216 | unsigned int memory;
|
---|
217 | unsigned int dpm;
|
---|
218 | int len;
|
---|
219 | };
|
---|
220 |
|
---|
221 | struct dpm_rw_can_desc {
|
---|
222 | int rval;
|
---|
223 | Message *pm;
|
---|
224 | };
|
---|
225 |
|
---|
226 | struct dpm_new_hostif_desc {
|
---|
227 | int fromhost_len;
|
---|
228 | int tohost_len;
|
---|
229 | };
|
---|
230 |
|
---|
231 | struct dpm_new_hostif_desc_prio {
|
---|
232 | int fromhost_hi_len;
|
---|
233 | int fromhost_low_len;
|
---|
234 | int fromhost_len;
|
---|
235 | int tohost_len;
|
---|
236 | };
|
---|
237 |
|
---|
238 | struct dpm_fast_can_desc {
|
---|
239 | int fromhost_len;
|
---|
240 | int tohost_len;
|
---|
241 | /* MSG_Q_ID read_queue; */
|
---|
242 | };
|
---|
243 |
|
---|
244 | struct dpm_fast_can_desc_prio {
|
---|
245 | int numOfPrioQueues;
|
---|
246 | int fromhost_len;
|
---|
247 | int tohost_len;
|
---|
248 | /* MSG_Q_ID read_queue; */
|
---|
249 | };
|
---|
250 |
|
---|
251 | struct dpm_write_fast_can_desc {
|
---|
252 | int rval;
|
---|
253 | FastMessage *pm;
|
---|
254 | };
|
---|
255 |
|
---|
256 | struct dpm_write_fast_can_desc_prio {
|
---|
257 | int rval;
|
---|
258 | int prioQueue;
|
---|
259 | FastMessage *pm;
|
---|
260 | };
|
---|
261 |
|
---|
262 | struct dpm_fast_can_desc_win {
|
---|
263 | int fromhost_len;
|
---|
264 | int tohost_len;
|
---|
265 | int fkt_addr;
|
---|
266 | };
|
---|
267 |
|
---|
268 | struct dpm_msg_q_id_desc {
|
---|
269 | unsigned short id;
|
---|
270 | /* MSG_Q_ID target_queue; */
|
---|
271 | };
|
---|
272 |
|
---|
273 | struct dpm_layer_2_routing_desc {
|
---|
274 | int rval;
|
---|
275 | int Id;
|
---|
276 | int max_routes;
|
---|
277 | int source_Id;
|
---|
278 | int dest_Id;
|
---|
279 | int dest_Board;
|
---|
280 | int dest_Modul;
|
---|
281 | };
|
---|
282 |
|
---|
283 | struct io_args {
|
---|
284 | int modno; /* slot of interesing module */
|
---|
285 | int arg; /* place of some arguments */
|
---|
286 | };
|
---|
287 |
|
---|
288 |
|
---|
289 | struct dpm_dev_create_desc {
|
---|
290 | int modno;
|
---|
291 | };
|
---|
292 |
|
---|
293 | struct dpm_objdic_desc {
|
---|
294 | int objdic_index;
|
---|
295 | int objdic_subindex;
|
---|
296 | int access_type;
|
---|
297 | void *entry_structure;
|
---|
298 | };
|
---|
299 |
|
---|
300 | struct dpm_readpp_desc {
|
---|
301 | int dataSize;
|
---|
302 | int offset;
|
---|
303 | int dataValid;
|
---|
304 | char *buffer;
|
---|
305 | };
|
---|
306 |
|
---|
307 | struct dpm_writepp_desc {
|
---|
308 | int dataSize;
|
---|
309 | int offset;
|
---|
310 | char *buffer;
|
---|
311 | };
|
---|
312 |
|
---|
313 | #define TS_TO_HOST 1 /* read modules timestamp counter */
|
---|
314 | /* of last SYNC message */
|
---|
315 | #define TS_TO_MODULE 0 /* synchronizing module by writing timestamp */
|
---|
316 |
|
---|
317 |
|
---|
318 | #ifdef INKERNEL
|
---|
319 | /************************************************************************/
|
---|
320 | /* DEFINES */
|
---|
321 | /************************************************************************/
|
---|
322 |
|
---|
323 | #define MAXNDEV 1 /* I/O-channel per module */
|
---|
324 | #define BOARDTYP (1<<7) /* d7=1 VMOD-IG, d7=0 VMOD-IO */
|
---|
325 | #define I_ENABLE 1
|
---|
326 |
|
---|
327 | /* MICAN3 */
|
---|
328 | #define DPM_PAGEWIDTH 256 /* ICAN3 */
|
---|
329 |
|
---|
330 | #ifdef BIG_ENDIAN
|
---|
331 | struct dpmw { /* structure for BIG_ENDIAN */
|
---|
332 | unsigned char unused;
|
---|
333 | unsigned char spec; /* message specifier */
|
---|
334 | unsigned char len_l; /* data length low byte */
|
---|
335 | unsigned char len_h; /* data length high byte */
|
---|
336 | unsigned char data[MSGLEN]; /* raw data */
|
---|
337 | unsigned char page_sel; /* page selector */
|
---|
338 | unsigned char gap1;
|
---|
339 | unsigned char intgen; /* wr: generate inter. on ICAN3 */
|
---|
340 | /* rd: clear MODULbus interrupt */
|
---|
341 | unsigned char gap2;
|
---|
342 | unsigned char reset; /* generate reset on ICAN3 */
|
---|
343 | unsigned char gap3;
|
---|
344 | unsigned char tpureq; /* signal to tpu on ICAN3 */
|
---|
345 | };
|
---|
346 | #endif
|
---|
347 |
|
---|
348 | #ifdef LITTLE_ENDIAN
|
---|
349 | struct dpmw { /* structure for LITTLE_ENDIAN */
|
---|
350 | unsigned char spec; /* message specifier */
|
---|
351 | unsigned char unused;
|
---|
352 | unsigned char len_h; /* data length high byte */
|
---|
353 | unsigned char len_l; /* data length low byte */
|
---|
354 | unsigned char data[MSGLEN]; /* raw data */
|
---|
355 | unsigned char gap1;
|
---|
356 | unsigned char page_sel; /* page selector */
|
---|
357 | unsigned char gap2;
|
---|
358 | unsigned char intgen; /* wr: generate inter. on ICAN3 */
|
---|
359 | /* rd: clear MODULbus interrupt */
|
---|
360 | unsigned char gap3;
|
---|
361 | unsigned char reset; /* generate reset on ICAN3 */
|
---|
362 | unsigned char gap4;
|
---|
363 | unsigned char tpureq; /* signal to tpu on ICAN3 */
|
---|
364 | };
|
---|
365 | #endif
|
---|
366 |
|
---|
367 |
|
---|
368 | #define START_BUFF 9 /* first free page within DPM */
|
---|
369 |
|
---|
370 | /* New stylish host interface */
|
---|
371 |
|
---|
372 | #ifdef BIG_ENDIAN
|
---|
373 | struct dpmw_desc {
|
---|
374 | unsigned char control; /* control byte */
|
---|
375 | unsigned char buffer; /* buffer pointer */
|
---|
376 | };
|
---|
377 | #endif
|
---|
378 |
|
---|
379 | #ifdef LITTLE_ENDIAN
|
---|
380 | struct dpmw_desc {
|
---|
381 | unsigned char buffer; /* buffer pointer */
|
---|
382 | unsigned char control; /* control byte */
|
---|
383 | };
|
---|
384 | #endif
|
---|
385 |
|
---|
386 | #define DPM_DESC_VALID (1<<7)
|
---|
387 | #define DPM_DESC_WRAP (1<<6)
|
---|
388 | #define DPM_DESC_INTR (1<<5)
|
---|
389 | #define DPM_DESC_IVALID (1<<4)
|
---|
390 | #define DPM_DESC_LEN (7<<0)
|
---|
391 |
|
---|
392 |
|
---|
393 | /* Fast dpmqueue host interface */
|
---|
394 |
|
---|
395 | #define FDPMQUEUE_LEN 14 /* data elements in each buffer */
|
---|
396 |
|
---|
397 |
|
---|
398 | #ifdef BIG_ENDIAN
|
---|
399 | struct fdpmw_desc {
|
---|
400 | unsigned char control;
|
---|
401 | unsigned char spec;
|
---|
402 | unsigned char data[FDPMQUEUE_LEN];
|
---|
403 | };
|
---|
404 | #endif
|
---|
405 |
|
---|
406 | #ifdef LITTLE_ENDIAN
|
---|
407 | struct fdpmw_desc {
|
---|
408 | unsigned char spec;
|
---|
409 | unsigned char control;
|
---|
410 | unsigned char data[FDPMQUEUE_LEN];
|
---|
411 | };
|
---|
412 | #endif
|
---|
413 |
|
---|
414 | #define FDPM_DESC_VALID (1<<7)
|
---|
415 | #define FDPM_DESC_WRAP (1<<6)
|
---|
416 | #define FDPM_DESC_IVALID (1<<4)
|
---|
417 |
|
---|
418 | /* Definition of fast-queue-fromhost priorization */
|
---|
419 | #define FDPMQUEUE_FROMHOST_NO_INIT 0
|
---|
420 | #define FDPMQUEUE_FROMHOST_1_PRIO 1
|
---|
421 | #define FDPMQUEUE_FROMHOST_N_PRIO 3
|
---|
422 |
|
---|
423 | #ifdef BIG_ENDIAN
|
---|
424 | #define DPMW_MSYNC_LOCL_ADDR 0x1
|
---|
425 | #define DPMW_MSYNC_PEER_ADDR 0x0
|
---|
426 | #define DPMW_TARGET_RUN_ADDR 0x2
|
---|
427 | #define TIME_STAMP_0_ADDR 0x10
|
---|
428 | #define TIME_STAMP_1_ADDR 0x11
|
---|
429 | #define TIME_STAMP_2_ADDR 0x12
|
---|
430 | #define TIME_STAMP_3_ADDR 0x13
|
---|
431 | #endif
|
---|
432 |
|
---|
433 | #ifdef LITTLE_ENDIAN
|
---|
434 | #define DPMW_MSYNC_LOCL_ADDR 0x0
|
---|
435 | #define DPMW_MSYNC_PEER_ADDR 0x1
|
---|
436 | #define DPMW_TARGET_RUN_ADDR 0x3
|
---|
437 | #define TIME_STAMP_0_ADDR 0x12
|
---|
438 | #define TIME_STAMP_1_ADDR 0x13
|
---|
439 | #define TIME_STAMP_2_ADDR 0x10
|
---|
440 | #define TIME_STAMP_3_ADDR 0x11
|
---|
441 | #endif
|
---|
442 |
|
---|
443 | /* end of defined MICAN3 */
|
---|
444 |
|
---|
445 | /* MICAN2 */
|
---|
446 |
|
---|
447 | #ifdef BIG_ENDIAN
|
---|
448 | struct dpm { /* structure for MOTOROLA type */
|
---|
449 | unsigned char page_sel; /* page selector */
|
---|
450 | unsigned char unused;
|
---|
451 | unsigned char intgen; /* wr: generate inter. on ICAN2 */
|
---|
452 | /* rd: clear MODULbus interrupt */
|
---|
453 | unsigned char spec; /* message specifier */
|
---|
454 | unsigned char reset; /* generate reset on ICAN2 */
|
---|
455 | unsigned char len_l; /* data length low byte */
|
---|
456 | unsigned char gap0;
|
---|
457 | unsigned char len_h; /* data length high byte */
|
---|
458 | unsigned char gap_1;
|
---|
459 | unsigned char data[MSGLEN * 2]; /* raw data */
|
---|
460 | };
|
---|
461 | #endif
|
---|
462 |
|
---|
463 | #ifdef LITTLE_ENDIAN
|
---|
464 | struct dpm { /* structure for INTEL-LIKE type */
|
---|
465 | unsigned char unused;
|
---|
466 | unsigned char page_sel; /* page selector */
|
---|
467 | unsigned char spec; /* message specifier */
|
---|
468 | unsigned char intgen; /* wr: generate inter. on ICAN2 */
|
---|
469 | /* rd: clear MODULbus interrupt */
|
---|
470 | unsigned char len_l; /* data length low byte */
|
---|
471 | unsigned char reset; /* generate reset on ICAN2 */
|
---|
472 | unsigned char len_h; /* data length high byte */
|
---|
473 | unsigned char gap0;
|
---|
474 | unsigned char data[MSGLEN * 2]; /* raw data */
|
---|
475 | unsigned char gap_1;
|
---|
476 | };
|
---|
477 | #endif
|
---|
478 |
|
---|
479 | /* New stylish host interface */
|
---|
480 |
|
---|
481 | #ifdef BIG_ENDIAN
|
---|
482 | struct dpm_desc {
|
---|
483 | unsigned char gap1;
|
---|
484 | unsigned char control; /* control byte */
|
---|
485 | unsigned char gap2;
|
---|
486 | unsigned char buffer; /* buffer pointer */
|
---|
487 | };
|
---|
488 | #endif
|
---|
489 |
|
---|
490 | #ifdef LITTLE_ENDIAN
|
---|
491 | struct dpm_desc {
|
---|
492 | unsigned char control; /* control byte */
|
---|
493 | unsigned char gap1;
|
---|
494 | unsigned char buffer; /* buffer pointer */
|
---|
495 | unsigned char gap2;
|
---|
496 | };
|
---|
497 | #endif
|
---|
498 |
|
---|
499 | #define DPM_DESC_VALID (1<<7)
|
---|
500 | #define DPM_DESC_WRAP (1<<6)
|
---|
501 | #define DPM_DESC_INTR (1<<5)
|
---|
502 | #define DPM_DESC_IVALID (1<<4)
|
---|
503 | #define DPM_DESC_LEN (7<<0)
|
---|
504 |
|
---|
505 |
|
---|
506 | /* Fast dpmqueue host interface */
|
---|
507 |
|
---|
508 | #define FDPMQUEUE_LEN 14
|
---|
509 |
|
---|
510 | #ifdef BIG_ENDIAN
|
---|
511 | struct fdpm_desc {
|
---|
512 | unsigned char gap1;
|
---|
513 | unsigned char control;
|
---|
514 | unsigned char gap2;
|
---|
515 | unsigned char spec;
|
---|
516 | unsigned char gap3;
|
---|
517 | unsigned char data[2*FDPMQUEUE_LEN-1];
|
---|
518 | };
|
---|
519 | #endif
|
---|
520 |
|
---|
521 | #ifdef LITTLE_ENDIAN
|
---|
522 | struct fdpm_desc {
|
---|
523 | unsigned char control;
|
---|
524 | unsigned char gap1;
|
---|
525 | unsigned char spec;
|
---|
526 | unsigned char gap2;
|
---|
527 | unsigned char data[2*FDPMQUEUE_LEN-1];
|
---|
528 | unsigned char gap3;
|
---|
529 | };
|
---|
530 | #endif
|
---|
531 |
|
---|
532 | #ifdef BIG_ENDIAN
|
---|
533 | #define DPM_MSYNC_LOCL_ADDR 0x3
|
---|
534 | #define DPM_MSYNC_PEER_ADDR 0x1
|
---|
535 | #define DPM_TARGET_RUN_ADDR 0x5
|
---|
536 | #endif
|
---|
537 |
|
---|
538 | #ifdef LITTLE_ENDIAN
|
---|
539 | #define DPM_MSYNC_LOCL_ADDR 0x2
|
---|
540 | #define DPM_MSYNC_PEER_ADDR 0x0
|
---|
541 | #define DPM_TARGET_RUN_ADDR 0x4
|
---|
542 | #endif
|
---|
543 |
|
---|
544 | /* swap macro for MOTOROLA <-> INTEL access on ICAN3 */
|
---|
545 | #ifdef LITTLE_ENDIAN
|
---|
546 | #define SWAP_WORD(x) (((x & 0xff) << 8) | (0xff & (x >> 8)))
|
---|
547 | #endif
|
---|
548 | #ifdef BIG_ENDIAN
|
---|
549 | #define SWAP_WORD(x) (x)
|
---|
550 | #endif
|
---|
551 |
|
---|
552 | #endif /* #ifdef INKERNEL */
|
---|
553 |
|
---|
554 | #define TOHOST_DPM_QUEUE_PAGE 5 /* tohost_dpmqueue page */
|
---|
555 | #define FROMHOST_DPM_QUEUE_PAGE 6 /* fromhost_dpmqueue page prio mid */
|
---|
556 | #define FROMHOST_DPM_QUEUE_HI_PAGE 7 /* fromhost_dpmqueue page prio high */
|
---|
557 | #define FROMHOST_DPM_QUEUE_LOW_PAGE 8 /* fromhost_dpmqueue page prio low */
|
---|
558 | #define START_BUFF 9 /* first free page within DPM */
|
---|
559 |
|
---|
560 |
|
---|
561 | /*----------routing specific defines ------------------------*/
|
---|
562 |
|
---|
563 | /* CAN Identifiers used by CAL (cf. CiA/DS204-1, Annex I) */
|
---|
564 | #define ID_START_STOP 0 /* Node Start, Stop, Disconnect */
|
---|
565 | #define ID_CMS_NIL 0 /* invalid CMS Id */
|
---|
566 | #define ID_CMS_MIN 1 /* range of CMS */
|
---|
567 | #define ID_CMS_MAX 1760 /* identifiers */
|
---|
568 | #define ID_GUARD_NIL 0 /* invalid guard Id */
|
---|
569 | #define ID_GUARD_MIN 1761 /* range of guarding */
|
---|
570 | #define ID_GUARD_MAX 2015 /* identifiers */
|
---|
571 | #define ID_LMT_S 2020 /* from LMT Slave */
|
---|
572 | #define ID_LMT_M 2021 /* from LMT Master */
|
---|
573 | #define ID_NMT_IDENTIFY 2022 /* Identify Node Protocol */
|
---|
574 | #define ID_DBT_S 2023 /* from DBT Slave */
|
---|
575 | #define ID_DBT_M 2024 /* from DBT Master */
|
---|
576 | #define ID_NMT_S 2025 /* from NMT Slave */
|
---|
577 | #define ID_NMT_M 2026 /* from NMT Master */
|
---|
578 | #define ID_SELFTEST 2027 /* for module selftest */
|
---|
579 | #define ID_MIN 0 /* range of identifiers */
|
---|
580 | #define ID_MAX 2031 /* controlled by CiA */
|
---|
581 |
|
---|
582 | #define MAX_ROUTES_PER_ID (ID_MAX * 2)
|
---|
583 | /* should be enough... */
|
---|
584 |
|
---|
585 | #define NIL_ROUT (struct rout_target *) 0
|
---|
586 | /* NIL pointer for "no routing" */
|
---|
587 |
|
---|
588 | #define NIL_NIL_ROUT (struct rout_target **) 0
|
---|
589 | /* NIL pointer for "no routing" */
|
---|
590 |
|
---|
591 | #define NIL_DPM_DEV (DPM_DEV *) -1
|
---|
592 | /* NIL pointer for "no routing" */
|
---|
593 |
|
---|
594 | #define BLANC 0xffff /* empty / last entry indicator in */
|
---|
595 | /* rout_target->target_id struct */
|
---|
596 | /* member */
|
---|
597 |
|
---|
598 | /* prioritized fast-fromhost-queue specific defines/structures */
|
---|
599 |
|
---|
600 | struct fromHostFastDpmQPrioEntry {
|
---|
601 | unsigned short priority;
|
---|
602 | volatile struct fdpmw_desc *fhfdpmQueue;
|
---|
603 | int fhfdpmQueueP;
|
---|
604 | int fhfdpmQueueStartP;
|
---|
605 | struct fromHostFastDpmQPrioEntry *next;
|
---|
606 | };
|
---|
607 | #define NIL_FHFDQ_PRIO_ENTRY (struct fromHostFastDpmQPrioEntry *)0
|
---|
608 |
|
---|
609 | #ifdef __cplusplus
|
---|
610 | }
|
---|
611 | #endif
|
---|
612 |
|
---|
613 | #endif /* __INCdpmh */
|
---|
614 |
|
---|