equal
deleted
inserted
replaced
58 { |
58 { |
59 domain->master = master; |
59 domain->master = master; |
60 domain->index = index; |
60 domain->index = index; |
61 INIT_LIST_HEAD(&domain->fmmu_configs); |
61 INIT_LIST_HEAD(&domain->fmmu_configs); |
62 domain->data_size = 0; |
62 domain->data_size = 0; |
|
63 domain->tx_size = 0; |
63 domain->data = NULL; |
64 domain->data = NULL; |
64 domain->data_origin = EC_ORIG_INTERNAL; |
65 domain->data_origin = EC_ORIG_INTERNAL; |
65 domain->logical_base_address = 0x00000000; |
66 domain->logical_base_address = 0x00000000; |
66 INIT_LIST_HEAD(&domain->datagrams); |
67 INIT_LIST_HEAD(&domain->datagrams); |
67 domain->working_counter = 0x0000; |
68 domain->working_counter = 0x0000; |
111 ) |
112 ) |
112 { |
113 { |
113 fmmu->domain = domain; |
114 fmmu->domain = domain; |
114 |
115 |
115 domain->data_size += fmmu->data_size; |
116 domain->data_size += fmmu->data_size; |
|
117 domain->tx_size += fmmu->tx_size; |
116 list_add_tail(&fmmu->list, &domain->fmmu_configs); |
118 list_add_tail(&fmmu->list, &domain->fmmu_configs); |
117 |
119 |
118 EC_MASTER_DBG(domain->master, 1, "Domain %u:" |
120 EC_MASTER_DBG(domain->master, 1, "Domain %u:" |
119 " Added %u bytes, total %zu.\n", |
121 " Added %u bytes, total %zu.\n", |
120 domain->index, fmmu->data_size, domain->data_size); |
122 domain->index, fmmu->data_size, domain->data_size); |
177 domain->expected_working_counter += used[EC_DIR_INPUT]; |
179 domain->expected_working_counter += used[EC_DIR_INPUT]; |
178 } |
180 } |
179 |
181 |
180 ec_datagram_zero(datagram); |
182 ec_datagram_zero(datagram); |
181 list_add_tail(&datagram->list, &domain->datagrams); |
183 list_add_tail(&datagram->list, &domain->datagrams); |
|
184 datagram->domain = domain; |
182 return 0; |
185 return 0; |
183 } |
186 } |
184 |
187 |
185 /*****************************************************************************/ |
188 /*****************************************************************************/ |
186 |
189 |
236 } |
239 } |
237 |
240 |
238 list_for_each_entry(fmmu, &domain->fmmu_configs, list) { |
241 list_for_each_entry(fmmu, &domain->fmmu_configs, list) { |
239 // Correct logical FMMU address |
242 // Correct logical FMMU address |
240 fmmu->logical_start_address += base_address; |
243 fmmu->logical_start_address += base_address; |
|
244 fmmu->domain_address += base_address; |
241 |
245 |
242 // Increment Input/Output counter to determine datagram types |
246 // Increment Input/Output counter to determine datagram types |
243 // and calculate expected working counters |
247 // and calculate expected working counters |
244 if (fmmu->sc->used_for_fmmu_datagram[fmmu->dir] == 0) { |
248 if (fmmu->sc->used_for_fmmu_datagram[fmmu->dir] == 0) { |
245 ec_slave_config_t *sc = (ec_slave_config_t *)fmmu->sc; |
249 ec_slave_config_t *sc = (ec_slave_config_t *)fmmu->sc; |
247 sc->used_for_fmmu_datagram[fmmu->dir] = 1; |
251 sc->used_for_fmmu_datagram[fmmu->dir] = 1; |
248 } |
252 } |
249 |
253 |
250 // If the current FMMU's data do not fit in the current datagram, |
254 // If the current FMMU's data do not fit in the current datagram, |
251 // allocate a new one. |
255 // allocate a new one. |
252 if (datagram_size + fmmu->data_size > EC_MAX_DATA_SIZE) { |
256 if (datagram_size + fmmu->tx_size > EC_MAX_DATA_SIZE) { |
253 ret = ec_domain_add_datagram(domain, |
257 ret = ec_domain_add_datagram(domain, |
254 domain->logical_base_address + datagram_offset, |
258 domain->logical_base_address + datagram_offset, |
255 datagram_size, domain->data + datagram_offset, |
259 datagram_size, domain->data + datagram_offset, |
256 datagram_used); |
260 datagram_used); |
257 if (ret < 0) |
261 if (ret < 0) |
265 ec_slave_config_t *sc = (ec_slave_config_t *)fmmu_temp->sc; |
269 ec_slave_config_t *sc = (ec_slave_config_t *)fmmu_temp->sc; |
266 sc->used_for_fmmu_datagram[fmmu_temp->dir] = 0; |
270 sc->used_for_fmmu_datagram[fmmu_temp->dir] = 0; |
267 } |
271 } |
268 } |
272 } |
269 |
273 |
270 datagram_size += fmmu->data_size; |
274 datagram_size += fmmu->tx_size; |
271 } |
275 } |
272 |
276 |
273 // Allocate last datagram, if data are left (this is also the case if the |
277 // Allocate last datagram, if data are left (this is also the case if the |
274 // process data fit into a single datagram) |
278 // process data fit into a single datagram) |
275 if (datagram_size) { |
279 if (datagram_size) { |
375 void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem) |
379 void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem) |
376 { |
380 { |
377 EC_MASTER_DBG(domain->master, 1, "ecrt_domain_external_memory(" |
381 EC_MASTER_DBG(domain->master, 1, "ecrt_domain_external_memory(" |
378 "domain = 0x%p, mem = 0x%p)\n", domain, mem); |
382 "domain = 0x%p, mem = 0x%p)\n", domain, mem); |
379 |
383 |
380 down(&domain->master->master_sem); |
384 ec_mutex_lock(&domain->master->master_mutex); |
381 |
385 |
382 ec_domain_clear_data(domain); |
386 ec_domain_clear_data(domain); |
383 |
387 |
384 domain->data = mem; |
388 domain->data = mem; |
385 domain->data_origin = EC_ORIG_EXTERNAL; |
389 domain->data_origin = EC_ORIG_EXTERNAL; |
386 |
390 |
387 up(&domain->master->master_sem); |
391 ec_mutex_unlock(&domain->master->master_mutex); |
388 } |
392 } |
389 |
393 |
390 /*****************************************************************************/ |
394 /*****************************************************************************/ |
391 |
395 |
392 uint8_t *ecrt_domain_data(ec_domain_t *domain) |
396 uint8_t *ecrt_domain_data(ec_domain_t *domain) |