master/slave.c
changeset 2600 1a969896d52e
parent 2597 0e145bb05859
equal deleted inserted replaced
2598:19ff84bbbcb3 2600:1a969896d52e
    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) {