master/module.c
changeset 446 8fede404c01f
parent 444 31223539fc00
child 448 e4b76dc7910c
equal deleted inserted replaced
445:3b7eec329112 446:8fede404c01f
   382     if (ec_device_open(master->device)) {
   382     if (ec_device_open(master->device)) {
   383         EC_ERR("Failed to open device!\n");
   383         EC_ERR("Failed to open device!\n");
   384         return -1;
   384         return -1;
   385     }
   385     }
   386 
   386 
   387     ec_master_idle_start(master);
   387     ec_master_enter_idle_mode(master);
       
   388 
   388     return 0;
   389     return 0;
   389 }
   390 }
   390 
   391 
   391 /*****************************************************************************/
   392 /*****************************************************************************/
   392 
   393 
   400 void ecdev_stop(unsigned int master_index /**< master index */)
   401 void ecdev_stop(unsigned int master_index /**< master index */)
   401 {
   402 {
   402     ec_master_t *master;
   403     ec_master_t *master;
   403     if (!(master = ec_find_master(master_index))) return;
   404     if (!(master = ec_find_master(master_index))) return;
   404 
   405 
   405     ec_master_idle_stop(master);
   406     ec_master_leave_idle_mode(master);
   406     ec_master_flush_sdo_requests(master);
       
   407 
   407 
   408     if (ec_device_close(master->device))
   408     if (ec_device_close(master->device))
   409         EC_WARN("Failed to close device!\n");
   409         EC_WARN("Failed to close device!\n");
   410 }
   410 }
   411 
   411 
   457     if (!master->device->link_state) {
   457     if (!master->device->link_state) {
   458         EC_ERR("Link is DOWN.\n");
   458         EC_ERR("Link is DOWN.\n");
   459         goto out_module_put;
   459         goto out_module_put;
   460     }
   460     }
   461 
   461 
   462     ec_master_reset(master); // also stops idle mode
   462     if (ec_master_enter_operation_mode(master)) {
   463     master->mode = EC_MASTER_MODE_OPERATION;
   463         EC_ERR("Failed to enter OPERATION mode!\n");
   464 
   464         goto out_module_put;
   465     if (ec_master_measure_bus_time(master)) {
       
   466         EC_ERR("Bus time measuring failed!\n");
       
   467         goto out_reset;
       
   468     }
       
   469 
       
   470     if (ec_master_bus_scan(master)) {
       
   471         EC_ERR("Bus scan failed!\n");
       
   472         goto out_reset;
       
   473     }
   465     }
   474 
   466 
   475     EC_INFO("Successfully requested master %i.\n", master_index);
   467     EC_INFO("Successfully requested master %i.\n", master_index);
   476     return master;
   468     return master;
   477 
   469 
   478  out_reset:
       
   479     ec_master_reset(master);
       
   480     ec_master_idle_start(master);
       
   481  out_module_put:
   470  out_module_put:
   482     module_put(master->device->module);
   471     module_put(master->device->module);
   483  out_release:
   472  out_release:
   484     atomic_inc(&master->available);
   473     atomic_inc(&master->available);
   485  out_return:
   474  out_return:
   486     EC_ERR("Failed to request master %i.\n", master_index);
       
   487     return NULL;
   475     return NULL;
   488 }
   476 }
   489 
   477 
   490 /*****************************************************************************/
   478 /*****************************************************************************/
   491 
   479 
   494    \ingroup RealtimeInterface
   482    \ingroup RealtimeInterface
   495 */
   483 */
   496 
   484 
   497 void ecrt_release_master(ec_master_t *master /**< EtherCAT master */)
   485 void ecrt_release_master(ec_master_t *master /**< EtherCAT master */)
   498 {
   486 {
   499     EC_INFO("Releasing master %i...\n", master->index);
   487     ec_master_leave_operation_mode(master);
   500 
       
   501     if (atomic_read(&master->available)) {
       
   502         EC_ERR("Master %i was never requested!\n", master->index);
       
   503         return;
       
   504     }
       
   505 
       
   506     ec_master_reset(master);
       
   507     ec_master_idle_start(master);
       
   508 
   488 
   509     module_put(master->device->module);
   489     module_put(master->device->module);
   510     atomic_inc(&master->available);
   490     atomic_inc(&master->available);
   511 
   491 
   512     EC_INFO("Successfully released master %i.\n", master->index);
   492     EC_INFO("Released master %i.\n", master->index);
   513     return;
   493     return;
   514 }
   494 }
   515 
   495 
   516 /*****************************************************************************/
   496 /*****************************************************************************/
   517 
   497