Skip to content
Snippets Groups Projects
Commit 05134700 authored by Florian Pose's avatar Florian Pose
Browse files

Always write PDO mapping/assignment.

parent 77a5a7ed
No related branches found
No related tags found
No related merge requests found
...@@ -76,7 +76,6 @@ Future issues: ...@@ -76,7 +76,6 @@ Future issues:
- Implement reading from stream for soe_write. - Implement reading from stream for soe_write.
* Simplify master fsm by introducing a common request state to handle external * Simplify master fsm by introducing a common request state to handle external
requests (replace write_sii, sdo_request, etc). requests (replace write_sii, sdo_request, etc).
* Write PDO mapping/assignment by default?
* Remove stdio uses in userspace library? * Remove stdio uses in userspace library?
Smaller issues: Smaller issues:
......
...@@ -376,7 +376,7 @@ void ec_fsm_pdo_conf_state_start( ...@@ -376,7 +376,7 @@ void ec_fsm_pdo_conf_state_start(
return; return;
} }
fsm->sync_index = 0xff; // next is zero fsm->sync_index = 1; // next is 2
ec_fsm_pdo_conf_action_next_sync(fsm); ec_fsm_pdo_conf_action_next_sync(fsm);
} }
...@@ -429,7 +429,8 @@ void ec_fsm_pdo_conf_action_next_sync( ...@@ -429,7 +429,8 @@ void ec_fsm_pdo_conf_action_next_sync(
} }
// get first configured PDO // get first configured PDO
if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) { if (!(fsm->pdo =
ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
// no pdos configured // no pdos configured
ec_fsm_pdo_conf_action_check_assignment(fsm); ec_fsm_pdo_conf_action_check_assignment(fsm);
return; return;
...@@ -506,17 +507,30 @@ void ec_fsm_pdo_conf_action_check_mapping( ...@@ -506,17 +507,30 @@ void ec_fsm_pdo_conf_action_check_mapping(
ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */ ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */
) )
{ {
if (ec_pdo_equal_entries(fsm->pdo, &fsm->slave_pdo)) { // check, if slave supports PDO configuration
EC_SLAVE_DBG(fsm->slave, 1, "Mapping of PDO 0x%04X" if ((fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
" is already configured correctly.\n", fsm->pdo->index); && fsm->slave->sii.has_general
ec_fsm_pdo_conf_action_next_pdo_mapping(fsm); && fsm->slave->sii.coe_details.enable_pdo_configuration) {
// always write PDO mapping
ec_fsm_pdo_entry_start_configuration(&fsm->fsm_pdo_entry, fsm->slave,
fsm->pdo, &fsm->slave_pdo);
fsm->state = ec_fsm_pdo_conf_state_mapping;
fsm->state(fsm); // execure immediately
return; return;
} }
else if (!ec_pdo_equal_entries(fsm->pdo, &fsm->slave_pdo)) {
EC_SLAVE_WARN(fsm->slave, "Slave does not support"
" changing the PDO mapping!\n");
EC_SLAVE_WARN(fsm->slave, "");
printk("Currently mapped PDO entries: ");
ec_pdo_print_entries(&fsm->slave_pdo);
printk(". Entries to map: ");
ec_pdo_print_entries(fsm->pdo);
printk("\n");
}
ec_fsm_pdo_entry_start_configuration(&fsm->fsm_pdo_entry, fsm->slave, ec_fsm_pdo_conf_action_next_pdo_mapping(fsm);
fsm->pdo, &fsm->slave_pdo);
fsm->state = ec_fsm_pdo_conf_state_mapping;
fsm->state(fsm); // execure immediately
} }
/*****************************************************************************/ /*****************************************************************************/
...@@ -564,46 +578,42 @@ void ec_fsm_pdo_conf_action_check_assignment( ...@@ -564,46 +578,42 @@ void ec_fsm_pdo_conf_action_check_assignment(
ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */ ec_fsm_pdo_t *fsm /**< PDO configuration state machine. */
) )
{ {
// check if assignment has to be re-configured if ((fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
if (ec_pdo_list_equal(&fsm->sync->pdos, &fsm->pdos)) { && fsm->slave->sii.has_general
EC_SLAVE_DBG(fsm->slave, 1, "PDO assignment for SM%u" && fsm->slave->sii.coe_details.enable_pdo_assign) {
" is already configured correctly.\n", fsm->sync_index);
ec_fsm_pdo_conf_action_next_sync(fsm); // always write PDO assignment
return; if (fsm->slave->master->debug_level) {
} EC_SLAVE_DBG(fsm->slave, 1, "Setting PDO assignment of SM%u:\n",
fsm->sync_index);
EC_SLAVE_DBG(fsm->slave, 1, ""); ec_fsm_pdo_print(fsm);
}
if (fsm->slave->master->debug_level) { if (ec_sdo_request_alloc(&fsm->request, 2)) {
EC_SLAVE_DBG(fsm->slave, 1, "PDO assignment of SM%u differs:\n", fsm->state = ec_fsm_pdo_state_error;
fsm->sync_index); return;
EC_SLAVE_DBG(fsm->slave, 1, ""); ec_fsm_pdo_print(fsm); }
}
// PDO assignment has to be changed. Does the slave support this? // set mapped PDO count to zero
if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE) EC_WRITE_U8(fsm->request.data, 0); // zero PDOs mapped
|| (fsm->slave->sii.has_general fsm->request.data_size = 1;
&& !fsm->slave->sii.coe_details.enable_pdo_assign)) { ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
EC_SLAVE_WARN(fsm->slave, "Slave does not support assigning PDOs!\n"); ecrt_sdo_request_write(&fsm->request);
EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm);
ec_fsm_pdo_conf_action_next_sync(fsm);
return;
}
if (ec_sdo_request_alloc(&fsm->request, 2)) { EC_SLAVE_DBG(fsm->slave, 1, "Setting number of assigned"
fsm->state = ec_fsm_pdo_state_error; " PDOs to zero.\n");
fsm->state = ec_fsm_pdo_conf_state_zero_pdo_count;
ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
return; return;
} }
else if (!ec_pdo_list_equal(&fsm->sync->pdos, &fsm->pdos)) {
EC_SLAVE_WARN(fsm->slave, "Slave does not support assigning PDOs!\n");
EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm);
}
// set mapped PDO count to zero ec_fsm_pdo_conf_action_next_sync(fsm);
EC_WRITE_U8(fsm->request.data, 0); // zero PDOs mapped
fsm->request.data_size = 1;
ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
ecrt_sdo_request_write(&fsm->request);
EC_SLAVE_DBG(fsm->slave, 1, "Setting number of assigned PDOs to zero.\n");
fsm->state = ec_fsm_pdo_conf_state_zero_pdo_count;
ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
} }
/*****************************************************************************/ /*****************************************************************************/
...@@ -621,7 +631,7 @@ void ec_fsm_pdo_conf_state_zero_pdo_count( ...@@ -621,7 +631,7 @@ void ec_fsm_pdo_conf_state_zero_pdo_count(
EC_SLAVE_WARN(fsm->slave, "Failed to clear PDO assignment of SM%u.\n", EC_SLAVE_WARN(fsm->slave, "Failed to clear PDO assignment of SM%u.\n",
fsm->sync_index); fsm->sync_index);
EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm); EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm);
fsm->state = ec_fsm_pdo_state_error; ec_fsm_pdo_conf_action_next_sync(fsm);
return; return;
} }
...@@ -632,7 +642,6 @@ void ec_fsm_pdo_conf_state_zero_pdo_count( ...@@ -632,7 +642,6 @@ void ec_fsm_pdo_conf_state_zero_pdo_count(
// find first PDO // find first PDO
if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) { if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
EC_SLAVE_DBG(fsm->slave, 1, "No PDOs to assign.\n");
// check for mapping to be altered // check for mapping to be altered
ec_fsm_pdo_conf_action_next_sync(fsm); ec_fsm_pdo_conf_action_next_sync(fsm);
......
...@@ -328,17 +328,6 @@ void ec_fsm_pdo_entry_conf_state_start( ...@@ -328,17 +328,6 @@ void ec_fsm_pdo_entry_conf_state_start(
ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */ ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
) )
{ {
// PDO mapping has to be changed. Does the slave support this?
if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
|| (fsm->slave->sii.has_general
&& !fsm->slave->sii.coe_details.enable_pdo_configuration)) {
EC_SLAVE_WARN(fsm->slave, "Slave does not support"
" changing the PDO mapping!\n");
EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_entry_print(fsm);
fsm->state = ec_fsm_pdo_entry_state_error;
return;
}
if (ec_sdo_request_alloc(&fsm->request, 4)) { if (ec_sdo_request_alloc(&fsm->request, 4)) {
fsm->state = ec_fsm_pdo_entry_state_error; fsm->state = ec_fsm_pdo_entry_state_error;
return; return;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment