mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-09-27 12:33:48 +08:00
Merged changes from Martin Troxler.
This commit is contained in:
+73
-7
@@ -52,6 +52,7 @@ void ec_fsm_slave_scan_state_dc_times(ec_fsm_slave_scan_t *);
|
||||
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_end(ec_fsm_slave_scan_t *);
|
||||
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 @@ void ec_fsm_slave_scan_state_base(
|
||||
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 @@ void ec_fsm_slave_scan_state_sii_data(ec_fsm_slave_scan_t *fsm /**< slave state
|
||||
}
|
||||
|
||||
// Evaluate SII contents
|
||||
|
||||
|
||||
ec_slave_clear_sync_managers(slave);
|
||||
|
||||
slave->sii.alias =
|
||||
@@ -711,11 +713,7 @@ void ec_fsm_slave_scan_state_sii_data(ec_fsm_slave_scan_t *fsm /**< slave state
|
||||
}
|
||||
}
|
||||
|
||||
if (slave->sii.mailbox_protocols & EC_MBOX_COE) {
|
||||
ec_fsm_slave_scan_enter_preop(fsm);
|
||||
} else {
|
||||
fsm->state = ec_fsm_slave_scan_state_end;
|
||||
}
|
||||
ec_fsm_slave_scan_enter_regalias(fsm);
|
||||
return;
|
||||
|
||||
end:
|
||||
@@ -724,6 +722,74 @@ end:
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Enter slave scan state PREOP.
|
||||
|
||||
Reference in New Issue
Block a user