58 void ec_fsm_master_state_configure_slave(ec_fsm_master_t *); |
58 void ec_fsm_master_state_configure_slave(ec_fsm_master_t *); |
59 void ec_fsm_master_state_clear_addresses(ec_fsm_master_t *); |
59 void ec_fsm_master_state_clear_addresses(ec_fsm_master_t *); |
60 void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *); |
60 void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *); |
61 void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *); |
61 void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *); |
62 void ec_fsm_master_state_sdodict(ec_fsm_master_t *); |
62 void ec_fsm_master_state_sdodict(ec_fsm_master_t *); |
63 void ec_fsm_master_state_pdomap(ec_fsm_master_t *); |
|
64 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *); |
63 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *); |
65 void ec_fsm_master_state_end(ec_fsm_master_t *); |
64 void ec_fsm_master_state_end(ec_fsm_master_t *); |
66 void ec_fsm_master_state_error(ec_fsm_master_t *); |
65 void ec_fsm_master_state_error(ec_fsm_master_t *); |
67 |
66 |
68 /*****************************************************************************/ |
67 /*****************************************************************************/ |
86 fsm->validate = 0; |
85 fsm->validate = 0; |
87 fsm->tainted = 0; |
86 fsm->tainted = 0; |
88 |
87 |
89 // init sub-state-machines |
88 // init sub-state-machines |
90 ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram); |
89 ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram); |
91 ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram); |
90 ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram, |
|
91 &fsm->fsm_slave_config, &fsm->fsm_coe_map); |
92 ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); |
92 ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); |
93 ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); |
93 ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); |
94 ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram); |
94 ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram); |
95 ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe); |
95 ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe); |
96 } |
96 } |
385 list_entry(master->sdo_requests.next, ec_sdo_request_t, list); |
385 list_entry(master->sdo_requests.next, ec_sdo_request_t, list); |
386 list_del_init(&request->list); // dequeue |
386 list_del_init(&request->list); // dequeue |
387 request->state = EC_REQUEST_IN_PROGRESS; |
387 request->state = EC_REQUEST_IN_PROGRESS; |
388 up(&master->sdo_sem); |
388 up(&master->sdo_sem); |
389 |
389 |
390 slave = request->entry->sdo->slave; |
390 slave = request->slave; |
391 if (slave->current_state == EC_SLAVE_STATE_INIT || |
391 if (slave->current_state == EC_SLAVE_STATE_INIT || |
392 slave->online_state == EC_SLAVE_OFFLINE || |
392 slave->online_state == EC_SLAVE_OFFLINE || |
393 slave->error_flag) { |
393 slave->error_flag) { |
394 EC_ERR("Discarding Sdo request, slave %i not ready.\n", |
394 EC_ERR("Discarding Sdo request, slave %i not ready.\n", |
395 slave->ring_position); |
395 slave->ring_position); |
524 ec_fsm_coe_dictionary(&fsm->fsm_coe, slave); |
524 ec_fsm_coe_dictionary(&fsm->fsm_coe, slave); |
525 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately |
525 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately |
526 return; |
526 return; |
527 } |
527 } |
528 |
528 |
529 // check, if slaves have their Pdo mapping to be read. |
|
530 list_for_each_entry(slave, &master->slaves, list) { |
|
531 if (!(slave->sii_mailbox_protocols & EC_MBOX_COE) |
|
532 || slave->pdo_mapping_fetched |
|
533 || !slave->sdo_dictionary_fetched |
|
534 || slave->current_state == EC_SLAVE_STATE_INIT |
|
535 || slave->online_state == EC_SLAVE_OFFLINE) continue; |
|
536 |
|
537 if (master->debug_level) { |
|
538 EC_DBG("Fetching Pdo mapping from slave %i via CoE.\n", |
|
539 slave->ring_position); |
|
540 } |
|
541 |
|
542 slave->pdo_mapping_fetched = 1; |
|
543 |
|
544 // start fetching Pdo mapping |
|
545 fsm->idle = 0; |
|
546 fsm->state = ec_fsm_master_state_pdomap; |
|
547 ec_fsm_coe_map_start(&fsm->fsm_coe_map, slave); |
|
548 ec_fsm_coe_map_exec(&fsm->fsm_coe_map); // execute immediately |
|
549 return; |
|
550 } |
|
551 |
|
552 // check for pending EEPROM write operations. |
529 // check for pending EEPROM write operations. |
553 if (ec_fsm_master_action_process_eeprom(fsm)) |
530 if (ec_fsm_master_action_process_eeprom(fsm)) |
554 return; // EEPROM write request found |
531 return; // EEPROM write request found |
555 } |
532 } |
556 |
533 |
1037 } |
1014 } |
1038 |
1015 |
1039 /*****************************************************************************/ |
1016 /*****************************************************************************/ |
1040 |
1017 |
1041 /** |
1018 /** |
1042 * Scan the Pdo mapping of a slave. |
1019 Master state: SDO REQUEST. |
1043 */ |
|
1044 |
|
1045 void ec_fsm_master_state_pdomap( |
|
1046 ec_fsm_master_t *fsm /**< master state machine */ |
|
1047 ) |
|
1048 { |
|
1049 if (ec_fsm_coe_map_exec(&fsm->fsm_coe_map)) return; |
|
1050 |
|
1051 if (!ec_fsm_coe_map_success(&fsm->fsm_coe_map)) { |
|
1052 fsm->state = ec_fsm_master_state_error; |
|
1053 return; |
|
1054 } |
|
1055 |
|
1056 // fetching of Pdo mapping finished |
|
1057 fsm->state = ec_fsm_master_state_end; |
|
1058 } |
|
1059 |
|
1060 /*****************************************************************************/ |
|
1061 |
|
1062 /** |
|
1063 Master state: Sdo REQUEST. |
|
1064 */ |
1020 */ |
1065 |
1021 |
1066 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */) |
1022 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */) |
1067 { |
1023 { |
1068 ec_master_t *master = fsm->master; |
1024 ec_master_t *master = fsm->master; |