diff --git a/master/fsm_master.c b/master/fsm_master.c index d2fe4b83d84eac6c46bc7fe861f44fabcfba89f1..6c0311d015d7766be93343ad7a8b4bb6016b0890 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -346,8 +346,8 @@ int ec_fsm_master_action_process_eeprom( 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; @@ -971,10 +971,10 @@ void ec_fsm_master_state_write_eeprom( } 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; @@ -983,7 +983,7 @@ void ec_fsm_master_state_write_eeprom( // finished writing EEPROM if (master->debug_level) EC_DBG("Finished writing %u words of EEPROM data to slave %u.\n", - request->size, slave->ring_position); + request->word_size, slave->ring_position); request->state = EC_REQUEST_COMPLETE; wake_up(&master->eeprom_queue); diff --git a/master/fsm_master.h b/master/fsm_master.h index 26c23e6d7d545e865ecbe11057059a7c4d24be90..5f95f31aa9b19f99a66216ac0c25048eec595152 100644 --- a/master/fsm_master.h +++ b/master/fsm_master.h @@ -60,9 +60,9 @@ typedef struct { struct list_head list; ec_slave_t *slave; - off_t offset; - size_t size; - const uint16_t *words; + off_t word_offset; + size_t word_size; + const uint8_t *data; ec_request_state_t state; } ec_eeprom_write_request_t; diff --git a/master/fsm_sii.c b/master/fsm_sii.c index 638e11accc5a0d843b3e26718cb196e8ea33df36..de1a18a00db65ed8f80cc32c1c80701f37154929 100644 --- a/master/fsm_sii.c +++ b/master/fsm_sii.c @@ -105,7 +105,7 @@ void ec_fsm_sii_read(ec_fsm_sii_t *fsm, /**< finite state machine */ void ec_fsm_sii_write(ec_fsm_sii_t *fsm, /**< finite state machine */ ec_slave_t *slave, /**< slave to read from */ uint16_t offset, /**< offset to read from */ - const uint16_t *value, /**< pointer to 2 bytes of data */ + const uint8_t *value, /**< pointer to 2 bytes of data */ ec_fsm_sii_addressing_t mode /**< addressing scheme */ ) { @@ -127,7 +127,8 @@ int ec_fsm_sii_exec(ec_fsm_sii_t *fsm /**< finite state machine */) { fsm->state(fsm); - return fsm->state != ec_fsm_sii_state_end && fsm->state != ec_fsm_sii_state_error; + return fsm->state != ec_fsm_sii_state_end + && fsm->state != ec_fsm_sii_state_error; } /*****************************************************************************/ @@ -143,7 +144,7 @@ int ec_fsm_sii_success(ec_fsm_sii_t *fsm /**< Finite state machine */) } /****************************************************************************** - * SII state machine + * state functions *****************************************************************************/ /** @@ -151,7 +152,9 @@ int ec_fsm_sii_success(ec_fsm_sii_t *fsm /**< Finite state machine */) Starts reading the slave information interface. */ -void ec_fsm_sii_state_start_reading(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_start_reading( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { ec_datagram_t *datagram = fsm->datagram; @@ -179,7 +182,9 @@ void ec_fsm_sii_state_start_reading(ec_fsm_sii_t *fsm /**< finite state machine Checks, if the SII-read-datagram has been sent and issues a fetch datagram. */ -void ec_fsm_sii_state_read_check(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_read_check( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { ec_datagram_t *datagram = fsm->datagram; @@ -226,7 +231,9 @@ void ec_fsm_sii_state_read_check(ec_fsm_sii_t *fsm /**< finite state machine */) Fetches the result of an SII-read datagram. */ -void ec_fsm_sii_state_read_fetch(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_read_fetch( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { ec_datagram_t *datagram = fsm->datagram; @@ -302,7 +309,9 @@ void ec_fsm_sii_state_read_fetch(ec_fsm_sii_t *fsm /**< finite state machine */) Starts reading the slave information interface. */ -void ec_fsm_sii_state_start_writing(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_start_writing( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { ec_datagram_t *datagram = fsm->datagram; @@ -323,7 +332,9 @@ void ec_fsm_sii_state_start_writing(ec_fsm_sii_t *fsm /**< finite state machine SII state: WRITE CHECK. */ -void ec_fsm_sii_state_write_check(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_write_check( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { ec_datagram_t *datagram = fsm->datagram; @@ -361,7 +372,9 @@ void ec_fsm_sii_state_write_check(ec_fsm_sii_t *fsm /**< finite state machine */ SII state: WRITE CHECK 2. */ -void ec_fsm_sii_state_write_check2(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_write_check2( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { ec_datagram_t *datagram = fsm->datagram; @@ -417,7 +430,9 @@ void ec_fsm_sii_state_write_check2(ec_fsm_sii_t *fsm /**< finite state machine * State: ERROR. */ -void ec_fsm_sii_state_error(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_error( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { } @@ -427,7 +442,9 @@ void ec_fsm_sii_state_error(ec_fsm_sii_t *fsm /**< finite state machine */) State: END. */ -void ec_fsm_sii_state_end(ec_fsm_sii_t *fsm /**< finite state machine */) +void ec_fsm_sii_state_end( + ec_fsm_sii_t *fsm /**< finite state machine */ + ) { } diff --git a/master/fsm_sii.h b/master/fsm_sii.h index 96f36ba7322bd2b8664030cf49ad9bfab1b319cc..007be7954b7f04bd55cab6091e91330ac6657aff 100644 --- a/master/fsm_sii.h +++ b/master/fsm_sii.h @@ -85,7 +85,7 @@ void ec_fsm_sii_clear(ec_fsm_sii_t *); void ec_fsm_sii_read(ec_fsm_sii_t *, ec_slave_t *, uint16_t, ec_fsm_sii_addressing_t); void ec_fsm_sii_write(ec_fsm_sii_t *, ec_slave_t *, uint16_t, - const uint16_t *, ec_fsm_sii_addressing_t); + const uint8_t *, ec_fsm_sii_addressing_t); int ec_fsm_sii_exec(ec_fsm_sii_t *); int ec_fsm_sii_success(ec_fsm_sii_t *); diff --git a/master/slave.c b/master/slave.c index 98633ada3f728643b01d42383c4f17de4ff4c8c4..71d5181c0bf3abdcf64cfb6208c75baa585dcf12 100644 --- a/master/slave.c +++ b/master/slave.c @@ -978,11 +978,11 @@ ssize_t ec_slave_write_eeprom(ec_slave_t *slave, /**< EtherCAT slave */ // init EEPROM write request INIT_LIST_HEAD(&request.list); request.slave = slave; - request.words = (const uint16_t *) data; - request.offset = 0; - request.size = size / 2; + request.data = data; + request.word_offset = 0; + request.word_size = size / 2; - if (request.size < 0x0041) { + if (request.word_size < 0x0041) { EC_ERR("EEPROM data too short! Dropping.\n"); return -EINVAL; } @@ -993,15 +993,18 @@ ssize_t ec_slave_write_eeprom(ec_slave_t *slave, /**< EtherCAT slave */ EC_WARN("EEPROM CRC incorrect. Must be 0x%02x.\n", crc); } - cat_header = request.words + EC_FIRST_EEPROM_CATEGORY_OFFSET; + cat_header = (const uint16_t *) request.data + + EC_FIRST_EEPROM_CATEGORY_OFFSET; cat_type = EC_READ_U16(cat_header); while (cat_type != 0xFFFF) { // cycle through categories - if (cat_header + 1 > request.words + request.size) { + if (cat_header + 1 > + (const uint16_t *) request.data + request.word_size) { EC_ERR("EEPROM data corrupted! Dropping.\n"); return -EINVAL; } cat_size = EC_READ_U16(cat_header + 1); - if (cat_header + cat_size + 2 > request.words + request.size) { + if (cat_header + cat_size + 2 > + (const uint16_t *) request.data + request.word_size) { EC_ERR("EEPROM data corrupted! Dropping.\n"); return -EINVAL; } @@ -1030,9 +1033,9 @@ ssize_t ec_slave_write_alias(ec_slave_t *slave, /**< EtherCAT slave */ { ec_eeprom_write_request_t request; char *remainder; - uint16_t alias, words[8]; + uint16_t alias; int ret; - uint8_t crc; + uint8_t eeprom_data[16], crc; if (slave->master->mode != EC_MASTER_MODE_IDLE) { // FIXME EC_ERR("Writing to EEPROM is only allowed in idle mode!\n"); @@ -1052,21 +1055,21 @@ ssize_t ec_slave_write_alias(ec_slave_t *slave, /**< EtherCAT slave */ } // copy first 7 words of recent EEPROM contents - memcpy(words, slave->eeprom_data, 14); + memcpy(eeprom_data, slave->eeprom_data, 14); - // write new alias address - EC_WRITE_U16(words + 4, alias); + // write new alias address in word 4 + EC_WRITE_U16(eeprom_data + 8, alias); // calculate new checksum over words 0 to 6 - crc = ec_slave_eeprom_crc((const uint8_t *) words, 14); - EC_WRITE_U16(words + 7, crc); + crc = ec_slave_eeprom_crc(eeprom_data, 14); + EC_WRITE_U16(eeprom_data + 14, crc); // init EEPROM write request INIT_LIST_HEAD(&request.list); request.slave = slave; - request.words = words; - request.offset = 0x0000; - request.size = 8; + request.data = eeprom_data; + request.word_offset = 0x0000; + request.word_size = 8; if ((ret = ec_slave_schedule_eeprom_writing(&request))) return ret; // error code