447 sync.physical_start_address = slave->sii.boot_rx_mailbox_offset; |
447 sync.physical_start_address = slave->sii.boot_rx_mailbox_offset; |
448 sync.control_register = 0x26; |
448 sync.control_register = 0x26; |
449 sync.enable = 1; |
449 sync.enable = 1; |
450 ec_sync_page(&sync, 0, slave->sii.boot_rx_mailbox_size, |
450 ec_sync_page(&sync, 0, slave->sii.boot_rx_mailbox_size, |
451 EC_DIR_INVALID, // use default direction |
451 EC_DIR_INVALID, // use default direction |
|
452 0, // no PDO xfer |
452 datagram->data); |
453 datagram->data); |
453 slave->configured_rx_mailbox_offset = |
454 slave->configured_rx_mailbox_offset = |
454 slave->sii.boot_rx_mailbox_offset; |
455 slave->sii.boot_rx_mailbox_offset; |
455 slave->configured_rx_mailbox_size = |
456 slave->configured_rx_mailbox_size = |
456 slave->sii.boot_rx_mailbox_size; |
457 slave->sii.boot_rx_mailbox_size; |
459 sync.physical_start_address = slave->sii.boot_tx_mailbox_offset; |
460 sync.physical_start_address = slave->sii.boot_tx_mailbox_offset; |
460 sync.control_register = 0x22; |
461 sync.control_register = 0x22; |
461 sync.enable = 1; |
462 sync.enable = 1; |
462 ec_sync_page(&sync, 1, slave->sii.boot_tx_mailbox_size, |
463 ec_sync_page(&sync, 1, slave->sii.boot_tx_mailbox_size, |
463 EC_DIR_INVALID, // use default direction |
464 EC_DIR_INVALID, // use default direction |
|
465 0, // no PDO xfer |
464 datagram->data + EC_SYNC_PAGE_SIZE); |
466 datagram->data + EC_SYNC_PAGE_SIZE); |
465 slave->configured_tx_mailbox_offset = |
467 slave->configured_tx_mailbox_offset = |
466 slave->sii.boot_tx_mailbox_offset; |
468 slave->sii.boot_tx_mailbox_offset; |
467 slave->configured_tx_mailbox_size = |
469 slave->configured_tx_mailbox_size = |
468 slave->sii.boot_tx_mailbox_size; |
470 slave->sii.boot_tx_mailbox_size; |
474 |
476 |
475 for (i = 0; i < 2; i++) { |
477 for (i = 0; i < 2; i++) { |
476 ec_sync_page(&slave->sii.syncs[i], i, |
478 ec_sync_page(&slave->sii.syncs[i], i, |
477 slave->sii.syncs[i].default_length, |
479 slave->sii.syncs[i].default_length, |
478 NULL, // use default sync manager configuration |
480 NULL, // use default sync manager configuration |
|
481 0, // no PDO xfer |
479 datagram->data + EC_SYNC_PAGE_SIZE * i); |
482 datagram->data + EC_SYNC_PAGE_SIZE * i); |
480 } |
483 } |
481 |
484 |
482 slave->configured_rx_mailbox_offset = |
485 slave->configured_rx_mailbox_offset = |
483 slave->sii.syncs[0].physical_start_address; |
486 slave->sii.syncs[0].physical_start_address; |
501 sync.physical_start_address = slave->sii.std_rx_mailbox_offset; |
504 sync.physical_start_address = slave->sii.std_rx_mailbox_offset; |
502 sync.control_register = 0x26; |
505 sync.control_register = 0x26; |
503 sync.enable = 1; |
506 sync.enable = 1; |
504 ec_sync_page(&sync, 0, slave->sii.std_rx_mailbox_size, |
507 ec_sync_page(&sync, 0, slave->sii.std_rx_mailbox_size, |
505 NULL, // use default sync manager configuration |
508 NULL, // use default sync manager configuration |
|
509 0, // no PDO xfer |
506 datagram->data); |
510 datagram->data); |
507 slave->configured_rx_mailbox_offset = |
511 slave->configured_rx_mailbox_offset = |
508 slave->sii.std_rx_mailbox_offset; |
512 slave->sii.std_rx_mailbox_offset; |
509 slave->configured_rx_mailbox_size = |
513 slave->configured_rx_mailbox_size = |
510 slave->sii.std_rx_mailbox_size; |
514 slave->sii.std_rx_mailbox_size; |
513 sync.physical_start_address = slave->sii.std_tx_mailbox_offset; |
517 sync.physical_start_address = slave->sii.std_tx_mailbox_offset; |
514 sync.control_register = 0x22; |
518 sync.control_register = 0x22; |
515 sync.enable = 1; |
519 sync.enable = 1; |
516 ec_sync_page(&sync, 1, slave->sii.std_tx_mailbox_size, |
520 ec_sync_page(&sync, 1, slave->sii.std_tx_mailbox_size, |
517 NULL, // use default sync manager configuration |
521 NULL, // use default sync manager configuration |
|
522 0, // no PDO xfer |
518 datagram->data + EC_SYNC_PAGE_SIZE); |
523 datagram->data + EC_SYNC_PAGE_SIZE); |
519 slave->configured_tx_mailbox_offset = |
524 slave->configured_tx_mailbox_offset = |
520 slave->sii.std_tx_mailbox_offset; |
525 slave->sii.std_tx_mailbox_offset; |
521 slave->configured_tx_mailbox_size = |
526 slave->configured_tx_mailbox_size = |
522 slave->sii.std_tx_mailbox_size; |
527 slave->sii.std_tx_mailbox_size; |
957 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
962 ec_fsm_slave_config_t *fsm /**< slave state machine */ |
958 ) |
963 ) |
959 { |
964 { |
960 ec_slave_t *slave = fsm->slave; |
965 ec_slave_t *slave = fsm->slave; |
961 ec_datagram_t *datagram = fsm->datagram; |
966 ec_datagram_t *datagram = fsm->datagram; |
962 unsigned int i, offset, num_pdo_syncs; |
967 unsigned int i, j, offset, num_pdo_syncs; |
963 uint8_t sync_index; |
968 uint8_t sync_index; |
964 const ec_sync_t *sync; |
969 const ec_sync_t *sync; |
965 uint16_t size; |
970 uint16_t size; |
966 |
971 |
967 if (slave->sii.mailbox_protocols) { |
972 if (slave->sii.mailbox_protocols) { |
984 EC_SYNC_PAGE_SIZE * num_pdo_syncs); |
989 EC_SYNC_PAGE_SIZE * num_pdo_syncs); |
985 ec_datagram_zero(datagram); |
990 ec_datagram_zero(datagram); |
986 |
991 |
987 for (i = 0; i < num_pdo_syncs; i++) { |
992 for (i = 0; i < num_pdo_syncs; i++) { |
988 const ec_sync_config_t *sync_config; |
993 const ec_sync_config_t *sync_config; |
|
994 uint8_t pdo_xfer = 0; |
989 sync_index = i + offset; |
995 sync_index = i + offset; |
990 sync = &slave->sii.syncs[sync_index]; |
996 sync = &slave->sii.syncs[sync_index]; |
991 |
997 |
992 if (slave->config) { |
998 if (slave->config) { |
993 sync_config = &slave->config->sync_configs[sync_index]; |
999 const ec_slave_config_t *sc = slave->config; |
|
1000 sync_config = &sc->sync_configs[sync_index]; |
994 size = ec_pdo_list_total_size(&sync_config->pdos); |
1001 size = ec_pdo_list_total_size(&sync_config->pdos); |
|
1002 |
|
1003 // determine, if PDOs shall be transferred via this SM |
|
1004 // inthat case, enable sync manager in every case |
|
1005 for (j = 0; j < sc->used_fmmus; j++) { |
|
1006 if (sc->fmmu_configs[j].sync_index == sync_index) { |
|
1007 pdo_xfer = 1; |
|
1008 break; |
|
1009 } |
|
1010 } |
|
1011 |
995 } else { |
1012 } else { |
996 sync_config = NULL; |
1013 sync_config = NULL; |
997 size = sync->default_length; |
1014 size = sync->default_length; |
998 } |
1015 } |
999 |
1016 |
1000 ec_sync_page(sync, sync_index, size, sync_config, |
1017 ec_sync_page(sync, sync_index, size, sync_config, pdo_xfer, |
1001 datagram->data + EC_SYNC_PAGE_SIZE * i); |
1018 datagram->data + EC_SYNC_PAGE_SIZE * i); |
1002 } |
1019 } |
1003 |
1020 |
1004 fsm->retries = EC_FSM_RETRIES; |
1021 fsm->retries = EC_FSM_RETRIES; |
1005 fsm->state = ec_fsm_slave_config_state_pdo_sync; |
1022 fsm->state = ec_fsm_slave_config_state_pdo_sync; |