504 */ |
505 */ |
505 void ec_fsm_pdo_conf_action_check_mapping( |
506 void ec_fsm_pdo_conf_action_check_mapping( |
506 ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */ |
507 ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */ |
507 ) |
508 ) |
508 { |
509 { |
509 if (ec_pdo_equal_entries(fsm->pdo, &fsm->slave_pdo)) { |
510 // check, if slave supports PDO configuration |
510 EC_SLAVE_DBG(fsm->slave, 1, "Mapping of PDO 0x%04X" |
511 if ((fsm->slave->sii.mailbox_protocols & EC_MBOX_COE) |
511 " is already configured correctly.\n", fsm->pdo->index); |
512 && fsm->slave->sii.has_general |
512 ec_fsm_pdo_conf_action_next_pdo_mapping(fsm); |
513 && fsm->slave->sii.coe_details.enable_pdo_configuration) { |
513 return; |
514 |
514 } |
515 // always write PDO mapping |
515 |
516 ec_fsm_pdo_entry_start_configuration(&fsm->fsm_pdo_entry, fsm->slave, |
516 ec_fsm_pdo_entry_start_configuration(&fsm->fsm_pdo_entry, fsm->slave, |
517 fsm->pdo, &fsm->slave_pdo); |
517 fsm->pdo, &fsm->slave_pdo); |
518 fsm->state = ec_fsm_pdo_conf_state_mapping; |
518 fsm->state = ec_fsm_pdo_conf_state_mapping; |
519 fsm->state(fsm); // execure immediately |
519 fsm->state(fsm); // execure immediately |
520 return; |
|
521 } |
|
522 else if (!ec_pdo_equal_entries(fsm->pdo, &fsm->slave_pdo)) { |
|
523 EC_SLAVE_WARN(fsm->slave, "Slave does not support" |
|
524 " changing the PDO mapping!\n"); |
|
525 EC_SLAVE_WARN(fsm->slave, ""); |
|
526 printk("Currently mapped PDO entries: "); |
|
527 ec_pdo_print_entries(&fsm->slave_pdo); |
|
528 printk(". Entries to map: "); |
|
529 ec_pdo_print_entries(fsm->pdo); |
|
530 printk("\n"); |
|
531 } |
|
532 |
|
533 ec_fsm_pdo_conf_action_next_pdo_mapping(fsm); |
520 } |
534 } |
521 |
535 |
522 /*****************************************************************************/ |
536 /*****************************************************************************/ |
523 |
537 |
524 /** Let the PDO entry state machine configure the current PDO's mapping. |
538 /** Let the PDO entry state machine configure the current PDO's mapping. |
562 */ |
576 */ |
563 void ec_fsm_pdo_conf_action_check_assignment( |
577 void ec_fsm_pdo_conf_action_check_assignment( |
564 ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */ |
578 ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */ |
565 ) |
579 ) |
566 { |
580 { |
567 // check if assignment has to be re-configured |
581 if ((fsm->slave->sii.mailbox_protocols & EC_MBOX_COE) |
568 if (ec_pdo_list_equal(&fsm->sync->pdos, &fsm->pdos)) { |
582 && fsm->slave->sii.has_general |
569 EC_SLAVE_DBG(fsm->slave, 1, "PDO assignment for SM%u" |
583 && fsm->slave->sii.coe_details.enable_pdo_assign) { |
570 " is already configured correctly.\n", fsm->sync_index); |
584 |
571 ec_fsm_pdo_conf_action_next_sync(fsm); |
585 // always write PDO assignment |
572 return; |
586 if (fsm->slave->master->debug_level) { |
573 } |
587 EC_SLAVE_DBG(fsm->slave, 1, "Setting PDO assignment of SM%u:\n", |
574 |
588 fsm->sync_index); |
575 if (fsm->slave->master->debug_level) { |
589 EC_SLAVE_DBG(fsm->slave, 1, ""); ec_fsm_pdo_print(fsm); |
576 EC_SLAVE_DBG(fsm->slave, 1, "PDO assignment of SM%u differs:\n", |
590 } |
577 fsm->sync_index); |
591 |
578 EC_SLAVE_DBG(fsm->slave, 1, ""); ec_fsm_pdo_print(fsm); |
592 if (ec_sdo_request_alloc(&fsm->request, 2)) { |
579 } |
593 fsm->state = ec_fsm_pdo_state_error; |
580 |
594 return; |
581 // PDO assignment has to be changed. Does the slave support this? |
595 } |
582 if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE) |
596 |
583 || (fsm->slave->sii.has_general |
597 // set mapped PDO count to zero |
584 && !fsm->slave->sii.coe_details.enable_pdo_assign)) { |
598 EC_WRITE_U8(fsm->request.data, 0); // zero PDOs mapped |
|
599 fsm->request.data_size = 1; |
|
600 ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0); |
|
601 ecrt_sdo_request_write(&fsm->request); |
|
602 |
|
603 EC_SLAVE_DBG(fsm->slave, 1, "Setting number of assigned" |
|
604 " PDOs to zero.\n"); |
|
605 |
|
606 fsm->state = ec_fsm_pdo_conf_state_zero_pdo_count; |
|
607 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); |
|
608 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
|
609 return; |
|
610 } |
|
611 else if (!ec_pdo_list_equal(&fsm->sync->pdos, &fsm->pdos)) { |
585 EC_SLAVE_WARN(fsm->slave, "Slave does not support assigning PDOs!\n"); |
612 EC_SLAVE_WARN(fsm->slave, "Slave does not support assigning PDOs!\n"); |
586 EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm); |
613 EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm); |
587 ec_fsm_pdo_conf_action_next_sync(fsm); |
614 } |
588 return; |
615 |
589 } |
616 ec_fsm_pdo_conf_action_next_sync(fsm); |
590 |
|
591 if (ec_sdo_request_alloc(&fsm->request, 2)) { |
|
592 fsm->state = ec_fsm_pdo_state_error; |
|
593 return; |
|
594 } |
|
595 |
|
596 // set mapped PDO count to zero |
|
597 EC_WRITE_U8(fsm->request.data, 0); // zero PDOs mapped |
|
598 fsm->request.data_size = 1; |
|
599 ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0); |
|
600 ecrt_sdo_request_write(&fsm->request); |
|
601 |
|
602 EC_SLAVE_DBG(fsm->slave, 1, "Setting number of assigned PDOs to zero.\n"); |
|
603 |
|
604 fsm->state = ec_fsm_pdo_conf_state_zero_pdo_count; |
|
605 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); |
|
606 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
|
607 } |
617 } |
608 |
618 |
609 /*****************************************************************************/ |
619 /*****************************************************************************/ |
610 |
620 |
611 /** Set the number of assigned PDOs to zero. |
621 /** Set the number of assigned PDOs to zero. |
619 |
629 |
620 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
630 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
621 EC_SLAVE_WARN(fsm->slave, "Failed to clear PDO assignment of SM%u.\n", |
631 EC_SLAVE_WARN(fsm->slave, "Failed to clear PDO assignment of SM%u.\n", |
622 fsm->sync_index); |
632 fsm->sync_index); |
623 EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm); |
633 EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm); |
624 fsm->state = ec_fsm_pdo_state_error; |
634 ec_fsm_pdo_conf_action_next_sync(fsm); |
625 return; |
635 return; |
626 } |
636 } |
627 |
637 |
628 // the sync manager's assigned PDOs have been cleared |
638 // the sync manager's assigned PDOs have been cleared |
629 ec_pdo_list_clear_pdos(&fsm->sync->pdos); |
639 ec_pdo_list_clear_pdos(&fsm->sync->pdos); |
630 |
640 |
631 // assign all PDOs belonging to the current sync manager |
641 // assign all PDOs belonging to the current sync manager |
632 |
642 |
633 // find first PDO |
643 // find first PDO |
634 if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) { |
644 if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) { |
635 EC_SLAVE_DBG(fsm->slave, 1, "No PDOs to assign.\n"); |
|
636 |
645 |
637 // check for mapping to be altered |
646 // check for mapping to be altered |
638 ec_fsm_pdo_conf_action_next_sync(fsm); |
647 ec_fsm_pdo_conf_action_next_sync(fsm); |
639 return; |
648 return; |
640 } |
649 } |