Replaced timeval by 64-bit EtherCAT time.

This commit is contained in:
Florian Pose 2009-04-24 10:24:53 +00:00
parent b106be8342
commit d3303e0fa4
9 changed files with 31 additions and 23 deletions

4
TODO
View File

@ -12,8 +12,8 @@ Version 1.5.0:
* 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.

View File

@ -220,13 +220,16 @@ void run(long data)
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);

View File

@ -169,7 +169,7 @@ void cyclic_task()
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);

View File

@ -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 @@ void ecrt_master_state(
/** 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.

View File

@ -190,13 +190,11 @@ void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
/*****************************************************************************/
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",

View File

@ -1647,7 +1647,7 @@ int ec_cdev_ioctl_sync_ref(
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;
}

View File

@ -251,13 +251,6 @@ enum {
.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;

View File

@ -389,7 +389,7 @@ typedef struct {
typedef struct {
// inputs
struct timeval app_time;
uint64_t app_time;
} ec_ioctl_dc_t;
/*****************************************************************************/

View File

@ -1651,9 +1651,9 @@ void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
/*****************************************************************************/
void ecrt_master_sync_reference_clock(ec_master_t *master,
const struct timeval *app_time)
uint64_t app_time)
{
master->app_time = EC_TIMEVAL2NANO(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);
}