lib/master.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 2447 e93efb4af231
child 2703 045624f7f4c3
permissions -rw-r--r--
devices/ccat: revert "limit rx processing to one frame per poll"

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
     1
/*****************************************************************************
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
     2
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
     3
 *  $Id$
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
     4
 *
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
     5
 *  Copyright (C) 2006-2012  Florian Pose, Ingenieurgemeinschaft IgH
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
     6
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
     7
 *  This file is part of the IgH EtherCAT master userspace library.
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
     8
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
     9
 *  The IgH EtherCAT master userspace library is free software; you can
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    10
 *  redistribute it and/or modify it under the terms of the GNU Lesser General
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    11
 *  Public License as published by the Free Software Foundation; version 2.1
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    12
 *  of the License.
1287
cc7b679c74e9 Improved LGPL headers.
Florian Pose <fp@igh-essen.com>
parents: 1266
diff changeset
    13
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    14
 *  The IgH EtherCAT master userspace library is distributed in the hope that
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    15
 *  it will be useful, but WITHOUT ANY WARRANTY; without even the implied
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    16
 *  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    17
 *  GNU Lesser General Public License for more details.
1287
cc7b679c74e9 Improved LGPL headers.
Florian Pose <fp@igh-essen.com>
parents: 1266
diff changeset
    18
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    19
 *  You should have received a copy of the GNU Lesser General Public License
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    20
 *  along with the IgH EtherCAT master userspace library. If not, see
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    21
 *  <http://www.gnu.org/licenses/>.
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
    22
 *
1363
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1341
diff changeset
    23
 *  ---
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
    24
 *
1363
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1341
diff changeset
    25
 *  The license mentioned above concerns the source code only. Using the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1341
diff changeset
    26
 *  EtherCAT technology and brand is only permitted in compliance with the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1341
diff changeset
    27
 *  industrial property and similar rights of Beckhoff Automation GmbH.
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
    29
 ****************************************************************************/
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
2427
17ada1c77acc Fixed some compiler warnings.
Florian Pose <fp@igh-essen.com>
parents: 2426
diff changeset
    31
#include <unistd.h> /* close() */
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <stdlib.h>
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <stdio.h>
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include <errno.h>
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include <string.h>
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
    36
#include <sys/mman.h>
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    38
#include "ioctl.h"
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#include "master.h"
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include "domain.h"
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
    41
#include "slave_config.h"
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
    43
/****************************************************************************/
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
    45
