master/fsm_pdo.c
changeset 1964 9327c261056f
parent 1921 d9cf40facbc4
child 2421 bc2d4bf9cbe5
child 2589 2b9c78543663
equal deleted inserted replaced
1963:6aaf77798445 1964:9327c261056f
   374     if (!fsm->slave->config) {
   374     if (!fsm->slave->config) {
   375         fsm->state = ec_fsm_pdo_state_end;
   375         fsm->state = ec_fsm_pdo_state_end;
   376         return;
   376         return;
   377     }
   377     }
   378 
   378 
   379     fsm->sync_index = 0xff; // next is zero
   379     fsm->sync_index = 1; // next is 2
   380     ec_fsm_pdo_conf_action_next_sync(fsm);
   380     ec_fsm_pdo_conf_action_next_sync(fsm);
   381 }
   381 }
   382 
   382 
   383 /*****************************************************************************/
   383 /*****************************************************************************/
   384 
   384 
   427                         fsm->sync_index);
   427                         fsm->sync_index);
   428             continue;
   428             continue;
   429         }
   429         }
   430 
   430 
   431         // get first configured PDO
   431         // get first configured PDO
   432         if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
   432         if (!(fsm->pdo =
       
   433                     ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
   433             // no pdos configured
   434             // no pdos configured
   434             ec_fsm_pdo_conf_action_check_assignment(fsm);
   435             ec_fsm_pdo_conf_action_check_assignment(fsm);
   435             return;
   436             return;
   436         }
   437         }
   437 
   438 
   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     }