equal
deleted
inserted
replaced
44 |
44 |
45 /** Maximum time in ms to wait for responses when reading out the dictionary. |
45 /** Maximum time in ms to wait for responses when reading out the dictionary. |
46 */ |
46 */ |
47 #define EC_FSM_FOE_TIMEOUT 3000 |
47 #define EC_FSM_FOE_TIMEOUT 3000 |
48 |
48 |
|
49 /** Mailbox type FoE. |
|
50 */ |
49 #define EC_MBOX_TYPE_FILEACCESS 0x04 |
51 #define EC_MBOX_TYPE_FILEACCESS 0x04 |
50 |
52 |
|
53 /** Size of the FoE header. |
|
54 */ |
51 #define EC_FOE_HEADER_SIZE 6 |
55 #define EC_FOE_HEADER_SIZE 6 |
52 // uint8_t OpCode |
56 // uint8_t OpCode |
53 // uint8_t reserved |
57 // uint8_t reserved |
54 // uint32_t PacketNo, Password, ErrorCode |
58 // uint32_t PacketNo, Password, ErrorCode |
55 |
59 |
150 return fsm->state == ec_fsm_foe_end; |
154 return fsm->state == ec_fsm_foe_end; |
151 } |
155 } |
152 |
156 |
153 /*****************************************************************************/ |
157 /*****************************************************************************/ |
154 |
158 |
|
159 /** Prepares an FoE transfer. |
|
160 */ |
155 void ec_fsm_foe_transfer( |
161 void ec_fsm_foe_transfer( |
156 ec_fsm_foe_t *fsm, /**< State machine. */ |
162 ec_fsm_foe_t *fsm, /**< State machine. */ |
157 ec_slave_t *slave, /**< EtherCAT slave. */ |
163 ec_slave_t *slave, /**< EtherCAT slave. */ |
158 ec_foe_request_t *request /**< Sdo request. */ |
164 ec_foe_request_t *request /**< Sdo request. */ |
159 ) |
165 ) |
261 return 0; |
267 return 0; |
262 } |
268 } |
263 |
269 |
264 /*****************************************************************************/ |
270 /*****************************************************************************/ |
265 |
271 |
266 void ec_fsm_foe_write(ec_fsm_foe_t *fsm /**< finite state machine */) |
272 /** Start a write operation. |
|
273 */ |
|
274 void ec_fsm_foe_write( |
|
275 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
276 ) |
267 { |
277 { |
268 fsm->tx_buffer = fsm->request->buffer; |
278 fsm->tx_buffer = fsm->request->buffer; |
269 fsm->tx_buffer_size = fsm->request->data_size; |
279 fsm->tx_buffer_size = fsm->request->data_size; |
270 fsm->tx_buffer_offset = 0; |
280 fsm->tx_buffer_offset = 0; |
271 |
281 |
274 |
284 |
275 fsm->state = ec_fsm_foe_write_start; |
285 fsm->state = ec_fsm_foe_write_start; |
276 } |
286 } |
277 |
287 |
278 /*****************************************************************************/ |
288 /*****************************************************************************/ |
279 /** |
289 |
280 Initializes the SII write state machine. |
290 /** Initializes the FoE write state machine. |
281 */ |
291 */ |
282 |
|
283 void ec_fsm_foe_write_start(ec_fsm_foe_t *fsm /**< finite state machine */) |
292 void ec_fsm_foe_write_start(ec_fsm_foe_t *fsm /**< finite state machine */) |
284 { |
293 { |
285 ec_slave_t *slave = fsm->slave; |
294 ec_slave_t *slave = fsm->slave; |
286 |
295 |
287 fsm->tx_buffer_offset = 0; |
296 fsm->tx_buffer_offset = 0; |
307 fsm->state = ec_fsm_foe_state_wrq_sent; |
316 fsm->state = ec_fsm_foe_state_wrq_sent; |
308 } |
317 } |
309 |
318 |
310 /*****************************************************************************/ |
319 /*****************************************************************************/ |
311 |
320 |
312 void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *fsm) |
321 /** Check for acknowledge. |
|
322 */ |
|
323 void ec_fsm_foe_state_ack_check( |
|
324 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
325 ) |
313 { |
326 { |
314 ec_datagram_t *datagram = fsm->datagram; |
327 ec_datagram_t *datagram = fsm->datagram; |
315 ec_slave_t *slave = fsm->slave; |
328 ec_slave_t *slave = fsm->slave; |
316 |
329 |
317 #ifdef DEBUG_FOE |
330 #ifdef DEBUG_FOE |
357 fsm->state = ec_fsm_foe_state_ack_read; |
370 fsm->state = ec_fsm_foe_state_ack_read; |
358 } |
371 } |
359 |
372 |
360 /*****************************************************************************/ |
373 /*****************************************************************************/ |
361 |
374 |
362 void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *fsm) |
375 /** Acknowledge a read operation. |
363 { |
376 */ |
364 |
377 void ec_fsm_foe_state_ack_read( |
|
378 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
379 ) |
|
380 { |
365 ec_datagram_t *datagram = fsm->datagram; |
381 ec_datagram_t *datagram = fsm->datagram; |
366 ec_slave_t *slave = fsm->slave; |
382 ec_slave_t *slave = fsm->slave; |
367 uint8_t *data, mbox_prot; |
383 uint8_t *data, mbox_prot; |
368 uint8_t opCode; |
384 uint8_t opCode; |
369 size_t rec_size; |
385 size_t rec_size; |
431 } |
447 } |
432 ec_foe_set_tx_error(fsm, FOE_ACK_ERROR); |
448 ec_foe_set_tx_error(fsm, FOE_ACK_ERROR); |
433 } |
449 } |
434 |
450 |
435 /*****************************************************************************/ |
451 /*****************************************************************************/ |
436 /** |
452 |
437 State: WRQ SENT. |
453 /** State: WRQ SENT. |
438 Checks is the previous transmit datagram succeded and sends the next |
454 * |
439 fragment, if necessary. |
455 * Checks is the previous transmit datagram succeded and sends the next |
440 */ |
456 * fragment, if necessary. |
441 |
457 */ |
442 void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *fsm) |
458 void ec_fsm_foe_state_wrq_sent( |
|
459 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
460 ) |
443 { |
461 { |
444 ec_datagram_t *datagram = fsm->datagram; |
462 ec_datagram_t *datagram = fsm->datagram; |
445 ec_slave_t *slave = fsm->slave; |
463 ec_slave_t *slave = fsm->slave; |
446 |
464 |
447 #ifdef DEBUG_FOE |
465 #ifdef DEBUG_FOE |
472 fsm->retries = EC_FSM_RETRIES; |
490 fsm->retries = EC_FSM_RETRIES; |
473 fsm->state = ec_fsm_foe_state_ack_check; |
491 fsm->state = ec_fsm_foe_state_ack_check; |
474 } |
492 } |
475 |
493 |
476 /*****************************************************************************/ |
494 /*****************************************************************************/ |
477 /** |
495 |
478 State: WRQ SENT. |
496 /** State: WRQ SENT. |
479 Checks is the previous transmit datagram succeded and sends the next |
497 * |
480 fragment, if necessary. |
498 * Checks is the previous transmit datagram succeded and sends the next |
481 */ |
499 * fragment, if necessary. |
482 |
500 */ |
483 void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *fsm) |
501 void ec_fsm_foe_state_data_sent( |
|
502 ec_fsm_foe_t *fsm /**< Foe statemachine. */ |
|
503 ) |
484 { |
504 { |
485 ec_datagram_t *datagram = fsm->datagram; |
505 ec_datagram_t *datagram = fsm->datagram; |
486 ec_slave_t *slave = fsm->slave; |
506 ec_slave_t *slave = fsm->slave; |
487 |
507 |
488 #ifdef DEBUG_FOE |
508 #ifdef DEBUG_FOE |
541 } |
561 } |
542 |
562 |
543 |
563 |
544 /*****************************************************************************/ |
564 /*****************************************************************************/ |
545 |
565 |
546 int ec_foe_prepare_send_ack(ec_fsm_foe_t *foe) |
566 /** Prepare to send an acknowledge. |
|
567 */ |
|
568 int ec_foe_prepare_send_ack( |
|
569 ec_fsm_foe_t *foe /**< FoE statemachine. */ |
|
570 ) |
547 { |
571 { |
548 uint8_t *data; |
572 uint8_t *data; |
549 |
573 |
550 data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram, |
574 data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram, |
551 EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE); |
575 EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE); |
557 |
581 |
558 return 0; |
582 return 0; |
559 } |
583 } |
560 |
584 |
561 /*****************************************************************************/ |
585 /*****************************************************************************/ |
562 /** |
586 |
563 State: RRQ SENT. |
587 /** State: RRQ SENT. |
564 Checks is the previous transmit datagram succeded and sends the next |
588 * |
565 fragment, if necessary. |
589 * Checks is the previous transmit datagram succeded and sends the next |
566 */ |
590 * fragment, if necessary. |
567 |
591 */ |
568 void ec_fsm_foe_state_rrq_sent( ec_fsm_foe_t *fsm ) { |
592 void ec_fsm_foe_state_rrq_sent( |
|
593 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
594 ) |
|
595 { |
569 ec_datagram_t *datagram = fsm->datagram; |
596 ec_datagram_t *datagram = fsm->datagram; |
570 ec_slave_t *slave = fsm->slave; |
597 ec_slave_t *slave = fsm->slave; |
571 |
598 |
572 #ifdef DEBUG_FOE |
599 #ifdef DEBUG_FOE |
573 printk("ec_foe_state_rrq_sent()\n"); |
600 printk("ec_foe_state_rrq_sent()\n"); |
598 fsm->state = ec_fsm_foe_state_data_check; |
625 fsm->state = ec_fsm_foe_state_data_check; |
599 } |
626 } |
600 |
627 |
601 /*****************************************************************************/ |
628 /*****************************************************************************/ |
602 |
629 |
603 void ec_fsm_foe_read(ec_fsm_foe_t *fsm /**< finite state machine */) |
630 /** Start a read operation. |
|
631 */ |
|
632 void ec_fsm_foe_read( |
|
633 ec_fsm_foe_t *fsm /**< FoE state machine. */ |
|
634 ) |
604 { |
635 { |
605 fsm->state = ec_fsm_foe_read_start; |
636 fsm->state = ec_fsm_foe_read_start; |
606 fsm->rx_filename = fsm->request->file_name; |
637 fsm->rx_filename = fsm->request->file_name; |
607 fsm->rx_filename_len = strlen(fsm->rx_filename); |
638 fsm->rx_filename_len = strlen(fsm->rx_filename); |
608 |
639 |
610 fsm->rx_buffer_size = fsm->request->buffer_size; |
641 fsm->rx_buffer_size = fsm->request->buffer_size; |
611 } |
642 } |
612 |
643 |
613 /*****************************************************************************/ |
644 /*****************************************************************************/ |
614 |
645 |
615 void ec_fsm_foe_read_start(ec_fsm_foe_t *fsm /**< finite state machine */) |
646 /** Starting state for read operations. |
|
647 */ |
|
648 void ec_fsm_foe_read_start( |
|
649 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
650 ) |
616 { |
651 { |
617 size_t current_size; |
652 size_t current_size; |
618 ec_slave_t *slave = fsm->slave; |
653 ec_slave_t *slave = fsm->slave; |
619 |
654 |
620 fsm->rx_buffer_offset = 0; |
655 fsm->rx_buffer_offset = 0; |
643 fsm->state = ec_fsm_foe_state_rrq_sent; |
678 fsm->state = ec_fsm_foe_state_rrq_sent; |
644 } |
679 } |
645 |
680 |
646 /*****************************************************************************/ |
681 /*****************************************************************************/ |
647 |
682 |
648 void ec_fsm_foe_state_data_check ( ec_fsm_foe_t *fsm ) { |
683 /** Check for data. |
|
684 */ |
|
685 void ec_fsm_foe_state_data_check( |
|
686 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
687 ) |
|
688 { |
649 ec_datagram_t *datagram = fsm->datagram; |
689 ec_datagram_t *datagram = fsm->datagram; |
650 ec_slave_t *slave = fsm->slave; |
690 ec_slave_t *slave = fsm->slave; |
651 |
691 |
652 #ifdef DEBUG_FOE |
692 #ifdef DEBUG_FOE |
653 printk("ec_fsm_foe_state_data_check()\n"); |
693 printk("ec_fsm_foe_state_data_check()\n"); |
692 |
732 |
693 } |
733 } |
694 |
734 |
695 /*****************************************************************************/ |
735 /*****************************************************************************/ |
696 |
736 |
697 void ec_fsm_foe_state_data_read(ec_fsm_foe_t *fsm) |
737 /** Start reading data. |
|
738 */ |
|
739 void ec_fsm_foe_state_data_read( |
|
740 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
741 ) |
698 { |
742 { |
699 size_t rec_size; |
743 size_t rec_size; |
700 uint8_t *data, opCode, packet_no, mbox_prot; |
744 uint8_t *data, opCode, packet_no, mbox_prot; |
701 |
745 |
702 ec_datagram_t *datagram = fsm->datagram; |
746 ec_datagram_t *datagram = fsm->datagram; |
813 } |
857 } |
814 } |
858 } |
815 |
859 |
816 /*****************************************************************************/ |
860 /*****************************************************************************/ |
817 |
861 |
818 void ec_fsm_foe_state_sent_ack( ec_fsm_foe_t *fsm ) { |
862 /** Sent an acknowledge. |
819 |
863 */ |
|
864 void ec_fsm_foe_state_sent_ack( |
|
865 ec_fsm_foe_t *fsm /**< FoE statemachine. */ |
|
866 ) |
|
867 { |
820 ec_datagram_t *datagram = fsm->datagram; |
868 ec_datagram_t *datagram = fsm->datagram; |
821 ec_slave_t *slave = fsm->slave; |
869 ec_slave_t *slave = fsm->slave; |
822 |
870 |
823 #ifdef DEBUG_FOE |
871 #ifdef DEBUG_FOE |
824 printk("ec_foe_state_sent_ack()\n"); |
872 printk("ec_foe_state_sent_ack()\n"); |
857 } |
905 } |
858 } |
906 } |
859 |
907 |
860 /*****************************************************************************/ |
908 /*****************************************************************************/ |
861 |
909 |
862 void ec_foe_set_tx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) |
910 /** Set an error code and go to the send error state. |
|
911 */ |
|
912 void ec_foe_set_tx_error( |
|
913 ec_fsm_foe_t *fsm, /**< FoE statemachine. */ |
|
914 uint32_t errorcode /**< FoE error code. */ |
|
915 ) |
863 { |
916 { |
864 fsm->tx_errors++; |
917 fsm->tx_errors++; |
865 fsm->request->result = errorcode; |
918 fsm->request->result = errorcode; |
866 fsm->state = ec_fsm_foe_error; |
919 fsm->state = ec_fsm_foe_error; |
867 } |
920 } |
868 |
921 |
869 /*****************************************************************************/ |
922 /*****************************************************************************/ |
870 |
923 |
871 void ec_foe_set_rx_error(ec_fsm_foe_t *fsm, uint32_t errorcode) |
924 /** Set an error code and go to the receive error state. |
|
925 */ |
|
926 void ec_foe_set_rx_error( |
|
927 ec_fsm_foe_t *fsm, /**< FoE statemachine. */ |
|
928 uint32_t errorcode /**< FoE error code. */ |
|
929 ) |
872 { |
930 { |
873 fsm->rx_errors++; |
931 fsm->rx_errors++; |
874 fsm->request->result = errorcode; |
932 fsm->request->result = errorcode; |
875 fsm->state = ec_fsm_foe_error; |
933 fsm->state = ec_fsm_foe_error; |
876 } |
934 } |