| 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 |  | 
|---|