281 slave->ring_position); |
281 slave->ring_position); |
282 } |
282 } |
283 return; |
283 return; |
284 } |
284 } |
285 |
285 |
286 if (!slave->sii_mailbox_protocols) { |
286 if (!slave->sii.mailbox_protocols) { |
287 // no mailbox protocols supported |
287 // no mailbox protocols supported |
288 if (master->debug_level) |
288 if (master->debug_level) |
289 EC_DBG("Slave %u does not support mailbox communication.\n", |
289 EC_DBG("Slave %u does not support mailbox communication.\n", |
290 slave->ring_position); |
290 slave->ring_position); |
291 ec_fsm_slave_config_enter_preop(fsm); |
291 ec_fsm_slave_config_enter_preop(fsm); |
295 if (master->debug_level) { |
295 if (master->debug_level) { |
296 EC_DBG("Configuring mailbox sync managers of slave %i.\n", |
296 EC_DBG("Configuring mailbox sync managers of slave %i.\n", |
297 slave->ring_position); |
297 slave->ring_position); |
298 } |
298 } |
299 |
299 |
300 if (slave->sii_sync_count >= 2) { // mailbox configuration provided |
300 if (slave->sii.sync_count >= 2) { // mailbox configuration provided |
301 ec_datagram_fpwr(datagram, slave->station_address, 0x0800, |
301 ec_datagram_fpwr(datagram, slave->station_address, 0x0800, |
302 EC_SYNC_PAGE_SIZE * slave->sii_sync_count); |
302 EC_SYNC_PAGE_SIZE * slave->sii.sync_count); |
303 memset(datagram->data, 0x00, |
303 memset(datagram->data, 0x00, |
304 EC_SYNC_PAGE_SIZE * slave->sii_sync_count); |
304 EC_SYNC_PAGE_SIZE * slave->sii.sync_count); |
305 |
305 |
306 for (i = 0; i < 2; i++) { |
306 for (i = 0; i < 2; i++) { |
307 ec_sync_config(&slave->sii_syncs[i], slave->sii_syncs[i].length, |
307 ec_sync_config(&slave->sii.syncs[i], slave->sii.syncs[i].length, |
308 datagram->data + EC_SYNC_PAGE_SIZE * i); |
308 datagram->data + EC_SYNC_PAGE_SIZE * i); |
309 } |
309 } |
310 } else { // no mailbox sync manager configurations provided |
310 } else { // no mailbox sync manager configurations provided |
311 ec_sync_t sync; |
311 ec_sync_t sync; |
312 |
312 |
318 ec_datagram_fpwr(datagram, slave->station_address, 0x0800, |
318 ec_datagram_fpwr(datagram, slave->station_address, 0x0800, |
319 EC_SYNC_PAGE_SIZE * 2); |
319 EC_SYNC_PAGE_SIZE * 2); |
320 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * 2); |
320 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * 2); |
321 |
321 |
322 ec_sync_init(&sync, slave, 0); |
322 ec_sync_init(&sync, slave, 0); |
323 sync.physical_start_address = slave->sii_rx_mailbox_offset; |
323 sync.physical_start_address = slave->sii.rx_mailbox_offset; |
324 sync.control_register = 0x26; |
324 sync.control_register = 0x26; |
325 sync.enable = 1; |
325 sync.enable = 1; |
326 ec_sync_config(&sync, slave->sii_rx_mailbox_size, |
326 ec_sync_config(&sync, slave->sii.rx_mailbox_size, |
327 datagram->data + EC_SYNC_PAGE_SIZE * sync.index); |
327 datagram->data + EC_SYNC_PAGE_SIZE * sync.index); |
328 |
328 |
329 ec_sync_init(&sync, slave, 1); |
329 ec_sync_init(&sync, slave, 1); |
330 sync.physical_start_address = slave->sii_tx_mailbox_offset; |
330 sync.physical_start_address = slave->sii.tx_mailbox_offset; |
331 sync.control_register = 0x22; |
331 sync.control_register = 0x22; |
332 sync.enable = 1; |
332 sync.enable = 1; |
333 ec_sync_config(&sync, slave->sii_tx_mailbox_size, |
333 ec_sync_config(&sync, slave->sii.tx_mailbox_size, |
334 datagram->data + EC_SYNC_PAGE_SIZE * sync.index); |
334 datagram->data + EC_SYNC_PAGE_SIZE * sync.index); |
335 } |
335 } |
336 |
336 |
337 fsm->retries = EC_FSM_RETRIES; |
337 fsm->retries = EC_FSM_RETRIES; |
338 fsm->state = ec_fsm_slave_config_state_mbox_sync; |
338 fsm->state = ec_fsm_slave_config_state_mbox_sync; |
567 unsigned int i, offset, num_syncs; |
567 unsigned int i, offset, num_syncs; |
568 const ec_sync_t *sync; |
568 const ec_sync_t *sync; |
569 ec_direction_t dir; |
569 ec_direction_t dir; |
570 uint16_t size; |
570 uint16_t size; |
571 |
571 |
572 if (!slave->sii_sync_count) { |
572 if (!slave->sii.sync_count) { |
573 ec_fsm_slave_config_enter_fmmu(fsm); |
573 ec_fsm_slave_config_enter_fmmu(fsm); |
574 return; |
574 return; |
575 } |
575 } |
576 |
576 |
577 if (slave->sii_mailbox_protocols) { |
577 if (slave->sii.mailbox_protocols) { |
578 offset = 2; // slave has mailboxes |
578 offset = 2; // slave has mailboxes |
579 } else { |
579 } else { |
580 offset = 0; |
580 offset = 0; |
581 } |
581 } |
582 num_syncs = slave->sii_sync_count - offset; |
582 num_syncs = slave->sii.sync_count - offset; |
583 |
583 |
584 // configure sync managers for process data |
584 // configure sync managers for process data |
585 ec_datagram_fpwr(datagram, slave->station_address, |
585 ec_datagram_fpwr(datagram, slave->station_address, |
586 0x0800 + EC_SYNC_PAGE_SIZE * offset, |
586 0x0800 + EC_SYNC_PAGE_SIZE * offset, |
587 EC_SYNC_PAGE_SIZE * num_syncs); |
587 EC_SYNC_PAGE_SIZE * num_syncs); |
588 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * num_syncs); |
588 memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * num_syncs); |
589 |
589 |
590 for (i = 0; i < num_syncs; i++) { |
590 for (i = 0; i < num_syncs; i++) { |
591 sync = &slave->sii_syncs[i + offset]; |
591 sync = &slave->sii.syncs[i + offset]; |
592 dir = ec_sync_direction(sync); |
592 dir = ec_sync_direction(sync); |
593 size = ec_pdo_mapping_total_size(&slave->config->mapping[dir]); |
593 size = ec_pdo_mapping_total_size(&slave->config->mapping[dir]); |
594 ec_sync_config(sync, size, datagram->data + EC_SYNC_PAGE_SIZE * i); |
594 ec_sync_config(sync, size, datagram->data + EC_SYNC_PAGE_SIZE * i); |
595 } |
595 } |
596 |
596 |