diff --git a/examples/mini/mini.c b/examples/mini/mini.c index 2eed05ac9164d82d79903670f0f5b1a1595c2bdc..cb62a70b72e50d5081c8d6256051608c8e824a3d 100644 --- a/examples/mini/mini.c +++ b/examples/mini/mini.c @@ -201,12 +201,9 @@ void __exit cleanup_mini_module(void) { printk(KERN_INFO "=== Stopping Minimal EtherCAT environment... ===\n"); - if (master) { - del_timer_sync(&timer); - printk(KERN_INFO "Deactivating master...\n"); - ecrt_master_deactivate(master); - ecrt_release_master(master); - } + del_timer_sync(&timer); + printk(KERN_INFO "Releasing master...\n"); + ecrt_release_master(master); printk(KERN_INFO "=== Minimal EtherCAT environment stopped. ===\n"); } diff --git a/examples/msr/msr_sample.c b/examples/msr/msr_sample.c index 82b3fbce2721ce9e49eaef374b7ab58f598e4f6f..0d148216382e076f06c8df8059ed37e5b7d10f7f 100644 --- a/examples/msr/msr_sample.c +++ b/examples/msr/msr_sample.c @@ -214,7 +214,6 @@ void __exit cleanup_mod(void) rt_task_delete(&task); stop_rt_timer(); - ecrt_master_deactivate(master); ecrt_release_master(master); rt_sem_delete(&master_sem); msr_rtlib_cleanup(); diff --git a/examples/rtai/rtai_sample.c b/examples/rtai/rtai_sample.c index aa5365175bbd4f857be6b8f6c03976fffee67338..79889a35db1bf9843f7abce5abcd133b4ad3aa17 100644 --- a/examples/rtai/rtai_sample.c +++ b/examples/rtai/rtai_sample.c @@ -202,7 +202,6 @@ void __exit cleanup_mod(void) rt_task_delete(&task); stop_rt_timer(); - ecrt_master_deactivate(master); ecrt_release_master(master); rt_sem_delete(&master_sem); diff --git a/include/ecrt.h b/include/ecrt.h index d6120e9e034fce43eb701d0f940c36b17032368b..b1c14f5ca899fe69abb7a542bb0c716ab1e26c1b 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -109,7 +109,7 @@ void ecrt_master_callbacks(ec_master_t *master, int (*request_cb)(void *), ec_domain_t *ecrt_master_create_domain(ec_master_t *master); int ecrt_master_activate(ec_master_t *master); -void ecrt_master_deactivate(ec_master_t *master); +void ecrt_master_deactivate(ec_master_t *master); // deprecated! void ecrt_master_prepare(ec_master_t *master); diff --git a/master/master.c b/master/master.c index 388118d0387b419e8664c81e80529d92bfe58e8c..98d158aa60a792cf033ca5dc6127076e49f553b3 100644 --- a/master/master.c +++ b/master/master.c @@ -417,6 +417,25 @@ void ec_master_leave_operation_mode(ec_master_t *master /**< EtherCAT master */) { ec_slave_t *slave; + ec_fsm_t *fsm = &master->fsm; + ec_datagram_t *datagram = &master->fsm.datagram; + + // wait for FSM datagram + if (datagram->state == EC_DATAGRAM_SENT) { + while (get_cycles() - datagram->cycles_sent + < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000)) {} + ecrt_master_receive(master); + } + + // set states for all slaves + list_for_each_entry(slave, &master->slaves, list) { + ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); + } + + // execute master FSM to deactivate slaves + while (ec_fsm_exec(fsm)) { + ec_master_sync_io(master); + } ec_master_destroy_domains(master); @@ -1325,31 +1344,14 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */) /** Resets all slaves to INIT state. + This method is deprecated and will disappear in the next version + of the realtime interface. The functionality is moved to + ecrt_master_release(). \ingroup RealtimeInterface */ void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT master */) { - ec_fsm_t *fsm = &master->fsm; - ec_slave_t *slave; - ec_datagram_t *datagram = &master->fsm.datagram; - - // wait for FSM datagram - if (datagram->state == EC_DATAGRAM_SENT) { - while (get_cycles() - datagram->cycles_sent - < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000)) {} - ecrt_master_receive(master); - } - - // set states for all slaves - list_for_each_entry(slave, &master->slaves, list) { - ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); - } - - // execute master FSM to deactivate slaves - while (ec_fsm_exec(fsm)) { - ec_master_sync_io(master); - } } /*****************************************************************************/