diff -r 19ff84bbbcb3 -r 1a969896d52e master/slave.c --- a/master/slave.c Thu Feb 19 15:19:29 2015 +0100 +++ b/master/slave.c Fri Feb 20 16:06:23 2015 +0100 @@ -95,7 +95,7 @@ slave->ports[i].desc = EC_PORT_NOT_IMPLEMENTED; slave->ports[i].link.link_up = 0; - slave->ports[i].link.loop_closed = 0; + slave->ports[i].link.loop_closed = 1; slave->ports[i].link.signal_detected = 0; slave->sii.physical_layer[i] = 0xFF; @@ -103,6 +103,11 @@ slave->ports[i].next_slave = NULL; slave->ports[i].delay_to_next_dc = 0U; + +#ifdef EC_LOOP_CONTROL + slave->ports[i].state = EC_SLAVE_PORT_DOWN; + slave->ports[i].link_detection_jiffies = 0; +#endif } slave->base_fmmu_bit_operation = 0; @@ -278,10 +283,50 @@ /*****************************************************************************/ /** + * Sets the data-link state of a slave. + */ + +void ec_slave_set_dl_status(ec_slave_t *slave, /**< EtherCAT slave */ + uint16_t new_state /**< content of registers 0x0110-0x0111. */ + ) +{ + unsigned int i; + uint8_t state; + + for (i = 0; i < EC_MAX_PORTS; i++) { + // link status + state = new_state & (1 << (4 + i)) ? 1 : 0; + if (slave->ports[i].link.link_up != state) { + EC_SLAVE_DBG(slave, 1, "Port %u link status changed to %s.\n", + i, state ? "up" : "down"); + slave->ports[i].link.link_up = state; + } + + // loop status + state = new_state & (1 << (8 + i * 2)) ? 1 : 0; + if (slave->ports[i].link.loop_closed != state) { + EC_SLAVE_DBG(slave, 1, "Port %u loop status changed to %s.\n", + i, state ? "closed" : "open"); + slave->ports[i].link.loop_closed = state; + } + + // signal detection + state = new_state & (1 << (9 + i * 2)) ? 1 : 0; + if (slave->ports[i].link.signal_detected != state) { + EC_SLAVE_DBG(slave, 1, "Port %u signal status changed to %s.\n", + i, state ? "yes" : "no"); + slave->ports[i].link.signal_detected = state; + } + } +} + +/*****************************************************************************/ + +/** * Sets the application state of a slave. */ -void ec_slave_set_state(ec_slave_t *slave, /**< EtherCAT slave */ +void ec_slave_set_al_status(ec_slave_t *slave, /**< EtherCAT slave */ ec_slave_state_t new_state /**< new application state */ ) {