Changed unit of ec_eeprom_write_request_t from word to byte.
This commit is contained in:
parent
8f31083441
commit
59d245a367
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 *);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue