Domains als Liste verwaltet.

This commit is contained in:
Florian Pose 2006-02-28 13:07:05 +00:00
parent a84b1adce5
commit 3a98ea9715
5 changed files with 18 additions and 24 deletions

View File

@ -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 */

View File

@ -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

View File

@ -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;
}

View File

@ -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 */

View File

@ -3,7 +3,6 @@ TODO-Liste EtherCAT-Treiber
$Id$
- Domains in Listen
- Asynchroner Betrieb
- Typeninformation aus Master entfernen?
- Ethernet over EtherCAT (EoE)