diff -r 55a6e3294dab -r 656f114153c2 lib/master.c --- a/lib/master.c Sun Jun 06 23:21:09 2010 +0200 +++ b/lib/master.c Thu Sep 16 08:35:21 2010 +0200 @@ -53,6 +53,51 @@ /*****************************************************************************/ +void ec_master_clear(ec_master_t *master) +{ + ec_domain_t *d, *next_d; + ec_slave_config_t *c, *next_c; + + if (master->process_data) { + munmap(master->process_data, master->process_data_size); + } + + d = master->first_domain; + while (d) { + next_d = d->next; + ec_domain_clear(d); + d = next_d; + } + + c = master->first_config; + while (c) { + next_c = c->next; + ec_slave_config_clear(c); + c = next_c; + } + + if (master->fd != -1) { + close(master->fd); + } +} + +/*****************************************************************************/ + +void ec_master_add_domain(ec_master_t *master, ec_domain_t *domain) +{ + if (master->first_domain) { + ec_domain_t *d = master->first_domain; + while (d->next) { + d = d->next; + } + d->next = domain; + } else { + master->first_domain = domain; + } +} + +/*****************************************************************************/ + ec_domain_t *ecrt_master_create_domain(ec_master_t *master) { ec_domain_t *domain; @@ -71,14 +116,33 @@ return 0; } + domain->next = NULL; domain->index = (unsigned int) index; domain->master = master; domain->process_data = NULL; + + ec_master_add_domain(master, domain); + return domain; } /*****************************************************************************/ +void ec_master_add_slave_config(ec_master_t *master, ec_slave_config_t *sc) +{ + if (master->first_config) { + ec_slave_config_t *c = master->first_config; + while (c->next) { + c = c->next; + } + c->next = sc; + } else { + master->first_config = sc; + } +} + +/*****************************************************************************/ + ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master, uint16_t alias, uint16_t position, uint32_t vendor_id, uint32_t product_code) @@ -105,10 +169,16 @@ return 0; } + sc->next = NULL; sc->master = master; sc->index = data.config_index; sc->alias = alias; sc->position = position; + sc->first_sdo_request = NULL; + sc->first_voe_handler = NULL; + + ec_master_add_slave_config(master, sc); + return sc; }