196 } |
196 } |
197 |
197 |
198 // create state machine object |
198 // create state machine object |
199 ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram); |
199 ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram); |
200 |
200 |
|
201 // init reference sync datagram |
|
202 ec_datagram_init(&master->ref_sync_datagram); |
|
203 snprintf(master->ref_sync_datagram.name, EC_DATAGRAM_NAME_SIZE, "refsync"); |
|
204 ret = ec_datagram_apwr(&master->ref_sync_datagram, 0, 0x0910, 8); |
|
205 if (ret < 0) { |
|
206 ec_datagram_clear(&master->ref_sync_datagram); |
|
207 EC_ERR("Failed to allocate reference synchronisation datagram.\n"); |
|
208 goto out_clear_fsm; |
|
209 } |
|
210 |
201 // init sync datagram |
211 // init sync datagram |
202 ec_datagram_init(&master->sync_datagram); |
212 ec_datagram_init(&master->sync_datagram); |
203 snprintf(master->sync_datagram.name, EC_DATAGRAM_NAME_SIZE, "sync"); |
213 snprintf(master->sync_datagram.name, EC_DATAGRAM_NAME_SIZE, "sync"); |
204 ret = ec_datagram_armw(&master->sync_datagram, 0 /* FIXME */, 0x0910, 4); |
214 ret = ec_datagram_armw(&master->sync_datagram, 0 /* FIXME */, 0x0910, 4); |
205 if (ret < 0) { |
215 if (ret < 0) { |
206 ec_datagram_clear(&master->sync_datagram); |
216 ec_datagram_clear(&master->sync_datagram); |
207 EC_ERR("Failed to allocate synchronisation datagram.\n"); |
217 EC_ERR("Failed to allocate synchronisation datagram.\n"); |
208 goto out_clear_fsm; |
218 goto out_clear_ref_sync; |
209 } |
219 } |
210 |
220 |
211 // init character device |
221 // init character device |
212 ret = ec_cdev_init(&master->cdev, master, device_number); |
222 ret = ec_cdev_init(&master->cdev, master, device_number); |
213 if (ret) |
223 if (ret) |
240 |
250 |
241 out_clear_cdev: |
251 out_clear_cdev: |
242 ec_cdev_clear(&master->cdev); |
252 ec_cdev_clear(&master->cdev); |
243 out_clear_sync: |
253 out_clear_sync: |
244 ec_datagram_clear(&master->sync_datagram); |
254 ec_datagram_clear(&master->sync_datagram); |
|
255 out_clear_ref_sync: |
|
256 ec_datagram_clear(&master->ref_sync_datagram); |
245 out_clear_fsm: |
257 out_clear_fsm: |
246 ec_fsm_master_clear(&master->fsm); |
258 ec_fsm_master_clear(&master->fsm); |
247 ec_datagram_clear(&master->fsm_datagram); |
259 ec_datagram_clear(&master->fsm_datagram); |
248 out_clear_backup: |
260 out_clear_backup: |
249 ec_device_clear(&master->backup_device); |
261 ec_device_clear(&master->backup_device); |
275 ec_master_clear_domains(master); |
287 ec_master_clear_domains(master); |
276 ec_master_clear_slave_configs(master); |
288 ec_master_clear_slave_configs(master); |
277 ec_master_clear_slaves(master); |
289 ec_master_clear_slaves(master); |
278 |
290 |
279 ec_datagram_clear(&master->sync_datagram); |
291 ec_datagram_clear(&master->sync_datagram); |
|
292 ec_datagram_clear(&master->ref_sync_datagram); |
280 ec_fsm_master_clear(&master->fsm); |
293 ec_fsm_master_clear(&master->fsm); |
281 ec_datagram_clear(&master->fsm_datagram); |
294 ec_datagram_clear(&master->fsm_datagram); |
282 ec_device_clear(&master->backup_device); |
295 ec_device_clear(&master->backup_device); |
283 ec_device_clear(&master->main_device); |
296 ec_device_clear(&master->main_device); |
284 } |
297 } |
1605 state->link_up = master->main_device.link_state; |
1618 state->link_up = master->main_device.link_state; |
1606 } |
1619 } |
1607 |
1620 |
1608 /*****************************************************************************/ |
1621 /*****************************************************************************/ |
1609 |
1622 |
1610 void ecrt_master_sync(ec_master_t *master) |
1623 void ecrt_master_sync(ec_master_t *master, const struct timeval *app_time) |
1611 { |
1624 { |
|
1625 master->app_time = EC_TIMEVAL2NANO(app_time); |
|
1626 |
|
1627 #if 1 |
|
1628 EC_WRITE_U32(master->ref_sync_datagram.data, master->app_time); |
|
1629 ec_master_queue_datagram(master, &master->ref_sync_datagram); |
|
1630 #endif |
|
1631 |
|
1632 #if 1 |
1612 ec_datagram_zero(&master->sync_datagram); |
1633 ec_datagram_zero(&master->sync_datagram); |
1613 ec_master_queue_datagram(master, &master->sync_datagram); |
1634 ec_master_queue_datagram(master, &master->sync_datagram); |
|
1635 #endif |
1614 } |
1636 } |
1615 |
1637 |
1616 /*****************************************************************************/ |
1638 /*****************************************************************************/ |
1617 |
1639 |
1618 /** \cond */ |
1640 /** \cond */ |