# HG changeset patch # User Florian Pose # Date 1162568131 0 # Node ID 322fab6b085bc6514cfe7c6478db0af58bdb9c59 # Parent 69d05643041fdc7a91397b91e8b8e8be35c5b44a Fix: Configuration of process data sync managers now in PREOP. diff -r 69d05643041f -r 322fab6b085b master/fsm.c --- a/master/fsm.c Fri Nov 03 14:18:05 2006 +0000 +++ b/master/fsm.c Fri Nov 03 15:35:31 2006 +0000 @@ -73,6 +73,7 @@ void ec_fsm_slaveconf_state_clear_fmmus(ec_fsm_t *); void ec_fsm_slaveconf_state_sync(ec_fsm_t *); void ec_fsm_slaveconf_state_preop(ec_fsm_t *); +void ec_fsm_slaveconf_state_sync2(ec_fsm_t *); void ec_fsm_slaveconf_state_fmmu(ec_fsm_t *); void ec_fsm_slaveconf_state_sdoconf(ec_fsm_t *); void ec_fsm_slaveconf_state_saveop(ec_fsm_t *); @@ -80,6 +81,8 @@ void ec_fsm_slaveconf_enter_sync(ec_fsm_t *); void ec_fsm_slaveconf_enter_preop(ec_fsm_t *); +void ec_fsm_slaveconf_enter_sync2(ec_fsm_t *); +void ec_fsm_slaveconf_enter_fmmu(ec_fsm_t *); void ec_fsm_slaveconf_enter_sdoconf(ec_fsm_t *); void ec_fsm_slaveconf_enter_saveop(ec_fsm_t *); @@ -1361,14 +1364,10 @@ datagram->data + EC_SYNC_SIZE * mbox_sync.index); } } - else { + else if (slave->sii_mailbox_protocols) { // mailboxes present list_for_each_entry(sync, &slave->sii_syncs, list) { - if (sync->index >= slave->base_sync_count) { - EC_ERR("Invalid sync manager configuration found!"); - fsm->slave->error_flag = 1; - fsm->slave_state = ec_fsm_slave_state_error; - return; - } + // only configure mailbox sync-managers + if (sync->index != 0 && sync->index != 1) continue; ec_sync_config(sync, slave, datagram->data + EC_SYNC_SIZE * sync->index); } @@ -1423,8 +1422,6 @@ { ec_slave_t *slave = fsm->slave; ec_master_t *master = fsm->master; - ec_datagram_t *datagram = &fsm->datagram; - unsigned int j; if (ec_fsm_change_exec(&fsm->fsm_change)) return; @@ -1450,12 +1447,75 @@ return; } + ec_fsm_slaveconf_enter_sync2(fsm); +} + +/*****************************************************************************/ + +/** +*/ + +void ec_fsm_slaveconf_enter_sync2(ec_fsm_t *fsm /**< finite state machine */) +{ + ec_slave_t *slave = fsm->slave; + ec_datagram_t *datagram = &fsm->datagram; + ec_sii_sync_t *sync; + + if (list_empty(&slave->sii_syncs)) { + ec_fsm_slaveconf_enter_fmmu(fsm); + return; + } + + // configure sync managers for process data + ec_datagram_npwr(datagram, slave->station_address, 0x0800, + EC_SYNC_SIZE * slave->base_sync_count); + memset(datagram->data, 0x00, EC_SYNC_SIZE * slave->base_sync_count); + + list_for_each_entry(sync, &slave->sii_syncs, list) { + ec_sync_config(sync, slave, + datagram->data + EC_SYNC_SIZE * sync->index); + } + + ec_master_queue_datagram(fsm->master, datagram); + fsm->slave_state = ec_fsm_slaveconf_state_sync2; +} + +/*****************************************************************************/ + +/** + Slave configuration state: SYNC2. +*/ + +void ec_fsm_slaveconf_state_sync2(ec_fsm_t *fsm /**< finite state machine */) +{ + ec_datagram_t *datagram = &fsm->datagram; + ec_slave_t *slave = fsm->slave; + + if (datagram->state != EC_DATAGRAM_RECEIVED + || datagram->working_counter != 1) { + slave->error_flag = 1; + fsm->slave_state = ec_fsm_slave_state_error; + EC_ERR("Failed to set process data sync managers on slave %i.\n", + slave->ring_position); + return; + } + + ec_fsm_slaveconf_enter_fmmu(fsm); +} + +/*****************************************************************************/ + +/** +*/ + +void ec_fsm_slaveconf_enter_fmmu(ec_fsm_t *fsm /**< finite state machine */) +{ + ec_slave_t *slave = fsm->slave; + ec_master_t *master = slave->master; + ec_datagram_t *datagram = &fsm->datagram; + unsigned int j; + if (!slave->base_fmmu_count) { // skip FMMU configuration - if (list_empty(&slave->sdo_confs)) { // skip SDO configuration - ec_fsm_slaveconf_enter_saveop(fsm); - return; - } - ec_fsm_slaveconf_enter_sdoconf(fsm); return; } @@ -1509,6 +1569,13 @@ void ec_fsm_slaveconf_enter_sdoconf(ec_fsm_t *fsm /**< finite state machine */) { + ec_slave_t *slave = fsm->slave; + + if (list_empty(&slave->sdo_confs)) { // skip SDO configuration + ec_fsm_slaveconf_enter_saveop(fsm); + return; + } + // start SDO configuration fsm->slave_state = ec_fsm_slaveconf_state_sdoconf; fsm->sdodata = list_entry(fsm->slave->sdo_confs.next, ec_sdo_data_t, list);