master/master.c
changeset 1914 da7adbde2625
parent 1909 ea3eb4c74c1b
child 1921 d9cf40facbc4
child 1980 a89e2bedf004
equal deleted inserted replaced
1913:cbef34ba142b 1914:da7adbde2625
  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 }