52 void ec_fsm_slave_config_state_dc_read_offset(ec_fsm_slave_config_t *); |
52 void ec_fsm_slave_config_state_dc_read_offset(ec_fsm_slave_config_t *); |
53 void ec_fsm_slave_config_state_dc_write_offset(ec_fsm_slave_config_t *); |
53 void ec_fsm_slave_config_state_dc_write_offset(ec_fsm_slave_config_t *); |
54 void ec_fsm_slave_config_state_mbox_sync(ec_fsm_slave_config_t *); |
54 void ec_fsm_slave_config_state_mbox_sync(ec_fsm_slave_config_t *); |
55 void ec_fsm_slave_config_state_boot_preop(ec_fsm_slave_config_t *); |
55 void ec_fsm_slave_config_state_boot_preop(ec_fsm_slave_config_t *); |
56 void ec_fsm_slave_config_state_sdo_conf(ec_fsm_slave_config_t *); |
56 void ec_fsm_slave_config_state_sdo_conf(ec_fsm_slave_config_t *); |
|
57 void ec_fsm_slave_config_state_soe_conf(ec_fsm_slave_config_t *); |
57 void ec_fsm_slave_config_state_watchdog_divider(ec_fsm_slave_config_t *); |
58 void ec_fsm_slave_config_state_watchdog_divider(ec_fsm_slave_config_t *); |
58 void ec_fsm_slave_config_state_watchdog(ec_fsm_slave_config_t *); |
59 void ec_fsm_slave_config_state_watchdog(ec_fsm_slave_config_t *); |
59 void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *); |
60 void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *); |
60 void ec_fsm_slave_config_state_pdo_conf(ec_fsm_slave_config_t *); |
61 void ec_fsm_slave_config_state_pdo_conf(ec_fsm_slave_config_t *); |
61 void ec_fsm_slave_config_state_fmmu(ec_fsm_slave_config_t *); |
62 void ec_fsm_slave_config_state_fmmu(ec_fsm_slave_config_t *); |
69 void ec_fsm_slave_config_enter_clear_sync(ec_fsm_slave_config_t *); |
70 void ec_fsm_slave_config_enter_clear_sync(ec_fsm_slave_config_t *); |
70 void ec_fsm_slave_config_enter_dc_clear_assign(ec_fsm_slave_config_t *); |
71 void ec_fsm_slave_config_enter_dc_clear_assign(ec_fsm_slave_config_t *); |
71 void ec_fsm_slave_config_enter_mbox_sync(ec_fsm_slave_config_t *); |
72 void ec_fsm_slave_config_enter_mbox_sync(ec_fsm_slave_config_t *); |
72 void ec_fsm_slave_config_enter_boot_preop(ec_fsm_slave_config_t *); |
73 void ec_fsm_slave_config_enter_boot_preop(ec_fsm_slave_config_t *); |
73 void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *); |
74 void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *); |
|
75 void ec_fsm_slave_config_enter_soe_conf(ec_fsm_slave_config_t *); |
74 void ec_fsm_slave_config_enter_pdo_conf(ec_fsm_slave_config_t *); |
76 void ec_fsm_slave_config_enter_pdo_conf(ec_fsm_slave_config_t *); |
75 void ec_fsm_slave_config_enter_watchdog_divider(ec_fsm_slave_config_t *); |
77 void ec_fsm_slave_config_enter_watchdog_divider(ec_fsm_slave_config_t *); |
76 void ec_fsm_slave_config_enter_watchdog(ec_fsm_slave_config_t *); |
78 void ec_fsm_slave_config_enter_watchdog(ec_fsm_slave_config_t *); |
77 void ec_fsm_slave_config_enter_pdo_sync(ec_fsm_slave_config_t *); |
79 void ec_fsm_slave_config_enter_pdo_sync(ec_fsm_slave_config_t *); |
78 void ec_fsm_slave_config_enter_fmmu(ec_fsm_slave_config_t *); |
80 void ec_fsm_slave_config_enter_fmmu(ec_fsm_slave_config_t *); |
802 ec_sdo_request_t, list); |
805 ec_sdo_request_t, list); |
803 ec_sdo_request_copy(&fsm->request_copy, fsm->request); |
806 ec_sdo_request_copy(&fsm->request_copy, fsm->request); |
804 ecrt_sdo_request_write(&fsm->request_copy); |
807 ecrt_sdo_request_write(&fsm->request_copy); |
805 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request_copy); |
808 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request_copy); |
806 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
809 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
|
810 return; |
|
811 } |
|
812 |
|
813 // All SDOs are now configured. |
|
814 ec_fsm_slave_config_enter_soe_conf(fsm); |
|
815 } |
|
816 |
|
817 /*****************************************************************************/ |
|
818 |
|
819 /** Check for SoE configurations to be applied. |
|
820 */ |
|
821 void ec_fsm_slave_config_enter_soe_conf( |
|
822 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
|
823 ) |
|
824 { |
|
825 ec_slave_t *slave = fsm->slave; |
|
826 ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; |
|
827 |
|
828 if (!slave->config) { |
|
829 ec_fsm_slave_config_enter_pdo_sync(fsm); |
|
830 return; |
|
831 } |
|
832 |
|
833 // No SoE configuration to be applied? |
|
834 if (list_empty(&slave->config->soe_configs)) { // skip configuration |
|
835 ec_fsm_slave_config_enter_pdo_conf(fsm); |
|
836 return; |
|
837 } |
|
838 |
|
839 // start SoE configuration |
|
840 fsm->state = ec_fsm_slave_config_state_soe_conf; |
|
841 fsm->soe_request = list_entry(fsm->slave->config->soe_configs.next, |
|
842 ec_soe_request_t, list); |
|
843 ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); |
|
844 ec_soe_request_write(&fsm->soe_request_copy); |
|
845 ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); |
|
846 ec_fsm_soe_exec(fsm_soe); // execute immediately |
|
847 } |
|
848 |
|
849 /*****************************************************************************/ |
|
850 |
|
851 /** Slave configuration state: SOE_CONF. |
|
852 */ |
|
853 void ec_fsm_slave_config_state_soe_conf( |
|
854 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
|
855 ) |
|
856 { |
|
857 ec_slave_t *slave = fsm->slave; |
|
858 ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; |
|
859 |
|
860 if (ec_fsm_soe_exec(fsm_soe)) { |
|
861 return; |
|
862 } |
|
863 |
|
864 if (!ec_fsm_soe_success(fsm_soe)) { |
|
865 EC_ERR("SoE configuration failed for slave %u.\n", |
|
866 fsm->slave->ring_position); |
|
867 fsm->slave->error_flag = 1; |
|
868 fsm->state = ec_fsm_slave_config_state_error; |
|
869 return; |
|
870 } |
|
871 |
|
872 if (!fsm->slave->config) { // config removed in the meantime |
|
873 ec_fsm_slave_config_reconfigure(fsm); |
|
874 return; |
|
875 } |
|
876 |
|
877 // Another IDN to configure? |
|
878 if (fsm->soe_request->list.next != &fsm->slave->config->soe_configs) { |
|
879 fsm->soe_request = list_entry(fsm->soe_request->list.next, |
|
880 ec_soe_request_t, list); |
|
881 ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); |
|
882 ec_soe_request_write(&fsm->soe_request_copy); |
|
883 ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); |
|
884 ec_fsm_soe_exec(fsm_soe); // execute immediately |
807 return; |
885 return; |
808 } |
886 } |
809 |
887 |
810 // All SDOs are now configured. |
888 // All SDOs are now configured. |
811 ec_fsm_slave_config_enter_pdo_conf(fsm); |
889 ec_fsm_slave_config_enter_pdo_conf(fsm); |