changeset 446 | 8fede404c01f |
parent 442 | 6607875255d9 |
child 448 | e4b76dc7910c |
445:3b7eec329112 | 446:8fede404c01f |
---|---|
54 void ec_fsm_master_configure_slave(ec_fsm_t *); |
54 void ec_fsm_master_configure_slave(ec_fsm_t *); |
55 void ec_fsm_master_scan_slaves(ec_fsm_t *); |
55 void ec_fsm_master_scan_slaves(ec_fsm_t *); |
56 void ec_fsm_master_write_eeprom(ec_fsm_t *); |
56 void ec_fsm_master_write_eeprom(ec_fsm_t *); |
57 void ec_fsm_master_sdodict(ec_fsm_t *); |
57 void ec_fsm_master_sdodict(ec_fsm_t *); |
58 void ec_fsm_master_sdo_request(ec_fsm_t *); |
58 void ec_fsm_master_sdo_request(ec_fsm_t *); |
59 |
59 void ec_fsm_master_end(ec_fsm_t *); |
60 void ec_fsm_startup_start(ec_fsm_t *); |
60 void ec_fsm_master_error(ec_fsm_t *); |
61 void ec_fsm_startup_broadcast(ec_fsm_t *); |
|
62 void ec_fsm_startup_scan(ec_fsm_t *); |
|
63 |
|
64 void ec_fsm_configuration_start(ec_fsm_t *); |
|
65 void ec_fsm_configuration_conf(ec_fsm_t *); |
|
66 |
61 |
67 void ec_fsm_slavescan_start(ec_fsm_t *); |
62 void ec_fsm_slavescan_start(ec_fsm_t *); |
68 void ec_fsm_slavescan_address(ec_fsm_t *); |
63 void ec_fsm_slavescan_address(ec_fsm_t *); |
69 void ec_fsm_slavescan_state(ec_fsm_t *); |
64 void ec_fsm_slavescan_state(ec_fsm_t *); |
70 void ec_fsm_slavescan_base(ec_fsm_t *); |
65 void ec_fsm_slavescan_base(ec_fsm_t *); |
78 void ec_fsm_slaveconf_fmmu(ec_fsm_t *); |
73 void ec_fsm_slaveconf_fmmu(ec_fsm_t *); |
79 void ec_fsm_slaveconf_sdoconf(ec_fsm_t *); |
74 void ec_fsm_slaveconf_sdoconf(ec_fsm_t *); |
80 void ec_fsm_slaveconf_saveop(ec_fsm_t *); |
75 void ec_fsm_slaveconf_saveop(ec_fsm_t *); |
81 void ec_fsm_slaveconf_op(ec_fsm_t *); |
76 void ec_fsm_slaveconf_op(ec_fsm_t *); |
82 |
77 |
83 void ec_fsm_end(ec_fsm_t *); |
78 void ec_fsm_slave_end(ec_fsm_t *); |
84 void ec_fsm_error(ec_fsm_t *); |
79 void ec_fsm_slave_error(ec_fsm_t *); |
85 |
80 |
86 /*****************************************************************************/ |
81 /*****************************************************************************/ |
87 |
82 |
88 /** |
83 /** |
89 Constructor. |
84 Constructor. |
130 } |
125 } |
131 |
126 |
132 /*****************************************************************************/ |
127 /*****************************************************************************/ |
133 |
128 |
134 /** |
129 /** |
135 Resets the state machine. |
|
136 */ |
|
137 |
|
138 void ec_fsm_reset(ec_fsm_t *fsm /**< finite state machine */) |
|
139 { |
|
140 fsm->master_state = ec_fsm_master_start; |
|
141 fsm->master_slaves_responding = 0; |
|
142 fsm->master_slave_states = EC_SLAVE_STATE_UNKNOWN; |
|
143 } |
|
144 |
|
145 /*****************************************************************************/ |
|
146 |
|
147 /** |
|
148 Executes the current state of the state machine. |
130 Executes the current state of the state machine. |
149 \return false, if state machine has terminated |
131 \return false, if state machine has terminated |
150 */ |
132 */ |
151 |
133 |
152 int ec_fsm_exec(ec_fsm_t *fsm /**< finite state machine */) |
134 int ec_fsm_exec(ec_fsm_t *fsm /**< finite state machine */) |
153 { |
135 { |
154 fsm->master_state(fsm); |
136 fsm->master_state(fsm); |
155 |
137 |
156 return fsm->master_state != ec_fsm_end && |
138 return fsm->master_state != ec_fsm_master_end |
157 fsm->master_state != ec_fsm_error; |
139 && fsm->master_state != ec_fsm_master_error; |
158 } |
140 } |
159 |
141 |
160 /*****************************************************************************/ |
142 /*****************************************************************************/ |
161 |
143 |
162 /** |
144 /** |
163 Initializes the master startup state machine. |
145 \return true, if the master state machine terminated gracefully |
164 */ |
146 */ |
165 |
147 |
166 void ec_fsm_startup(ec_fsm_t *fsm) |
148 int ec_fsm_success(ec_fsm_t *fsm /**< finite state machine */) |
167 { |
149 { |
168 fsm->master_state = ec_fsm_startup_start; |
150 return fsm->master_state == ec_fsm_master_end; |
169 } |
|
170 |
|
171 /*****************************************************************************/ |
|
172 |
|
173 /** |
|
174 Returns, if the master startup state machine terminated with success. |
|
175 \return non-zero if successful. |
|
176 */ |
|
177 |
|
178 int ec_fsm_startup_success(ec_fsm_t *fsm /**< Finite state machine */) |
|
179 { |
|
180 return fsm->master_state == ec_fsm_end; |
|
181 } |
|
182 |
|
183 /*****************************************************************************/ |
|
184 |
|
185 /** |
|
186 Initializes the master configuration state machine. |
|
187 */ |
|
188 |
|
189 void ec_fsm_configuration(ec_fsm_t *fsm) |
|
190 { |
|
191 fsm->master_state = ec_fsm_configuration_start; |
|
192 } |
|
193 |
|
194 /*****************************************************************************/ |
|
195 |
|
196 /** |
|
197 Returns, if the master confuguration state machine terminated with success. |
|
198 \return non-zero if successful. |
|
199 */ |
|
200 |
|
201 int ec_fsm_configuration_success(ec_fsm_t *fsm /**< Finite state machine */) |
|
202 { |
|
203 return fsm->master_state == ec_fsm_end; |
|
204 } |
151 } |
205 |
152 |
206 /****************************************************************************** |
153 /****************************************************************************** |
207 * master startup state machine |
154 * operation/idle state machine |
208 *****************************************************************************/ |
|
209 |
|
210 /** |
|
211 Master state: START. |
|
212 Starts with getting slave count and slave states. |
|
213 */ |
|
214 |
|
215 void ec_fsm_startup_start(ec_fsm_t *fsm) |
|
216 { |
|
217 ec_datagram_brd(&fsm->datagram, 0x0130, 2); |
|
218 ec_master_queue_datagram(fsm->master, &fsm->datagram); |
|
219 fsm->master_state = ec_fsm_startup_broadcast; |
|
220 } |
|
221 |
|
222 /*****************************************************************************/ |
|
223 |
|
224 /** |
|
225 Master state: BROADCAST. |
|
226 Processes the broadcast read slave count and slaves states. |
|
227 */ |
|
228 |
|
229 void ec_fsm_startup_broadcast(ec_fsm_t *fsm /**< finite state machine */) |
|
230 { |
|
231 ec_datagram_t *datagram = &fsm->datagram; |
|
232 unsigned int i; |
|
233 ec_slave_t *slave; |
|
234 ec_master_t *master = fsm->master; |
|
235 |
|
236 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
237 EC_ERR("Failed to receive broadcast datagram.\n"); |
|
238 fsm->master_state = ec_fsm_error; |
|
239 return; |
|
240 } |
|
241 |
|
242 EC_INFO("Scanning bus.\n"); |
|
243 |
|
244 ec_master_clear_slaves(master); |
|
245 |
|
246 master->slave_count = datagram->working_counter; |
|
247 |
|
248 if (!master->slave_count) { |
|
249 // no slaves present -> finish state machine. |
|
250 fsm->master_state = ec_fsm_end; |
|
251 return; |
|
252 } |
|
253 |
|
254 // init slaves |
|
255 for (i = 0; i < master->slave_count; i++) { |
|
256 if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t), |
|
257 GFP_KERNEL))) { |
|
258 EC_ERR("Failed to allocate slave %i!\n", i); |
|
259 fsm->master_state = ec_fsm_error; |
|
260 return; |
|
261 } |
|
262 |
|
263 if (ec_slave_init(slave, master, i, i + 1)) { |
|
264 fsm->master_state = ec_fsm_error; |
|
265 return; |
|
266 } |
|
267 |
|
268 if (kobject_add(&slave->kobj)) { |
|
269 EC_ERR("Failed to add kobject.\n"); |
|
270 kobject_put(&slave->kobj); // free |
|
271 fsm->master_state = ec_fsm_error; |
|
272 return; |
|
273 } |
|
274 |
|
275 list_add_tail(&slave->list, &master->slaves); |
|
276 } |
|
277 |
|
278 // begin scanning of slaves |
|
279 fsm->slave = list_entry(master->slaves.next, ec_slave_t, list); |
|
280 fsm->slave_state = ec_fsm_slavescan_start; |
|
281 fsm->master_state = ec_fsm_startup_scan; |
|
282 fsm->master_state(fsm); // execute immediately |
|
283 return; |
|
284 } |
|
285 |
|
286 /*****************************************************************************/ |
|
287 |
|
288 /** |
|
289 Master state: SCAN. |
|
290 Executes the sub-statemachine for the scanning of a slave. |
|
291 */ |
|
292 |
|
293 void ec_fsm_startup_scan(ec_fsm_t *fsm /**< finite state machine */) |
|
294 { |
|
295 ec_master_t *master = fsm->master; |
|
296 ec_slave_t *slave = fsm->slave; |
|
297 |
|
298 fsm->slave_state(fsm); // execute slave state machine |
|
299 |
|
300 if (fsm->slave_state == ec_fsm_error) { |
|
301 EC_ERR("Slave scanning failed.\n"); |
|
302 fsm->master_state = ec_fsm_error; |
|
303 return; |
|
304 } |
|
305 |
|
306 if (fsm->slave_state != ec_fsm_end) return; |
|
307 |
|
308 // another slave to scan? |
|
309 if (slave->list.next != &master->slaves) { |
|
310 fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list); |
|
311 fsm->slave_state = ec_fsm_slavescan_start; |
|
312 fsm->slave_state(fsm); // execute immediately |
|
313 return; |
|
314 } |
|
315 |
|
316 EC_INFO("Bus scanning completed.\n"); |
|
317 |
|
318 ec_master_calc_addressing(master); |
|
319 |
|
320 fsm->master_state = ec_fsm_end; |
|
321 } |
|
322 |
|
323 /****************************************************************************** |
|
324 * master configuration state machine |
|
325 *****************************************************************************/ |
|
326 |
|
327 /** |
|
328 Master configuration state machine: START. |
|
329 */ |
|
330 |
|
331 void ec_fsm_configuration_start(ec_fsm_t *fsm /**< finite state machine */) |
|
332 { |
|
333 ec_master_t *master = fsm->master; |
|
334 |
|
335 if (list_empty(&master->slaves)) { |
|
336 fsm->master_state = ec_fsm_end; |
|
337 return; |
|
338 } |
|
339 |
|
340 // begin configuring slaves |
|
341 fsm->slave = list_entry(master->slaves.next, ec_slave_t, list); |
|
342 fsm->slave_state = ec_fsm_slaveconf_init; |
|
343 ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT); |
|
344 fsm->master_state = ec_fsm_configuration_conf; |
|
345 fsm->master_state(fsm); // execute immediately |
|
346 } |
|
347 |
|
348 /*****************************************************************************/ |
|
349 |
|
350 /** |
|
351 Master state: CONF. |
|
352 */ |
|
353 |
|
354 void ec_fsm_configuration_conf(ec_fsm_t *fsm /**< finite state machine */) |
|
355 { |
|
356 ec_master_t *master = fsm->master; |
|
357 ec_slave_t *slave = fsm->slave; |
|
358 |
|
359 fsm->slave_state(fsm); // execute slave's state machine |
|
360 |
|
361 if (fsm->slave_state == ec_fsm_error) { |
|
362 fsm->master_state = ec_fsm_error; |
|
363 return; |
|
364 } |
|
365 |
|
366 if (fsm->slave_state != ec_fsm_end) return; |
|
367 |
|
368 // another slave to configure? |
|
369 if (slave->list.next != &master->slaves) { |
|
370 fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list); |
|
371 fsm->slave_state = ec_fsm_slaveconf_init; |
|
372 ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT); |
|
373 fsm->master_state(fsm); // execute immediately |
|
374 return; |
|
375 } |
|
376 |
|
377 fsm->master_state = ec_fsm_end; |
|
378 } |
|
379 |
|
380 /****************************************************************************** |
|
381 * operation / idle state machine |
|
382 *****************************************************************************/ |
155 *****************************************************************************/ |
383 |
156 |
384 /** |
157 /** |
385 Master state: START. |
158 Master state: START. |
386 Starts with getting slave count and slave states. |
159 Starts with getting slave count and slave states. |
412 fsm->master_slaves_responding = 0; |
185 fsm->master_slaves_responding = 0; |
413 list_for_each_entry(slave, &master->slaves, list) { |
186 list_for_each_entry(slave, &master->slaves, list) { |
414 slave->online = 0; |
187 slave->online = 0; |
415 } |
188 } |
416 } |
189 } |
417 fsm->master_state = ec_fsm_master_start; |
190 else { |
418 fsm->master_state(fsm); // execute immediately |
191 EC_ERR("Failed to receive broadcast datagram.\n"); |
192 } |
|
193 fsm->master_state = ec_fsm_master_error; |
|
419 return; |
194 return; |
420 } |
195 } |
421 |
196 |
422 topology_change = (datagram->working_counter != |
197 topology_change = (datagram->working_counter != |
423 fsm->master_slaves_responding); |
198 fsm->master_slaves_responding); |
447 EC_INFO("Slave states: %s.\n", states); |
222 EC_INFO("Slave states: %s.\n", states); |
448 } |
223 } |
449 |
224 |
450 // topology change in idle mode: clear all slaves and scan the bus |
225 // topology change in idle mode: clear all slaves and scan the bus |
451 if (topology_change && master->mode == EC_MASTER_MODE_IDLE) { |
226 if (topology_change && master->mode == EC_MASTER_MODE_IDLE) { |
452 EC_INFO("Scanning bus.\n"); |
|
453 |
227 |
454 ec_master_eoe_stop(master); |
228 ec_master_eoe_stop(master); |
455 ec_master_clear_slaves(master); |
229 ec_master_clear_slaves(master); |
456 |
230 |
457 master->slave_count = datagram->working_counter; |
231 master->slave_count = datagram->working_counter; |
458 |
232 |
459 if (!master->slave_count) { |
233 if (!master->slave_count) { |
460 // no slaves present -> finish state machine. |
234 // no slaves present -> finish state machine. |
461 fsm->master_state = ec_fsm_master_start; |
235 fsm->master_state = ec_fsm_master_end; |
462 fsm->master_state(fsm); // execute immediately |
|
463 return; |
236 return; |
464 } |
237 } |
465 |
238 |
466 // init slaves |
239 // init slaves |
467 for (i = 0; i < master->slave_count; i++) { |
240 for (i = 0; i < master->slave_count; i++) { |
468 if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t), |
241 if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t), |
469 GFP_ATOMIC))) { |
242 GFP_ATOMIC))) { |
470 EC_ERR("Failed to allocate slave %i!\n", i); |
243 EC_ERR("Failed to allocate slave %i!\n", i); |
471 ec_master_clear_slaves(master); |
244 ec_master_clear_slaves(master); |
472 fsm->master_state = ec_fsm_master_start; |
245 fsm->master_state = ec_fsm_master_error; |
473 fsm->master_state(fsm); // execute immediately |
|
474 return; |
246 return; |
475 } |
247 } |
476 |
248 |
477 if (ec_slave_init(slave, master, i, i + 1)) { |
249 if (ec_slave_init(slave, master, i, i + 1)) { |
478 // freeing of "slave" already done |
250 // freeing of "slave" already done |
479 ec_master_clear_slaves(master); |
251 ec_master_clear_slaves(master); |
480 fsm->master_state = ec_fsm_master_start; |
252 fsm->master_state = ec_fsm_master_error; |
481 fsm->master_state(fsm); // execute immediately |
|
482 return; |
253 return; |
483 } |
254 } |
484 |
255 |
485 if (kobject_add(&slave->kobj)) { |
256 if (kobject_add(&slave->kobj)) { |
486 EC_ERR("Failed to add kobject.\n"); |
257 EC_ERR("Failed to add kobject.\n"); |
487 kobject_put(&slave->kobj); // free |
258 kobject_put(&slave->kobj); // free |
488 ec_master_clear_slaves(master); |
259 ec_master_clear_slaves(master); |
489 fsm->master_state = ec_fsm_master_start; |
260 fsm->master_state = ec_fsm_master_error; |
490 fsm->master_state(fsm); // execute immediately |
|
491 return; |
261 return; |
492 } |
262 } |
493 |
263 |
494 list_add_tail(&slave->list, &master->slaves); |
264 list_add_tail(&slave->list, &master->slaves); |
495 } |
265 } |
266 |
|
267 EC_INFO("Scanning bus.\n"); |
|
496 |
268 |
497 // begin scanning of slaves |
269 // begin scanning of slaves |
498 fsm->slave = list_entry(master->slaves.next, ec_slave_t, list); |
270 fsm->slave = list_entry(master->slaves.next, ec_slave_t, list); |
499 fsm->slave_state = ec_fsm_slavescan_start; |
271 fsm->slave_state = ec_fsm_slavescan_start; |
500 fsm->master_state = ec_fsm_master_scan_slaves; |
272 fsm->master_state = ec_fsm_master_scan_slaves; |
531 || slave->requested_state == EC_SLAVE_STATE_UNKNOWN |
303 || slave->requested_state == EC_SLAVE_STATE_UNKNOWN |
532 || (slave->current_state == slave->requested_state |
304 || (slave->current_state == slave->requested_state |
533 && (slave->configured |
305 && (slave->configured |
534 || slave->current_state == EC_SLAVE_STATE_INIT))) continue; |
306 || slave->current_state == EC_SLAVE_STATE_INIT))) continue; |
535 |
307 |
536 ec_state_string(slave->current_state, old_state); |
308 if (master->debug_level) { |
537 ec_state_string(slave->requested_state, new_state); |
309 ec_state_string(slave->current_state, old_state); |
538 |
310 if (!slave->configured |
539 if (!slave->configured |
311 && slave->current_state != EC_SLAVE_STATE_INIT) { |
540 && slave->current_state != EC_SLAVE_STATE_INIT) { |
312 EC_INFO("Reconfiguring slave %i (%s).\n", |
541 EC_INFO("Reconfiguring slave %i (%s -> %s).\n", |
313 slave->ring_position, old_state); |
542 slave->ring_position, old_state, new_state); |
314 } |
543 } |
315 else if (slave->current_state != slave->requested_state) { |
544 else if (slave->current_state != slave->requested_state) { |
316 ec_state_string(slave->requested_state, new_state); |
545 EC_INFO("Changing state of slave %i (%s -> %s).\n", |
317 EC_INFO("Changing state of slave %i (%s -> %s).\n", |
546 slave->ring_position, old_state, new_state); |
318 slave->ring_position, old_state, new_state); |
319 } |
|
547 } |
320 } |
548 |
321 |
549 fsm->slave = slave; |
322 fsm->slave = slave; |
550 fsm->slave_state = ec_fsm_slaveconf_init; |
323 fsm->slave_state = ec_fsm_slaveconf_init; |
551 ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT); |
324 ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT); |
599 |
372 |
600 if (kobject_add(&slave->sdo_kobj)) { |
373 if (kobject_add(&slave->sdo_kobj)) { |
601 EC_ERR("Failed to add SDO kobj of slave %i.\n", |
374 EC_ERR("Failed to add SDO kobj of slave %i.\n", |
602 slave->ring_position); |
375 slave->ring_position); |
603 slave->error_flag = 1; |
376 slave->error_flag = 1; |
604 fsm->master_state = ec_fsm_master_start; |
377 fsm->master_state = ec_fsm_master_error; |
605 fsm->master_state(fsm); // execute immediately |
|
606 return; |
378 return; |
607 } |
379 } |
608 |
380 |
609 slave->sdo_dictionary_fetched = 1; |
381 slave->sdo_dictionary_fetched = 1; |
610 |
382 |
637 fsm->master_state(fsm); // execute immediately |
409 fsm->master_state(fsm); // execute immediately |
638 return; |
410 return; |
639 } |
411 } |
640 } |
412 } |
641 |
413 |
642 // nothing to do. restart master state machine. |
414 fsm->master_state = ec_fsm_master_end; |
643 fsm->master_state = ec_fsm_master_start; |
|
644 fsm->master_state(fsm); // execute immediately |
|
645 } |
415 } |
646 |
416 |
647 /*****************************************************************************/ |
417 /*****************************************************************************/ |
648 |
418 |
649 /** |
419 /** |
700 ec_slave_t *slave = fsm->slave; |
470 ec_slave_t *slave = fsm->slave; |
701 ec_datagram_t *datagram = &fsm->datagram; |
471 ec_datagram_t *datagram = &fsm->datagram; |
702 uint8_t new_state; |
472 uint8_t new_state; |
703 |
473 |
704 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
474 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
705 fsm->master_state = ec_fsm_master_start; |
475 EC_ERR("Failed to receive AL state datagram for slave %i!\n", |
706 fsm->master_state(fsm); // execute immediately |
476 slave->ring_position); |
477 fsm->master_state = ec_fsm_master_error; |
|
707 return; |
478 return; |
708 } |
479 } |
709 |
480 |
710 // did the slave not respond to its station address? |
481 // did the slave not respond to its station address? |
711 if (datagram->working_counter != 1) { |
482 if (datagram->working_counter != 1) { |
754 |
525 |
755 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
526 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
756 fsm->slave->error_flag = 1; |
527 fsm->slave->error_flag = 1; |
757 EC_ERR("Failed to validate vendor ID of slave %i.\n", |
528 EC_ERR("Failed to validate vendor ID of slave %i.\n", |
758 slave->ring_position); |
529 slave->ring_position); |
759 fsm->master_state = ec_fsm_master_start; |
530 fsm->master_state = ec_fsm_master_error; |
760 fsm->master_state(fsm); // execute immediately |
|
761 return; |
531 return; |
762 } |
532 } |
763 |
533 |
764 if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_vendor_id) { |
534 if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_vendor_id) { |
765 EC_ERR("Slave %i: invalid vendor ID!\n", slave->ring_position); |
535 EC_ERR("Slave %i has an invalid vendor ID!\n", slave->ring_position); |
766 fsm->master_state = ec_fsm_master_start; |
536 fsm->master_state = ec_fsm_master_error; |
767 fsm->master_state(fsm); // execute immediately |
|
768 return; |
537 return; |
769 } |
538 } |
770 |
539 |
771 // vendor ID is ok. check product code. |
540 // vendor ID is ok. check product code. |
772 fsm->master_state = ec_fsm_master_validate_product; |
541 fsm->master_state = ec_fsm_master_validate_product; |
794 } |
563 } |
795 // check next slave |
564 // check next slave |
796 fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list); |
565 fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list); |
797 } |
566 } |
798 |
567 |
799 EC_INFO("Reinitializing slave %i.\n", fsm->slave->ring_position); |
568 if (fsm->master->debug_level) |
569 EC_DBG("Reinitializing slave %i.\n", fsm->slave->ring_position); |
|
800 |
570 |
801 // write station address |
571 // write station address |
802 ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2); |
572 ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2); |
803 EC_WRITE_U16(datagram->data, fsm->slave->station_address); |
573 EC_WRITE_U16(datagram->data, fsm->slave->station_address); |
804 ec_master_queue_datagram(fsm->master, datagram); |
574 ec_master_queue_datagram(fsm->master, datagram); |
820 |
590 |
821 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
591 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
822 fsm->slave->error_flag = 1; |
592 fsm->slave->error_flag = 1; |
823 EC_ERR("Failed to validate product code of slave %i.\n", |
593 EC_ERR("Failed to validate product code of slave %i.\n", |
824 slave->ring_position); |
594 slave->ring_position); |
825 fsm->master_state = ec_fsm_master_start; |
595 fsm->master_state = ec_fsm_master_error; |
826 fsm->master_state(fsm); // execute immediately |
|
827 return; |
596 return; |
828 } |
597 } |
829 |
598 |
830 if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_product_code) { |
599 if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_product_code) { |
831 EC_ERR("Slave %i: invalid product code!\n", slave->ring_position); |
600 EC_ERR("Slave %i: invalid product code!\n", slave->ring_position); |
832 EC_ERR("expected 0x%08X, got 0x%08X.\n", slave->sii_product_code, |
601 EC_ERR("expected 0x%08X, got 0x%08X.\n", slave->sii_product_code, |
833 EC_READ_U32(fsm->fsm_sii.value)); |
602 EC_READ_U32(fsm->fsm_sii.value)); |
834 fsm->master_state = ec_fsm_master_start; |
603 fsm->master_state = ec_fsm_master_error; |
835 fsm->master_state(fsm); // execute immediately |
|
836 return; |
604 return; |
837 } |
605 } |
838 |
606 |
839 // have all states been validated? |
607 // have all states been validated? |
840 if (slave->list.next == &fsm->master->slaves) { |
608 if (slave->list.next == &fsm->master->slaves) { |
895 ec_master_t *master = fsm->master; |
663 ec_master_t *master = fsm->master; |
896 ec_slave_t *slave = fsm->slave; |
664 ec_slave_t *slave = fsm->slave; |
897 |
665 |
898 fsm->slave_state(fsm); // execute slave state machine |
666 fsm->slave_state(fsm); // execute slave state machine |
899 |
667 |
900 if (fsm->slave_state != ec_fsm_end |
668 if (fsm->slave_state != ec_fsm_slave_end |
901 && fsm->slave_state != ec_fsm_error) return; |
669 && fsm->slave_state != ec_fsm_slave_error) return; |
902 |
670 |
903 // another slave to fetch? |
671 // another slave to fetch? |
904 if (slave->list.next != &master->slaves) { |
672 if (slave->list.next != &master->slaves) { |
905 fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list); |
673 fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list); |
906 fsm->slave_state = ec_fsm_slavescan_start; |
674 fsm->slave_state = ec_fsm_slavescan_start; |
913 ec_master_calc_addressing(master); |
681 ec_master_calc_addressing(master); |
914 |
682 |
915 // set initial states of all slaves to PREOP to make mailbox |
683 // set initial states of all slaves to PREOP to make mailbox |
916 // communication possible |
684 // communication possible |
917 list_for_each_entry(slave, &master->slaves, list) { |
685 list_for_each_entry(slave, &master->slaves, list) { |
918 slave->requested_state = EC_SLAVE_STATE_PREOP; |
686 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
919 } |
687 } |
920 |
688 |
921 fsm->master_state = ec_fsm_master_start; |
689 fsm->master_state = ec_fsm_master_end; |
922 fsm->master_state(fsm); // execute immediately |
|
923 } |
690 } |
924 |
691 |
925 /*****************************************************************************/ |
692 /*****************************************************************************/ |
926 |
693 |
927 /** |
694 /** |
933 /**< finite state machine */ |
700 /**< finite state machine */ |
934 ) |
701 ) |
935 { |
702 { |
936 fsm->slave_state(fsm); // execute slave's state machine |
703 fsm->slave_state(fsm); // execute slave's state machine |
937 |
704 |
938 if (fsm->slave_state != ec_fsm_end |
705 if (fsm->slave_state != ec_fsm_slave_end |
939 && fsm->slave_state != ec_fsm_error) return; |
706 && fsm->slave_state != ec_fsm_slave_error) return; |
940 |
707 |
941 ec_fsm_master_action_process_states(fsm); |
708 ec_fsm_master_action_process_states(fsm); |
942 } |
709 } |
943 |
710 |
944 /*****************************************************************************/ |
711 /*****************************************************************************/ |
957 fsm->slave->error_flag = 1; |
724 fsm->slave->error_flag = 1; |
958 EC_ERR("Failed to write EEPROM contents to slave %i.\n", |
725 EC_ERR("Failed to write EEPROM contents to slave %i.\n", |
959 slave->ring_position); |
726 slave->ring_position); |
960 kfree(slave->new_eeprom_data); |
727 kfree(slave->new_eeprom_data); |
961 slave->new_eeprom_data = NULL; |
728 slave->new_eeprom_data = NULL; |
962 fsm->master_state = ec_fsm_master_start; |
729 fsm->master_state = ec_fsm_master_error; |
963 fsm->master_state(fsm); // execute immediately |
|
964 return; |
730 return; |
965 } |
731 } |
966 |
732 |
967 fsm->sii_offset++; |
733 fsm->sii_offset++; |
968 if (fsm->sii_offset < slave->new_eeprom_size) { |
734 if (fsm->sii_offset < slave->new_eeprom_size) { |
997 ec_master_t *master = fsm->master; |
763 ec_master_t *master = fsm->master; |
998 |
764 |
999 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
765 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
1000 |
766 |
1001 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
767 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1002 fsm->master_state = ec_fsm_master_start; |
768 fsm->master_state = ec_fsm_master_error; |
1003 fsm->master_state(fsm); // execute immediately |
|
1004 return; |
769 return; |
1005 } |
770 } |
1006 |
771 |
1007 // SDO dictionary fetching finished |
772 // SDO dictionary fetching finished |
1008 |
773 |
1032 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
797 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
1033 |
798 |
1034 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
799 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1035 request->return_code = -1; |
800 request->return_code = -1; |
1036 master->sdo_seq_master++; |
801 master->sdo_seq_master++; |
1037 fsm->master_state = ec_fsm_master_start; |
802 fsm->master_state = ec_fsm_master_error; |
1038 fsm->master_state(fsm); // execute immediately |
|
1039 return; |
803 return; |
1040 } |
804 } |
1041 |
805 |
1042 // SDO dictionary fetching finished |
806 // SDO dictionary fetching finished |
1043 |
807 |
1045 master->sdo_seq_master++; |
809 master->sdo_seq_master++; |
1046 |
810 |
1047 // restart master state machine. |
811 // restart master state machine. |
1048 fsm->master_state = ec_fsm_master_start; |
812 fsm->master_state = ec_fsm_master_start; |
1049 fsm->master_state(fsm); // execute immediately |
813 fsm->master_state(fsm); // execute immediately |
814 } |
|
815 |
|
816 /*****************************************************************************/ |
|
817 |
|
818 /** |
|
819 State: ERROR. |
|
820 */ |
|
821 |
|
822 void ec_fsm_master_error(ec_fsm_t *fsm /**< finite state machine */) |
|
823 { |
|
824 fsm->master_state = ec_fsm_master_start; |
|
825 } |
|
826 |
|
827 /*****************************************************************************/ |
|
828 |
|
829 /** |
|
830 State: END. |
|
831 */ |
|
832 |
|
833 void ec_fsm_master_end(ec_fsm_t *fsm /**< finite state machine */) |
|
834 { |
|
835 fsm->master_state = ec_fsm_master_start; |
|
1050 } |
836 } |
1051 |
837 |
1052 /****************************************************************************** |
838 /****************************************************************************** |
1053 * slave scan state machine |
839 * slave scan state machine |
1054 *****************************************************************************/ |
840 *****************************************************************************/ |
1081 ec_datagram_t *datagram = &fsm->datagram; |
867 ec_datagram_t *datagram = &fsm->datagram; |
1082 |
868 |
1083 if (datagram->state != EC_DATAGRAM_RECEIVED |
869 if (datagram->state != EC_DATAGRAM_RECEIVED |
1084 || datagram->working_counter != 1) { |
870 || datagram->working_counter != 1) { |
1085 fsm->slave->error_flag = 1; |
871 fsm->slave->error_flag = 1; |
1086 fsm->slave_state = ec_fsm_error; |
872 fsm->slave_state = ec_fsm_slave_error; |
1087 EC_ERR("Failed to write station address of slave %i.\n", |
873 EC_ERR("Failed to write station address of slave %i.\n", |
1088 fsm->slave->ring_position); |
874 fsm->slave->ring_position); |
1089 return; |
875 return; |
1090 } |
876 } |
1091 |
877 |
1107 ec_slave_t *slave = fsm->slave; |
893 ec_slave_t *slave = fsm->slave; |
1108 |
894 |
1109 if (datagram->state != EC_DATAGRAM_RECEIVED |
895 if (datagram->state != EC_DATAGRAM_RECEIVED |
1110 || datagram->working_counter != 1) { |
896 || datagram->working_counter != 1) { |
1111 fsm->slave->error_flag = 1; |
897 fsm->slave->error_flag = 1; |
1112 fsm->slave_state = ec_fsm_error; |
898 fsm->slave_state = ec_fsm_slave_error; |
1113 EC_ERR("Failed to read AL state of slave %i.\n", |
899 EC_ERR("Failed to read AL state of slave %i.\n", |
1114 fsm->slave->ring_position); |
900 fsm->slave->ring_position); |
1115 return; |
901 return; |
1116 } |
902 } |
1117 |
903 |
1139 ec_slave_t *slave = fsm->slave; |
925 ec_slave_t *slave = fsm->slave; |
1140 |
926 |
1141 if (datagram->state != EC_DATAGRAM_RECEIVED |
927 if (datagram->state != EC_DATAGRAM_RECEIVED |
1142 || datagram->working_counter != 1) { |
928 || datagram->working_counter != 1) { |
1143 fsm->slave->error_flag = 1; |
929 fsm->slave->error_flag = 1; |
1144 fsm->slave_state = ec_fsm_error; |
930 fsm->slave_state = ec_fsm_slave_error; |
1145 EC_ERR("Failed to read base data of slave %i.\n", |
931 EC_ERR("Failed to read base data of slave %i.\n", |
1146 slave->ring_position); |
932 slave->ring_position); |
1147 return; |
933 return; |
1148 } |
934 } |
1149 |
935 |
1176 unsigned int i; |
962 unsigned int i; |
1177 |
963 |
1178 if (datagram->state != EC_DATAGRAM_RECEIVED |
964 if (datagram->state != EC_DATAGRAM_RECEIVED |
1179 || datagram->working_counter != 1) { |
965 || datagram->working_counter != 1) { |
1180 fsm->slave->error_flag = 1; |
966 fsm->slave->error_flag = 1; |
1181 fsm->slave_state = ec_fsm_error; |
967 fsm->slave_state = ec_fsm_slave_error; |
1182 EC_ERR("Failed to read DL status of slave %i.\n", |
968 EC_ERR("Failed to read DL status of slave %i.\n", |
1183 slave->ring_position); |
969 slave->ring_position); |
1184 return; |
970 return; |
1185 } |
971 } |
1186 |
972 |
1212 |
998 |
1213 if (ec_fsm_sii_exec(&fsm->fsm_sii)) return; |
999 if (ec_fsm_sii_exec(&fsm->fsm_sii)) return; |
1214 |
1000 |
1215 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
1001 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
1216 fsm->slave->error_flag = 1; |
1002 fsm->slave->error_flag = 1; |
1217 fsm->slave_state = ec_fsm_error; |
1003 fsm->slave_state = ec_fsm_slave_error; |
1218 EC_ERR("Failed to read EEPROM size of slave %i.\n", |
1004 EC_ERR("Failed to read EEPROM size of slave %i.\n", |
1219 slave->ring_position); |
1005 slave->ring_position); |
1220 return; |
1006 return; |
1221 } |
1007 } |
1222 |
1008 |
1240 } |
1026 } |
1241 |
1027 |
1242 if (!(slave->eeprom_data = |
1028 if (!(slave->eeprom_data = |
1243 (uint8_t *) kmalloc(slave->eeprom_size, GFP_ATOMIC))) { |
1029 (uint8_t *) kmalloc(slave->eeprom_size, GFP_ATOMIC))) { |
1244 fsm->slave->error_flag = 1; |
1030 fsm->slave->error_flag = 1; |
1245 fsm->slave_state = ec_fsm_error; |
1031 fsm->slave_state = ec_fsm_slave_error; |
1246 EC_ERR("Failed to allocate EEPROM data on slave %i.\n", |
1032 EC_ERR("Failed to allocate EEPROM data on slave %i.\n", |
1247 slave->ring_position); |
1033 slave->ring_position); |
1248 return; |
1034 return; |
1249 } |
1035 } |
1250 |
1036 |
1269 |
1055 |
1270 if (ec_fsm_sii_exec(&fsm->fsm_sii)) return; |
1056 if (ec_fsm_sii_exec(&fsm->fsm_sii)) return; |
1271 |
1057 |
1272 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
1058 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
1273 fsm->slave->error_flag = 1; |
1059 fsm->slave->error_flag = 1; |
1274 fsm->slave_state = ec_fsm_error; |
1060 fsm->slave_state = ec_fsm_slave_error; |
1275 EC_ERR("Failed to fetch EEPROM contents of slave %i.\n", |
1061 EC_ERR("Failed to fetch EEPROM contents of slave %i.\n", |
1276 slave->ring_position); |
1062 slave->ring_position); |
1277 return; |
1063 return; |
1278 } |
1064 } |
1279 |
1065 |
1357 } |
1143 } |
1358 |
1144 |
1359 cat_word += cat_size + 2; |
1145 cat_word += cat_size + 2; |
1360 } |
1146 } |
1361 |
1147 |
1362 fsm->slave_state = ec_fsm_end; |
1148 fsm->slave_state = ec_fsm_slave_end; |
1363 return; |
1149 return; |
1364 |
1150 |
1365 end: |
1151 end: |
1366 EC_ERR("Failed to analyze category data.\n"); |
1152 EC_ERR("Failed to analyze category data.\n"); |
1367 fsm->slave->error_flag = 1; |
1153 fsm->slave->error_flag = 1; |
1368 fsm->slave_state = ec_fsm_error; |
1154 fsm->slave_state = ec_fsm_slave_error; |
1369 } |
1155 } |
1370 |
1156 |
1371 /****************************************************************************** |
1157 /****************************************************************************** |
1372 * slave configuration state machine |
1158 * slave configuration state machine |
1373 *****************************************************************************/ |
1159 *****************************************************************************/ |
1386 |
1172 |
1387 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1173 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1388 |
1174 |
1389 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1175 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1390 slave->error_flag = 1; |
1176 slave->error_flag = 1; |
1391 fsm->slave_state = ec_fsm_error; |
1177 fsm->slave_state = ec_fsm_slave_error; |
1392 return; |
1178 return; |
1393 } |
1179 } |
1394 |
1180 |
1395 slave->configured = 1; |
1181 slave->configured = 1; |
1396 |
1182 |
1398 EC_DBG("Slave %i is now in INIT.\n", slave->ring_position); |
1184 EC_DBG("Slave %i is now in INIT.\n", slave->ring_position); |
1399 } |
1185 } |
1400 |
1186 |
1401 // slave is now in INIT |
1187 // slave is now in INIT |
1402 if (slave->current_state == slave->requested_state) { |
1188 if (slave->current_state == slave->requested_state) { |
1403 fsm->slave_state = ec_fsm_end; // successful |
1189 fsm->slave_state = ec_fsm_slave_end; // successful |
1404 if (master->debug_level) { |
1190 if (master->debug_level) { |
1405 EC_DBG("Finished configuration of slave %i.\n", |
1191 EC_DBG("Finished configuration of slave %i.\n", |
1406 slave->ring_position); |
1192 slave->ring_position); |
1407 } |
1193 } |
1408 return; |
1194 return; |
1455 else { |
1241 else { |
1456 list_for_each_entry(sync, &slave->sii_syncs, list) { |
1242 list_for_each_entry(sync, &slave->sii_syncs, list) { |
1457 if (sync->index >= slave->base_sync_count) { |
1243 if (sync->index >= slave->base_sync_count) { |
1458 EC_ERR("Invalid sync manager configuration found!"); |
1244 EC_ERR("Invalid sync manager configuration found!"); |
1459 fsm->slave->error_flag = 1; |
1245 fsm->slave->error_flag = 1; |
1460 fsm->slave_state = ec_fsm_error; |
1246 fsm->slave_state = ec_fsm_slave_error; |
1461 return; |
1247 return; |
1462 } |
1248 } |
1463 ec_sync_config(sync, slave, |
1249 ec_sync_config(sync, slave, |
1464 datagram->data + EC_SYNC_SIZE * sync->index); |
1250 datagram->data + EC_SYNC_SIZE * sync->index); |
1465 } |
1251 } |
1481 ec_slave_t *slave = fsm->slave; |
1267 ec_slave_t *slave = fsm->slave; |
1482 |
1268 |
1483 if (datagram->state != EC_DATAGRAM_RECEIVED |
1269 if (datagram->state != EC_DATAGRAM_RECEIVED |
1484 || datagram->working_counter != 1) { |
1270 || datagram->working_counter != 1) { |
1485 slave->error_flag = 1; |
1271 slave->error_flag = 1; |
1486 fsm->slave_state = ec_fsm_error; |
1272 fsm->slave_state = ec_fsm_slave_error; |
1487 EC_ERR("Failed to set sync managers on slave %i.\n", |
1273 EC_ERR("Failed to set sync managers on slave %i.\n", |
1488 slave->ring_position); |
1274 slave->ring_position); |
1489 return; |
1275 return; |
1490 } |
1276 } |
1491 |
1277 |
1509 |
1295 |
1510 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1296 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1511 |
1297 |
1512 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1298 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1513 slave->error_flag = 1; |
1299 slave->error_flag = 1; |
1514 fsm->slave_state = ec_fsm_error; |
1300 fsm->slave_state = ec_fsm_slave_error; |
1515 return; |
1301 return; |
1516 } |
1302 } |
1517 |
1303 |
1518 // slave is now in PREOP |
1304 // slave is now in PREOP |
1519 slave->jiffies_preop = fsm->datagram.jiffies_received; |
1305 slave->jiffies_preop = fsm->datagram.jiffies_received; |
1521 if (master->debug_level) { |
1307 if (master->debug_level) { |
1522 EC_DBG("Slave %i is now in PREOP.\n", slave->ring_position); |
1308 EC_DBG("Slave %i is now in PREOP.\n", slave->ring_position); |
1523 } |
1309 } |
1524 |
1310 |
1525 if (slave->current_state == slave->requested_state) { |
1311 if (slave->current_state == slave->requested_state) { |
1526 fsm->slave_state = ec_fsm_end; // successful |
1312 fsm->slave_state = ec_fsm_slave_end; // successful |
1527 if (master->debug_level) { |
1313 if (master->debug_level) { |
1528 EC_DBG("Finished configuration of slave %i.\n", |
1314 EC_DBG("Finished configuration of slave %i.\n", |
1529 slave->ring_position); |
1315 slave->ring_position); |
1530 } |
1316 } |
1531 return; |
1317 return; |
1572 ec_slave_t *slave = fsm->slave; |
1358 ec_slave_t *slave = fsm->slave; |
1573 |
1359 |
1574 if (datagram->state != EC_DATAGRAM_RECEIVED |
1360 if (datagram->state != EC_DATAGRAM_RECEIVED |
1575 || datagram->working_counter != 1) { |
1361 || datagram->working_counter != 1) { |
1576 fsm->slave->error_flag = 1; |
1362 fsm->slave->error_flag = 1; |
1577 fsm->slave_state = ec_fsm_error; |
1363 fsm->slave_state = ec_fsm_slave_error; |
1578 EC_ERR("Failed to set FMMUs on slave %i.\n", |
1364 EC_ERR("Failed to set FMMUs on slave %i.\n", |
1579 fsm->slave->ring_position); |
1365 fsm->slave->ring_position); |
1580 return; |
1366 return; |
1581 } |
1367 } |
1582 |
1368 |
1606 { |
1392 { |
1607 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
1393 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
1608 |
1394 |
1609 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1395 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1610 fsm->slave->error_flag = 1; |
1396 fsm->slave->error_flag = 1; |
1611 fsm->slave_state = ec_fsm_error; |
1397 fsm->slave_state = ec_fsm_slave_error; |
1612 return; |
1398 return; |
1613 } |
1399 } |
1614 |
1400 |
1615 // Another SDO to configure? |
1401 // Another SDO to configure? |
1616 if (fsm->sdodata->list.next != &fsm->slave->sdo_confs) { |
1402 if (fsm->sdodata->list.next != &fsm->slave->sdo_confs) { |
1642 |
1428 |
1643 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1429 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1644 |
1430 |
1645 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1431 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1646 fsm->slave->error_flag = 1; |
1432 fsm->slave->error_flag = 1; |
1647 fsm->slave_state = ec_fsm_error; |
1433 fsm->slave_state = ec_fsm_slave_error; |
1648 return; |
1434 return; |
1649 } |
1435 } |
1650 |
1436 |
1651 // slave is now in SAVEOP |
1437 // slave is now in SAVEOP |
1652 |
1438 |
1653 if (master->debug_level) { |
1439 if (master->debug_level) { |
1654 EC_DBG("Slave %i is now in SAVEOP.\n", slave->ring_position); |
1440 EC_DBG("Slave %i is now in SAVEOP.\n", slave->ring_position); |
1655 } |
1441 } |
1656 |
1442 |
1657 if (fsm->slave->current_state == fsm->slave->requested_state) { |
1443 if (fsm->slave->current_state == fsm->slave->requested_state) { |
1658 fsm->slave_state = ec_fsm_end; // successful |
1444 fsm->slave_state = ec_fsm_slave_end; // successful |
1659 if (master->debug_level) { |
1445 if (master->debug_level) { |
1660 EC_DBG("Finished configuration of slave %i.\n", |
1446 EC_DBG("Finished configuration of slave %i.\n", |
1661 slave->ring_position); |
1447 slave->ring_position); |
1662 } |
1448 } |
1663 return; |
1449 return; |
1682 |
1468 |
1683 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1469 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
1684 |
1470 |
1685 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1471 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
1686 slave->error_flag = 1; |
1472 slave->error_flag = 1; |
1687 fsm->slave_state = ec_fsm_error; |
1473 fsm->slave_state = ec_fsm_slave_error; |
1688 return; |
1474 return; |
1689 } |
1475 } |
1690 |
1476 |
1691 // slave is now in OP |
1477 // slave is now in OP |
1692 |
1478 |
1693 if (master->debug_level) { |
1479 if (master->debug_level) { |
1694 EC_DBG("Slave %i is now in OP.\n", slave->ring_position); |
1480 EC_DBG("Slave %i is now in OP.\n", slave->ring_position); |
1695 EC_DBG("Finished configuration of slave %i.\n", slave->ring_position); |
1481 EC_DBG("Finished configuration of slave %i.\n", slave->ring_position); |
1696 } |
1482 } |
1697 |
1483 |
1698 fsm->slave_state = ec_fsm_end; // successful |
1484 fsm->slave_state = ec_fsm_slave_end; // successful |
1699 } |
1485 } |
1700 |
1486 |
1701 /****************************************************************************** |
1487 /****************************************************************************** |
1702 * Common state functions |
1488 * Common state functions |
1703 *****************************************************************************/ |
1489 *****************************************************************************/ |
1704 |
1490 |
1705 /** |
1491 /** |
1706 State: ERROR. |
1492 State: ERROR. |
1707 */ |
1493 */ |
1708 |
1494 |
1709 void ec_fsm_error(ec_fsm_t *fsm /**< finite state machine */) |
1495 void ec_fsm_slave_error(ec_fsm_t *fsm /**< finite state machine */) |
1710 { |
1496 { |
1711 } |
1497 } |
1712 |
1498 |
1713 /*****************************************************************************/ |
1499 /*****************************************************************************/ |
1714 |
1500 |
1715 /** |
1501 /** |
1716 State: END. |
1502 State: END. |
1717 */ |
1503 */ |
1718 |
1504 |
1719 void ec_fsm_end(ec_fsm_t *fsm /**< finite state machine */) |
1505 void ec_fsm_slave_end(ec_fsm_t *fsm /**< finite state machine */) |
1720 { |
1506 { |
1721 } |
1507 } |
1722 |
1508 |
1723 /*****************************************************************************/ |
1509 /*****************************************************************************/ |