int ecrt_master_reserve(ec_master_t *master)
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
    46
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    47
    int ret = ioctl(master->fd, EC_IOCTL_REQUEST, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    48
    if (EC_IOCTL_IS_ERROR(ret)) {
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
    49
        fprintf(stderr, "Failed to reserve master: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    50
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    51
        return -EC_IOCTL_ERRNO(ret);
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
    52
    }
1975
8e173dddd183 Improved compiling on 2.6.34 (thanks to Malcolm Lewis).
Florian Pose <fp@igh-essen.com>
parents: 1963
diff changeset
    53
    return 0;
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
    54
}
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
    55
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
    56
/****************************************************************************/
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
    57
1960
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    58
void ec_master_clear_config(ec_master_t *master)
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    59
{
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    60
    ec_domain_t *d, *next_d;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    61
    ec_slave_config_t *c, *next_c;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    62
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    63
    d = master->first_domain;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    64
    while (d) {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    65
        next_d = d->next;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    66
        ec_domain_clear(d);
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    67
        d = next_d;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    68
    }
1960
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    69
    master->first_domain = NULL;
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    70
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    71
    c = master->first_config;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    72
    while (c) {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    73
        next_c = c->next;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    74
        ec_slave_config_clear(c);
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    75
        c = next_c;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    76
    }
1960
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    77
    master->first_config = NULL;
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    78
}
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    79
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
    80
/****************************************************************************/
1960
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    81
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    82
void ec_master_clear(ec_master_t *master)
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    83
{
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    84
    if (master->process_data)  {
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    85
        munmap(master->process_data, master->process_data_size);
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    86
    }
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    87
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
    88
    ec_master_clear_config(master);
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    89
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    90
    if (master->fd != -1) {
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    91
#if USE_RTDM
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    92
        rt_dev_close(master->fd);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    93
#else
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    94
        close(master->fd);
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
    95
#endif
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    96
    }
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    97
}
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
    98
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
    99
/****************************************************************************/
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   100
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   101
void ec_master_add_domain(ec_master_t *master, ec_domain_t *domain)
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   102
{
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   103
    if (master->first_domain) {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   104
        ec_domain_t *d = master->first_domain;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   105
        while (d->next) {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   106
            d = d->next;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   107
        }
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   108
        d->next = domain;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   109
    } else {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   110
        master->first_domain = domain;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   111
    }
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   112
}
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   113
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   114
/****************************************************************************/
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   115
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
ec_domain_t *ecrt_master_create_domain(ec_master_t *master)
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
{
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
    ec_domain_t *domain;
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
    int index;
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
    domain = malloc(sizeof(ec_domain_t));
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
    if (!domain) {
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
        fprintf(stderr, "Failed to allocate memory.\n");
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
        return 0;
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
    }
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
   126
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
    index = ioctl(master->fd, EC_IOCTL_CREATE_DOMAIN, NULL);
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   128
    if (EC_IOCTL_IS_ERROR(index)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   129
        fprintf(stderr, "Failed to create domain: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   130
                strerror(EC_IOCTL_ERRNO(index)));
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
        free(domain);
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
   132
        return 0;
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
    }
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   135
    domain->next = NULL;
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
    domain->index = (unsigned int) index;
1255
38b7e05b20c1 Added some slave configuration methods.
Florian Pose <fp@igh-essen.com>
parents: 1247
diff changeset
   137
    domain->master = master;
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   138
    domain->process_data = NULL;
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   139
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   140
    ec_master_add_domain(master, domain);
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   141
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
    return domain;
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
}
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   145
/****************************************************************************/
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   147
void ec_master_add_slave_config(ec_master_t *master, ec_slave_config_t *sc)
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   148
{
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   149
    if (master->first_config) {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   150
        ec_slave_config_t *c = master->first_config;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   151
        while (c->next) {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   152
            c = c->next;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   153
        }
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   154
        c->next = sc;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   155
    } else {
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   156
        master->first_config = sc;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   157
    }
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   158
}
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   159
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   160
/****************************************************************************/
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   161
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
        uint16_t alias, uint16_t position, uint32_t vendor_id,
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
        uint32_t product_code)
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
{
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   166
    ec_ioctl_config_t data;
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   167
    ec_slave_config_t *sc;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   168
    int ret;
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   169
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   170
    sc = malloc(sizeof(ec_slave_config_t));
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   171
    if (!sc) {
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   172
        fprintf(stderr, "Failed to allocate memory.\n");
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   173
        return 0;
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   174
    }
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
   175
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   176
    data.alias = alias;
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   177
    data.position = position;
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   178
    data.vendor_id = vendor_id;
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   179
    data.product_code = product_code;
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
   180
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   181
    ret = ioctl(master->fd, EC_IOCTL_CREATE_SLAVE_CONFIG, &data);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   182
    if (EC_IOCTL_IS_ERROR(ret)) {
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   183
        fprintf(stderr, "Failed to create slave config: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   184
                strerror(EC_IOCTL_ERRNO(ret)));
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   185
        free(sc);
2241
0ba77ef52922 Insert port information into slave info.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2124
diff changeset
   186
        return 0;
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   187
    }
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   188
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   189
    sc->next = NULL;
1255
38b7e05b20c1 Added some slave configuration methods.
Florian Pose <fp@igh-essen.com>
parents: 1247
diff changeset
   190
    sc->master = master;
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   191
    sc->index = data.config_index;
1255
38b7e05b20c1 Added some slave configuration methods.
Florian Pose <fp@igh-essen.com>
parents: 1247
diff changeset
   192
    sc->alias = alias;
38b7e05b20c1 Added some slave configuration methods.
Florian Pose <fp@igh-essen.com>
parents: 1247
diff changeset
   193
    sc->position = position;
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   194
    sc->first_sdo_request = NULL;
2443
2c3ccdde3919 Added interface to read/write register contents; re-worked register requests.
Florian Pose <fp@igh-essen.com>
parents: 2433
diff changeset
   195
    sc->first_reg_request = NULL;
1959
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   196
    sc->first_voe_handler = NULL;
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   197
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   198
    ec_master_add_slave_config(master, sc);
656f114153c2 Free all userspace library objects on releasing master.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   199
1246
4042bda8c980 Creating slave configurations.
Florian Pose <fp@igh-essen.com>
parents: 1244
diff changeset
   200
    return sc;
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
}
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
2447
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   203
/*****************************************************************************/
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   204
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   205
int ecrt_master_select_reference_clock(ec_master_t *master,
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   206
        ec_slave_config_t *sc)
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   207
{
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   208
    uint32_t config_index;
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   209
    int ret;
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   210
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   211
    if (sc) {
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   212
        config_index = sc->index;
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   213
    }
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   214
    else {
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   215
        config_index = 0xFFFFFFFF;
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   216
    }
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   217
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   218
    ret = ioctl(master->fd, EC_IOCTL_SELECT_REF_CLOCK, config_index);
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   219
    if (EC_IOCTL_IS_ERROR(ret)) {
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   220
        fprintf(stderr, "Failed to select reference clock: %s\n",
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   221
                strerror(EC_IOCTL_ERRNO(ret)));
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   222
        return -EC_IOCTL_ERRNO(ret);
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   223
    }
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   224
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   225
    return 0;
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   226
}
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   227
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   228
/****************************************************************************/
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   230
int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
   231
{
1508
60a116ed3897 Removed more tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1497
diff changeset
   232
    ec_ioctl_master_t data;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   233
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   234
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   235
    ret = ioctl(master->fd, EC_IOCTL_MASTER, &data);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   236
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   237
        fprintf(stderr, "Failed to get master info: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   238
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   239
        return -EC_IOCTL_ERRNO(ret);
1508
60a116ed3897 Removed more tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1497
diff changeset
   240
    }
60a116ed3897 Removed more tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1497
diff changeset
   241
60a116ed3897 Removed more tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1497
diff changeset
   242
    master_info->slave_count = data.slave_count;
60a116ed3897 Removed more tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1497
diff changeset
   243
    master_info->link_up = data.devices[0].link_state;
1579
326d47aa986c applied komax patch to version r1822
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1510
diff changeset
   244
    master_info->scan_busy = data.scan_busy;
1508
60a116ed3897 Removed more tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1497
diff changeset
   245
    master_info->app_time = data.app_time;
60a116ed3897 Removed more tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1497
diff changeset
   246
    return 0;
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
   247
}
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
   248
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   249
/****************************************************************************/
1497
c9308eb34c0e Separated master requesting into open and reserve for userspace library.
Florian Pose <fp@igh-essen.com>
parents: 1495
diff changeset
   250
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   251
int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
1341
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   252
        ec_slave_info_t *slave_info)
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   253
{
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   254
    ec_ioctl_slave_t data;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   255
    int ret, i;
1341
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   256
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   257
    data.position = slave_position;
1341
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   258
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   259
    ret = ioctl(master->fd, EC_IOCTL_SLAVE, &data);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   260
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   261
        fprintf(stderr, "Failed to get slave info: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   262
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   263
        return -EC_IOCTL_ERRNO(ret);
1341
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   264
    }
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   265
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   266
    slave_info->position = data.position;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   267
    slave_info->vendor_id = data.vendor_id;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   268
    slave_info->product_code = data.product_code;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   269
    slave_info->revision_number = data.revision_number;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   270
    slave_info->serial_number = data.serial_number;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   271
    slave_info->alias = data.alias;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   272
    slave_info->current_on_ebus = data.current_on_ebus;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   273
    for (i = 0; i < EC_MAX_PORTS; i++) {
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   274
        slave_info->ports[i].desc = data.ports[i].desc;
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   275
        slave_info->ports[i].link.link_up = data.ports[i].link.link_up;
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   276
        slave_info->ports[i].link.loop_closed =
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   277
            data.ports[i].link.loop_closed;
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   278
        slave_info->ports[i].link.signal_detected =
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   279
            data.ports[i].link.signal_detected;
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   280
        slave_info->ports[i].receive_time = data.ports[i].receive_time;
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   281
        slave_info->ports[i].next_slave = data.ports[i].next_slave;
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   282
        slave_info->ports[i].delay_to_next_dc =
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   283
            data.ports[i].delay_to_next_dc;
2242
d23f69156cfd Fixed copying port information.
Stefan Weiser <ch1010858@ch10pc584>
parents: 2241
diff changeset
   284
    }
1341
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   285
    slave_info->al_state = data.al_state;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   286
    slave_info->error_flag = data.error_flag;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   287
    slave_info->sync_count = data.sync_count;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   288
    slave_info->sdo_count = data.sdo_count;
1593
fb8337e664fb Fixed string length constant bug.
Florian Pose <fp@igh-essen.com>
parents: 1585
diff changeset
   289
    strncpy(slave_info->name, data.name, EC_MAX_STRING_LENGTH);
1341
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   290
    return 0;
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   291
}
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   292
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   293
/****************************************************************************/
1341
32ba7ffb6c7f Added ecrt_master_slave().
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   294
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   295
int ecrt_master_get_sync_manager(ec_master_t *master, uint16_t slave_position,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   296
        uint8_t sync_index, ec_sync_info_t *sync)
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   297
{
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1611
diff changeset
   298
    ec_ioctl_slave_sync_t data;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   299
    int ret;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   300
2380
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   301
    if (sync_index >= EC_MAX_SYNC_MANAGERS) {
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   302
        return -ENOENT;
2380
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   303
    }
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   304
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   305
    memset(&data, 0x00, sizeof(ec_ioctl_slave_sync_t));
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   306
    data.slave_position = slave_position;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   307
    data.sync_index = sync_index;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   308
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   309
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SYNC, &data);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   310
    if (EC_IOCTL_IS_ERROR(ret)) {
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   311
        fprintf(stderr, "Failed to get sync manager information: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   312
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   313
        return -EC_IOCTL_ERRNO(ret);
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   314
    }
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   315
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   316
    sync->index = sync_index;
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1611
diff changeset
   317
    sync->dir = EC_READ_BIT(&data.control_register, 2) ?
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   318
        EC_DIR_OUTPUT : EC_DIR_INPUT;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   319
    sync->n_pdos = data.pdo_count;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   320
    sync->pdos = NULL;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   321
    sync->watchdog_mode = EC_READ_BIT(&data.control_register, 6) ?
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   322
        EC_WD_ENABLE : EC_WD_DISABLE;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   323
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   324
    return 0;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   325
}
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   326
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   327
/****************************************************************************/
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   328
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   329
int ecrt_master_get_pdo(ec_master_t *master, uint16_t slave_position,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   330
        uint8_t sync_index, uint16_t pos, ec_pdo_info_t *pdo)
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   331
{
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1611
diff changeset
   332
    ec_ioctl_slave_sync_pdo_t data;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   333
    int ret;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   334
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   335
    if (sync_index >= EC_MAX_SYNC_MANAGERS)
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   336
        return -ENOENT;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   337
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   338
    memset(&data, 0x00, sizeof(ec_ioctl_slave_sync_pdo_t));
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   339
    data.slave_position = slave_position;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   340
    data.sync_index = sync_index;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   341
    data.pdo_pos = pos;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   342
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   343
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SYNC_PDO, &data);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   344
    if (EC_IOCTL_IS_ERROR(ret)) {
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   345
        fprintf(stderr, "Failed to get pdo information: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   346
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   347
        return -EC_IOCTL_ERRNO(ret);
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   348
    }
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   349
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   350
    pdo->index = data.index;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   351
    pdo->n_entries = data.entry_count;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   352
    pdo->entries = NULL;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   353
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   354
    return 0;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   355
}
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   356
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   357
/****************************************************************************/
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   358
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   359
int ecrt_master_get_pdo_entry(ec_master_t *master, uint16_t slave_position,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   360
        uint8_t sync_index, uint16_t pdo_pos, uint16_t entry_pos,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   361
        ec_pdo_entry_info_t *entry)
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   362
{
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1611
diff changeset
   363
    ec_ioctl_slave_sync_pdo_entry_t data;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   364
    int ret;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   365
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   366
    if (sync_index >= EC_MAX_SYNC_MANAGERS)
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   367
        return -ENOENT;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   368
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   369
    memset(&data, 0x00, sizeof(ec_ioctl_slave_sync_pdo_entry_t));
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   370
    data.slave_position = slave_position;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   371
    data.sync_index = sync_index;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   372
    data.pdo_pos = pdo_pos;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   373
    data.entry_pos = entry_pos;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   374
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   375
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SYNC_PDO_ENTRY, &data);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   376
    if (EC_IOCTL_IS_ERROR(ret)) {
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   377
        fprintf(stderr, "Failed to get pdo entry information: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   378
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   379
        return -EC_IOCTL_ERRNO(ret);
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   380
    }
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   381
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   382
    entry->index = data.index;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   383
    entry->subindex = data.subindex;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   384
    entry->bit_length = data.bit_length;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   385
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   386
    return 0;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   387
}
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   388
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   389
/****************************************************************************/
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   390
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   391
int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   392
        uint16_t index, uint8_t subindex, uint8_t *data,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   393
        size_t data_size, uint32_t *abort_code)
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   394
{
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   395
    ec_ioctl_slave_sdo_download_t download;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   396
    int ret;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   397
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   398
    download.slave_position = slave_position;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   399
    download.sdo_index = index;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   400
    download.sdo_entry_subindex = subindex;
2124
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   401
    download.complete_access = 0;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   402
    download.data_size = data_size;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   403
    download.data = data;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   404
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   405
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SDO_DOWNLOAD, &download);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   406
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   407
        if (EC_IOCTL_ERRNO(ret) == EIO && abort_code) {
2124
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   408
            *abort_code = download.abort_code;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   409
        }
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   410
        fprintf(stderr, "Failed to execute SDO download: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   411
            strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   412
        return -EC_IOCTL_ERRNO(ret);
2124
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   413
    }
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   414
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   415
    return 0;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   416
}
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   417
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   418
/****************************************************************************/
2124
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   419
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   420
int ecrt_master_sdo_download_complete(ec_master_t *master,
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   421
        uint16_t slave_position, uint16_t index, uint8_t *data,
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   422
        size_t data_size, uint32_t *abort_code)
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   423
{
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   424
    ec_ioctl_slave_sdo_download_t download;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   425
    int ret;
2124
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   426
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   427
    download.slave_position = slave_position;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   428
    download.sdo_index = index;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   429
    download.sdo_entry_subindex = 0;
c4afc5fede19 Added ecrt_master_sdo_download_complete() for ad-hoc downloading SDOs (also
Florian Pose <fp@igh-essen.com>
parents: 2062
diff changeset
   430
    download.complete_access = 1;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   431
    download.data_size = data_size;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   432
    download.data = data;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   433
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   434
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SDO_DOWNLOAD, &download);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   435
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   436
        if (EC_IOCTL_ERRNO(ret) == EIO && abort_code) {
1911
460baca4df83 Fixed errno usage in user library.
Florian Pose <fp@igh-essen.com>
parents: 1804
diff changeset
   437
            *abort_code = download.abort_code;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   438
        }
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   439
        fprintf(stderr, "Failed to execute SDO download: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   440
            strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   441
        return -EC_IOCTL_ERRNO(ret);
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   442
    }
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   443
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   444
    return 0;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   445
}
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   446
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   447
/****************************************************************************/
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   448
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   449
int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   450
        uint16_t index, uint8_t subindex, uint8_t *target,
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   451
        size_t target_size, size_t *result_size, uint32_t *abort_code)
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   452
{
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   453
    ec_ioctl_slave_sdo_upload_t upload;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   454
    int ret;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   455
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   456
    upload.slave_position = slave_position;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   457
    upload.sdo_index = index;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   458
    upload.sdo_entry_subindex = subindex;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   459
    upload.target_size = target_size;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   460
    upload.target = target;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   461
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   462
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SDO_UPLOAD, &upload);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   463
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   464
        if (EC_IOCTL_ERRNO(ret) == EIO && abort_code) {
1911
460baca4df83 Fixed errno usage in user library.
Florian Pose <fp@igh-essen.com>
parents: 1804
diff changeset
   465
            *abort_code = upload.abort_code;
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   466
        }
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   467
        fprintf(stderr, "Failed to execute SDO upload: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   468
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   469
        return -EC_IOCTL_ERRNO(ret);
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   470
    }
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   471
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   472
    *result_size = upload.data_size;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   473
    return 0;
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   474
}
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   475
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   476
/****************************************************************************/
1510
88b608a1a7f3 Improved bus information API.
Florian Pose <fp@igh-essen.com>
parents: 1508
diff changeset
   477
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   478
int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position,
1952
7d9fb723fc4b Added drive_no parameter to SoE layer.
Florian Pose <fp@igh-essen.com>
parents: 1947
diff changeset
   479
        uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size,
