Changed unit of ec_eeprom_write_request_t from word to byte.

This commit is contained in:
Florian Pose 2007-09-24 07:54:51 +00:00
parent 8f31083441
commit 59d245a367
5 changed files with 58 additions and 38 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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 */
)
{
}

View File

@ -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 *);

View File

@ -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