# HG changeset patch # User Florian Pose # Date 1240568693 0 # Node ID 7c2d5d69134c8aeca5d26e1cb897b7ca4be0401e # Parent 85d20ae6736e3aae02228cde9ed2ff011893f586 Replaced timeval by 64-bit EtherCAT time. diff -r 85d20ae6736e -r 7c2d5d69134c TODO --- a/TODO Fri Apr 24 09:51:11 2009 +0000 +++ b/TODO Fri Apr 24 10:24:53 2009 +0000 @@ -12,8 +12,8 @@ * Distributed clocks: - Delay calculation. - - User same application time offset when setting start times. - - Replace timeval by uint64 EtherCAT time. + - Use common application time offset when setting start times. + - Check 32/64 bit operations. * Fix arguments of reg_read. * Sign/Abs type for reg_ commands? * Number layout for reg_read. diff -r 85d20ae6736e -r 7c2d5d69134c examples/dc_rtai/dc_rtai_sample.c --- a/examples/dc_rtai/dc_rtai_sample.c Fri Apr 24 09:51:11 2009 +0000 +++ b/examples/dc_rtai/dc_rtai_sample.c Fri Apr 24 10:24:53 2009 +0000 @@ -220,13 +220,16 @@ tv.tv_usec -= 1000000; tv.tv_sec++; } - //printk(KERN_INFO PFX "tv=%u.%06u\n", (u32) tv.tv_sec, (u32) tv.tv_usec); if (sync_ref_counter) { sync_ref_counter--; } else { sync_ref_counter = 9; - ecrt_master_sync_reference_clock(master, &tv); +#if 0 + printk(KERN_INFO PFX "ref: %u %u %llu\n", + (u32) tv.tv_sec, (u32) tv.tv_usec, EC_TIMEVAL2NANO(&tv)); +#endif + ecrt_master_sync_reference_clock(master, EC_TIMEVAL2NANO(&tv)); } ecrt_master_sync_slave_clocks(master); ecrt_domain_queue(domain1); diff -r 85d20ae6736e -r 7c2d5d69134c examples/dc_user/main.c --- a/examples/dc_user/main.c Fri Apr 24 09:51:11 2009 +0000 +++ b/examples/dc_user/main.c Fri Apr 24 10:24:53 2009 +0000 @@ -169,7 +169,7 @@ sync_ref_counter--; } else { sync_ref_counter = 9; - ecrt_master_sync_reference_clock(master, &app_time); + ecrt_master_sync_reference_clock(master, EC_TIMEVAL2NANO(&app_time)); } ecrt_master_sync_slave_clocks(master); diff -r 85d20ae6736e -r 7c2d5d69134c include/ecrt.h --- a/include/ecrt.h Fri Apr 24 09:51:11 2009 +0000 +++ b/include/ecrt.h Fri Apr 24 10:24:53 2009 +0000 @@ -46,7 +46,8 @@ * ecrt_slave_config_dc_sync_cycle_times() and * ecrt_slave_config_dc_sync_shift_times() to configure a slave for cyclic * operation, and ecrt_master_sync_reference_clock() and - * ecrt_master_sync_slave_clocks() for drift compensation. + * ecrt_master_sync_slave_clocks() for drift compensation. The + * EC_TIMEVAL2NANO() macro can be used for epoch time conversion. * - Changed the meaning of the negative return values of * ecrt_slave_config_reg_pdo_entry() and ecrt_slave_config_sdo*(). * - Imlemented the Vendor-specific over EtherCAT mailbox protocol. See @@ -114,6 +115,17 @@ */ #define EC_MAX_STRING_LENGTH 64 +/** Timeval to nanoseconds conversion. + * + * This macro converts a unix epoch time to EtherCAT DC time. + * + * \see ecrt_master_sync_reference_clock() + * + * \param TV Pointer to struct timeval. + */ +#define EC_TIMEVAL2NANO(TV) \ + (((TV)->tv_sec - 946684800ULL) * 1000000000ULL + (TV)->tv_usec * 1000ULL) + /****************************************************************************** * Data types *****************************************************************************/ @@ -510,11 +522,13 @@ /** Queues the DC reference clock drift compensation datagram for sending. * - * The reference clock will by synchronized to the \a app_time. + * The reference clock will by synchronized to the \a app_time. The time is + * defined as nanoseconds from 2000-01-01 00:00. Converting an epoch time can + * be done with the EC_TIMEVAL2NANO() macro. */ void ecrt_master_sync_reference_clock( ec_master_t *master, /**< EtherCAT master. */ - const struct timeval *app_time /**< Application time. */ + uint64_t app_time /**< Application time. */ ); /** Queues the DC clock drift compensation datagram for sending. diff -r 85d20ae6736e -r 7c2d5d69134c lib/master.c --- a/lib/master.c Fri Apr 24 09:51:11 2009 +0000 +++ b/lib/master.c Fri Apr 24 10:24:53 2009 +0000 @@ -190,13 +190,11 @@ /*****************************************************************************/ -void ecrt_master_sync_reference_clock(ec_master_t *master, - const struct timeval *app_time) +void ecrt_master_sync_reference_clock(ec_master_t *master, uint64_t app_time) { ec_ioctl_dc_t data; - data.app_time.tv_sec = app_time->tv_sec; - data.app_time.tv_usec = app_time->tv_usec; + data.app_time = app_time; if (ioctl(master->fd, EC_IOCTL_SYNC_REF, &data) == -1) { fprintf(stderr, "Failed to sync reference clock: %s\n", diff -r 85d20ae6736e -r 7c2d5d69134c master/cdev.c --- a/master/cdev.c Fri Apr 24 09:51:11 2009 +0000 +++ b/master/cdev.c Fri Apr 24 10:24:53 2009 +0000 @@ -1647,7 +1647,7 @@ return -EFAULT; spin_lock_bh(&master->internal_lock); - ecrt_master_sync_reference_clock(master, &data.app_time); + ecrt_master_sync_reference_clock(master, data.app_time); spin_unlock_bh(&master->internal_lock); return 0; } diff -r 85d20ae6736e -r 7c2d5d69134c master/globals.h --- a/master/globals.h Fri Apr 24 09:51:11 2009 +0000 +++ b/master/globals.h Fri Apr 24 10:24:53 2009 +0000 @@ -251,13 +251,6 @@ .name = EC_STR(NAME), .owner = THIS_MODULE, .mode = S_IRUGO | S_IWUSR \ } -/** Timeval to nanoseconds conversion. - * - * \param TV Pointer to struct timeval. - */ -#define EC_TIMEVAL2NANO(TV) \ - (((TV)->tv_sec - 946684800ULL) * 1000000000ULL + (TV)->tv_usec * 1000ULL) - /*****************************************************************************/ extern char *ec_master_version_str; diff -r 85d20ae6736e -r 7c2d5d69134c master/ioctl.h --- a/master/ioctl.h Fri Apr 24 09:51:11 2009 +0000 +++ b/master/ioctl.h Fri Apr 24 10:24:53 2009 +0000 @@ -389,7 +389,7 @@ typedef struct { // inputs - struct timeval app_time; + uint64_t app_time; } ec_ioctl_dc_t; /*****************************************************************************/ diff -r 85d20ae6736e -r 7c2d5d69134c master/master.c --- a/master/master.c Fri Apr 24 09:51:11 2009 +0000 +++ b/master/master.c Fri Apr 24 10:24:53 2009 +0000 @@ -1651,9 +1651,9 @@ /*****************************************************************************/ void ecrt_master_sync_reference_clock(ec_master_t *master, - const struct timeval *app_time) -{ - master->app_time = EC_TIMEVAL2NANO(app_time); + uint64_t app_time) +{ + master->app_time = app_time; EC_WRITE_U32(master->ref_sync_datagram.data, master->app_time); ec_master_queue_datagram(master, &master->ref_sync_datagram); }