7d9fb723fc4b Added drive_no parameter to SoE layer.
Florian Pose <fp@igh-essen.com>
parents: 1947
diff changeset
   480
        uint16_t *error_code)
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   481
{
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   482
    ec_ioctl_slave_soe_write_t io;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   483
    int ret;
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   484
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   485
    io.slave_position = slave_position;
1952
7d9fb723fc4b Added drive_no parameter to SoE layer.
Florian Pose <fp@igh-essen.com>
parents: 1947
diff changeset
   486
    io.drive_no = drive_no;
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   487
    io.idn = idn;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   488
    io.data_size = data_size;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   489
    io.data = data;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   490
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   491
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SOE_WRITE, &io);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   492
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   493
        if (EC_IOCTL_ERRNO(ret) == EIO && error_code) {
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   494
            *error_code = io.error_code;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   495
        }
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   496
        fprintf(stderr, "Failed to write IDN: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   497
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   498
        return -EC_IOCTL_ERRNO(ret);
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   499
    }
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   500
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   501
    return 0;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   502
}
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   503
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   504
/****************************************************************************/
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   505
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   506
int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position,
1952
7d9fb723fc4b Added drive_no parameter to SoE layer.
Florian Pose <fp@igh-essen.com>
parents: 1947
diff changeset
   507
        uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size,
