equal
deleted
inserted
replaced
230 ec_datagram_print_wc_error(datagram); |
230 ec_datagram_print_wc_error(datagram); |
231 return; |
231 return; |
232 } |
232 } |
233 |
233 |
234 // Read AL state |
234 // Read AL state |
235 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0130, 2); |
235 ec_datagram_fprd(datagram, fsm->slave->station_address, 0x0130, 2); |
236 fsm->retries = EC_FSM_RETRIES; |
236 fsm->retries = EC_FSM_RETRIES; |
237 fsm->state = ec_fsm_slave_scan_state_state; |
237 fsm->state = ec_fsm_slave_scan_state_state; |
238 } |
238 } |
239 |
239 |
240 /*****************************************************************************/ |
240 /*****************************************************************************/ |
277 EC_WARN("Slave %i has state error bit set (%s)!\n", |
277 EC_WARN("Slave %i has state error bit set (%s)!\n", |
278 slave->ring_position, state_str); |
278 slave->ring_position, state_str); |
279 } |
279 } |
280 |
280 |
281 // read base data |
281 // read base data |
282 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6); |
282 ec_datagram_fprd(datagram, fsm->slave->station_address, 0x0000, 6); |
283 fsm->retries = EC_FSM_RETRIES; |
283 fsm->retries = EC_FSM_RETRIES; |
284 fsm->state = ec_fsm_slave_scan_state_base; |
284 fsm->state = ec_fsm_slave_scan_state_base; |
285 } |
285 } |
286 |
286 |
287 /*****************************************************************************/ |
287 /*****************************************************************************/ |
322 |
322 |
323 if (slave->base_fmmu_count > EC_MAX_FMMUS) |
323 if (slave->base_fmmu_count > EC_MAX_FMMUS) |
324 slave->base_fmmu_count = EC_MAX_FMMUS; |
324 slave->base_fmmu_count = EC_MAX_FMMUS; |
325 |
325 |
326 // read data link status |
326 // read data link status |
327 ec_datagram_nprd(datagram, slave->station_address, 0x0110, 2); |
327 ec_datagram_fprd(datagram, slave->station_address, 0x0110, 2); |
328 fsm->retries = EC_FSM_RETRIES; |
328 fsm->retries = EC_FSM_RETRIES; |
329 fsm->state = ec_fsm_slave_scan_state_datalink; |
329 fsm->state = ec_fsm_slave_scan_state_datalink; |
330 } |
330 } |
331 |
331 |
332 /*****************************************************************************/ |
332 /*****************************************************************************/ |
370 } |
370 } |
371 |
371 |
372 // Start fetching EEPROM size |
372 // Start fetching EEPROM size |
373 |
373 |
374 fsm->sii_offset = EC_FIRST_EEPROM_CATEGORY_OFFSET; // first category header |
374 fsm->sii_offset = EC_FIRST_EEPROM_CATEGORY_OFFSET; // first category header |
375 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE); |
375 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
|
376 EC_FSM_SII_USE_CONFIGURED_ADDRESS); |
376 fsm->state = ec_fsm_slave_scan_state_eeprom_size; |
377 fsm->state = ec_fsm_slave_scan_state_eeprom_size; |
377 fsm->state(fsm); // execute state immediately |
378 fsm->state(fsm); // execute state immediately |
378 } |
379 } |
379 |
380 |
380 /*****************************************************************************/ |
381 /*****************************************************************************/ |
411 slave->eeprom_size = EC_FIRST_EEPROM_CATEGORY_OFFSET * 2; |
412 slave->eeprom_size = EC_FIRST_EEPROM_CATEGORY_OFFSET * 2; |
412 goto alloc_eeprom; |
413 goto alloc_eeprom; |
413 } |
414 } |
414 fsm->sii_offset = next_offset; |
415 fsm->sii_offset = next_offset; |
415 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
416 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
416 EC_FSM_SII_NODE); |
417 EC_FSM_SII_USE_CONFIGURED_ADDRESS); |
417 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
418 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
418 return; |
419 return; |
419 } |
420 } |
420 |
421 |
421 slave->eeprom_size = (fsm->sii_offset + 1) * 2; |
422 slave->eeprom_size = (fsm->sii_offset + 1) * 2; |
439 |
440 |
440 // Start fetching EEPROM contents |
441 // Start fetching EEPROM contents |
441 |
442 |
442 fsm->state = ec_fsm_slave_scan_state_eeprom_data; |
443 fsm->state = ec_fsm_slave_scan_state_eeprom_data; |
443 fsm->sii_offset = 0x0000; |
444 fsm->sii_offset = 0x0000; |
444 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE); |
445 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
|
446 EC_FSM_SII_USE_CONFIGURED_ADDRESS); |
445 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
447 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
446 } |
448 } |
447 |
449 |
448 /*****************************************************************************/ |
450 /*****************************************************************************/ |
449 |
451 |
479 |
481 |
480 if (fsm->sii_offset + 2 < eeprom_word_size) { |
482 if (fsm->sii_offset + 2 < eeprom_word_size) { |
481 // fetch the next 2 words |
483 // fetch the next 2 words |
482 fsm->sii_offset += 2; |
484 fsm->sii_offset += 2; |
483 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
485 ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, |
484 EC_FSM_SII_NODE); |
486 EC_FSM_SII_USE_CONFIGURED_ADDRESS); |
485 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
487 ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately |
486 return; |
488 return; |
487 } |
489 } |
488 |
490 |
489 // Evaluate EEPROM contents |
491 // Evaluate EEPROM contents |
658 if (master->debug_level) |
660 if (master->debug_level) |
659 EC_DBG("Clearing FMMU configurations of slave %i...\n", |
661 EC_DBG("Clearing FMMU configurations of slave %i...\n", |
660 slave->ring_position); |
662 slave->ring_position); |
661 |
663 |
662 // clear FMMU configurations |
664 // clear FMMU configurations |
663 ec_datagram_npwr(datagram, slave->station_address, |
665 ec_datagram_fpwr(datagram, slave->station_address, |
664 0x0600, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
666 0x0600, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
665 memset(datagram->data, 0x00, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
667 memset(datagram->data, 0x00, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
666 fsm->retries = EC_FSM_RETRIES; |
668 fsm->retries = EC_FSM_RETRIES; |
667 fsm->state = ec_fsm_slave_conf_state_clear_fmmus; |
669 fsm->state = ec_fsm_slave_conf_state_clear_fmmus; |
668 } |
670 } |
738 EC_DBG("Configuring mailbox sync managers of slave %i.\n", |
740 EC_DBG("Configuring mailbox sync managers of slave %i.\n", |
739 slave->ring_position); |
741 slave->ring_position); |
740 } |
742 } |
741 |
743 |
742 if (slave->sii_sync_count >= 2) { // mailbox configuration provided |
744 if (slave->sii_sync_count >= 2) { // mailbox configuration provided |
743 ec_datagram_npwr(datagram, slave->station_address, 0x0800, |
745 ec_datagram_fpwr(datagram, slave->station_address, 0x0800, |
744 EC_SYNC_PAGE_SIZE * slave->sii_sync_count); |
746 EC_SYNC_PAGE_SIZE * slave->sii_sync_count); |
745 memset(datagram->data, 0x00, |
747 memset(datagram->data, 0x00, |
746 EC_SYNC_PAGE_SIZE * slave->sii_sync_count); |
748 EC_SYNC_PAGE_SIZE * slave->sii_sync_count); |
747 |
749 |
748 for (i = 0; i < 2; i++) { |
750 for (i = 0; i < 2; i++) { |
755 if (master->debug_level) |
757 if (master->debug_level) |
756 EC_DBG("Slave %u does not provide" |
758 EC_DBG("Slave %u does not provide" |
757 " mailbox sync manager configurations.\n", |
759 " mailbox sync manager configurations.\n", |
758 slave->ring_position); |
760 slave->ring_position); |
759 |
761 |
760 ec_datagram_npwr(datagram, slave->station_address, 0x0800, |
762 ec_datagram_fpwr(datagram, slave->station_address, 0x0800, |
761 EC_SYNC_PAGE_SIZE * 2); |
763 EC_SYNC_PAGE_SIZE * 2); |
762 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * 2); |
764 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * 2); |
763 |
765 |
764 ec_sync_init(&sync, slave, 0); |
766 ec_sync_init(&sync, slave, 0); |
765 sync.physical_start_address = slave->sii_rx_mailbox_offset; |
767 sync.physical_start_address = slave->sii_rx_mailbox_offset; |
1022 offset = 0; |
1024 offset = 0; |
1023 } |
1025 } |
1024 num_syncs = slave->sii_sync_count - offset; |
1026 num_syncs = slave->sii_sync_count - offset; |
1025 |
1027 |
1026 // configure sync managers for process data |
1028 // configure sync managers for process data |
1027 ec_datagram_npwr(datagram, slave->station_address, |
1029 ec_datagram_fpwr(datagram, slave->station_address, |
1028 0x0800 + EC_SYNC_PAGE_SIZE * offset, |
1030 0x0800 + EC_SYNC_PAGE_SIZE * offset, |
1029 EC_SYNC_PAGE_SIZE * num_syncs); |
1031 EC_SYNC_PAGE_SIZE * num_syncs); |
1030 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * num_syncs); |
1032 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * num_syncs); |
1031 |
1033 |
1032 for (i = 0; i < num_syncs; i++) { |
1034 for (i = 0; i < num_syncs; i++) { |
1092 ec_fsm_slave_conf_enter_safeop(fsm); |
1094 ec_fsm_slave_conf_enter_safeop(fsm); |
1093 return; |
1095 return; |
1094 } |
1096 } |
1095 |
1097 |
1096 // configure FMMUs |
1098 // configure FMMUs |
1097 ec_datagram_npwr(datagram, slave->station_address, |
1099 ec_datagram_fpwr(datagram, slave->station_address, |
1098 0x0600, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
1100 0x0600, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
1099 memset(datagram->data, 0x00, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
1101 memset(datagram->data, 0x00, EC_FMMU_PAGE_SIZE * slave->base_fmmu_count); |
1100 for (i = 0; i < slave->config->used_fmmus; i++) { |
1102 for (i = 0; i < slave->config->used_fmmus; i++) { |
1101 fmmu = &slave->config->fmmu_configs[i]; |
1103 fmmu = &slave->config->fmmu_configs[i]; |
1102 if (!(sync = ec_slave_get_pdo_sync(slave, fmmu->dir))) { |
1104 if (!(sync = ec_slave_get_pdo_sync(slave, fmmu->dir))) { |