equal
deleted
inserted
replaced
1939 int ecrt_master_activate(ec_master_t *master) |
1939 int ecrt_master_activate(ec_master_t *master) |
1940 { |
1940 { |
1941 uint32_t domain_offset; |
1941 uint32_t domain_offset; |
1942 ec_domain_t *domain; |
1942 ec_domain_t *domain; |
1943 int ret; |
1943 int ret; |
|
1944 #ifdef EC_EOE |
|
1945 int eoe_was_running; |
|
1946 #endif |
1944 |
1947 |
1945 if (master->debug_level) |
1948 if (master->debug_level) |
1946 EC_DBG("ecrt_master_activate(master = 0x%p)\n", master); |
1949 EC_DBG("ecrt_master_activate(master = 0x%p)\n", master); |
1947 |
1950 |
1948 if (master->active) { |
1951 if (master->active) { |
1970 } |
1973 } |
1971 |
1974 |
1972 up(&master->master_sem); |
1975 up(&master->master_sem); |
1973 |
1976 |
1974 // restart EoE process and master thread with new locking |
1977 // restart EoE process and master thread with new locking |
|
1978 |
|
1979 ec_master_thread_stop(master); |
1975 #ifdef EC_EOE |
1980 #ifdef EC_EOE |
|
1981 eoe_was_running = master->eoe_thread != NULL; |
1976 ec_master_eoe_stop(master); |
1982 ec_master_eoe_stop(master); |
1977 #endif |
1983 #endif |
1978 ec_master_thread_stop(master); |
|
1979 |
1984 |
1980 if (master->debug_level) |
1985 if (master->debug_level) |
1981 EC_DBG("FSM datagram is %p.\n", &master->fsm_datagram); |
1986 EC_DBG("FSM datagram is %p.\n", &master->fsm_datagram); |
1982 |
1987 |
1983 master->injection_seq_fsm = 0; |
1988 master->injection_seq_fsm = 0; |
1985 |
1990 |
1986 master->send_cb = master->app_send_cb; |
1991 master->send_cb = master->app_send_cb; |
1987 master->receive_cb = master->app_receive_cb; |
1992 master->receive_cb = master->app_receive_cb; |
1988 master->cb_data = master->app_cb_data; |
1993 master->cb_data = master->app_cb_data; |
1989 |
1994 |
|
1995 #ifdef EC_EOE |
|
1996 if (eoe_was_running) { |
|
1997 ec_master_eoe_start(master); |
|
1998 } |
|
1999 #endif |
1990 ret = ec_master_thread_start(master, ec_master_operation_thread, |
2000 ret = ec_master_thread_start(master, ec_master_operation_thread, |
1991 "EtherCAT-OP"); |
2001 "EtherCAT-OP"); |
1992 if (ret < 0) { |
2002 if (ret < 0) { |
1993 EC_ERR("Failed to start master thread!\n"); |
2003 EC_ERR("Failed to start master thread!\n"); |
1994 return ret; |
2004 return ret; |
1995 } |
2005 } |
1996 #ifdef EC_EOE |
|
1997 ec_master_eoe_start(master); |
|
1998 #endif |
|
1999 |
2006 |
2000 master->allow_config = 1; // request the current configuration |
2007 master->allow_config = 1; // request the current configuration |
2001 master->allow_scan = 1; // allow re-scanning on topology change |
2008 master->allow_scan = 1; // allow re-scanning on topology change |
2002 master->active = 1; |
2009 master->active = 1; |
2003 return 0; |
2010 return 0; |
2008 void ecrt_master_deactivate(ec_master_t *master) |
2015 void ecrt_master_deactivate(ec_master_t *master) |
2009 { |
2016 { |
2010 ec_slave_t *slave; |
2017 ec_slave_t *slave; |
2011 #ifdef EC_EOE |
2018 #ifdef EC_EOE |
2012 ec_eoe_t *eoe; |
2019 ec_eoe_t *eoe; |
|
2020 int eoe_was_running; |
2013 #endif |
2021 #endif |
2014 |
2022 |
2015 if (master->debug_level) |
2023 if (master->debug_level) |
2016 EC_DBG("ecrt_master_deactivate(master = 0x%x)\n", (u32) master); |
2024 EC_DBG("ecrt_master_deactivate(master = 0x%x)\n", (u32) master); |
2017 |
2025 |
2018 if (!master->active) { |
2026 if (!master->active) { |
2019 EC_WARN("%s: Master not active.\n", __func__); |
2027 EC_WARN("%s: Master not active.\n", __func__); |
2020 return; |
2028 return; |
2021 } |
2029 } |
2022 |
2030 |
|
2031 ec_master_thread_stop(master); |
2023 #ifdef EC_EOE |
2032 #ifdef EC_EOE |
|
2033 eoe_was_running = master->eoe_thread != NULL; |
2024 ec_master_eoe_stop(master); |
2034 ec_master_eoe_stop(master); |
2025 #endif |
2035 #endif |
2026 ec_master_thread_stop(master); |
|
2027 |
2036 |
2028 master->send_cb = ec_master_internal_send_cb; |
2037 master->send_cb = ec_master_internal_send_cb; |
2029 master->receive_cb = ec_master_internal_receive_cb; |
2038 master->receive_cb = ec_master_internal_receive_cb; |
2030 master->cb_data = master; |
2039 master->cb_data = master; |
2031 |
2040 |
2057 |
2066 |
2058 master->app_time = 0ULL; |
2067 master->app_time = 0ULL; |
2059 master->app_start_time = 0ULL; |
2068 master->app_start_time = 0ULL; |
2060 master->has_start_time = 0; |
2069 master->has_start_time = 0; |
2061 |
2070 |
|
2071 #ifdef EC_EOE |
|
2072 if (eoe_was_running) { |
|
2073 ec_master_eoe_start(master); |
|
2074 } |
|
2075 #endif |
2062 if (ec_master_thread_start(master, ec_master_idle_thread, |
2076 if (ec_master_thread_start(master, ec_master_idle_thread, |
2063 "EtherCAT-IDLE")) |
2077 "EtherCAT-IDLE")) |
2064 EC_WARN("Failed to restart master thread!\n"); |
2078 EC_WARN("Failed to restart master thread!\n"); |
2065 #ifdef EC_EOE |
|
2066 ec_master_eoe_start(master); |
|
2067 #endif |
|
2068 |
2079 |
2069 master->allow_scan = 1; |
2080 master->allow_scan = 1; |
2070 master->allow_config = 1; |
2081 master->allow_config = 1; |
2071 master->active = 0; |
2082 master->active = 0; |
2072 } |
2083 } |