From 4d44a473fd1018fbaee6d00421926d1af07721c3 Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Tue, 28 Feb 2006 13:07:05 +0000 Subject: [PATCH] Domains als Liste verwaltet. --- master/domain.h | 1 + master/globals.h | 3 --- master/master.c | 32 ++++++++++++++------------------ master/master.h | 5 +++-- todo.txt | 1 - 5 files changed, 18 insertions(+), 24 deletions(-) diff --git a/master/domain.h b/master/domain.h index bc150401..41df145f 100644 --- a/master/domain.h +++ b/master/domain.h @@ -44,6 +44,7 @@ ec_field_reg_t; struct ec_domain { + struct list_head list; /**< Listenkopf */ ec_master_t *master; /**< EtherCAT-Master, zu der die Domäne gehört. */ unsigned char *data; /**< Prozessdaten */ diff --git a/master/globals.h b/master/globals.h index 71854667..8627041f 100644 --- a/master/globals.h +++ b/master/globals.h @@ -23,14 +23,11 @@ #define EC_SYNC_SIZE 8 /**< Größe einer Sync-Manager-Konfigurationsseite */ #define EC_FMMU_SIZE 16 /**< Größe einer FMMU-Konfigurationsseite */ #define EC_MAX_FMMUS 16 /**< Maximale Anzahl FMMUs pro Slave */ - #define EC_MAX_DATA_SIZE (EC_MAX_FRAME_SIZE \ - EC_FRAME_HEADER_SIZE \ - EC_COMMAND_HEADER_SIZE \ - EC_COMMAND_FOOTER_SIZE) /**< Maximale Datengröße */ -#define EC_MASTER_MAX_DOMAINS 10 /**< Maximale Anzahl Domänen eines Masters */ - #ifndef NULL #define NULL ((void *) 0) /**< NULL-Define, falls noch nicht definiert. */ #endif diff --git a/master/master.c b/master/master.c index bb23c752..9ea7f6a3 100644 --- a/master/master.c +++ b/master/master.c @@ -35,12 +35,13 @@ void ec_master_init(ec_master_t *master /**< EtherCAT-Master */) master->slave_count = 0; master->device_registered = 0; master->command_index = 0x00; - master->domain_count = 0; master->debug_level = 0; master->bus_time = 0; master->frames_lost = 0; master->frames_delayed = 0; master->t_last_cyclic_output = 0; + + INIT_LIST_HEAD(&master->domains); } /*****************************************************************************/ @@ -71,15 +72,16 @@ void ec_master_reset(ec_master_t *master /**< Zeiger auf den zurückzusetzenden Master */ ) { - unsigned int i; + ec_domain_t *domain, *next; ec_master_clear_slaves(master); - for (i = 0; i < master->domain_count; i++) { - ec_domain_clear(master->domains[i]); - kfree(master->domains[i]); + // Domain-Liste leeren + list_for_each_entry_safe(domain, next, &master->domains, list) { + ec_domain_clear(domain); + kfree(domain); } - master->domain_count = 0; + INIT_LIST_HEAD(&master->domains); master->command_index = 0; master->debug_level = 0; @@ -418,19 +420,14 @@ ec_domain_t *EtherCAT_rt_master_register_domain(ec_master_t *master, { ec_domain_t *domain; - if (master->domain_count >= EC_MASTER_MAX_DOMAINS) { - EC_ERR("Maximum number of domains reached!\n"); - return NULL; - } - if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) { EC_ERR("Error allocating domain memory!\n"); return NULL; } ec_domain_init(domain, master, mode, timeout_us); - master->domains[master->domain_count] = domain; - master->domain_count++; + + list_add_tail(&domain->list, &master->domains); return domain; } @@ -462,16 +459,15 @@ int EtherCAT_rt_master_activate(ec_master_t *master /**< EtherCAT-Master */) // Domains erstellen domain_offset = 0; - for (i = 0; i < master->domain_count; i++) { - domain = master->domains[i]; + list_for_each_entry(domain, &master->domains, list) { if (ec_domain_alloc(domain, domain_offset)) { - EC_ERR("Failed to allocate domain %i!\n", i); + EC_ERR("Failed to allocate domain %X!\n", (u32) domain); return -1; } frame_count = domain->data_size / EC_MAX_FRAME_SIZE + 1; if (!domain->data_size) frame_count = 0; - EC_INFO("Domain %i - Allocated %i bytes (%i Frame(s))\n", i, - domain->data_size, frame_count); + EC_INFO("Domain %X - Allocated %i bytes (%i Frame(s))\n", + (u32) domain, domain->data_size, frame_count); domain_offset += domain->data_size; } diff --git a/master/master.h b/master/master.h index 77baf4a3..de673d6a 100644 --- a/master/master.h +++ b/master/master.h @@ -11,6 +11,8 @@ #ifndef _EC_MASTER_H_ #define _EC_MASTER_H_ +#include <linux/list.h> + #include "device.h" #include "slave.h" #include "frame.h" @@ -32,8 +34,7 @@ struct ec_master ec_device_t device; /**< EtherCAT-Gerät */ unsigned int device_registered; /**< Ein Geraet hat sich registriert. */ uint8_t command_index; /**< Aktueller Kommando-Index */ - ec_domain_t *domains[EC_MASTER_MAX_DOMAINS]; /**< Prozessdatendomänen */ - unsigned int domain_count; /**< Anzahl Domänen */ + struct list_head domains; /**< Liste der Prozessdatendomänen */ int debug_level; /**< Debug-Level im Master-Code */ unsigned int bus_time; /**< Letzte Bus-Zeit in Mikrosekunden */ unsigned int frames_lost; /**< Anzahl verlorener Frames */ diff --git a/todo.txt b/todo.txt index 03e44437..69a5fad1 100644 --- a/todo.txt +++ b/todo.txt @@ -3,7 +3,6 @@ TODO-Liste EtherCAT-Treiber $Id$ -- Domains in Listen - Asynchroner Betrieb - Typeninformation aus Master entfernen? - Ethernet over EtherCAT (EoE) -- GitLab