master/master.c
changeset 1396 9d04cc08f40f
parent 1394 e77728ddf0f9
child 1399 f79d4bb5b23a
equal deleted inserted replaced
1395:e9fe40c458cc 1396:9d04cc08f40f
   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 */