master/master.c
changeset 1925 29161abef052
parent 1921 d9cf40facbc4
child 1930 59a50053ccc6
child 1989 6aa393418fb3
equal deleted inserted replaced
1924:2917b262554b 1925:29161abef052
   137 
   137 
   138     sema_init(&master->device_sem, 1);
   138     sema_init(&master->device_sem, 1);
   139 
   139 
   140     master->phase = EC_ORPHANED;
   140     master->phase = EC_ORPHANED;
   141     master->active = 0;
   141     master->active = 0;
       
   142     master->config_changed = 0;
   142     master->injection_seq_fsm = 0;
   143     master->injection_seq_fsm = 0;
   143     master->injection_seq_rt = 0;
   144     master->injection_seq_rt = 0;
   144 
   145 
   145     master->slaves = NULL;
   146     master->slaves = NULL;
   146     master->slave_count = 0;
   147     master->slave_count = 0;
   147     
   148     
   148     INIT_LIST_HEAD(&master->configs);
   149     INIT_LIST_HEAD(&master->configs);
   149 
   150 
   150     master->app_time = 0ULL;
   151     master->app_time = 0ULL;
   151     master->app_start_time = 0ULL;
   152     master->app_start_time = 0ULL;
   152     master->has_start_time = 0;
   153     master->has_app_time = 0;
   153 
   154 
   154     master->scan_busy = 0;
   155     master->scan_busy = 0;
   155     master->allow_scan = 1;
   156     master->allow_scan = 1;
   156     sema_init(&master->scan_sem, 1);
   157     sema_init(&master->scan_sem, 1);
   157     init_waitqueue_head(&master->scan_queue);
   158     init_waitqueue_head(&master->scan_queue);
  1822     ec_master_calc_topology(master);
  1823     ec_master_calc_topology(master);
  1823 
  1824 
  1824     ec_master_calc_transmission_delays(master);
  1825     ec_master_calc_transmission_delays(master);
  1825 }
  1826 }
  1826 
  1827 
       
  1828 /*****************************************************************************/
       
  1829 
       
  1830 /** Request OP state for configured slaves.
       
  1831  */
       
  1832 void ec_master_request_op(
       
  1833         ec_master_t *master /**< EtherCAT master. */
       
  1834         )
       
  1835 {
       
  1836     unsigned int i;
       
  1837     ec_slave_t *slave;
       
  1838 
       
  1839     if (!master->active)
       
  1840         return;
       
  1841 
       
  1842     EC_MASTER_DBG(master, 1, "Requesting OP...\n");
       
  1843 
       
  1844     // request OP for all configured slaves
       
  1845     for (i = 0; i < master->slave_count; i++) {
       
  1846         slave = master->slaves + i;
       
  1847         if (slave->config) {
       
  1848             ec_slave_request_state(slave, EC_SLAVE_STATE_OP);
       
  1849         }
       
  1850     }
       
  1851 
       
  1852     // always set DC reference clock to OP
       
  1853     if (master->dc_ref_clock) {
       
  1854         ec_slave_request_state(master->dc_ref_clock,
       
  1855                 EC_SLAVE_STATE_OP);
       
  1856     }
       
  1857 }
       
  1858 
  1827 /******************************************************************************
  1859 /******************************************************************************
  1828  *  Application interface
  1860  *  Application interface
  1829  *****************************************************************************/
  1861  *****************************************************************************/
  1830 
  1862 
  1831 /** Same as ecrt_master_create_domain(), but with ERR_PTR() return value.
  1863 /** Same as ecrt_master_create_domain(), but with ERR_PTR() return value.
  1904             return ret;
  1936             return ret;
  1905         }
  1937         }
  1906         domain_offset += domain->data_size;
  1938         domain_offset += domain->data_size;
  1907     }
  1939     }
  1908     
  1940     
  1909     // always set DC reference clock to OP
       
  1910     if (master->dc_ref_clock) {
       
  1911         ec_slave_request_state(master->dc_ref_clock, EC_SLAVE_STATE_OP);
       
  1912     }
       
  1913 
       
  1914     up(&master->master_sem);
  1941     up(&master->master_sem);
  1915 
  1942 
  1916     // restart EoE process and master thread with new locking
  1943     // restart EoE process and master thread with new locking
  1917 
  1944 
  1918     ec_master_thread_stop(master);
  1945     ec_master_thread_stop(master);
  1943     }
  1970     }
  1944 
  1971 
  1945     master->allow_config = 1; // request the current configuration
  1972     master->allow_config = 1; // request the current configuration
  1946     master->allow_scan = 1; // allow re-scanning on topology change
  1973     master->allow_scan = 1; // allow re-scanning on topology change
  1947     master->active = 1;
  1974     master->active = 1;
       
  1975 
       
  1976     // notify state machine, that the configuration shall now be applied
       
  1977     master->config_changed = 1;
       
  1978 
  1948     return 0;
  1979     return 0;
  1949 }
  1980 }
  1950 
  1981 
  1951 /*****************************************************************************/
  1982 /*****************************************************************************/
  1952 
  1983 
  2002     }
  2033     }
  2003 #endif
  2034 #endif
  2004 
  2035 
  2005     master->app_time = 0ULL;
  2036     master->app_time = 0ULL;
  2006     master->app_start_time = 0ULL;
  2037     master->app_start_time = 0ULL;
  2007     master->has_start_time = 0;
  2038     master->has_app_time = 0;
  2008 
  2039 
  2009 #ifdef EC_EOE
  2040 #ifdef EC_EOE
  2010     if (eoe_was_running) {
  2041     if (eoe_was_running) {
  2011         ec_master_eoe_start(master);
  2042         ec_master_eoe_start(master);
  2012     }
  2043     }
  2256 
  2287 
  2257 void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
  2288 void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
  2258 {
  2289 {
  2259     master->app_time = app_time;
  2290     master->app_time = app_time;
  2260 
  2291 
  2261     if (unlikely(!master->has_start_time)) {
  2292     if (unlikely(!master->has_app_time)) {
  2262         master->app_start_time = app_time;
  2293         master->app_start_time = app_time;
  2263         master->has_start_time = 1;
  2294         master->has_app_time = 1;
  2264     }
  2295     }
  2265 }
  2296 }
  2266 
  2297 
  2267 /*****************************************************************************/
  2298 /*****************************************************************************/
  2268 
  2299