master/fsm_slave_config.c
changeset 1844 b6bd88d4806b
parent 1822 74e6ac2369f4
child 1849 0a660edc7180
equal deleted inserted replaced
1843:4d44d8bee580 1844:b6bd88d4806b
    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 *);
   111 void ec_fsm_slave_config_clear(
   113 void ec_fsm_slave_config_clear(
   112         ec_fsm_slave_config_t *fsm /**< slave state machine */
   114         ec_fsm_slave_config_t *fsm /**< slave state machine */
   113         )
   115         )
   114 {
   116 {
   115     ec_sdo_request_clear(&fsm->request_copy);
   117     ec_sdo_request_clear(&fsm->request_copy);
       
   118     ec_soe_request_clear(&fsm->soe_request_copy);
   116 }
   119 }
   117 
   120 
   118 /*****************************************************************************/
   121 /*****************************************************************************/
   119 
   122 
   120 /** Start slave configuration state machine.
   123 /** Start slave configuration state machine.
   757         return;
   760         return;
   758     }
   761     }
   759 
   762 
   760     // No CoE configuration to be applied?
   763     // No CoE configuration to be applied?
   761     if (list_empty(&slave->config->sdo_configs)) { // skip SDO configuration
   764     if (list_empty(&slave->config->sdo_configs)) { // skip SDO configuration
   762         ec_fsm_slave_config_enter_pdo_conf(fsm);
   765         ec_fsm_slave_config_enter_soe_conf(fsm);
   763         return;
   766         return;
   764     }
   767     }
   765 
   768 
   766     // start SDO configuration
   769     // start SDO configuration
   767     fsm->state = ec_fsm_slave_config_state_sdo_conf;
   770     fsm->state = ec_fsm_slave_config_state_sdo_conf;
   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);