master/fsm_slave_config.c
changeset 834 0791aac03180
parent 830 d83d92e1a919
child 854 f4f53be425ac
equal deleted inserted replaced
833:5dca670ae4dd 834:0791aac03180
   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