diff -r 07fd94c5119d -r 72e7507b3f1b master/fsm_master.c --- a/master/fsm_master.c Thu Sep 13 11:08:46 2007 +0000 +++ b/master/fsm_master.c Wed Oct 03 08:58:01 2007 +0000 @@ -60,6 +60,7 @@ void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *); void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *); void ec_fsm_master_state_sdodict(ec_fsm_master_t *); +void ec_fsm_master_state_pdomap(ec_fsm_master_t *); void ec_fsm_master_state_sdo_request(ec_fsm_master_t *); void ec_fsm_master_state_end(ec_fsm_master_t *); void ec_fsm_master_state_error(ec_fsm_master_t *); @@ -90,6 +91,7 @@ ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram); + ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe); } /*****************************************************************************/ @@ -105,6 +107,7 @@ ec_fsm_sii_clear(&fsm->fsm_sii); ec_fsm_change_clear(&fsm->fsm_change); ec_fsm_coe_clear(&fsm->fsm_coe); + ec_fsm_coe_map_clear(&fsm->fsm_coe_map); } /*****************************************************************************/ @@ -329,8 +332,8 @@ up(&master->eeprom_sem); slave = request->slave; - if (slave->online_state == EC_SLAVE_OFFLINE || slave->error_flag) { - EC_ERR("Discarding EEPROM data, slave %i not ready.\n", + if (slave->online_state == EC_SLAVE_OFFLINE) { + EC_ERR("Discarding EEPROM data, slave %i offline.\n", slave->ring_position); request->state = EC_REQUEST_FAILURE; wake_up(&master->eeprom_queue); @@ -343,8 +346,8 @@ slave->ring_position); fsm->eeprom_request = request; fsm->eeprom_index = 0; - ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->offset, - request->words, EC_FSM_SII_NODE); + ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->word_offset, + request->data, EC_FSM_SII_NODE); fsm->state = ec_fsm_master_state_write_eeprom; fsm->state(fsm); // execute immediately return 1; @@ -382,7 +385,7 @@ request->state = EC_REQUEST_IN_PROGRESS; up(&master->sdo_sem); - slave = request->sdo->slave; + slave = request->entry->sdo->slave; if (slave->current_state == EC_SLAVE_STATE_INIT || slave->online_state == EC_SLAVE_OFFLINE || slave->error_flag) { @@ -414,6 +417,7 @@ /*****************************************************************************/ /** + * Check for slaves that are not configured and configure them. */ int ec_fsm_master_action_configure( @@ -521,6 +525,29 @@ return; } + // check, if slaves have their PDO mapping to be read. + list_for_each_entry(slave, &master->slaves, list) { + if (!(slave->sii_mailbox_protocols & EC_MBOX_COE) + || slave->pdo_mapping_fetched + || !slave->sdo_dictionary_fetched + || slave->current_state == EC_SLAVE_STATE_INIT + || slave->online_state == EC_SLAVE_OFFLINE) continue; + + if (master->debug_level) { + EC_DBG("Fetching PDO mapping from slave %i via CoE.\n", + slave->ring_position); + } + + slave->pdo_mapping_fetched = 1; + + // start fetching PDO mapping + fsm->idle = 0; + fsm->state = ec_fsm_master_state_pdomap; + ec_fsm_coe_map_start(&fsm->fsm_coe_map, slave); + ec_fsm_coe_map_exec(&fsm->fsm_coe_map); // execute immediately + return; + } + // check for pending EEPROM write operations. if (ec_fsm_master_action_process_eeprom(fsm)) return; // EEPROM write request found @@ -945,10 +972,10 @@ } fsm->eeprom_index++; - if (fsm->eeprom_index < request->size) { + if (fsm->eeprom_index < request->word_size) { ec_fsm_sii_write(&fsm->fsm_sii, slave, - request->offset + fsm->eeprom_index, - request->words + fsm->eeprom_index, + request->word_offset + fsm->eeprom_index, + request->data + fsm->eeprom_index * 2, EC_FSM_SII_NODE); ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately return; @@ -956,8 +983,8 @@ // finished writing EEPROM if (master->debug_level) - EC_DBG("Finished writing EEPROM data to slave %i.\n", - slave->ring_position); + EC_DBG("Finished writing %u words of EEPROM data to slave %u.\n", + request->word_size, slave->ring_position); request->state = EC_REQUEST_COMPLETE; wake_up(&master->eeprom_queue); @@ -1003,6 +1030,27 @@ /*****************************************************************************/ /** + * Scan the PDO mapping of a slave. + */ + +void ec_fsm_master_state_pdomap( + ec_fsm_master_t *fsm /**< master state machine */ + ) +{ + if (ec_fsm_coe_map_exec(&fsm->fsm_coe_map)) return; + + if (!ec_fsm_coe_map_success(&fsm->fsm_coe_map)) { + fsm->state = ec_fsm_master_state_error; + return; + } + + // fetching of PDO mapping finished + fsm->state = ec_fsm_master_state_end; +} + +/*****************************************************************************/ + +/** Master state: SDO REQUEST. */