master/domain.c
changeset 2068 3001f6523e63
parent 2028 55854f070c4a
child 2101 01b30593e942
equal deleted inserted replaced
2067:19732da2cf86 2068:3001f6523e63
    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)