master/fsm_slave.c
changeset 815 002fe9ec778f
parent 814 a51f857b1b2d
child 822 21c86d97c587
equal deleted inserted replaced
814:a51f857b1b2d 815:002fe9ec778f
   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))) {