1947
024a3c6aa3f7 Implemented ecrt_master_read_idn() and ecrt_master_write_idn() in kernel space.
Florian Pose <fp@igh-essen.com>
parents: 1913
diff changeset
   508
        size_t *result_size, uint16_t *error_code)
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   509
{
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   510
    ec_ioctl_slave_soe_read_t io;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   511
    int ret;
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   512
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   513
    io.slave_position = slave_position;
1952
7d9fb723fc4b Added drive_no parameter to SoE layer.
Florian Pose <fp@igh-essen.com>
parents: 1947
diff changeset
   514
    io.drive_no = drive_no;
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   515
    io.idn = idn;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   516
    io.mem_size = target_size;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   517
    io.data = target;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   518
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   519
    ret = ioctl(master->fd, EC_IOCTL_SLAVE_SOE_READ, &io);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   520
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   521
        if (EC_IOCTL_ERRNO(ret) == EIO && error_code) {
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   522
            *error_code = io.error_code;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   523
        }
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   524
        fprintf(stderr, "Failed to read IDN: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   525
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   526
        return -EC_IOCTL_ERRNO(ret);
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   527
    }
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   528
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   529
    *result_size = io.data_size;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   530
    return 0;
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   531
}
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   532
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   533
/****************************************************************************/
1913
cbef34ba142b Added ecrt_master_read_idn() and ecrt_master_write_idn() to read/write SoE
Florian Pose <fp@igh-essen.com>
parents: 1911
diff changeset
   534
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
int ecrt_master_activate(ec_master_t *master)
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   537
    ec_ioctl_master_activate_t io;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   538
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   539
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   540
    ret = ioctl(master->fd, EC_IOCTL_ACTIVATE, &io);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   541
    if (EC_IOCTL_IS_ERROR(ret)) {
1247
5f1f1a3e6636 Activate, Send and received; cyclic timer with setitimer().
Florian Pose <fp@igh-essen.com>
parents: 1246
diff changeset
   542
        fprintf(stderr, "Failed to activate master: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   543
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   544
        return -EC_IOCTL_ERRNO(ret);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   545
    }
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   546
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   547
    master->process_data_size = io.process_data_size;
1247
5f1f1a3e6636 Activate, Send and received; cyclic timer with setitimer().
Florian Pose <fp@igh-essen.com>
parents: 1246
diff changeset
   548
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   549
    if (master->process_data_size) {
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   550
#ifdef USE_RTDM
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   551
        /* memory-mapping was already done in kernel. The user-space addess is
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   552
         * provided in the ioctl data.
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   553
         */
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   554
        master->process_data = io.process_data;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   555
#else
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   556
        master->process_data = mmap(0, master->process_data_size,
1259
5f9d1abbee71 Added state functions; writing of process data works.
Florian Pose <fp@igh-essen.com>
parents: 1258
diff changeset
   557
                PROT_READ | PROT_WRITE, MAP_SHARED, master->fd, 0);
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   558
        if (master->process_data == MAP_FAILED) {
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   559
            fprintf(stderr, "Failed to map process data: %s\n",
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   560
                    strerror(errno));
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   561
            master->process_data = NULL;
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   562
            master->process_data_size = 0;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   563
            return -errno;
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   564
        }
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   565
#endif
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   566
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   567
        // Access the mapped region to cause the initial page fault
2062
9cc8f64726bb Removed "Pd: 0" output that does the initial pagefault. Write to the
Florian Pose <fp@igh-essen.com>
parents: 2009
diff changeset
   568
        master->process_data[0] = 0x00;
1258
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   569
    }
900f1124e8f8 Memory-mapped process data.
Florian Pose <fp@igh-essen.com>
parents: 1255
diff changeset
   570
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
    return 0;
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
}
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   574
/****************************************************************************/
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
1531
6c5478400e28 Implemented ecrt_master_deactivate() in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1510
diff changeset
   576
