169 for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) { |
169 for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) { |
170 fsm->pdos = &fsm->slave->config->sync_configs[fsm->sync_index].pdos; |
170 fsm->pdos = &fsm->slave->config->sync_configs[fsm->sync_index].pdos; |
171 |
171 |
172 if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) { |
172 if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) { |
173 if (!list_empty(&fsm->pdos->list)) { |
173 if (!list_empty(&fsm->pdos->list)) { |
174 EC_ERR("Slave %u does not provide a configuration for sync " |
174 EC_WARN("Slave %u does not provide a configuration " |
175 "manager %u!\n", fsm->slave->ring_position, |
175 "for SM%u!\n", fsm->slave->ring_position, |
176 fsm->sync_index); |
176 fsm->sync_index); |
177 fsm->state = ec_fsm_pdo_assign_state_error; |
177 fsm->state = ec_fsm_pdo_assign_state_error; |
178 return; |
178 return; |
179 } |
179 } |
180 continue; |
180 continue; |
183 // check if assignment has to be altered |
183 // check if assignment has to be altered |
184 if (ec_pdo_list_equal(&fsm->sync->pdos, fsm->pdos)) |
184 if (ec_pdo_list_equal(&fsm->sync->pdos, fsm->pdos)) |
185 continue; |
185 continue; |
186 |
186 |
187 if (fsm->slave->master->debug_level) { |
187 if (fsm->slave->master->debug_level) { |
188 EC_DBG("Pdo assignment of SM%u differs in slave %u:\n", |
188 EC_DBG("Pdo assignment of SM%u differs:\n", fsm->sync_index); |
189 fsm->sync_index, fsm->slave->ring_position); |
|
190 EC_DBG("Currently assigned Pdos: "); |
189 EC_DBG("Currently assigned Pdos: "); |
191 ec_pdo_list_print(&fsm->sync->pdos); |
190 ec_pdo_list_print(&fsm->sync->pdos); |
192 printk("\n"); |
191 printk("\n"); |
193 EC_DBG("Pdos to assign: "); |
192 EC_DBG("Pdos to assign: "); |
194 ec_pdo_list_print(fsm->pdos); |
193 ec_pdo_list_print(fsm->pdos); |
197 |
196 |
198 // Pdo assignment has to be changed. Does the slave support this? |
197 // Pdo assignment has to be changed. Does the slave support this? |
199 if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE) |
198 if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE) |
200 || (fsm->slave->sii.has_general |
199 || (fsm->slave->sii.has_general |
201 && !fsm->slave->sii.coe_details.enable_pdo_assign)) { |
200 && !fsm->slave->sii.coe_details.enable_pdo_assign)) { |
202 EC_ERR("Slave %u does not support assigning Pdos!\n", |
201 EC_WARN("Slave %u does not support assigning Pdos!\n", |
203 fsm->slave->ring_position); |
202 fsm->slave->ring_position); |
204 fsm->state = ec_fsm_pdo_assign_state_error; |
203 fsm->state = ec_fsm_pdo_assign_state_error; |
205 return; |
204 return; |
206 } |
205 } |
207 |
206 |
208 fsm->num_configured_syncs++; |
207 fsm->num_configured_syncs++; |
209 |
|
210 if (fsm->slave->master->debug_level) { |
|
211 EC_DBG("Changing Pdo assignment for SM%u of slave %u.\n", |
|
212 fsm->sync_index, fsm->slave->ring_position); |
|
213 } |
|
214 |
208 |
215 if (ec_sdo_request_alloc(&fsm->request, 2)) { |
209 if (ec_sdo_request_alloc(&fsm->request, 2)) { |
216 fsm->state = ec_fsm_pdo_assign_state_error; |
210 fsm->state = ec_fsm_pdo_assign_state_error; |
217 return; |
211 return; |
218 } |
212 } |
220 // set mapped Pdo count to zero |
214 // set mapped Pdo count to zero |
221 EC_WRITE_U8(fsm->request.data, 0); // zero Pdos mapped |
215 EC_WRITE_U8(fsm->request.data, 0); // zero Pdos mapped |
222 fsm->request.data_size = 1; |
216 fsm->request.data_size = 1; |
223 ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0); |
217 ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0); |
224 ecrt_sdo_request_write(&fsm->request); |
218 ecrt_sdo_request_write(&fsm->request); |
|
219 |
225 if (fsm->slave->master->debug_level) |
220 if (fsm->slave->master->debug_level) |
226 EC_DBG("Setting Pdo count to zero for SM%u.\n", fsm->sync_index); |
221 EC_DBG("Setting Pdo count to zero.\n"); |
227 |
222 |
228 fsm->state = ec_fsm_pdo_assign_state_zero_count; |
223 fsm->state = ec_fsm_pdo_assign_state_zero_count; |
229 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); |
224 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request); |
230 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
225 ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately |
231 return; |
226 return; |
232 } |
227 } |
233 |
228 |
234 if (fsm->slave->master->debug_level && !fsm->num_configured_syncs) |
229 if (fsm->slave->master->debug_level && !fsm->num_configured_syncs) |
235 EC_DBG("Pdo assignments of slave %u are already configured" |
230 EC_DBG("Pdo assignments are already configured correctly.\n"); |
236 " correctly.\n", fsm->slave->ring_position); |
|
237 fsm->state = ec_fsm_pdo_assign_state_end; |
231 fsm->state = ec_fsm_pdo_assign_state_end; |
238 } |
232 } |
239 |
233 |
240 /*****************************************************************************/ |
234 /*****************************************************************************/ |
241 |
235 |
263 EC_WRITE_U16(fsm->request.data, fsm->pdo->index); |
257 EC_WRITE_U16(fsm->request.data, fsm->pdo->index); |
264 fsm->request.data_size = 2; |
258 fsm->request.data_size = 2; |
265 ec_sdo_request_address(&fsm->request, |
259 ec_sdo_request_address(&fsm->request, |
266 0x1C10 + fsm->sync_index, fsm->pdo_count); |
260 0x1C10 + fsm->sync_index, fsm->pdo_count); |
267 ecrt_sdo_request_write(&fsm->request); |
261 ecrt_sdo_request_write(&fsm->request); |
|
262 |
268 if (fsm->slave->master->debug_level) |
263 if (fsm->slave->master->debug_level) |
269 EC_DBG("Assigning Pdo 0x%04X at position %u.\n", |
264 EC_DBG("Assigning Pdo 0x%04X at position %u.\n", |
270 fsm->pdo->index, fsm->pdo_count); |
265 fsm->pdo->index, fsm->pdo_count); |
271 |
266 |
272 fsm->state = ec_fsm_pdo_assign_state_add_pdo; |
267 fsm->state = ec_fsm_pdo_assign_state_add_pdo; |
283 ) |
278 ) |
284 { |
279 { |
285 if (ec_fsm_coe_exec(fsm->fsm_coe)) return; |
280 if (ec_fsm_coe_exec(fsm->fsm_coe)) return; |
286 |
281 |
287 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
282 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
288 EC_ERR("Failed to clear Pdo assignment of slave %u.\n", |
283 EC_WARN("Failed to clear Pdo assignment of SM%u.\n", fsm->sync_index); |
289 fsm->slave->ring_position); |
|
290 fsm->state = ec_fsm_pdo_assign_state_error; |
284 fsm->state = ec_fsm_pdo_assign_state_error; |
291 return; |
285 return; |
292 } |
286 } |
293 |
287 |
294 // assign all Pdos belonging to the current sync manager |
288 // assign all Pdos belonging to the current sync manager |
295 |
289 |
296 // find first Pdo |
290 // find first Pdo |
297 if (!(fsm->pdo = ec_fsm_pdo_assign_next_pdo(fsm, &fsm->pdos->list))) { |
291 if (!(fsm->pdo = ec_fsm_pdo_assign_next_pdo(fsm, &fsm->pdos->list))) { |
298 if (fsm->slave->master->debug_level) |
292 if (fsm->slave->master->debug_level) |
299 EC_DBG("No Pdos to assign for SM%u of slave %u.\n", |
293 EC_DBG("No Pdos to assign.\n"); |
300 fsm->sync_index, fsm->slave->ring_position); |
|
301 ec_fsm_pdo_assign_next_sync(fsm); |
294 ec_fsm_pdo_assign_next_sync(fsm); |
302 return; |
295 return; |
303 } |
296 } |
304 |
297 |
305 // assign first Pdo |
298 // assign first Pdo |
316 ) |
309 ) |
317 { |
310 { |
318 if (ec_fsm_coe_exec(fsm->fsm_coe)) return; |
311 if (ec_fsm_coe_exec(fsm->fsm_coe)) return; |
319 |
312 |
320 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
313 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
321 EC_ERR("Failed to map Pdo 0x%04X for SM%u of slave %u.\n", |
314 EC_WARN("Failed to assign Pdo 0x%04X to position %u in SM%u.\n", |
322 fsm->pdo->index, fsm->sync_index, fsm->slave->ring_position); |
315 fsm->pdo->index, fsm->pdo_count, fsm->sync_index); |
323 fsm->state = ec_fsm_pdo_assign_state_error; |
316 fsm->state = ec_fsm_pdo_assign_state_error; |
324 return; |
317 return; |
325 } |
318 } |
326 |
319 |
327 // find next Pdo |
320 // find next Pdo |
329 // no more Pdos to map. write Pdo count |
322 // no more Pdos to map. write Pdo count |
330 EC_WRITE_U8(fsm->request.data, fsm->pdo_count); |
323 EC_WRITE_U8(fsm->request.data, fsm->pdo_count); |
331 fsm->request.data_size = 1; |
324 fsm->request.data_size = 1; |
332 ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0); |
325 ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0); |
333 ecrt_sdo_request_write(&fsm->request); |
326 ecrt_sdo_request_write(&fsm->request); |
|
327 |
334 if (fsm->slave->master->debug_level) |
328 if (fsm->slave->master->debug_level) |
335 EC_DBG("Setting number of assigned Pdos to %u.\n", |
329 EC_DBG("Setting number of assigned Pdos to %u.\n", |
336 fsm->pdo_count); |
330 fsm->pdo_count); |
337 |
331 |
338 fsm->state = ec_fsm_pdo_assign_state_pdo_count; |
332 fsm->state = ec_fsm_pdo_assign_state_pdo_count; |
355 ) |
349 ) |
356 { |
350 { |
357 if (ec_fsm_coe_exec(fsm->fsm_coe)) return; |
351 if (ec_fsm_coe_exec(fsm->fsm_coe)) return; |
358 |
352 |
359 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
353 if (!ec_fsm_coe_success(fsm->fsm_coe)) { |
360 EC_ERR("Failed to set number of assigned Pdos for slave %u.\n", |
354 EC_WARN("Failed to set number of assigned Pdos for SM%u.\n", |
361 fsm->slave->ring_position); |
355 fsm->sync_index); |
362 fsm->state = ec_fsm_pdo_assign_state_error; |
356 fsm->state = ec_fsm_pdo_assign_state_error; |
363 return; |
357 return; |
364 } |
358 } |
365 |
359 |
366 if (fsm->slave->master->debug_level) |
360 if (fsm->slave->master->debug_level) |
367 EC_DBG("Successfully configured Pdo assignment for SM%u of" |
361 EC_DBG("Pdo assignment successful for SM%u.\n", fsm->sync_index); |
368 " slave %u.\n", fsm->sync_index, fsm->slave->ring_position); |
|
369 |
362 |
370 // assignment for this sync manager finished |
363 // assignment for this sync manager finished |
371 ec_fsm_pdo_assign_next_sync(fsm); |
364 ec_fsm_pdo_assign_next_sync(fsm); |
372 } |
365 } |
373 |
366 |