54 void ec_fsm_slave_scan_state_eeprom_data(ec_fsm_slave_t *); |
54 void ec_fsm_slave_scan_state_eeprom_data(ec_fsm_slave_t *); |
55 |
55 |
56 void ec_fsm_slave_conf_state_start(ec_fsm_slave_t *); |
56 void ec_fsm_slave_conf_state_start(ec_fsm_slave_t *); |
57 void ec_fsm_slave_conf_state_init(ec_fsm_slave_t *); |
57 void ec_fsm_slave_conf_state_init(ec_fsm_slave_t *); |
58 void ec_fsm_slave_conf_state_clear_fmmus(ec_fsm_slave_t *); |
58 void ec_fsm_slave_conf_state_clear_fmmus(ec_fsm_slave_t *); |
59 void ec_fsm_slave_conf_state_sync(ec_fsm_slave_t *); |
59 void ec_fsm_slave_conf_state_mbox_sync(ec_fsm_slave_t *); |
60 void ec_fsm_slave_conf_state_preop(ec_fsm_slave_t *); |
60 void ec_fsm_slave_conf_state_preop(ec_fsm_slave_t *); |
61 void ec_fsm_slave_conf_state_sync2(ec_fsm_slave_t *); |
61 void ec_fsm_slave_conf_state_pdo_sync(ec_fsm_slave_t *); |
62 void ec_fsm_slave_conf_state_fmmu(ec_fsm_slave_t *); |
62 void ec_fsm_slave_conf_state_fmmu(ec_fsm_slave_t *); |
63 void ec_fsm_slave_conf_state_sdoconf(ec_fsm_slave_t *); |
63 void ec_fsm_slave_conf_state_sdoconf(ec_fsm_slave_t *); |
64 void ec_fsm_slave_conf_state_saveop(ec_fsm_slave_t *); |
64 void ec_fsm_slave_conf_state_saveop(ec_fsm_slave_t *); |
65 void ec_fsm_slave_conf_state_op(ec_fsm_slave_t *); |
65 void ec_fsm_slave_conf_state_op(ec_fsm_slave_t *); |
66 |
66 |
67 void ec_fsm_slave_conf_enter_sync(ec_fsm_slave_t *); |
67 void ec_fsm_slave_conf_enter_mbox_sync(ec_fsm_slave_t *); |
68 void ec_fsm_slave_conf_enter_preop(ec_fsm_slave_t *); |
68 void ec_fsm_slave_conf_enter_preop(ec_fsm_slave_t *); |
69 void ec_fsm_slave_conf_enter_sync2(ec_fsm_slave_t *); |
69 void ec_fsm_slave_conf_enter_pdo_sync(ec_fsm_slave_t *); |
70 void ec_fsm_slave_conf_enter_fmmu(ec_fsm_slave_t *); |
70 void ec_fsm_slave_conf_enter_fmmu(ec_fsm_slave_t *); |
71 void ec_fsm_slave_conf_enter_sdoconf(ec_fsm_slave_t *); |
71 void ec_fsm_slave_conf_enter_sdoconf(ec_fsm_slave_t *); |
72 void ec_fsm_slave_conf_enter_saveop(ec_fsm_slave_t *); |
72 void ec_fsm_slave_conf_enter_saveop(ec_fsm_slave_t *); |
73 |
73 |
74 void ec_fsm_slave_state_end(ec_fsm_slave_t *); |
74 void ec_fsm_slave_state_end(ec_fsm_slave_t *); |
601 // check and reset CRC fault counters |
601 // check and reset CRC fault counters |
602 //ec_slave_check_crc(slave); |
602 //ec_slave_check_crc(slave); |
603 // TODO: Implement state machine for CRC checking. |
603 // TODO: Implement state machine for CRC checking. |
604 |
604 |
605 if (!slave->base_fmmu_count) { // skip FMMU configuration |
605 if (!slave->base_fmmu_count) { // skip FMMU configuration |
606 ec_fsm_slave_conf_enter_sync(fsm); |
606 ec_fsm_slave_conf_enter_mbox_sync(fsm); |
607 return; |
607 return; |
608 } |
608 } |
609 |
609 |
610 if (master->debug_level) |
610 if (master->debug_level) |
611 EC_DBG("Clearing FMMU configurations of slave %i...\n", |
611 EC_DBG("Clearing FMMU configurations of slave %i...\n", |
649 EC_ERR("Failed to clear FMMUs - slave %i did not respond.\n", |
649 EC_ERR("Failed to clear FMMUs - slave %i did not respond.\n", |
650 fsm->slave->ring_position); |
650 fsm->slave->ring_position); |
651 return; |
651 return; |
652 } |
652 } |
653 |
653 |
654 ec_fsm_slave_conf_enter_sync(fsm); |
654 ec_fsm_slave_conf_enter_mbox_sync(fsm); |
655 } |
655 } |
656 |
656 |
657 /*****************************************************************************/ |
657 /*****************************************************************************/ |
658 |
658 |
659 /** |
659 /** |
660 */ |
660 */ |
661 |
661 |
662 void ec_fsm_slave_conf_enter_sync(ec_fsm_slave_t *fsm /**< slave state machine */) |
662 void ec_fsm_slave_conf_enter_mbox_sync(ec_fsm_slave_t *fsm /**< slave state machine */) |
663 { |
663 { |
664 ec_master_t *master = fsm->slave->master; |
664 ec_master_t *master = fsm->slave->master; |
665 ec_slave_t *slave = fsm->slave; |
665 ec_slave_t *slave = fsm->slave; |
666 ec_datagram_t *datagram = fsm->datagram; |
666 ec_datagram_t *datagram = fsm->datagram; |
667 unsigned int i; |
667 unsigned int i; |
697 datagram->data + EC_SYNC_SIZE * i); |
697 datagram->data + EC_SYNC_SIZE * i); |
698 } |
698 } |
699 |
699 |
700 ec_master_queue_datagram(fsm->slave->master, datagram); |
700 ec_master_queue_datagram(fsm->slave->master, datagram); |
701 fsm->retries = EC_FSM_RETRIES; |
701 fsm->retries = EC_FSM_RETRIES; |
702 fsm->state = ec_fsm_slave_conf_state_sync; |
702 fsm->state = ec_fsm_slave_conf_state_mbox_sync; |
703 } |
703 } |
704 |
704 |
705 /*****************************************************************************/ |
705 /*****************************************************************************/ |
706 |
706 |
707 /** |
707 /** |
708 Slave configuration state: SYNC. |
708 Slave configuration state: SYNC. |
709 */ |
709 */ |
710 |
710 |
711 void ec_fsm_slave_conf_state_sync(ec_fsm_slave_t *fsm /**< slave state machine */) |
711 void ec_fsm_slave_conf_state_mbox_sync(ec_fsm_slave_t *fsm /**< slave state machine */) |
712 { |
712 { |
713 ec_datagram_t *datagram = fsm->datagram; |
713 ec_datagram_t *datagram = fsm->datagram; |
714 ec_slave_t *slave = fsm->slave; |
714 ec_slave_t *slave = fsm->slave; |
715 |
715 |
716 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
716 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
782 slave->ring_position); |
782 slave->ring_position); |
783 } |
783 } |
784 return; |
784 return; |
785 } |
785 } |
786 |
786 |
787 ec_fsm_slave_conf_enter_sync2(fsm); |
787 ec_fsm_slave_conf_enter_pdo_sync(fsm); |
788 } |
788 } |
789 |
789 |
790 /*****************************************************************************/ |
790 /*****************************************************************************/ |
791 |
791 |
792 /** |
792 /** |
793 */ |
793 */ |
794 |
794 |
795 void ec_fsm_slave_conf_enter_sync2(ec_fsm_slave_t *fsm /**< slave state machine */) |
795 void ec_fsm_slave_conf_enter_pdo_sync(ec_fsm_slave_t *fsm /**< slave state machine */) |
796 { |
796 { |
797 ec_slave_t *slave = fsm->slave; |
797 ec_slave_t *slave = fsm->slave; |
798 ec_datagram_t *datagram = fsm->datagram; |
798 ec_datagram_t *datagram = fsm->datagram; |
799 unsigned int i; |
799 unsigned int i; |
800 |
800 |
813 datagram->data + EC_SYNC_SIZE * i); |
813 datagram->data + EC_SYNC_SIZE * i); |
814 } |
814 } |
815 |
815 |
816 ec_master_queue_datagram(fsm->slave->master, datagram); |
816 ec_master_queue_datagram(fsm->slave->master, datagram); |
817 fsm->retries = EC_FSM_RETRIES; |
817 fsm->retries = EC_FSM_RETRIES; |
818 fsm->state = ec_fsm_slave_conf_state_sync2; |
818 fsm->state = ec_fsm_slave_conf_state_pdo_sync; |
819 } |
819 } |
820 |
820 |
821 /*****************************************************************************/ |
821 /*****************************************************************************/ |
822 |
822 |
823 /** |
823 /** |
824 Slave configuration state: SYNC2. |
824 Slave configuration state: SYNC2. |
825 */ |
825 */ |
826 |
826 |
827 void ec_fsm_slave_conf_state_sync2(ec_fsm_slave_t *fsm /**< slave state machine */) |
827 void ec_fsm_slave_conf_state_pdo_sync(ec_fsm_slave_t *fsm /**< slave state machine */) |
828 { |
828 { |
829 ec_datagram_t *datagram = fsm->datagram; |
829 ec_datagram_t *datagram = fsm->datagram; |
830 ec_slave_t *slave = fsm->slave; |
830 ec_slave_t *slave = fsm->slave; |
831 |
831 |
832 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
832 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |