equal
deleted
inserted
replaced
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 |