void ecrt_master_deactivate(ec_master_t *master)
6c5478400e28 Implemented ecrt_master_deactivate() in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1510
diff changeset
   577
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   578
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   579
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   580
    ret = ioctl(master->fd, EC_IOCTL_DEACTIVATE, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   581
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   582
        fprintf(stderr, "Failed to deactivate master: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   583
                strerror(EC_IOCTL_ERRNO(ret)));
1531
6c5478400e28 Implemented ecrt_master_deactivate() in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1510
diff changeset
   584
        return;
6c5478400e28 Implemented ecrt_master_deactivate() in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1510
diff changeset
   585
    }
1960
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
   586
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
   587
    ec_master_clear_config(master);
6c4269dca1c2 Clear configuration on deactivation; also in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1959
diff changeset
   588
}
1585
1f640e321ee4 ecrt_master_set_max_cycle_size: limit SDO traffic
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1580
diff changeset
   589
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   590
/****************************************************************************/
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   591
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   592
int ecrt_master_set_send_interval(ec_master_t *master,
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   593
        size_t send_interval_us)
1600
e36c92cf58a9 use given send interval to limit SDO/FOE traffic
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1585
diff changeset
   594
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   595
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   596
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   597
    ret = ioctl(master->fd, EC_IOCTL_SET_SEND_INTERVAL, &send_interval_us);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   598
    if (EC_IOCTL_IS_ERROR(ret)) {
1804
742607c464c4 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1611
diff changeset
   599
        fprintf(stderr, "Failed to set send interval: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   600
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   601
        return -EC_IOCTL_ERRNO(ret);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   602
    }
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   603
1585
1f640e321ee4 ecrt_master_set_max_cycle_size: limit SDO traffic
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1580
diff changeset
   604
    return 0;
1f640e321ee4 ecrt_master_set_max_cycle_size: limit SDO traffic
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1580
diff changeset
   605
}
1f640e321ee4 ecrt_master_set_max_cycle_size: limit SDO traffic
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1580
diff changeset
   606
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   607
/****************************************************************************/
1531
6c5478400e28 Implemented ecrt_master_deactivate() in userspace.
Florian Pose <fp@igh-essen.com>
parents: 1510
diff changeset
   608
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
void ecrt_master_send(ec_master_t *master)
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   611
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   612
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   613
    ret = ioctl(master->fd, EC_IOCTL_SEND, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   614
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   615
        fprintf(stderr, "Failed to send: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   616
                strerror(EC_IOCTL_ERRNO(ret)));
1247
5f1f1a3e6636 Activate, Send and received; cyclic timer with setitimer().
Florian Pose <fp@igh-essen.com>
parents: 1246
diff changeset
   617
    }
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
}
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   620
/****************************************************************************/
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
void ecrt_master_receive(ec_master_t *master)
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   624
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   625
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   626
    ret = ioctl(master->fd, EC_IOCTL_RECEIVE, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   627
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   628
        fprintf(stderr, "Failed to receive: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   629
                strerror(EC_IOCTL_ERRNO(ret)));
1247
5f1f1a3e6636 Activate, Send and received; cyclic timer with setitimer().
Florian Pose <fp@igh-essen.com>
parents: 1246
diff changeset
   630
    }
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
}
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   633
/****************************************************************************/
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   637
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   638
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   639
    ret = ioctl(master->fd, EC_IOCTL_MASTER_STATE, state);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   640
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   641
        fprintf(stderr, "Failed to get master state: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   642
                strerror(EC_IOCTL_ERRNO(ret)));
