master/slave.c
changeset 2600 1a969896d52e
parent 2597 0e145bb05859
--- 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 */
         )
 {