lib/master.c
branchstable-1.5
changeset 2426 58572b4208ba
parent 2419 fdb85a806585
child 2427 17ada1c77acc
equal deleted inserted replaced
2425:6a6dec6fc806 2426:58572b4208ba
     1 /******************************************************************************
     1 /*****************************************************************************
     2  *
     2  *
     3  *  $Id$
     3  *  $Id$
     4  *
     4  *
     5  *  Copyright (C) 2006-2009  Florian Pose, Ingenieurgemeinschaft IgH
     5  *  Copyright (C) 2006-2009  Florian Pose, Ingenieurgemeinschaft IgH
     6  *
     6  *
    24  *
    24  *
    25  *  The license mentioned above concerns the source code only. Using the
    25  *  The license mentioned above concerns the source code only. Using the
    26  *  EtherCAT technology and brand is only permitted in compliance with the
    26  *  EtherCAT technology and brand is only permitted in compliance with the
    27  *  industrial property and similar rights of Beckhoff Automation GmbH.
    27  *  industrial property and similar rights of Beckhoff Automation GmbH.
    28  *
    28  *
    29  *****************************************************************************/
    29  ****************************************************************************/
    30 
    30 
    31 #include <stdlib.h>
    31 #include <stdlib.h>
    32 #include <sys/ioctl.h>
    32 #include <sys/ioctl.h>
    33 #include <stdio.h>
    33 #include <stdio.h>
    34 #include <errno.h>
    34 #include <errno.h>
    38 #include "master.h"
    38 #include "master.h"
    39 #include "domain.h"
    39 #include "domain.h"
    40 #include "slave_config.h"
    40 #include "slave_config.h"
    41 #include "master/ioctl.h"
    41 #include "master/ioctl.h"
    42 
    42 
    43 /*****************************************************************************/
    43 /****************************************************************************/
    44 
    44 
    45 int ecrt_master_reserve(ec_master_t *master)
    45 int ecrt_master_reserve(ec_master_t *master)
    46 {
    46 {
    47     if (ioctl(master->fd, EC_IOCTL_REQUEST, NULL) == -1) {
    47     if (ioctl(master->fd, EC_IOCTL_REQUEST, NULL) == -1) {
    48         fprintf(stderr, "Failed to reserve master: %s\n",
    48         fprintf(stderr, "Failed to reserve master: %s\n",
    50         return -1;
    50         return -1;
    51     }
    51     }
    52     return 0;
    52     return 0;
    53 }
    53 }
    54 
    54 
    55 /*****************************************************************************/
    55 /****************************************************************************/
    56 
    56 
    57 void ec_master_clear_config(ec_master_t *master)
    57 void ec_master_clear_config(ec_master_t *master)
    58 {
    58 {
    59     ec_domain_t *d, *next_d;
    59     ec_domain_t *d, *next_d;
    60     ec_slave_config_t *c, *next_c;
    60     ec_slave_config_t *c, *next_c;
    74         c = next_c;
    74         c = next_c;
    75     }
    75     }
    76     master->first_config = NULL;
    76     master->first_config = NULL;
    77 }
    77 }
    78 
    78 
    79 /*****************************************************************************/
    79 /****************************************************************************/
    80 
    80 
    81 void ec_master_clear(ec_master_t *master)
    81 void ec_master_clear(ec_master_t *master)
    82 {
    82 {
    83     if (master->process_data)  {
    83     if (master->process_data)  {
    84         munmap(master->process_data, master->process_data_size);
    84         munmap(master->process_data, master->process_data_size);
    89     if (master->fd != -1) {
    89     if (master->fd != -1) {
    90         close(master->fd);
    90         close(master->fd);
    91     }
    91     }
    92 }
    92 }
    93 
    93 
    94 /*****************************************************************************/
    94 /****************************************************************************/
    95 
    95 
    96 void ec_master_add_domain(ec_master_t *master, ec_domain_t *domain)
    96 void ec_master_add_domain(ec_master_t *master, ec_domain_t *domain)
    97 {
    97 {
    98     if (master->first_domain) {
    98     if (master->first_domain) {
    99         ec_domain_t *d = master->first_domain;
    99         ec_domain_t *d = master->first_domain;
   104     } else {
   104     } else {
   105         master->first_domain = domain;
   105         master->first_domain = domain;
   106     }
   106     }
   107 }
   107 }
   108 
   108 
   109 /*****************************************************************************/
   109 /****************************************************************************/
   110 
   110 
   111 ec_domain_t *ecrt_master_create_domain(ec_master_t *master)
   111 ec_domain_t *ecrt_master_create_domain(ec_master_t *master)
   112 {
   112 {
   113     ec_domain_t *domain;
   113     ec_domain_t *domain;
   114     int index;
   114     int index;
   134     ec_master_add_domain(master, domain);
   134     ec_master_add_domain(master, domain);
   135 
   135 
   136     return domain;
   136     return domain;
   137 }
   137 }
   138 
   138 
   139 /*****************************************************************************/
   139 /****************************************************************************/
   140 
   140 
   141 void ec_master_add_slave_config(ec_master_t *master, ec_slave_config_t *sc)
   141 void ec_master_add_slave_config(ec_master_t *master, ec_slave_config_t *sc)
   142 {
   142 {
   143     if (master->first_config) {
   143     if (master->first_config) {
   144         ec_slave_config_t *c = master->first_config;
   144         ec_slave_config_t *c = master->first_config;
   149     } else {
   149     } else {
   150         master->first_config = sc;
   150         master->first_config = sc;
   151     }
   151     }
   152 }
   152 }
   153 
   153 
   154 /*****************************************************************************/
   154 /****************************************************************************/
   155 
   155 
   156 ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
   156 ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
   157         uint16_t alias, uint16_t position, uint32_t vendor_id,
   157         uint16_t alias, uint16_t position, uint32_t vendor_id,
   158         uint32_t product_code)
   158         uint32_t product_code)
   159 {
   159 {
   190     ec_master_add_slave_config(master, sc);
   190     ec_master_add_slave_config(master, sc);
   191 
   191 
   192     return sc;
   192     return sc;
   193 }
   193 }
   194 
   194 
   195 /*****************************************************************************/
   195 /****************************************************************************/
   196 
   196 
   197 int ecrt_master(ec_master_t* master, ec_master_info_t *master_info)
   197 int ecrt_master(ec_master_t* master, ec_master_info_t *master_info)
   198 {
   198 {
   199     ec_ioctl_master_t data;
   199     ec_ioctl_master_t data;
   200 
   200 
   208     master_info->scan_busy = data.scan_busy;
   208     master_info->scan_busy = data.scan_busy;
   209     master_info->app_time = data.app_time;
   209     master_info->app_time = data.app_time;
   210     return 0;
   210     return 0;
   211 }
   211 }
   212 
   212 
   213 /*****************************************************************************/
   213 /****************************************************************************/
   214 
   214 
   215 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
   215 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
   216         ec_slave_info_t *slave_info)
   216         ec_slave_info_t *slave_info)
   217 {
   217 {
   218     ec_ioctl_slave_t data;
   218     ec_ioctl_slave_t data;
   231     slave_info->revision_number = data.revision_number;
   231     slave_info->revision_number = data.revision_number;
   232     slave_info->serial_number = data.serial_number;
   232     slave_info->serial_number = data.serial_number;
   233     slave_info->alias = data.alias;
   233     slave_info->alias = data.alias;
   234     slave_info->current_on_ebus = data.current_on_ebus;
   234     slave_info->current_on_ebus = data.current_on_ebus;
   235     for ( i = 0; i < EC_MAX_PORTS; i++ ) {
   235     for ( i = 0; i < EC_MAX_PORTS; i++ ) {
   236     	slave_info->ports[i].desc = data.ports[i].desc;
   236         slave_info->ports[i].desc = data.ports[i].desc;
   237     	slave_info->ports[i].link.link_up = data.ports[i].link.link_up;
   237         slave_info->ports[i].link.link_up = data.ports[i].link.link_up;
   238     	slave_info->ports[i].link.loop_closed = data.ports[i].link.loop_closed;
   238         slave_info->ports[i].link.loop_closed =
   239     	slave_info->ports[i].link.signal_detected = data.ports[i].link.signal_detected;
   239             data.ports[i].link.loop_closed;
   240     	slave_info->ports[i].receive_time = data.ports[i].receive_time;
   240         slave_info->ports[i].link.signal_detected =
   241     	slave_info->ports[i].next_slave = data.ports[i].next_slave;
   241             data.ports[i].link.signal_detected;
   242     	slave_info->ports[i].delay_to_next_dc = data.ports[i].delay_to_next_dc;
   242         slave_info->ports[i].receive_time = data.ports[i].receive_time;
       
   243         slave_info->ports[i].next_slave = data.ports[i].next_slave;
       
   244         slave_info->ports[i].delay_to_next_dc =
       
   245             data.ports[i].delay_to_next_dc;
   243     }
   246     }
   244     slave_info->al_state = data.al_state;
   247     slave_info->al_state = data.al_state;
   245     slave_info->error_flag = data.error_flag;
   248     slave_info->error_flag = data.error_flag;
   246     slave_info->sync_count = data.sync_count;
   249     slave_info->sync_count = data.sync_count;
   247     slave_info->sdo_count = data.sdo_count;
   250     slave_info->sdo_count = data.sdo_count;
   248     strncpy(slave_info->name, data.name, EC_MAX_STRING_LENGTH);
   251     strncpy(slave_info->name, data.name, EC_MAX_STRING_LENGTH);
   249     return 0;
   252     return 0;
   250 }
   253 }
   251 
   254 
   252 /*****************************************************************************/
   255 /****************************************************************************/
   253 
   256 
   254 int ecrt_master_get_sync_manager(ec_master_t *master, uint16_t slave_position,
   257 int ecrt_master_get_sync_manager(ec_master_t *master, uint16_t slave_position,
   255         uint8_t sync_index, ec_sync_info_t *sync)
   258         uint8_t sync_index, ec_sync_info_t *sync)
   256 {
   259 {
   257     ec_ioctl_slave_sync_t data;
   260     ec_ioctl_slave_sync_t data;
   279         EC_WD_ENABLE : EC_WD_DISABLE;
   282         EC_WD_ENABLE : EC_WD_DISABLE;
   280 
   283 
   281     return 0;
   284     return 0;
   282 }
   285 }
   283 
   286 
   284 /*****************************************************************************/
   287 /****************************************************************************/
   285 
   288 
   286 int ecrt_master_get_pdo(ec_master_t *master, uint16_t slave_position,
   289 int ecrt_master_get_pdo(ec_master_t *master, uint16_t slave_position,
   287         uint8_t sync_index, uint16_t pos, ec_pdo_info_t *pdo)
   290         uint8_t sync_index, uint16_t pos, ec_pdo_info_t *pdo)
   288 {
   291 {
   289     ec_ioctl_slave_sync_pdo_t data;
   292     ec_ioctl_slave_sync_pdo_t data;
   307     pdo->entries = NULL;
   310     pdo->entries = NULL;
   308 
   311 
   309     return 0;
   312     return 0;
   310 }
   313 }
   311 
   314 
   312 /*****************************************************************************/
   315 /****************************************************************************/
   313 
   316 
   314 int ecrt_master_get_pdo_entry(ec_master_t *master, uint16_t slave_position,
   317 int ecrt_master_get_pdo_entry(ec_master_t *master, uint16_t slave_position,
   315         uint8_t sync_index, uint16_t pdo_pos, uint16_t entry_pos,
   318         uint8_t sync_index, uint16_t pdo_pos, uint16_t entry_pos,
   316         ec_pdo_entry_info_t *entry)
   319         ec_pdo_entry_info_t *entry)
   317 {
   320 {
   337     entry->bit_length = data.bit_length;
   340     entry->bit_length = data.bit_length;
   338 
   341 
   339     return 0;
   342     return 0;
   340 }
   343 }
   341 
   344 
   342 /*****************************************************************************/
   345 /****************************************************************************/
   343 
   346 
   344 int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position,
   347 int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position,
   345         uint16_t index, uint8_t subindex, uint8_t *data,
   348         uint16_t index, uint8_t subindex, uint8_t *data,
   346         size_t data_size, uint32_t *abort_code)
   349         size_t data_size, uint32_t *abort_code)
   347 {
   350 {
   364     }
   367     }
   365 
   368 
   366     return 0;
   369     return 0;
   367 }
   370 }
   368 
   371 
   369 /*****************************************************************************/
   372 /****************************************************************************/
   370 
   373 
   371 int ecrt_master_sdo_download_complete(ec_master_t *master,
   374 int ecrt_master_sdo_download_complete(ec_master_t *master,
   372         uint16_t slave_position, uint16_t index, uint8_t *data,
   375         uint16_t slave_position, uint16_t index, uint8_t *data,
   373         size_t data_size, uint32_t *abort_code)
   376         size_t data_size, uint32_t *abort_code)
   374 {
   377 {
   391     }
   394     }
   392 
   395 
   393     return 0;
   396     return 0;
   394 }
   397 }
   395 
   398 
   396 /*****************************************************************************/
   399 /****************************************************************************/
   397 
   400 
   398 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position,
   401 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position,
   399         uint16_t index, uint8_t subindex, uint8_t *target,
   402         uint16_t index, uint8_t subindex, uint8_t *target,
   400         size_t target_size, size_t *result_size, uint32_t *abort_code)
   403         size_t target_size, size_t *result_size, uint32_t *abort_code)
   401 {
   404 {
   418 
   421 
   419     *result_size = upload.data_size;
   422     *result_size = upload.data_size;
   420     return 0;
   423     return 0;
   421 }
   424 }
   422 
   425 
   423 /*****************************************************************************/
   426 /****************************************************************************/
   424 
   427 
   425 int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position,
   428 int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position,
   426         uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size,
   429         uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size,
   427         uint16_t *error_code)
   430         uint16_t *error_code)
   428 {
   431 {
   443     }
   446     }
   444 
   447 
   445     return 0;
   448     return 0;
   446 }
   449 }
   447 
   450 
   448 /*****************************************************************************/
   451 /****************************************************************************/
   449 
   452 
   450 int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position,
   453 int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position,
   451         uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size,
   454         uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size,
   452         size_t *result_size, uint16_t *error_code)
   455         size_t *result_size, uint16_t *error_code)
   453 {
   456 {
   469 
   472 
   470     *result_size = io.data_size;
   473     *result_size = io.data_size;
   471     return 0;
   474     return 0;
   472 }
   475 }
   473 
   476 
   474 /*****************************************************************************/
   477 /****************************************************************************/
   475 
   478 
   476 int ecrt_master_activate(ec_master_t *master)
   479 int ecrt_master_activate(ec_master_t *master)
   477 {
   480 {
   478     if (ioctl(master->fd, EC_IOCTL_ACTIVATE,
   481     if (ioctl(master->fd, EC_IOCTL_ACTIVATE,
   479                 &master->process_data_size) == -1) {
   482                 &master->process_data_size) == -1) {
   484 
   487 
   485     if (master->process_data_size) {
   488     if (master->process_data_size) {
   486         master->process_data = mmap(0, master->process_data_size,
   489         master->process_data = mmap(0, master->process_data_size,
   487                 PROT_READ | PROT_WRITE, MAP_SHARED, master->fd, 0);
   490                 PROT_READ | PROT_WRITE, MAP_SHARED, master->fd, 0);
   488         if (master->process_data == MAP_FAILED) {
   491         if (master->process_data == MAP_FAILED) {
   489             fprintf(stderr, "Failed to map process data: %s", strerror(errno));
   492             fprintf(stderr, "Failed to map process data: %s",
       
   493                     strerror(errno));
   490             master->process_data = NULL;
   494             master->process_data = NULL;
   491             master->process_data_size = 0;
   495             master->process_data_size = 0;
   492             return -1; // FIXME
   496             return -1; // FIXME
   493         }
   497         }
   494 
   498 
   497     }
   501     }
   498 
   502 
   499     return 0;
   503     return 0;
   500 }
   504 }
   501 
   505 
   502 /*****************************************************************************/
   506 /****************************************************************************/
   503 
   507 
   504 void ecrt_master_deactivate(ec_master_t *master)
   508 void ecrt_master_deactivate(ec_master_t *master)
   505 {
   509 {
   506     if (ioctl(master->fd, EC_IOCTL_DEACTIVATE, NULL) == -1) {
   510     if (ioctl(master->fd, EC_IOCTL_DEACTIVATE, NULL) == -1) {
   507         fprintf(stderr, "Failed to deactivate master: %s\n", strerror(errno));
   511         fprintf(stderr, "Failed to deactivate master: %s\n", strerror(errno));
   509     }
   513     }
   510 
   514 
   511     ec_master_clear_config(master);
   515     ec_master_clear_config(master);
   512 }
   516 }
   513 
   517 
   514 /*****************************************************************************/
   518 /****************************************************************************/
   515 
   519 
   516 int ecrt_master_set_send_interval(ec_master_t *master,size_t send_interval_us)
   520 int ecrt_master_set_send_interval(ec_master_t *master,
       
   521         size_t send_interval_us)
   517 {
   522 {
   518     if (ioctl(master->fd, EC_IOCTL_SET_SEND_INTERVAL,
   523     if (ioctl(master->fd, EC_IOCTL_SET_SEND_INTERVAL,
   519                 &send_interval_us) == -1) {
   524                 &send_interval_us) == -1) {
   520         fprintf(stderr, "Failed to set send interval: %s\n",
   525         fprintf(stderr, "Failed to set send interval: %s\n",
   521                 strerror(errno));
   526                 strerror(errno));
   522         return -1; // FIXME
   527         return -1; // FIXME
   523     }
   528     }
   524     return 0;
   529     return 0;
   525 }
   530 }
   526 
   531 
   527 /*****************************************************************************/
   532 /****************************************************************************/
   528 
   533 
   529 void ecrt_master_send(ec_master_t *master)
   534 void ecrt_master_send(ec_master_t *master)
   530 {
   535 {
   531     if (ioctl(master->fd, EC_IOCTL_SEND, NULL) == -1) {
   536     if (ioctl(master->fd, EC_IOCTL_SEND, NULL) == -1) {
   532         fprintf(stderr, "Failed to send: %s\n", strerror(errno));
   537         fprintf(stderr, "Failed to send: %s\n", strerror(errno));
   533     }
   538     }
   534 }
   539 }
   535 
   540 
   536 /*****************************************************************************/
   541 /****************************************************************************/
   537 
   542 
   538 void ecrt_master_receive(ec_master_t *master)
   543 void ecrt_master_receive(ec_master_t *master)
   539 {
   544 {
   540     if (ioctl(master->fd, EC_IOCTL_RECEIVE, NULL) == -1) {
   545     if (ioctl(master->fd, EC_IOCTL_RECEIVE, NULL) == -1) {
   541         fprintf(stderr, "Failed to receive: %s\n", strerror(errno));
   546         fprintf(stderr, "Failed to receive: %s\n", strerror(errno));
   542     }
   547     }
   543 }
   548 }
   544 
   549 
   545 /*****************************************************************************/
   550 /****************************************************************************/
   546 
   551 
   547 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
   552 void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
   548 {
   553 {
   549     if (ioctl(master->fd, EC_IOCTL_MASTER_STATE, state) == -1) {
   554     if (ioctl(master->fd, EC_IOCTL_MASTER_STATE, state) == -1) {
   550         fprintf(stderr, "Failed to get master state: %s\n", strerror(errno));
   555         fprintf(stderr, "Failed to get master state: %s\n", strerror(errno));
   551     }
   556     }
   552 }
   557 }
   553 
   558 
   554 /*****************************************************************************/
   559 /****************************************************************************/
   555 
   560 
   556 int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx,
   561 int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx,
   557         ec_master_link_state_t *state)
   562         ec_master_link_state_t *state)
   558 {
   563 {
   559     ec_ioctl_link_state_t io;
   564     ec_ioctl_link_state_t io;
   564         fprintf(stderr, "Failed to get link state: %s\n", strerror(errno));
   569         fprintf(stderr, "Failed to get link state: %s\n", strerror(errno));
   565         return -errno;
   570         return -errno;
   566     }
   571     }
   567 }
   572 }
   568 
   573 
   569 /*****************************************************************************/
   574 /****************************************************************************/
   570 
   575 
   571 void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
   576 void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
   572 {
   577 {
   573     ec_ioctl_app_time_t data;
   578     ec_ioctl_app_time_t data;
   574 
   579 
   578         fprintf(stderr, "Failed to set application time: %s\n",
   583         fprintf(stderr, "Failed to set application time: %s\n",
   579                 strerror(errno));
   584                 strerror(errno));
   580     }
   585     }
   581 }
   586 }
   582 
   587 
   583 /*****************************************************************************/
   588 /****************************************************************************/
   584 
   589 
   585 void ecrt_master_sync_reference_clock(ec_master_t *master)
   590 void ecrt_master_sync_reference_clock(ec_master_t *master)
   586 {
   591 {
   587     if (ioctl(master->fd, EC_IOCTL_SYNC_REF, NULL) == -1) {
   592     if (ioctl(master->fd, EC_IOCTL_SYNC_REF, NULL) == -1) {
   588         fprintf(stderr, "Failed to sync reference clock: %s\n",
   593         fprintf(stderr, "Failed to sync reference clock: %s\n",
   589                 strerror(errno));
   594                 strerror(errno));
   590     }
   595     }
   591 }
   596 }
   592 
   597 
   593 /*****************************************************************************/
   598 /****************************************************************************/
   594 
   599 
   595 void ecrt_master_sync_slave_clocks(ec_master_t *master)
   600 void ecrt_master_sync_slave_clocks(ec_master_t *master)
   596 {
   601 {
   597     if (ioctl(master->fd, EC_IOCTL_SYNC_SLAVES, NULL) == -1) {
   602     if (ioctl(master->fd, EC_IOCTL_SYNC_SLAVES, NULL) == -1) {
   598         fprintf(stderr, "Failed to sync slave clocks: %s\n", strerror(errno));
   603         fprintf(stderr, "Failed to sync slave clocks: %s\n", strerror(errno));
   599     }
   604     }
   600 }
   605 }
   601 
   606 
   602 /*****************************************************************************/
   607 /****************************************************************************/
   603 
   608 
   604 void ecrt_master_sync_monitor_queue(ec_master_t *master)
   609 void ecrt_master_sync_monitor_queue(ec_master_t *master)
   605 {
   610 {
   606     if (ioctl(master->fd, EC_IOCTL_SYNC_MON_QUEUE, NULL) == -1) {
   611     if (ioctl(master->fd, EC_IOCTL_SYNC_MON_QUEUE, NULL) == -1) {
   607         fprintf(stderr, "Failed to queue sync monitor datagram: %s\n",
   612         fprintf(stderr, "Failed to queue sync monitor datagram: %s\n",
   608                 strerror(errno));
   613                 strerror(errno));
   609     }
   614     }
   610 }
   615 }
   611 
   616 
   612 /*****************************************************************************/
   617 /****************************************************************************/
   613 
   618 
   614 uint32_t ecrt_master_sync_monitor_process(ec_master_t *master)
   619 uint32_t ecrt_master_sync_monitor_process(ec_master_t *master)
   615 {
   620 {
   616     uint32_t time_diff;
   621     uint32_t time_diff;
   617 
   622 
   622     }
   627     }
   623 
   628 
   624     return time_diff;
   629     return time_diff;
   625 }
   630 }
   626 
   631 
   627 /*****************************************************************************/
   632 /****************************************************************************/
   628 
   633 
   629 void ecrt_master_reset(ec_master_t *master)
   634 void ecrt_master_reset(ec_master_t *master)
   630 {
   635 {
   631     if (ioctl(master->fd, EC_IOCTL_RESET, NULL) == -1) {
   636     if (ioctl(master->fd, EC_IOCTL_RESET, NULL) == -1) {
   632         fprintf(stderr, "Failed to reset master: %s\n", strerror(errno));
   637         fprintf(stderr, "Failed to reset master: %s\n", strerror(errno));
   633     }
   638     }
   634 }
   639 }
   635 
   640 
   636 /*****************************************************************************/
   641 /****************************************************************************/