93 |
93 |
94 for (i = 0; i < EC_MAX_PORTS; i++) { |
94 for (i = 0; i < EC_MAX_PORTS; i++) { |
95 slave->ports[i].desc = EC_PORT_NOT_IMPLEMENTED; |
95 slave->ports[i].desc = EC_PORT_NOT_IMPLEMENTED; |
96 |
96 |
97 slave->ports[i].link.link_up = 0; |
97 slave->ports[i].link.link_up = 0; |
98 slave->ports[i].link.loop_closed = 0; |
98 slave->ports[i].link.loop_closed = 1; |
99 slave->ports[i].link.signal_detected = 0; |
99 slave->ports[i].link.signal_detected = 0; |
100 slave->sii.physical_layer[i] = 0xFF; |
100 slave->sii.physical_layer[i] = 0xFF; |
101 |
101 |
102 slave->ports[i].receive_time = 0U; |
102 slave->ports[i].receive_time = 0U; |
103 |
103 |
104 slave->ports[i].next_slave = NULL; |
104 slave->ports[i].next_slave = NULL; |
105 slave->ports[i].delay_to_next_dc = 0U; |
105 slave->ports[i].delay_to_next_dc = 0U; |
|
106 |
|
107 #ifdef EC_LOOP_CONTROL |
|
108 slave->ports[i].state = EC_SLAVE_PORT_DOWN; |
|
109 slave->ports[i].link_detection_jiffies = 0; |
|
110 #endif |
106 } |
111 } |
107 |
112 |
108 slave->base_fmmu_bit_operation = 0; |
113 slave->base_fmmu_bit_operation = 0; |
109 slave->base_dc_supported = 0; |
114 slave->base_dc_supported = 0; |
110 slave->base_dc_range = EC_DC_32; |
115 slave->base_dc_range = EC_DC_32; |
276 } |
281 } |
277 |
282 |
278 /*****************************************************************************/ |
283 /*****************************************************************************/ |
279 |
284 |
280 /** |
285 /** |
|
286 * Sets the data-link state of a slave. |
|
287 */ |
|
288 |
|
289 void ec_slave_set_dl_status(ec_slave_t *slave, /**< EtherCAT slave */ |
|
290 uint16_t new_state /**< content of registers 0x0110-0x0111. */ |
|
291 ) |
|
292 { |
|
293 unsigned int i; |
|
294 uint8_t state; |
|
295 |
|
296 for (i = 0; i < EC_MAX_PORTS; i++) { |
|
297 // link status |
|
298 state = new_state & (1 << (4 + i)) ? 1 : 0; |
|
299 if (slave->ports[i].link.link_up != state) { |
|
300 EC_SLAVE_DBG(slave, 1, "Port %u link status changed to %s.\n", |
|
301 i, state ? "up" : "down"); |
|
302 slave->ports[i].link.link_up = state; |
|
303 } |
|
304 |
|
305 // loop status |
|
306 state = new_state & (1 << (8 + i * 2)) ? 1 : 0; |
|
307 if (slave->ports[i].link.loop_closed != state) { |
|
308 EC_SLAVE_DBG(slave, 1, "Port %u loop status changed to %s.\n", |
|
309 i, state ? "closed" : "open"); |
|
310 slave->ports[i].link.loop_closed = state; |
|
311 } |
|
312 |
|
313 // signal detection |
|
314 state = new_state & (1 << (9 + i * 2)) ? 1 : 0; |
|
315 if (slave->ports[i].link.signal_detected != state) { |
|
316 EC_SLAVE_DBG(slave, 1, "Port %u signal status changed to %s.\n", |
|
317 i, state ? "yes" : "no"); |
|
318 slave->ports[i].link.signal_detected = state; |
|
319 } |
|
320 } |
|
321 } |
|
322 |
|
323 /*****************************************************************************/ |
|
324 |
|
325 /** |
281 * Sets the application state of a slave. |
326 * Sets the application state of a slave. |
282 */ |
327 */ |
283 |
328 |
284 void ec_slave_set_state(ec_slave_t *slave, /**< EtherCAT slave */ |
329 void ec_slave_set_al_status(ec_slave_t *slave, /**< EtherCAT slave */ |
285 ec_slave_state_t new_state /**< new application state */ |
330 ec_slave_state_t new_state /**< new application state */ |
286 ) |
331 ) |
287 { |
332 { |
288 if (new_state != slave->current_state) { |
333 if (new_state != slave->current_state) { |
289 if (slave->master->debug_level) { |
334 if (slave->master->debug_level) { |