152 |
152 |
153 init_timer(&master->eoe_timer); |
153 init_timer(&master->eoe_timer); |
154 master->eoe_timer.function = ec_master_eoe_run; |
154 master->eoe_timer.function = ec_master_eoe_run; |
155 master->eoe_timer.data = (unsigned long) master; |
155 master->eoe_timer.data = (unsigned long) master; |
156 master->eoe_running = 0; |
156 master->eoe_running = 0; |
157 master->eoe_checked = 0; |
|
158 INIT_LIST_HEAD(&master->eoe_handlers); |
157 INIT_LIST_HEAD(&master->eoe_handlers); |
159 |
158 |
160 master->internal_lock = SPIN_LOCK_UNLOCKED; |
159 master->internal_lock = SPIN_LOCK_UNLOCKED; |
161 master->request_cb = NULL; |
160 master->request_cb = NULL; |
162 master->release_cb = NULL; |
161 master->release_cb = NULL; |
227 |
226 |
228 void ec_master_clear( |
227 void ec_master_clear( |
229 ec_master_t *master /**< EtherCAT master */ |
228 ec_master_t *master /**< EtherCAT master */ |
230 ) |
229 ) |
231 { |
230 { |
232 ec_eoe_t *eoe, *next_eoe; |
231 ec_master_clear_eoe_handlers(master); |
233 ec_datagram_t *datagram, *next_datagram; |
|
234 |
|
235 ec_master_destroy_slaves(master); |
232 ec_master_destroy_slaves(master); |
236 ec_master_destroy_domains(master); |
233 ec_master_destroy_domains(master); |
237 |
|
238 // list of EEPROM requests is empty, |
|
239 // otherwise master could not be cleared. |
|
240 |
|
241 // dequeue all datagrams |
|
242 list_for_each_entry_safe(datagram, next_datagram, |
|
243 &master->datagram_queue, queue) { |
|
244 datagram->state = EC_DATAGRAM_ERROR; |
|
245 list_del_init(&datagram->queue); |
|
246 } |
|
247 |
|
248 ec_fsm_master_clear(&master->fsm); |
234 ec_fsm_master_clear(&master->fsm); |
249 ec_datagram_clear(&master->fsm_datagram); |
235 ec_datagram_clear(&master->fsm_datagram); |
250 |
236 ec_device_clear(&master->backup_device); |
251 // clear EoE objects |
237 ec_device_clear(&master->main_device); |
252 list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) { |
238 |
|
239 // destroy self |
|
240 kobject_del(&master->kobj); |
|
241 kobject_put(&master->kobj); |
|
242 } |
|
243 |
|
244 /*****************************************************************************/ |
|
245 |
|
246 /** |
|
247 * Clear and free all EoE handlers. |
|
248 */ |
|
249 |
|
250 void ec_master_clear_eoe_handlers( |
|
251 ec_master_t *master /**< EtherCAT master */ |
|
252 ) |
|
253 { |
|
254 ec_eoe_t *eoe, *next; |
|
255 |
|
256 list_for_each_entry_safe(eoe, next, &master->eoe_handlers, list) { |
253 list_del(&eoe->list); |
257 list_del(&eoe->list); |
254 ec_eoe_clear(eoe); |
258 ec_eoe_clear(eoe); |
255 kfree(eoe); |
259 kfree(eoe); |
256 } |
260 } |
257 |
|
258 ec_device_clear(&master->backup_device); |
|
259 ec_device_clear(&master->main_device); |
|
260 |
|
261 // destroy self |
|
262 kobject_del(&master->kobj); |
|
263 kobject_put(&master->kobj); |
|
264 |
|
265 EC_INFO("Master %u freed.\n", master->index); |
|
266 } |
261 } |
267 |
262 |
268 /*****************************************************************************/ |
263 /*****************************************************************************/ |
269 |
264 |
270 /** |
265 /** |
444 |
440 |
445 // set states for all slaves |
441 // set states for all slaves |
446 list_for_each_entry(slave, &master->slaves, list) { |
442 list_for_each_entry(slave, &master->slaves, list) { |
447 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
443 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
448 } |
444 } |
|
445 // ... but set EoE slaves to OP |
|
446 list_for_each_entry(eoe, &master->eoe_handlers, list) { |
|
447 if (ec_eoe_is_open(eoe)) |
|
448 ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP); |
|
449 } |
449 |
450 |
450 if (master->debug_level) |
451 if (master->debug_level) |
451 EC_DBG("Switching to operation mode.\n"); |
452 EC_DBG("Switching to operation mode.\n"); |
452 |
453 |
453 master->mode = EC_MASTER_MODE_OPERATION; |
454 master->mode = EC_MASTER_MODE_OPERATION; |
454 master->pdo_slaves_offline = 0; // assume all PDO slaves online |
455 master->pdo_slaves_offline = 0; // assume all PDO slaves online |
|
456 master->ext_request_cb = NULL; |
|
457 master->ext_release_cb = NULL; |
|
458 master->ext_cb_data = NULL; |
455 return 0; |
459 return 0; |
456 |
460 |
457 out_allow: |
461 out_allow: |
458 master->allow_scan = 1; |
462 master->allow_scan = 1; |
459 master->allow_config = 1; |
463 master->allow_config = 1; |
483 // set states for all slaves |
488 // set states for all slaves |
484 list_for_each_entry(slave, &master->slaves, list) { |
489 list_for_each_entry(slave, &master->slaves, list) { |
485 ec_slave_reset(slave); |
490 ec_slave_reset(slave); |
486 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
491 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
487 } |
492 } |
|
493 // ... but leave EoE slaves in OP |
|
494 list_for_each_entry(eoe, &master->eoe_handlers, list) { |
|
495 if (ec_eoe_is_open(eoe)) |
|
496 ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_OP); |
|
497 } |
488 |
498 |
489 ec_master_destroy_domains(master); |
499 ec_master_destroy_domains(master); |
490 |
500 |
|
501 if (ec_master_thread_start(master, ec_master_idle_thread)) |
|
502 EC_WARN("Failed to restart master thread!\n"); |
|
503 ec_master_eoe_start(master); |
|
504 |
491 master->allow_scan = 1; |
505 master->allow_scan = 1; |
492 master->allow_config = 1; |
506 master->allow_config = 1; |
493 |
|
494 if (ec_master_thread_start(master, ec_master_idle_thread)) { |
|
495 EC_WARN("Failed to restart master thread!\n"); |
|
496 } |
|
497 } |
507 } |
498 |
508 |
499 /*****************************************************************************/ |
509 /*****************************************************************************/ |
500 |
510 |
501 /** |
511 /** |
1057 Starts Ethernet-over-EtherCAT processing on demand. |
1067 Starts Ethernet-over-EtherCAT processing on demand. |
1058 */ |
1068 */ |
1059 |
1069 |
1060 void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */) |
1070 void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */) |
1061 { |
1071 { |
1062 ec_eoe_t *eoe; |
1072 if (master->eoe_running) { |
1063 ec_slave_t *slave; |
1073 EC_WARN("EoE already running!\n"); |
1064 unsigned int coupled, found; |
1074 return; |
1065 |
1075 } |
1066 if (master->eoe_running || master->eoe_checked) return; |
1076 |
1067 |
1077 if (list_empty(&master->eoe_handlers)) |
1068 master->eoe_checked = 1; |
1078 return; |
1069 |
1079 |
1070 // decouple all EoE handlers |
1080 if (!master->request_cb || !master->release_cb) { |
1071 list_for_each_entry(eoe, &master->eoe_handlers, list) |
1081 EC_WARN("No EoE processing because of missing locking callbacks!\n"); |
1072 eoe->slave = NULL; |
|
1073 |
|
1074 // couple a free EoE handler to every EoE-capable slave |
|
1075 coupled = 0; |
|
1076 list_for_each_entry(slave, &master->slaves, list) { |
|
1077 if (!(slave->sii_mailbox_protocols & EC_MBOX_EOE)) continue; |
|
1078 |
|
1079 found = 0; |
|
1080 list_for_each_entry(eoe, &master->eoe_handlers, list) { |
|
1081 if (eoe->slave) continue; |
|
1082 eoe->slave = slave; |
|
1083 found = 1; |
|
1084 coupled++; |
|
1085 EC_INFO("Coupling device %s to slave %i.\n", |
|
1086 eoe->dev->name, slave->ring_position); |
|
1087 if (eoe->opened) |
|
1088 ec_slave_request_state(slave, EC_SLAVE_STATE_OP); |
|
1089 else |
|
1090 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
|
1091 break; |
|
1092 } |
|
1093 |
|
1094 if (!found) { |
|
1095 if (master->debug_level) |
|
1096 EC_WARN("No EoE handler for slave %i!\n", |
|
1097 slave->ring_position); |
|
1098 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
|
1099 } |
|
1100 } |
|
1101 |
|
1102 if (!coupled) { |
|
1103 EC_INFO("No EoE handlers coupled.\n"); |
|
1104 return; |
1082 return; |
1105 } |
1083 } |
1106 |
1084 |
1107 EC_INFO("Starting EoE processing.\n"); |
1085 EC_INFO("Starting EoE processing.\n"); |
1108 master->eoe_running = 1; |
1086 master->eoe_running = 1; |
1109 |
1087 |
1110 // start EoE processing |
1088 // start EoE processing |
1111 master->eoe_timer.expires = jiffies + 10; |
1089 master->eoe_timer.expires = jiffies + 10; |
1112 add_timer(&master->eoe_timer); |
1090 add_timer(&master->eoe_timer); |
1113 return; |
|
1114 } |
1091 } |
1115 |
1092 |
1116 /*****************************************************************************/ |
1093 /*****************************************************************************/ |
1117 |
1094 |
1118 /** |
1095 /** |
1119 Stops the Ethernet-over-EtherCAT processing. |
1096 Stops the Ethernet-over-EtherCAT processing. |
1120 */ |
1097 */ |
1121 |
1098 |
1122 void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */) |
1099 void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */) |
1123 { |
1100 { |
1124 ec_eoe_t *eoe; |
|
1125 |
|
1126 master->eoe_checked = 0; |
|
1127 |
|
1128 if (!master->eoe_running) return; |
1101 if (!master->eoe_running) return; |
1129 |
1102 |
1130 EC_INFO("Stopping EoE processing.\n"); |
1103 EC_INFO("Stopping EoE processing.\n"); |
1131 |
1104 |
1132 del_timer_sync(&master->eoe_timer); |
1105 del_timer_sync(&master->eoe_timer); |
1133 |
|
1134 // decouple all EoE handlers |
|
1135 list_for_each_entry(eoe, &master->eoe_handlers, list) { |
|
1136 if (eoe->slave) { |
|
1137 ec_slave_request_state(eoe->slave, EC_SLAVE_STATE_PREOP); |
|
1138 eoe->slave = NULL; |
|
1139 } |
|
1140 } |
|
1141 |
|
1142 master->eoe_running = 0; |
1106 master->eoe_running = 0; |
1143 } |
1107 } |
1144 |
1108 |
1145 /*****************************************************************************/ |
1109 /*****************************************************************************/ |
1146 |
1110 |
1150 |
1114 |
1151 void ec_master_eoe_run(unsigned long data /**< master pointer */) |
1115 void ec_master_eoe_run(unsigned long data /**< master pointer */) |
1152 { |
1116 { |
1153 ec_master_t *master = (ec_master_t *) data; |
1117 ec_master_t *master = (ec_master_t *) data; |
1154 ec_eoe_t *eoe; |
1118 ec_eoe_t *eoe; |
1155 unsigned int active = 0; |
1119 unsigned int none_open = 1; |
1156 cycles_t cycles_start, cycles_end; |
1120 cycles_t cycles_start, cycles_end; |
1157 unsigned long restart_jiffies; |
1121 unsigned long restart_jiffies; |
1158 |
1122 |
1159 list_for_each_entry(eoe, &master->eoe_handlers, list) { |
1123 list_for_each_entry(eoe, &master->eoe_handlers, list) { |
1160 if (ec_eoe_active(eoe)) active++; |
1124 if (ec_eoe_is_open(eoe)) { |
1161 } |
1125 none_open = 0; |
1162 if (!active) goto queue_timer; |
1126 break; |
|
1127 } |
|
1128 } |
|
1129 if (none_open) |
|
1130 goto queue_timer; |
1163 |
1131 |
1164 // receive datagrams |
1132 // receive datagrams |
1165 if (master->request_cb(master->cb_data)) goto queue_timer; |
1133 if (master->request_cb(master->cb_data)) goto queue_timer; |
1166 cycles_start = get_cycles(); |
1134 cycles_start = get_cycles(); |
1167 ecrt_master_receive(master); |
1135 ecrt_master_receive(master); |
1286 /*****************************************************************************/ |
1254 /*****************************************************************************/ |
1287 |
1255 |
1288 /** |
1256 /** |
1289 * Translates an ASCII coded bus-address to a slave pointer. |
1257 * Translates an ASCII coded bus-address to a slave pointer. |
1290 * These are the valid addressing schemes: |
1258 * These are the valid addressing schemes: |
1291 * - \a "X" = the X. slave on the bus (ring position), |
1259 * - \a "X" = the Xth slave on the bus (ring position), |
1292 * - \a "X:Y" = the Y. slave after the X. branch (bus coupler), |
|
1293 * - \a "#X" = the slave with alias X, |
1260 * - \a "#X" = the slave with alias X, |
1294 * - \a "#X:Y" = the Y. slave after the branch (bus coupler) with alias X. |
1261 * - \a "#X:Y" = the Yth slave after the slave with alias X. |
1295 * X and Y are zero-based indices and may be provided in hexadecimal or octal |
1262 * X and Y are zero-based indices and may be provided in hexadecimal or octal |
1296 * notation (with respective prefix). |
1263 * notation (with appropriate prefix). |
1297 * \return pointer to the slave on success, else NULL |
1264 * \return pointer to the slave on success, else NULL |
1298 */ |
1265 */ |
1299 |
1266 |
1300 ec_slave_t *ec_master_parse_slave_address( |
1267 ec_slave_t *ec_master_parse_slave_address( |
1301 const ec_master_t *master, /**< EtherCAT master */ |
1268 const ec_master_t *master, /**< EtherCAT master */ |
1460 if (master->debug_level) |
1427 if (master->debug_level) |
1461 EC_DBG("FSM datagram is %x.\n", (unsigned int) &master->fsm_datagram); |
1428 EC_DBG("FSM datagram is %x.\n", (unsigned int) &master->fsm_datagram); |
1462 |
1429 |
1463 master->injection_seq_fsm = 0; |
1430 master->injection_seq_fsm = 0; |
1464 master->injection_seq_rt = 0; |
1431 master->injection_seq_rt = 0; |
|
1432 master->request_cb = master->ext_request_cb; |
|
1433 master->release_cb = master->ext_release_cb; |
|
1434 master->cb_data = master->ext_cb_data; |
1465 |
1435 |
1466 if (ec_master_thread_start(master, ec_master_operation_thread)) { |
1436 if (ec_master_thread_start(master, ec_master_operation_thread)) { |
1467 EC_ERR("Failed to start master thread!\n"); |
1437 EC_ERR("Failed to start master thread!\n"); |
1468 return -1; |
1438 return -1; |
1469 } |
1439 } |
1470 |
1440 ec_master_eoe_start(master); |
1471 return 0; |
1441 return 0; |
1472 } |
1442 } |
1473 |
1443 |
1474 /*****************************************************************************/ |
1444 /*****************************************************************************/ |
1475 |
1445 |
1575 int (*request_cb)(void *), /**< request lock CB */ |
1545 int (*request_cb)(void *), /**< request lock CB */ |
1576 void (*release_cb)(void *), /**< release lock CB */ |
1546 void (*release_cb)(void *), /**< release lock CB */ |
1577 void *cb_data /**< data parameter */ |
1547 void *cb_data /**< data parameter */ |
1578 ) |
1548 ) |
1579 { |
1549 { |
1580 master->request_cb = request_cb; |
1550 master->ext_request_cb = request_cb; |
1581 master->release_cb = release_cb; |
1551 master->ext_release_cb = release_cb; |
1582 master->cb_data = cb_data; |
1552 master->ext_cb_data = cb_data; |
1583 } |
1553 } |
1584 |
1554 |
1585 /*****************************************************************************/ |
1555 /*****************************************************************************/ |
1586 |
1556 |
1587 /** |
1557 /** |