46 #define EC_FSM_COE_DICT_TIMEOUT 1000 50 #define EC_COE_DOWN_REQ_HEADER_SIZE 10 54 #define EC_COE_DOWN_SEG_REQ_HEADER_SIZE 3 58 #define EC_COE_DOWN_SEG_MIN_DATA_SIZE 7 62 #define DEBUG_RETRIES 0 115 {0x05030000,
"Toggle bit not changed"},
116 {0x05040000,
"SDO protocol timeout"},
117 {0x05040001,
"Client/Server command specifier not valid or unknown"},
118 {0x05040005,
"Out of memory"},
119 {0x06010000,
"Unsupported access to an object"},
120 {0x06010001,
"Attempt to read a write-only object"},
121 {0x06010002,
"Attempt to write a read-only object"},
122 {0x06020000,
"This object does not exist in the object directory"},
123 {0x06040041,
"The object cannot be mapped into the PDO"},
124 {0x06040042,
"The number and length of the objects to be mapped would" 125 " exceed the PDO length"},
126 {0x06040043,
"General parameter incompatibility reason"},
127 {0x06040047,
"Gerneral internal incompatibility in device"},
128 {0x06060000,
"Access failure due to a hardware error"},
129 {0x06070010,
"Data type does not match, length of service parameter does" 131 {0x06070012,
"Data type does not match, length of service parameter too" 133 {0x06070013,
"Data type does not match, length of service parameter too" 135 {0x06090011,
"Subindex does not exist"},
136 {0x06090030,
"Value range of parameter exceeded"},
137 {0x06090031,
"Value of parameter written too high"},
138 {0x06090032,
"Value of parameter written too low"},
139 {0x06090036,
"Maximum value is less than minimum value"},
140 {0x08000000,
"General error"},
141 {0x08000020,
"Data cannot be transferred or stored to the application"},
142 {0x08000021,
"Data cannot be transferred or stored to the application" 143 " because of local control"},
144 {0x08000022,
"Data cannot be transferred or stored to the application" 145 " because of the present device state"},
146 {0x08000023,
"Object dictionary dynamic generation fails or no object" 147 " dictionary is present"},
162 for (abort_msg = sdo_abort_messages; abort_msg->
code; abort_msg++) {
163 if (abort_msg->
code == abort_code) {
164 EC_SLAVE_ERR(slave,
"SDO abort message 0x%08X: \"%s\".\n",
170 EC_SLAVE_ERR(slave,
"Unknown SDO abort code 0x%08X.\n", abort_code);
243 fsm->
state(fsm, datagram);
280 if (size < 2 || ((
EC_READ_U16(data) >> 12) & 0x0F) != 0x01)
298 "Error code 0x%04X, Error register 0x%02X, data:\n",
319 EC_MBOX_TYPE_COE, 8);
321 return PTR_ERR(data);
346 EC_SLAVE_ERR(slave,
"Slave cannot process CoE dictionary request." 347 " SII data not available.\n");
360 " SDO information service!\n");
394 " request datagram: ");
401 EC_SLAVE_ERR(slave,
"Reception of CoE dictionary request failed: ");
439 EC_SLAVE_ERR(slave,
"Failed to receive CoE mailbox check datagram: ");
448 " datagram failed: ");
454 unsigned long diff_ms = 0;
460 fsm->
state(fsm, datagram);
471 " SDO dictionary list response.\n");
501 return PTR_ERR(data);
537 " response datagram: ");
547 EC_SLAVE_ERR(slave,
"Reception of CoE dictionary response failed: ");
554 fsm->
state(fsm, datagram);
571 uint8_t *data, mbox_prot;
573 unsigned int sdo_count, i;
574 uint16_t sdo_index, fragments_left;
577 size_t index_list_offset;
600 if (mbox_prot != EC_MBOX_TYPE_COE) {
601 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
616 EC_SLAVE_ERR(slave,
"Received corrupted SDO dictionary response" 617 " (size %zu).\n", rec_size);
624 EC_SLAVE_ERR(slave,
"SDO information error response!\n");
627 " error response:\n");
649 first_segment = list_empty(&slave->
sdo_dictionary) ? true :
false;
650 index_list_offset = first_segment ? 8 : 6;
652 if (rec_size < index_list_offset || rec_size % 2) {
653 EC_SLAVE_ERR(slave,
"Invalid data size %zu!\n", rec_size);
659 sdo_count = (rec_size - index_list_offset) / 2;
661 for (i = 0; i < sdo_count; i++) {
662 sdo_index =
EC_READ_U16(data + index_list_offset + i * 2);
664 EC_SLAVE_DBG(slave, 1,
"SDO dictionary contains index 0x0000.\n");
669 EC_SLAVE_ERR(slave,
"Failed to allocate memory for SDO!\n");
679 if (fragments_left) {
684 if (
EC_READ_U8(data + 2) & 0x80 || fragments_left) {
732 " description request datagram: ");
740 " request failed: ");
780 EC_SLAVE_ERR(slave,
"Failed to receive CoE mailbox check datagram: ");
789 " datagram failed: ");
795 unsigned long diff_ms = 0;
801 fsm->
state(fsm, datagram);
812 " SDO 0x%04x object description response.\n",
843 return PTR_ERR(data);
880 EC_SLAVE_ERR(slave,
"Failed to receive CoE SDO description" 881 " response datagram: ");
892 " response failed: ");
899 fsm->
state(fsm, datagram);
916 uint8_t *data, mbox_prot;
917 size_t rec_size, name_size;
940 if (mbox_prot != EC_MBOX_TYPE_COE) {
941 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
956 EC_SLAVE_ERR(slave,
"Received corrupted SDO description response" 957 " (size %zu).\n", rec_size);
964 EC_SLAVE_ERR(slave,
"SDO information error response while" 965 " fetching SDO 0x%04X!\n", sdo->
index);
973 " description response (size %zu).\n", rec_size);
982 EC_SLAVE_DBG(slave, 1,
"Invalid object description response while" 983 " fetching SDO 0x%04X!\n", sdo->
index);
1003 name_size = rec_size - 12;
1005 if (!(sdo->
name = kmalloc(name_size + 1, GFP_KERNEL))) {
1011 memcpy(sdo->
name, data + 12, name_size);
1012 sdo->
name[name_size] = 0;
1016 EC_SLAVE_ERR(slave,
"Fragment follows (not implemented)!\n");
1055 " request datagram: ");
1062 EC_SLAVE_ERR(slave,
"Reception of CoE SDO entry request failed: ");
1102 EC_SLAVE_ERR(slave,
"Failed to receive CoE mailbox check datagram: ");
1111 " datagram failed: ");
1117 unsigned long diff_ms = 0;
1123 fsm->
state(fsm, datagram);
1134 " SDO entry 0x%04x:%x description response.\n",
1173 " description response datagram: ");
1184 " response failed: ");
1191 fsm->
state(fsm, datagram);
1208 uint8_t *data, mbox_prot;
1209 size_t rec_size, data_size;
1234 if (mbox_prot != EC_MBOX_TYPE_COE) {
1236 " 0x%02X as response.\n", mbox_prot);
1251 " description response (size %zu).\n", rec_size);
1259 " fetching SDO entry 0x%04X:%02X!\n",
1270 " description response (size %zu).\n", rec_size);
1280 EC_SLAVE_DBG(slave, 1,
"Invalid entry description response" 1281 " while fetching SDO entry 0x%04X:%02X!\n",
1292 if (rec_size < 16) {
1293 EC_SLAVE_ERR(slave,
"Invalid data size %zu!\n", rec_size);
1299 data_size = rec_size - 16;
1316 (word >> 1) & 0x0001;
1320 (word >> 4) & 0x0001;
1325 if (!(desc = kmalloc(data_size + 1, GFP_KERNEL))) {
1326 EC_SLAVE_ERR(slave,
"Failed to allocate SDO entry name!\n");
1330 memcpy(desc, data + 16, data_size);
1331 desc[data_size] = 0;
1382 uint8_t data_set_size;
1388 request->
errno = PTR_ERR(data);
1389 return PTR_ERR(data);
1398 | data_set_size << 2
1408 EC_SLAVE_DBG(slave, 1,
"Expedited download request:\n");
1416 required_data_size =
1419 if (max_data_size < required_data_size) {
1421 data_size = max_data_size;
1423 data_size = required_data_size;
1429 request->
errno = PTR_ERR(data);
1430 return PTR_ERR(data);
1448 memcpy(data + EC_COE_DOWN_REQ_HEADER_SIZE,
1449 request->
data, segment_size);
1450 fsm->
offset += segment_size;
1479 subidxstr[0] = 0x00;
1481 sprintf(subidxstr,
":%02X", request->
subindex);
1484 request->
index, subidxstr);
1489 EC_SLAVE_ERR(slave,
"Slave cannot process CoE download request." 1490 " SII data not available.\n");
1491 request->
errno = EAGAIN;
1498 request->
errno = EPROTONOSUPPORT;
1506 request->
errno = EOVERFLOW;
1533 unsigned long diff_ms;
1546 " request datagram: ");
1555 if (diff_ms < fsm->request->response_timeout) {
1558 " download request. Retrying after %lu ms...\n",
1570 EC_SLAVE_ERR(slave,
"Reception of CoE download request" 1571 " for SDO 0x%04x:%x failed with timeout after %lu ms: ",
1578 if (diff_ms > 200) {
1579 EC_SLAVE_WARN(slave,
"SDO 0x%04x:%x download took %lu ms.\n",
1618 EC_SLAVE_ERR(slave,
"Failed to receive CoE mailbox check" 1629 " datagram failed: ");
1635 unsigned long diff_ms = 0;
1641 fsm->
state(fsm, datagram);
1652 EC_SLAVE_ERR(slave,
"Timeout after %lu ms while waiting" 1653 " for SDO 0x%04x:%x download response.\n", diff_ms,
1680 size_t max_segment_size =
1685 uint8_t last_segment, seg_data_size, *data;
1687 if (fsm->
remaining > max_segment_size) {
1696 seg_data_size = 0x00;
1697 data_size = EC_COE_DOWN_SEG_REQ_HEADER_SIZE + fsm->
segment_size;
1700 data_size = EC_COE_DOWN_SEG_REQ_HEADER_SIZE
1707 request->
errno = PTR_ERR(data);
1714 | (seg_data_size << 1)
1717 memcpy(data + EC_COE_DOWN_SEG_REQ_HEADER_SIZE,
1720 memset(data + EC_COE_DOWN_SEG_REQ_HEADER_SIZE + fsm->
segment_size,
1753 request->
errno = EIO;
1756 " response datagram: ");
1764 request->
errno = EIO;
1767 EC_SLAVE_ERR(slave,
"Reception of CoE download response failed: ");
1774 fsm->
state(fsm, datagram);
1790 uint8_t *data, mbox_prot;
1812 request->
errno = PTR_ERR(data);
1817 if (mbox_prot != EC_MBOX_TYPE_COE) {
1818 request->
errno = EIO;
1820 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
1839 request->
errno = EIO;
1841 EC_SLAVE_ERR(slave,
"Received data are too small (%zu bytes):\n",
1850 request->
errno = EIO;
1853 subidxstr[0] = 0x00;
1855 sprintf(subidxstr,
":%02X", request->
subindex);
1857 EC_SLAVE_ERR(slave,
"SDO download 0x%04X%s (%zu bytes) aborted.\n",
1859 if (rec_size < 10) {
1874 EC_SLAVE_DBG(slave, 1,
"Invalid SDO download response!" 1913 EC_SLAVE_ERR(slave,
"Failed to receive CoE mailbox check datagram: ");
1922 EC_SLAVE_ERR(slave,
"Reception of CoE mailbox segment check" 1923 " datagram failed: ");
1929 unsigned long diff_ms = 0;
1935 fsm->
state(fsm, datagram);
1946 EC_SLAVE_ERR(slave,
"Timeout while waiting for SDO download" 1947 " segment response.\n");
1983 request->
errno = EIO;
1986 EC_SLAVE_ERR(slave,
"Failed to receive CoE download response" 1995 request->
errno = EIO;
1998 EC_SLAVE_ERR(slave,
"Reception of CoE download response failed: ");
2005 fsm->
state(fsm, datagram);
2021 uint8_t *data, mbox_prot;
2042 request->
errno = PTR_ERR(data);
2047 if (mbox_prot != EC_MBOX_TYPE_COE) {
2048 request->
errno = EIO;
2050 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
2069 request->
errno = EIO;
2071 EC_SLAVE_ERR(slave,
"Received data are too small (%zu bytes):\n",
2080 request->
errno = EIO;
2083 subidxstr[0] = 0x00;
2085 sprintf(subidxstr,
":%02X", request->
subindex);
2087 EC_SLAVE_ERR(slave,
"SDO download 0x%04X%s (%zu bytes) aborted.\n",
2089 if (rec_size < 10) {
2102 EC_SLAVE_DBG(slave, 1,
"Invalid SDO download response!" 2115 " segmented download:\n");
2117 request->
errno = EIO;
2151 request->
errno = PTR_ERR(data);
2152 return PTR_ERR(data);
2160 memset(data + 6, 0x00, 4);
2187 subidxstr[0] = 0x00;
2189 sprintf(subidxstr,
":%02X", request->
subindex);
2193 request->
index, subidxstr);
2196 EC_SLAVE_ERR(slave,
"Slave cannot process CoE upload request." 2197 " SII data not available.\n");
2198 request->
errno = EAGAIN;
2205 request->
errno = EPROTONOSUPPORT;
2230 unsigned long diff_ms;
2234 subidxstr[0] = 0x00;
2249 EC_SLAVE_ERR(slave,
"Failed to receive CoE upload request: ");
2258 if (diff_ms < fsm->request->response_timeout) {
2261 " SDO upload request. Retrying after %lu ms...\n",
2273 EC_SLAVE_ERR(slave,
"Reception of CoE upload request for" 2274 " SDO 0x%04x%s failed with timeout after %lu ms: ",
2281 if (diff_ms > 200) {
2322 EC_SLAVE_ERR(slave,
"Failed to receive CoE mailbox check datagram: ");
2332 " datagram failed: ");
2338 unsigned long diff_ms = 0;
2344 fsm->
state(fsm, datagram);
2355 subidxstr[0] = 0x00;
2363 EC_SLAVE_ERR(slave,
"Timeout after %lu ms while waiting for" 2364 " SDO 0x%04x%s upload response.\n", diff_ms,
2401 memset(data + 3, 0x00, 7);
2430 request->
errno = EIO;
2433 EC_SLAVE_ERR(slave,
"Failed to receive CoE upload response" 2442 request->
errno = EIO;
2445 EC_SLAVE_ERR(slave,
"Reception of CoE upload response failed: ");
2452 fsm->
state(fsm, datagram);
2471 uint8_t *data, mbox_prot, rec_subindex;
2472 size_t rec_size, data_size;
2474 unsigned int expedited, size_specified;
2479 subidxstr[0] = 0x00;
2481 sprintf(subidxstr,
":%02X", request->
subindex);
2502 request->
errno = PTR_ERR(data);
2512 if (mbox_prot != EC_MBOX_TYPE_COE) {
2513 request->
errno = EIO;
2516 " as response.\n", mbox_prot);
2529 request->
errno = EIO;
2531 EC_SLAVE_ERR(slave,
"Received currupted SDO upload response" 2532 " (%zu bytes)!\n", rec_size);
2540 request->
index, subidxstr);
2541 if (rec_size >= 10) {
2547 request->
errno = EIO;
2555 " uploading SDO 0x%04X%s.\n",
2556 request->
index, subidxstr);
2558 request->
errno = EIO;
2566 if (rec_index != request->
index || rec_subindex != request->
subindex) {
2567 EC_SLAVE_ERR(slave,
"Received upload response for wrong SDO" 2568 " (0x%04X:%02X, requested: 0x%04X:%02X).\n",
2569 rec_index, rec_subindex, request->
index, request->
subindex);
2583 size_specified =
EC_READ_U8(data + 2) & 0x01;
2584 if (size_specified) {
2590 if (rec_size < 6 + fsm->complete_size) {
2591 request->
errno = EIO;
2593 EC_SLAVE_ERR(slave,
"Received corrupted SDO expedited upload" 2594 " response (only %zu bytes)!\n", rec_size);
2601 request->
errno = -ret;
2606 if (rec_size < 10) {
2607 request->
errno = EIO;
2609 EC_SLAVE_ERR(slave,
"Received currupted SDO normal upload" 2610 " response (only %zu bytes)!\n", rec_size);
2615 data_size = rec_size - 10;
2619 request->
errno = EIO;
2628 request->
errno = -ret;
2635 request->
errno = -ret;
2642 if (data_size < fsm->complete_size) {
2643 EC_SLAVE_DBG(slave, 1,
"SDO data incomplete (%zu / %u)." 2682 EC_SLAVE_ERR(slave,
"Failed to receive CoE upload segment" 2683 " request datagram: ");
2692 " request failed: ");
2732 EC_SLAVE_ERR(slave,
"Failed to receive CoE mailbox check" 2742 EC_SLAVE_ERR(slave,
"Reception of CoE mailbox check datagram" 2749 unsigned long diff_ms = 0;
2755 fsm->
state(fsm, datagram);
2766 EC_SLAVE_ERR(slave,
"Timeout while waiting for SDO upload" 2767 " segment response.\n");
2803 request->
errno = EIO;
2806 EC_SLAVE_ERR(slave,
"Failed to receive CoE upload segment" 2807 " response datagram: ");
2815 request->
errno = EIO;
2819 " response failed: ");
2826 fsm->
state(fsm, datagram);
2844 uint8_t *data, mbox_prot;
2845 size_t rec_size, data_size;
2847 unsigned int last_segment;
2867 request->
errno = PTR_ERR(data);
2877 if (mbox_prot != EC_MBOX_TYPE_COE) {
2878 EC_SLAVE_ERR(slave,
"Received mailbox protocol 0x%02X as response.\n",
2880 request->
errno = EIO;
2893 if (rec_size < 10) {
2895 " segment response!\n");
2897 request->
errno = EIO;
2904 EC_SLAVE_ERR(slave,
"SDO upload 0x%04X:%02X aborted.\n",
2908 request->
errno = EIO;
2916 EC_SLAVE_DBG(slave, 1,
"Invalid SDO upload segment response!\n");
2926 data_size = rec_size - 3;
2928 if (rec_size == 10) {
2929 uint8_t seg_size = (
EC_READ_U8(data + 2) & 0xE) >> 1;
2930 data_size -= seg_size;
2934 EC_SLAVE_ERR(slave,
"SDO upload 0x%04X:%02X failed: Fragment" 2935 " exceeding complete size!\n",
2937 request->
errno = EOVERFLOW;
2942 memcpy(request->
data + request->
data_size, data + 3, data_size);
2946 if (!last_segment) {
2955 EC_SLAVE_WARN(slave,
"SDO upload 0x%04X:%02X: Assembled data" 2956 " size (%zu) does not match complete size (%u)!\n",
int ec_fsm_coe_prepare_down_start(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Prepare a donwnload request.
#define EC_FSM_RETRIES
Number of state machine retries on datagram timeout.
void ec_fsm_coe_up_seg_response(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP RESPONSE.
uint8_t * ec_slave_mbox_prepare_send(const ec_slave_t *slave, ec_datagram_t *datagram, uint8_t type, size_t size)
Prepares a mailbox-send datagram.
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
int ec_fsm_coe_prepare_up(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Prepare an upload request.
void ec_fsm_coe_up_start(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP START.
uint32_t offset
Data offset during segmented download.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
void ec_fsm_coe_end(ec_fsm_coe_t *, ec_datagram_t *)
State: END.
size_t segment_size
Current segment size.
void ec_fsm_coe_dict_response(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT RESPONSE.
void ec_fsm_coe_error(ec_fsm_coe_t *, ec_datagram_t *)
State: ERROR.
void ec_fsm_coe_dict_entry_check(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT ENTRY CHECK.
uint16_t bit_length
Data size in bit.
uint32_t response_timeout
Maximum time in ms, the transfer is retried, if the slave does not respond.
int ec_slave_mbox_prepare_fetch(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram to fetch mailbox data.
#define EC_SLAVE_WARN(slave, fmt, args...)
Convenience macro for printing slave-specific warnings to syslog.
void ec_fsm_coe_dict_desc_response_data(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT DESC RESPONSE DATA.
void ec_fsm_coe_dict_entry_response(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT ENTRY RESPONSE.
void ec_fsm_coe_up_seg_response_data(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP RESPONSE DATA.
ec_sii_coe_details_t coe_details
CoE detail flags.
void ec_fsm_coe_down_check(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN CHECK.
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
uint32_t abort_code
SDO request abort code.
void(* state)(ec_fsm_coe_t *, ec_datagram_t *)
CoE state function.
void ec_fsm_coe_down_prepare_segment_request(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Prepare a download segment request.
void ec_fsm_coe_up_seg_request(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP REQUEST.
uint8_t * ec_slave_mbox_fetch(const ec_slave_t *slave, ec_mbox_data_t *response_data, uint8_t *type, size_t *size)
Processes received mailbox data.
uint16_t working_counter
Working counter.
struct list_head list
List item.
void ec_fsm_coe_down_seg_check(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN SEG CHECK.
#define EC_COE_DOWN_SEG_MIN_DATA_SIZE
Minimum size of download segment.
void ec_fsm_coe_up_seg_check(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP CHECK.
uint8_t * data
Pointer to SDO data.
int ec_fsm_coe_success(const ec_fsm_coe_t *fsm)
Returns, if the state machine terminated with success.
#define EC_FSM_COE_DICT_TIMEOUT
Maximum time in ms to wait for responses when reading out the dictionary.
#define EC_COE_DOWN_SEG_REQ_HEADER_SIZE
CoE download segment request header size.
int ec_fsm_coe_check_emergency(ec_fsm_coe_t *fsm, const uint8_t *data, size_t size)
Check if the received data are a CoE emergency request.
struct list_head list
List item.
void ec_fsm_coe_dict_entry_request(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT ENTRY REQUEST.
const char * message
Message belonging to code.
struct list_head sdo_dictionary
SDO dictionary list.
Global definitions and macros.
void ec_fsm_coe_up_request(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP REQUEST.
ec_direction_t dir
Direction.
EtherCAT master structure.
uint8_t object_code
Object code.
ec_sdo_t * sdo
current SDO
EtherCAT CoE state machines.
void ec_fsm_coe_up_response_data(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP RESPONSE DATA.
int ec_sdo_request_copy_data(ec_sdo_request_t *req, const uint8_t *source, size_t size)
Copies SDO data from an external source.
char * description
Description.
ec_sii_image_t * sii_image
Current complete SII image.
ec_datagram_state_t state
State.
void ec_fsm_coe_dict_desc_request(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT DESC REQUEST.
ec_slave_config_t * config
Current configuration.
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
void ec_fsm_coe_down_response_data(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN RESPONSE DATA.
void ec_fsm_coe_up_prepare_segment_request(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Prepare an SDO upload segment request.
uint8_t enable_sdo_info
SDO information service available.
uint16_t mailbox_protocols
Supported mailbox protocols.
ec_sdo_request_t * request
SDO request.
int ec_fsm_coe_dict_prepare_desc(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Prepare an object description request.
unsigned int debug_level
Master debug level.
void ec_fsm_coe_dict_desc_response(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT DESC RESPONSE.
#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.
void ec_fsm_coe_up_response(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP RESPONSE.
unsigned long jiffies_sent
Jiffies, when the upload/download request was sent.
uint8_t subindex
current subindex
void ec_fsm_coe_dict_entry_response_data(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT ENTRY RESPONSE DATA.
void ec_fsm_coe_clear(ec_fsm_coe_t *fsm)
Destructor.
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
ec_datagram_t * datagram
Datagram used in last step.
uint32_t remaining
Remaining bytes during segmented download.
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
uint32_t complete_size
Used when segmenting.
int ec_fsm_coe_dict_prepare_entry(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Prepare an entry description request.
ec_master_t * master
Master owning the slave.
void ec_fsm_coe_down_seg_response_data(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN SEG RESPONSE DATA.
unsigned long jiffies_start
CoE timestamp.
void ec_fsm_coe_dict_desc_check(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT DESC CHECK.
void ec_fsm_coe_dictionary(ec_fsm_coe_t *fsm, ec_slave_t *slave)
Starts reading a slaves' SDO dictionary.
void ec_fsm_coe_dict_start(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT START.
void ec_fsm_coe_down_request(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN REQUEST.
void ec_canopen_abort_msg(const ec_slave_t *slave, uint32_t abort_code)
Outputs an SDO abort message.
int ec_read_mbox_locked(ec_slave_t *slave)
Return the current mailbox lock status and lock it if not locked.
uint16_t data_type
Data type.
void ec_fsm_coe_dict_check(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT CHECK.
#define EC_MBOX_HEADER_SIZE
Mailbox header size.
void ec_sdo_init(ec_sdo_t *sdo, ec_slave_t *slave, uint16_t index)
Constructor.
int ec_fsm_coe_prepare_dict(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Prepare a dictionary request.
void ec_fsm_coe_init(ec_fsm_coe_t *fsm)
Constructor.
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
void ec_read_mbox_lock_clear(ec_slave_t *slave)
Clears the mailbox lock.
uint8_t read_access[EC_SDO_ENTRY_ACCESS_COUNT]
Read access.
uint8_t subindex
SDO subindex.
struct list_head entries
List of entries.
size_t data_size
Size of SDO data.
int ec_slave_mbox_prepare_check(const ec_slave_t *slave, ec_datagram_t *datagram)
Prepares a datagram for checking the mailbox state.
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
ec_coe_emerg_ring_t emerg_ring
CoE emergency ring buffer.
void ec_datagram_print_state(const ec_datagram_t *datagram)
Prints the state of a datagram.
void ec_coe_emerg_ring_push(ec_coe_emerg_ring_t *ring, const u8 *msg)
Add a new emergency message.
int ec_fsm_coe_exec(ec_fsm_coe_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
void ec_fsm_coe_dict_request(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT REQUEST.
void ec_fsm_coe_down_start(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN START.
uint8_t max_subindex
Maximum subindex.
void ec_fsm_coe_down_seg_response(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN SEG RESPONSE.
uint16_t configured_rx_mailbox_size
Configured receive mailbox size.
uint8_t toggle
toggle bit for segment commands
void ec_sdo_entry_init(ec_sdo_entry_t *entry, ec_sdo_t *sdo, uint8_t subindex)
Constructor.
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
EtherCAT slave configuration.
void ec_fsm_coe_down_response(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DOWN RESPONSE.
#define EC_COE_DOWN_REQ_HEADER_SIZE
CoE download request header size.
unsigned int retries
retries upon datagram timeout
EtherCAT slave configuration structure.
ec_sii_t sii
Extracted SII data.
uint8_t write_access[EC_SDO_ENTRY_ACCESS_COUNT]
Write access.
void ec_fsm_coe_dict_response_data(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: DICT RESPONSE DATA.
Unused and should not be queued (dequeued).
void ec_fsm_coe_transfer(ec_fsm_coe_t *fsm, ec_slave_t *slave, ec_sdo_request_t *request)
Starts to transfer an SDO to/from a slave.
int ec_sdo_request_alloc(ec_sdo_request_t *req, size_t size)
Pre-allocates the data memory.
Values written by the master.
unsigned long jiffies_received
Jiffies, when the datagram was received.
ec_mbox_data_t mbox_coe_data
Received mailbox data for CoE.
ec_slave_t * slave
slave the FSM runs on
size_t payload_size
Size of the mailbox response payload data.
int ec_slave_mbox_check(const ec_datagram_t *datagram)
Processes a mailbox state checking datagram.
const ec_code_msg_t sdo_abort_messages[]
SDO abort messages.
uint8_t complete_access
SDO shall be transferred completely.
void ec_fsm_coe_up_check(ec_fsm_coe_t *, ec_datagram_t *)
CoE state: UP CHECK.
unsigned int has_general
General category present.
Finite state machines for the CANopen over EtherCAT protocol.