master/slave_config.c
changeset 1981 c14b6bb14fdf
parent 1873 219be3742274
child 1989 6aa393418fb3
equal deleted inserted replaced
1980:a89e2bedf004 1981:c14b6bb14fdf
    68     sc->position = position;
    68     sc->position = position;
    69     sc->vendor_id = vendor_id;
    69     sc->vendor_id = vendor_id;
    70     sc->product_code = product_code;
    70     sc->product_code = product_code;
    71     sc->watchdog_divider = 0; // use default
    71     sc->watchdog_divider = 0; // use default
    72     sc->watchdog_intervals = 0; // use default
    72     sc->watchdog_intervals = 0; // use default
    73 
    73     sc->allow_overlapping_pdos = 0; // default not allowed
    74     sc->slave = NULL;
    74     sc->slave = NULL;
    75 
    75 
    76     for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++)
    76     for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++)
    77         ec_sync_config_init(&sc->sync_configs[i]);
    77         ec_sync_config_init(&sc->sync_configs[i]);
    78 
    78 
   162         ec_direction_t dir /**< PDO direction. */
   162         ec_direction_t dir /**< PDO direction. */
   163         )
   163         )
   164 {
   164 {
   165     unsigned int i;
   165     unsigned int i;
   166     ec_fmmu_config_t *fmmu;
   166     ec_fmmu_config_t *fmmu;
       
   167     ec_fmmu_config_t *prev_fmmu;
       
   168     uint32_t fmmu_logical_start_address;
       
   169     size_t tx_size;
   167 
   170 
   168     // FMMU configuration already prepared?
   171     // FMMU configuration already prepared?
   169     for (i = 0; i < sc->used_fmmus; i++) {
   172     for (i = 0; i < sc->used_fmmus; i++) {
   170         fmmu = &sc->fmmu_configs[i];
   173         fmmu = &sc->fmmu_configs[i];
   171         if (fmmu->domain == domain && fmmu->sync_index == sync_index)
   174         if (fmmu->domain == domain && fmmu->sync_index == sync_index)
   172             return fmmu->logical_start_address;
   175             return fmmu->domain_address;
   173     }
   176     }
   174 
   177 
   175     if (sc->used_fmmus == EC_MAX_FMMUS) {
   178     if (sc->used_fmmus == EC_MAX_FMMUS) {
   176         EC_ERR("FMMU limit reached for slave configuration %u:%u!\n",
   179         EC_ERR("FMMU limit reached for slave configuration %u:%u!\n",
   177                 sc->alias, sc->position);
   180                 sc->alias, sc->position);
   178         return -EOVERFLOW;
   181         return -EOVERFLOW;
   179     }
   182     }
   180 
   183 
   181     fmmu = &sc->fmmu_configs[sc->used_fmmus++];
   184     fmmu = &sc->fmmu_configs[sc->used_fmmus];
   182 
   185 
   183     down(&sc->master->master_sem);
   186     down(&sc->master->master_sem);
   184     ec_fmmu_config_init(fmmu, sc, domain, sync_index, dir);
   187     ec_fmmu_config_init(fmmu, sc, sync_index, dir);
       
   188     fmmu_logical_start_address = domain->tx_size;
       
   189     tx_size = fmmu->data_size;
       
   190     if (sc->allow_overlapping_pdos && sc->used_fmmus > 0) {
       
   191         prev_fmmu = &sc->fmmu_configs[sc->used_fmmus-1];
       
   192         if (fmmu->dir != prev_fmmu->dir) {
       
   193             prev_fmmu->tx_size = max(fmmu->data_size,prev_fmmu->data_size);
       
   194             tx_size = 0;
       
   195             fmmu_logical_start_address = prev_fmmu->logical_start_address;
       
   196         }
       
   197     }
       
   198     ec_fmmu_config_domain(fmmu,domain,fmmu_logical_start_address,tx_size);
   185     up(&sc->master->master_sem);
   199     up(&sc->master->master_sem);
   186 
   200 
   187     return fmmu->logical_start_address;
   201     ++sc->used_fmmus;
       
   202     return fmmu->domain_address;
   188 }
   203 }
   189 
   204 
   190 /*****************************************************************************/
   205 /*****************************************************************************/
   191 
   206 
   192 /** Attaches the configuration to the addressed slave object.
   207 /** Attaches the configuration to the addressed slave object.
   459         EC_DBG("%s(sc = 0x%p, divider = %u, intervals = %u)\n",
   474         EC_DBG("%s(sc = 0x%p, divider = %u, intervals = %u)\n",
   460                 __func__, sc, divider, intervals);
   475                 __func__, sc, divider, intervals);
   461 
   476 
   462     sc->watchdog_divider = divider;
   477     sc->watchdog_divider = divider;
   463     sc->watchdog_intervals = intervals;
   478     sc->watchdog_intervals = intervals;
       
   479 }
       
   480 
       
   481 /*****************************************************************************/
       
   482 
       
   483 void ecrt_slave_config_overlapping_pdos(ec_slave_config_t *sc,
       
   484         uint8_t allow_overlapping_pdos )
       
   485 {
       
   486     if (sc->master->debug_level)
       
   487         EC_DBG("%s(sc = 0x%p, allow_overlapping_pdos = %u)\n",
       
   488                 __func__, sc, allow_overlapping_pdos);
       
   489 
       
   490     sc->allow_overlapping_pdos = allow_overlapping_pdos;
   464 }
   491 }
   465 
   492 
   466 /*****************************************************************************/
   493 /*****************************************************************************/
   467 
   494 
   468 int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc,
   495 int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc,
  1003 
  1030 
  1004 /** \cond */
  1031 /** \cond */
  1005 
  1032 
  1006 EXPORT_SYMBOL(ecrt_slave_config_sync_manager);
  1033 EXPORT_SYMBOL(ecrt_slave_config_sync_manager);
  1007 EXPORT_SYMBOL(ecrt_slave_config_watchdog);
  1034 EXPORT_SYMBOL(ecrt_slave_config_watchdog);
       
  1035 EXPORT_SYMBOL(ecrt_slave_config_overlapping_pdos);
  1008 EXPORT_SYMBOL(ecrt_slave_config_pdo_assign_add);
  1036 EXPORT_SYMBOL(ecrt_slave_config_pdo_assign_add);
  1009 EXPORT_SYMBOL(ecrt_slave_config_pdo_assign_clear);
  1037 EXPORT_SYMBOL(ecrt_slave_config_pdo_assign_clear);
  1010 EXPORT_SYMBOL(ecrt_slave_config_pdo_mapping_add);
  1038 EXPORT_SYMBOL(ecrt_slave_config_pdo_mapping_add);
  1011 EXPORT_SYMBOL(ecrt_slave_config_pdo_mapping_clear);
  1039 EXPORT_SYMBOL(ecrt_slave_config_pdo_mapping_clear);
  1012 EXPORT_SYMBOL(ecrt_slave_config_pdos);
  1040 EXPORT_SYMBOL(ecrt_slave_config_pdos);