1259
5f9d1abbee71 Added state functions; writing of process data works.
Florian Pose <fp@igh-essen.com>
parents: 1258
diff changeset
   643
    }
1244
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
}
0b70040d3daa No kernel handles in userspace; Domain creation.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   646
/****************************************************************************/
1413
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   647
2380
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   648
int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx,
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   649
        ec_master_link_state_t *state)
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   650
{
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   651
    ec_ioctl_link_state_t io;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   652
    int ret;
2380
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   653
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   654
    io.dev_idx = dev_idx;
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   655
    io.state = state;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   656
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   657
    ret = ioctl(master->fd, EC_IOCTL_MASTER_LINK_STATE, &io);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   658
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   659
        fprintf(stderr, "Failed to get link state: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   660
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   661
        return -EC_IOCTL_ERRNO(ret);
2380
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   662
    }
2427
17ada1c77acc Fixed some compiler warnings.
Florian Pose <fp@igh-essen.com>
parents: 2426
diff changeset
   663
17ada1c77acc Fixed some compiler warnings.
Florian Pose <fp@igh-essen.com>
parents: 2426
diff changeset
   664
    return 0;
2380
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   665
}
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   666
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   667
/****************************************************************************/
2380
cf9db49bcce8 Added ecrt_master_link_state() to retrieve information about a redundant link.
Florian Pose <fp@igh-essen.com>
parents: 2242
diff changeset
   668
