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); |