diff -r 53bf35f7b6ea -r 326d47aa986c master/fsm_slave_scan.c --- a/master/fsm_slave_scan.c Tue Jul 28 15:42:43 2009 +0000 +++ b/master/fsm_slave_scan.c Thu Nov 19 14:39:10 2009 +0100 @@ -52,6 +52,7 @@ void ec_fsm_slave_scan_state_datalink(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_state_sii_size(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_state_sii_data(ec_fsm_slave_scan_t *); +void ec_fsm_slave_scan_state_regalias(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_state_preop(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_state_sync(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_state_pdos(ec_fsm_slave_scan_t *); @@ -60,6 +61,7 @@ void ec_fsm_slave_scan_state_error(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_enter_datalink(ec_fsm_slave_scan_t *); +void ec_fsm_slave_scan_enter_regalias(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_enter_preop(ec_fsm_slave_scan_t *); void ec_fsm_slave_scan_enter_pdos(ec_fsm_slave_scan_t *); @@ -313,7 +315,7 @@ for (i = 0; i < EC_MAX_PORTS; i++) { slave->ports[i].desc = (octet >> (2 * i)) & 0x03; } - + octet = EC_READ_U8(datagram->data + 8); slave->base_fmmu_bit_operation = octet & 0x01; slave->base_dc_supported = (octet >> 2) & 0x01; @@ -600,7 +602,7 @@ } // Evaluate SII contents - + ec_slave_clear_sync_managers(slave); slave->sii.alias = @@ -711,17 +713,81 @@ } } + ec_fsm_slave_scan_enter_regalias(fsm); + return; + +end: + EC_ERR("Failed to analyze category data.\n"); + fsm->slave->error_flag = 1; + fsm->state = ec_fsm_slave_scan_state_error; +} + + +/*****************************************************************************/ + +/** + Slave scan entry function: REGALIAS. +*/ + +void ec_fsm_slave_scan_enter_regalias( + ec_fsm_slave_scan_t *fsm /**< slave state machine */ + ) +{ + ec_datagram_t *datagram = fsm->datagram; + ec_slave_t *slave = fsm->slave; + + // read alias from register 0x0012 + if (slave->master->debug_level) + EC_DBG("Reading alias from register 0x0012 of slave %u.\n", + slave->ring_position); + ec_datagram_fprd(datagram, slave->station_address, 0x0012, 2); + ec_datagram_zero(datagram); + fsm->retries = EC_FSM_RETRIES; + fsm->state = ec_fsm_slave_scan_state_regalias; +} + +/*****************************************************************************/ + +/** + Slave scan state: REGALIAS. +*/ +void ec_fsm_slave_scan_state_regalias( + ec_fsm_slave_scan_t *fsm /**< slave state machine */ + ) +{ + ec_datagram_t *datagram = fsm->datagram; + ec_slave_t *slave = fsm->slave; + + if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) + return; + + if (datagram->state != EC_DATAGRAM_RECEIVED) { + fsm->state = ec_fsm_slave_scan_state_error; + EC_ERR("Failed to receive get reg alias datagram from slave %u" + " (datagram state %u).\n", + fsm->slave->ring_position, datagram->state); + return; + } + + if (datagram->working_counter != 1) { + fsm->slave->error_flag = 1; + fsm->state = ec_fsm_slave_scan_state_error; + EC_ERR("Failed to read reg alias of slave %u: ", + fsm->slave->ring_position); + ec_datagram_print_wc_error(datagram); + return; + } + + slave->sii.alias = EC_READ_U16(datagram->data); + if (slave->master->debug_level) + EC_DBG("Alias of slave %u is %u.\n", + slave->ring_position,slave->sii.alias); + if (slave->sii.mailbox_protocols & EC_MBOX_COE) { ec_fsm_slave_scan_enter_preop(fsm); } else { fsm->state = ec_fsm_slave_scan_state_end; } - return; - -end: - EC_ERR("Failed to analyze category data.\n"); - fsm->slave->error_flag = 1; - fsm->state = ec_fsm_slave_scan_state_error; } /*****************************************************************************/