1434
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   669
void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   670
{
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   671
    ec_ioctl_app_time_t data;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   672
    int ret;
1413
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   673
1417
7c2d5d69134c Replaced timeval by 64-bit EtherCAT time.
Florian Pose <fp@igh-essen.com>
parents: 1413
diff changeset
   674
    data.app_time = app_time;
1413
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   675
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   676
    ret = ioctl(master->fd, EC_IOCTL_APP_TIME, &data);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   677
    if (EC_IOCTL_IS_ERROR(ret)) {
1434
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   678
        fprintf(stderr, "Failed to set application time: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   679
                strerror(EC_IOCTL_ERRNO(ret)));
1434
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   680
    }
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   681
}
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   682
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   683
/****************************************************************************/
1434
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   684
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   685
void ecrt_master_sync_reference_clock(ec_master_t *master)
4c6fe0ae37f1 Separated application time from synchronizing reference clock.
Florian Pose <fp@igh-essen.com>
parents: 1417
diff changeset
   686
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   687
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   688
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   689
    ret = ioctl(master->fd, EC_IOCTL_SYNC_REF, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   690
    if (EC_IOCTL_IS_ERROR(ret)) {
1413
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   691
        fprintf(stderr, "Failed to sync reference clock: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   692
                strerror(EC_IOCTL_ERRNO(ret)));
1413
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   693
    }
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   694
}
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   695
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   696
/****************************************************************************/
1413
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   697
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   698
void ecrt_master_sync_slave_clocks(ec_master_t *master)
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   699
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   700
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   701
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   702
    ret = ioctl(master->fd, EC_IOCTL_SYNC_SLAVES, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   703
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   704
        fprintf(stderr, "Failed to sync slave clocks: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   705
                strerror(EC_IOCTL_ERRNO(ret)));
1413
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   706
    }
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   707
}
44c2b7c0ae1a Userspace library implementation of DC functions.
Florian Pose <fp@igh-essen.com>
parents: 1363
diff changeset
   708
