49 #define SII_LOAD_TIMEOUT 500 58 #define SII_TIMEOUT 20 108 uint16_t word_offset,
126 uint16_t word_offset,
127 const uint16_t *value,
135 memcpy(fsm->
value, value, 2);
161 fsm->
state(fsm, datagram);
241 memset(datagram->
data + 4, 0x00, 2);
242 memcpy(datagram->
data + 6, fsm->
value, 2);
342 "Failed to receive SII check/fetch datagram: ");
350 "Reception of SII check/fetch datagram failed: ");
362 " reading from SII word 0x%04x.\n", fsm->
word_offset);
369 unsigned long diff_ms;
374 "SII Read Error, EEPROM not loaded. Retrying...\n");
386 "SII Error: Timeout waiting for EEPROM to load.\n");
409 unsigned long diff_ms =
504 unsigned long diff_ms;
514 "Failed to receive SII write check datagram: ");
522 "Reception of SII write check datagram failed: ");
static void ec_fsm_sii_prepare_write(ec_fsm_sii_t *fsm, ec_datagram_t *datagram)
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
uint16_t ring_position
Ring position.
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
void ec_fsm_sii_state_end(ec_fsm_sii_t *, ec_datagram_t *)
State: END.
void ec_fsm_sii_state_error(ec_fsm_sii_t *, ec_datagram_t *)
State: ERROR.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
#define SII_TIMEOUT
Read/write timeout [ms].
void ec_fsm_sii_state_start_writing(ec_fsm_sii_t *, ec_datagram_t *)
SII state: START WRITING.
void(* state)(ec_fsm_sii_t *, ec_datagram_t *)
SII state function.
unsigned long jiffies_start
Start timestamp.
Slave information interface FSM.
ec_fsm_sii_addressing_t
SII access addressing mode.
static void ec_fsm_sii_prepare_read_check(ec_fsm_sii_t *fsm, ec_datagram_t *datagram)
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
uint16_t word_offset
input: word offset in SII
void ec_fsm_sii_write(ec_fsm_sii_t *fsm, ec_slave_t *slave, uint16_t word_offset, const uint16_t *value, ec_fsm_sii_addressing_t mode)
Initializes the SII write state machine.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
#define SII_INHIBIT
Time before evaluating answer at writing [ms].
uint16_t working_counter
Working counter.
int ec_fsm_sii_exec(ec_fsm_sii_t *fsm, ec_datagram_t *datagram)
Executes the SII state machine.
Sent (still in the queue).
uint16_t station_address
Configured station address.
int ec_datagram_aprd(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APRD datagram.
void ec_fsm_sii_state_read_fetch(ec_fsm_sii_t *, ec_datagram_t *)
SII state: READ FETCH.
Global definitions and macros.
EtherCAT master structure.
Initial state of a new datagram.
unsigned int retries
retries upon datagram timeout
int ec_datagram_apwr(ec_datagram_t *datagram, uint16_t ring_position, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT APWR datagram.
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
ec_datagram_state_t state
State.
Use configured addresses.
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
void ec_datagram_print_wc_error(const ec_datagram_t *datagram)
Evaluates the working counter of a single-cast datagram.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
int ec_datagram_fpwr(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPWR datagram.
void ec_fsm_sii_state_start_reading(ec_fsm_sii_t *, ec_datagram_t *)
SII state: START READING.
int ec_datagram_fprd(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPRD datagram.
void ec_fsm_sii_state_write_check2(ec_fsm_sii_t *, ec_datagram_t *)
SII state: WRITE CHECK 2.
uint8_t check_once_more
one more try after timeout
void ec_fsm_sii_read(ec_fsm_sii_t *fsm, ec_slave_t *slave, uint16_t word_offset, ec_fsm_sii_addressing_t mode)
Initializes the SII read state machine.
#define EC_SLAVE_INFO(slave, fmt, args...)
Convenience macro for printing slave-specific information to syslog.
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
void ec_fsm_sii_clear(ec_fsm_sii_t *fsm)
Destructor.
EtherCAT slave information interface FSM structure.
int ec_fsm_sii_success(ec_fsm_sii_t *fsm)
Returns, if the master startup state machine terminated with success.
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
void ec_fsm_sii_state_write_check(ec_fsm_sii_t *, ec_datagram_t *)
SII state: WRITE CHECK.
uint8_t eeprom_load_retry
waiting for eeprom to be loaded
ec_slave_t * slave
slave the FSM runs on
void ec_fsm_sii_init(ec_fsm_sii_t *fsm)
Constructor.
static void ec_fsm_sii_prepare_read(ec_fsm_sii_t *fsm, ec_datagram_t *datagram)
uint8_t * data
Datagram payload.
static void ec_fsm_sii_prepare_write_check(ec_fsm_sii_t *fsm, ec_datagram_t *datagram)
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
Unused and should not be queued (dequeued).
ec_fsm_sii_addressing_t mode
reading via APRD or NPRD
Use auto-increment addressing.
void ec_fsm_sii_state_read_check(ec_fsm_sii_t *, ec_datagram_t *)
SII state: READ CHECK.
ec_datagram_t * datagram
datagram used in the state machine
unsigned long jiffies_received
Jiffies, when the datagram was received.
#define SII_LOAD_TIMEOUT
EEPROM load timeout [ms].
uint8_t value[4]
raw SII value (32bit)