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 *); |
63 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *); |
64 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *); |
64 void ec_fsm_master_state_end(ec_fsm_master_t *); |
65 void ec_fsm_master_state_end(ec_fsm_master_t *); |
65 void ec_fsm_master_state_error(ec_fsm_master_t *); |
66 void ec_fsm_master_state_error(ec_fsm_master_t *); |
66 |
67 |
67 /*****************************************************************************/ |
68 /*****************************************************************************/ |
88 // init sub-state-machines |
89 // init sub-state-machines |
89 ec_fsm_slave_init(&fsm->fsm_slave, fsm->datagram); |
90 ec_fsm_slave_init(&fsm->fsm_slave, fsm->datagram); |
90 ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); |
91 ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); |
91 ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); |
92 ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); |
92 ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram); |
93 ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram); |
|
94 ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe); |
93 } |
95 } |
94 |
96 |
95 /*****************************************************************************/ |
97 /*****************************************************************************/ |
96 |
98 |
97 /** |
99 /** |
103 // clear sub-state machines |
105 // clear sub-state machines |
104 ec_fsm_slave_clear(&fsm->fsm_slave); |
106 ec_fsm_slave_clear(&fsm->fsm_slave); |
105 ec_fsm_sii_clear(&fsm->fsm_sii); |
107 ec_fsm_sii_clear(&fsm->fsm_sii); |
106 ec_fsm_change_clear(&fsm->fsm_change); |
108 ec_fsm_change_clear(&fsm->fsm_change); |
107 ec_fsm_coe_clear(&fsm->fsm_coe); |
109 ec_fsm_coe_clear(&fsm->fsm_coe); |
|
110 ec_fsm_coe_map_clear(&fsm->fsm_coe_map); |
108 } |
111 } |
109 |
112 |
110 /*****************************************************************************/ |
113 /*****************************************************************************/ |
111 |
114 |
112 /** |
115 /** |
327 list_del_init(&request->list); // dequeue |
330 list_del_init(&request->list); // dequeue |
328 request->state = EC_REQUEST_IN_PROGRESS; |
331 request->state = EC_REQUEST_IN_PROGRESS; |
329 up(&master->eeprom_sem); |
332 up(&master->eeprom_sem); |
330 |
333 |
331 slave = request->slave; |
334 slave = request->slave; |
332 if (slave->online_state == EC_SLAVE_OFFLINE || slave->error_flag) { |
335 if (slave->online_state == EC_SLAVE_OFFLINE) { |
333 EC_ERR("Discarding EEPROM data, slave %i not ready.\n", |
336 EC_ERR("Discarding EEPROM data, slave %i offline.\n", |
334 slave->ring_position); |
337 slave->ring_position); |
335 request->state = EC_REQUEST_FAILURE; |
338 request->state = EC_REQUEST_FAILURE; |
336 wake_up(&master->eeprom_queue); |
339 wake_up(&master->eeprom_queue); |
337 continue; |
340 continue; |
338 } |
341 } |
341 if (master->debug_level) |
344 if (master->debug_level) |
342 EC_DBG("Writing EEPROM data to slave %i...\n", |
345 EC_DBG("Writing EEPROM data to slave %i...\n", |
343 slave->ring_position); |
346 slave->ring_position); |
344 fsm->eeprom_request = request; |
347 fsm->eeprom_request = request; |
345 fsm->eeprom_index = 0; |
348 fsm->eeprom_index = 0; |
346 ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->offset, |
349 ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->word_offset, |
347 request->words, EC_FSM_SII_NODE); |
350 request->data, EC_FSM_SII_NODE); |
348 fsm->state = ec_fsm_master_state_write_eeprom; |
351 fsm->state = ec_fsm_master_state_write_eeprom; |
349 fsm->state(fsm); // execute immediately |
352 fsm->state(fsm); // execute immediately |
350 return 1; |
353 return 1; |
351 } |
354 } |
352 |
355 |
380 list_entry(master->sdo_requests.next, ec_sdo_request_t, list); |
383 list_entry(master->sdo_requests.next, ec_sdo_request_t, list); |
381 list_del_init(&request->list); // dequeue |
384 list_del_init(&request->list); // dequeue |
382 request->state = EC_REQUEST_IN_PROGRESS; |
385 request->state = EC_REQUEST_IN_PROGRESS; |
383 up(&master->sdo_sem); |
386 up(&master->sdo_sem); |
384 |
387 |
385 slave = request->sdo->slave; |
388 slave = request->entry->sdo->slave; |
386 if (slave->current_state == EC_SLAVE_STATE_INIT || |
389 if (slave->current_state == EC_SLAVE_STATE_INIT || |
387 slave->online_state == EC_SLAVE_OFFLINE || |
390 slave->online_state == EC_SLAVE_OFFLINE || |
388 slave->error_flag) { |
391 slave->error_flag) { |
389 EC_ERR("Discarding SDO request, slave %i not ready.\n", |
392 EC_ERR("Discarding SDO request, slave %i not ready.\n", |
390 slave->ring_position); |
393 slave->ring_position); |
519 ec_fsm_coe_dictionary(&fsm->fsm_coe, slave); |
523 ec_fsm_coe_dictionary(&fsm->fsm_coe, slave); |
520 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately |
524 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately |
521 return; |
525 return; |
522 } |
526 } |
523 |
527 |
|
528 // check, if slaves have their PDO mapping to be read. |
|
529 list_for_each_entry(slave, &master->slaves, list) { |
|
530 if (!(slave->sii_mailbox_protocols & EC_MBOX_COE) |
|
531 || slave->pdo_mapping_fetched |
|
532 || !slave->sdo_dictionary_fetched |
|
533 || slave->current_state == EC_SLAVE_STATE_INIT |
|
534 || slave->online_state == EC_SLAVE_OFFLINE) continue; |
|
535 |
|
536 if (master->debug_level) { |
|
537 EC_DBG("Fetching PDO mapping from slave %i via CoE.\n", |
|
538 slave->ring_position); |
|
539 } |
|
540 |
|
541 slave->pdo_mapping_fetched = 1; |
|
542 |
|
543 // start fetching PDO mapping |
|
544 fsm->idle = 0; |
|
545 fsm->state = ec_fsm_master_state_pdomap; |
|
546 ec_fsm_coe_map_start(&fsm->fsm_coe_map, slave); |
|
547 ec_fsm_coe_map_exec(&fsm->fsm_coe_map); // execute immediately |
|
548 return; |
|
549 } |
|
550 |
524 // check for pending EEPROM write operations. |
551 // check for pending EEPROM write operations. |
525 if (ec_fsm_master_action_process_eeprom(fsm)) |
552 if (ec_fsm_master_action_process_eeprom(fsm)) |
526 return; // EEPROM write request found |
553 return; // EEPROM write request found |
527 } |
554 } |
528 |
555 |
943 fsm->state = ec_fsm_master_state_error; |
970 fsm->state = ec_fsm_master_state_error; |
944 return; |
971 return; |
945 } |
972 } |
946 |
973 |
947 fsm->eeprom_index++; |
974 fsm->eeprom_index++; |
948 if (fsm->eeprom_index < request->size) { |
975 if (fsm->eeprom_index < request->word_size) { |
949 ec_fsm_sii_write(&fsm->fsm_sii, slave, |
976 ec_fsm_sii_write(&fsm->fsm_sii, slave, |
950 request->offset + fsm->eeprom_index, |
977 request->word_offset + fsm->eeprom_index, |
951 request->words + fsm->eeprom_index, |
978 request->data + fsm->eeprom_index * 2, |
952 EC_FSM_SII_NODE); |
979 EC_FSM_SII_NODE); |
953 ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately |
980 ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately |
954 return; |
981 return; |
955 } |
982 } |
956 |
983 |
957 // finished writing EEPROM |
984 // finished writing EEPROM |
958 if (master->debug_level) |
985 if (master->debug_level) |
959 EC_DBG("Finished writing EEPROM data to slave %i.\n", |
986 EC_DBG("Finished writing %u words of EEPROM data to slave %u.\n", |
960 slave->ring_position); |
987 request->word_size, slave->ring_position); |
961 request->state = EC_REQUEST_COMPLETE; |
988 request->state = EC_REQUEST_COMPLETE; |
962 wake_up(&master->eeprom_queue); |
989 wake_up(&master->eeprom_queue); |
963 |
990 |
964 // TODO: Evaluate new EEPROM contents! |
991 // TODO: Evaluate new EEPROM contents! |
965 |
992 |
1001 } |
1028 } |
1002 |
1029 |
1003 /*****************************************************************************/ |
1030 /*****************************************************************************/ |
1004 |
1031 |
1005 /** |
1032 /** |
|
1033 * Scan the PDO mapping of a slave. |
|
1034 */ |
|
1035 |
|
1036 void ec_fsm_master_state_pdomap( |
|
1037 ec_fsm_master_t *fsm /**< master state machine */ |
|
1038 ) |
|
1039 { |
|
1040 if (ec_fsm_coe_map_exec(&fsm->fsm_coe_map)) return; |
|
1041 |
|
1042 if (!ec_fsm_coe_map_success(&fsm->fsm_coe_map)) { |
|
1043 fsm->state = ec_fsm_master_state_error; |
|
1044 return; |
|
1045 } |
|
1046 |
|
1047 // fetching of PDO mapping finished |
|
1048 fsm->state = ec_fsm_master_state_end; |
|
1049 } |
|
1050 |
|
1051 /*****************************************************************************/ |
|
1052 |
|
1053 /** |
1006 Master state: SDO REQUEST. |
1054 Master state: SDO REQUEST. |
1007 */ |
1055 */ |
1008 |
1056 |
1009 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */) |
1057 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */) |
1010 { |
1058 { |