2447
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   709
/*****************************************************************************/
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   710
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   711
int ecrt_master_reference_clock_time(ec_master_t *master, uint32_t *time)
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   712
{
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   713
    int ret;
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   714
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   715
    ret = ioctl(master->fd, EC_IOCTL_REF_CLOCK_TIME, time);
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   716
    if (EC_IOCTL_IS_ERROR(ret)) {
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   717
        fprintf(stderr, "Failed to get reference clock time: %s\n",
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   718
                strerror(EC_IOCTL_ERRNO(ret)));
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   719
    }
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   720
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   721
    return ret;
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   722
}
e93efb4af231 Added interface to select the reference clock and to sync to it.
Florian Pose <fp@igh-essen.com>
parents: 2443
diff changeset
   723
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   724
/****************************************************************************/
1535
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   725
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   726
void ecrt_master_sync_monitor_queue(ec_master_t *master)
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   727
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   728
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   729
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   730
    ret = ioctl(master->fd, EC_IOCTL_SYNC_MON_QUEUE, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   731
    if (EC_IOCTL_IS_ERROR(ret)) {
1535
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   732
        fprintf(stderr, "Failed to queue sync monitor datagram: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   733
                strerror(EC_IOCTL_ERRNO(ret)));
1535
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   734
    }
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   735
}
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   736
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   737
/****************************************************************************/
1535
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   738
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   739
uint32_t ecrt_master_sync_monitor_process(ec_master_t *master)
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   740
{
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   741
    uint32_t time_diff;
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   742
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   743
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   744
    ret = ioctl(master->fd, EC_IOCTL_SYNC_MON_PROCESS, &time_diff);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   745
    if (EC_IOCTL_IS_ERROR(ret)) {
1535
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   746
        time_diff = 0xffffffff;
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   747
        fprintf(stderr, "Failed to process sync monitor datagram: %s\n",
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   748
                strerror(EC_IOCTL_ERRNO(ret)));
1535
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   749
    }
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   750
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   751
    return time_diff;
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   752
}
0c484ee12d89 DC synchrony monitoring methods.
Florian Pose <fp@igh-essen.com>
parents: 1531
diff changeset
   753
2426
58572b4208ba Minor: Fixed max line length.
Florian Pose <fp@igh-essen.com>
parents: 2419
diff changeset
   754
/****************************************************************************/
2009
b5391b329b5d Added ecrt_master_reset() method.
Florian Pose <fp@igh-essen.com>
parents: 1975
diff changeset
   755
b5391b329b5d Added ecrt_master_reset() method.
Florian Pose <fp@igh-essen.com>
parents: 1975
diff changeset
   756
void ecrt_master_reset(ec_master_t *master)
b5391b329b5d Added ecrt_master_reset() method.
Florian Pose <fp@igh-essen.com>
parents: 1975
diff changeset
   757
{
2433
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   758
    int ret;
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   759
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   760
    ret = ioctl(master->fd, EC_IOCTL_RESET, NULL);
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   761
    if (EC_IOCTL_IS_ERROR(ret)) {
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   762
        fprintf(stderr, "Failed to reset master: %s\n",
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   763
                strerror(EC_IOCTL_ERRNO(ret)));
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   764
    }
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   765
}
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   766
3bdd7a747fae Re-worked and seamlessly integrated RTDM interface.
Florian Pose <fp@igh-essen.com>
parents: 2427
diff changeset
   767
/****************************************************************************/