master/master.c
changeset 95 0066de7a456d
parent 94 fa8e9f520589
child 98 f564d0929292
equal deleted inserted replaced
94:fa8e9f520589 95:0066de7a456d
    33 {
    33 {
    34     master->slaves = NULL;
    34     master->slaves = NULL;
    35     master->slave_count = 0;
    35     master->slave_count = 0;
    36     master->device_registered = 0;
    36     master->device_registered = 0;
    37     master->command_index = 0x00;
    37     master->command_index = 0x00;
    38     master->domain_count = 0;
       
    39     master->debug_level = 0;
    38     master->debug_level = 0;
    40     master->bus_time = 0;
    39     master->bus_time = 0;
    41     master->frames_lost = 0;
    40     master->frames_lost = 0;
    42     master->frames_delayed = 0;
    41     master->frames_delayed = 0;
    43     master->t_last_cyclic_output = 0;
    42     master->t_last_cyclic_output = 0;
       
    43 
       
    44     INIT_LIST_HEAD(&master->domains);
    44 }
    45 }
    45 
    46 
    46 /*****************************************************************************/
    47 /*****************************************************************************/
    47 
    48 
    48 /**
    49 /**
    69 
    70 
    70 void ec_master_reset(ec_master_t *master
    71 void ec_master_reset(ec_master_t *master
    71                      /**< Zeiger auf den zurückzusetzenden Master */
    72                      /**< Zeiger auf den zurückzusetzenden Master */
    72                      )
    73                      )
    73 {
    74 {
    74     unsigned int i;
    75     ec_domain_t *domain, *next;
    75 
    76 
    76     ec_master_clear_slaves(master);
    77     ec_master_clear_slaves(master);
    77 
    78 
    78     for (i = 0; i < master->domain_count; i++) {
    79     // Domain-Liste leeren
    79         ec_domain_clear(master->domains[i]);
    80     list_for_each_entry_safe(domain, next, &master->domains, list) {
    80         kfree(master->domains[i]);
    81         ec_domain_clear(domain);
    81     }
    82         kfree(domain);
    82     master->domain_count = 0;
    83     }
       
    84     INIT_LIST_HEAD(&master->domains);
    83 
    85 
    84     master->command_index = 0;
    86     master->command_index = 0;
    85     master->debug_level = 0;
    87     master->debug_level = 0;
    86     master->bus_time = 0;
    88     master->bus_time = 0;
    87     master->frames_lost = 0;
    89     master->frames_lost = 0;
   416                                                 /**< Timeout */
   418                                                 /**< Timeout */
   417                                                 )
   419                                                 )
   418 {
   420 {
   419     ec_domain_t *domain;
   421     ec_domain_t *domain;
   420 
   422 
   421     if (master->domain_count >= EC_MASTER_MAX_DOMAINS) {
       
   422         EC_ERR("Maximum number of domains reached!\n");
       
   423         return NULL;
       
   424     }
       
   425 
       
   426     if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
   423     if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
   427         EC_ERR("Error allocating domain memory!\n");
   424         EC_ERR("Error allocating domain memory!\n");
   428         return NULL;
   425         return NULL;
   429     }
   426     }
   430 
   427 
   431     ec_domain_init(domain, master, mode, timeout_us);
   428     ec_domain_init(domain, master, mode, timeout_us);
   432     master->domains[master->domain_count] = domain;
   429 
   433     master->domain_count++;
   430     list_add_tail(&domain->list, &master->domains);
   434 
   431 
   435     return domain;
   432     return domain;
   436 }
   433 }
   437 
   434 
   438 /*****************************************************************************/
   435 /*****************************************************************************/
   460     unsigned int frame_count;
   457     unsigned int frame_count;
   461     ec_domain_t *domain;
   458     ec_domain_t *domain;
   462 
   459 
   463     // Domains erstellen
   460     // Domains erstellen
   464     domain_offset = 0;
   461     domain_offset = 0;
   465     for (i = 0; i < master->domain_count; i++) {
   462     list_for_each_entry(domain, &master->domains, list) {
   466         domain = master->domains[i];
       
   467         if (ec_domain_alloc(domain, domain_offset)) {
   463         if (ec_domain_alloc(domain, domain_offset)) {
   468             EC_ERR("Failed to allocate domain %i!\n", i);
   464             EC_ERR("Failed to allocate domain %X!\n", (u32) domain);
   469             return -1;
   465             return -1;
   470         }
   466         }
   471         frame_count = domain->data_size / EC_MAX_FRAME_SIZE + 1;
   467         frame_count = domain->data_size / EC_MAX_FRAME_SIZE + 1;
   472         if (!domain->data_size) frame_count = 0;
   468         if (!domain->data_size) frame_count = 0;
   473         EC_INFO("Domain %i - Allocated %i bytes (%i Frame(s))\n", i,
   469         EC_INFO("Domain %X - Allocated %i bytes (%i Frame(s))\n",
   474                 domain->data_size, frame_count);
   470                 (u32) domain, domain->data_size, frame_count);
   475         domain_offset += domain->data_size;
   471         domain_offset += domain->data_size;
   476     }
   472     }
   477 
   473 
   478     // Slaves aktivieren
   474     // Slaves aktivieren
   479     for (i = 0; i < master->slave_count; i++)
   475     for (i = 0; i < master->slave_count; i++)