diff --git a/include/EtherCAT_rt.h b/include/EtherCAT_rt.h index 1fe72dc1a0b1f794846ba7e43d7edc59e9260bb3..e1d6005e89902f603ad67280c96a2a19e6f6d9f0 100644 --- a/include/EtherCAT_rt.h +++ b/include/EtherCAT_rt.h @@ -20,6 +20,9 @@ typedef struct ec_slave_type ec_slave_type_t; struct ec_slave; typedef struct ec_slave ec_slave_t; +struct ec_slave_init; +typedef struct ec_slave_init ec_slave_init_t; + /*****************************************************************************/ ec_master_t *EtherCAT_rt_request_master(unsigned int master_index); @@ -32,6 +35,10 @@ ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master, const char *product_name, int domain); +int EtherCAT_rt_register_slave_list(ec_master_t *master, + const ec_slave_init_t *slaves, + unsigned int count); + int EtherCAT_rt_activate_slaves(ec_master_t *master); int EtherCAT_rt_deactivate_slaves(ec_master_t *master); @@ -84,4 +91,24 @@ struct ec_slave /*****************************************************************************/ +/** + Beschreibung eines EtherCAT-Slave-Typs. + + Diese Beschreibung dient zur Konfiguration einer bestimmten + Slave-Art. Sie enthält die Konfigurationsdaten für die + Slave-internen Sync-Manager und FMMU's. +*/ + +struct ec_slave_init +{ + ec_slave_t **slave_ptr; /**< Zeiger auf den Slave-Zeiger, der mit der + Adresse des Slaves belegt werden soll. */ + unsigned int bus_index; /**< Bus-Index des zu registrierenden Slaves */ + const char *vendor_name; /**< Name des Herstellers */ + const char *product_name; /**< Name des Slaves-Typs */ + unsigned int domain; /**< Domäne, in der registriert werden soll. */ +}; + +/*****************************************************************************/ + #endif diff --git a/master/master.c b/master/master.c index 69601957be90e46e4372d878debbcefbc7cc6ac0..c3ec67111cda40681c00d56ea282f52723bdb60b 100644 --- a/master/master.c +++ b/master/master.c @@ -615,7 +615,7 @@ int ec_state_change(ec_master_t *master, ec_slave_t *slave, } if (unlikely(cmd.working_counter != 1)) { - printk(KERN_ERR "EtherCAT: Could not set state %02X - Device %i (%s %s)" + printk(KERN_ERR "EtherCAT: Could not set state %02X - Slave %i (%s %s)" " did not respond!\n", state_and_ack, slave->ring_position * (-1), slave->type->vendor_name, slave->type->product_name); return -1; @@ -735,7 +735,7 @@ void ec_output_lost_frames(ec_master_t *master) @param product_name String mit dem Produktnamen @param domain Domäne, in der der Slave sein soll - @return 0 bei Erfolg, sonst < 0 + @return Zeiger auf den Slave bei Erfolg, sonst NULL */ ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master, @@ -818,6 +818,37 @@ ec_slave_t *EtherCAT_rt_register_slave(ec_master_t *master, /*****************************************************************************/ +/** + Registriert eine ganze Liste von Slaves beim Master. + + @param master Der EtherCAT-Master + @param slaves Array von Slave-Initialisierungsstrukturen + @param count Anzahl der Strukturen in "slaves" + + @return 0 bei Erfolg, sonst < 0 +*/ + +int EtherCAT_rt_register_slave_list(ec_master_t *master, + const ec_slave_init_t *slaves, + unsigned int count) +{ + unsigned int i; + + for (i = 0; i < count; i++) + { + if ((*(slaves[i].slave_ptr) = + EtherCAT_rt_register_slave(master, slaves[i].bus_index, + slaves[i].vendor_name, + slaves[i].product_name, + slaves[i].domain)) == NULL) + return -1; + } + + return 0; +} + +/*****************************************************************************/ + /** Konfiguriert alle Slaves und setzt den Operational-Zustand. @@ -1046,7 +1077,7 @@ int EtherCAT_rt_deactivate_slaves(ec_master_t *master) for (i = 0; i < master->bus_slaves_count; i++) { - slave = master->bus_slaves + 1; + slave = master->bus_slaves + i; if (unlikely(ec_state_change(master, slave, EC_SLAVE_STATE_INIT) != 0)) return -1; @@ -1155,6 +1186,7 @@ void EtherCAT_rt_debug_level(ec_master_t *master, int level) /*****************************************************************************/ EXPORT_SYMBOL(EtherCAT_rt_register_slave); +EXPORT_SYMBOL(EtherCAT_rt_register_slave_list); EXPORT_SYMBOL(EtherCAT_rt_activate_slaves); EXPORT_SYMBOL(EtherCAT_rt_deactivate_slaves); EXPORT_SYMBOL(EtherCAT_rt_domain_xio); diff --git a/master/types.h b/master/types.h index fc3967fed752609972341b7b82a524758049e75b..1d01743058c62106b6d1d3faacde34bd3e4a486b 100644 --- a/master/types.h +++ b/master/types.h @@ -25,7 +25,7 @@ typedef enum { - EC_SIMPLE_SLAVE, EC_MAILBOX_SLAVE, EC_NOSYNC_SLAVE + EC_SIMPLE_SLAVE, EC_MAILBOX_SLAVE, EC_NOSYNC_SLAVE } ec_slave_features_t; @@ -41,25 +41,25 @@ ec_slave_features_t; struct ec_slave_type { - const char *vendor_name; /**< Name des Herstellers */ - const char *product_name; /**< Name des Slaves-Typs */ - const char *product_desc; /**< Genauere Beschreibung des Slave-Typs */ + const char *vendor_name; /**< Name des Herstellers */ + const char *product_name; /**< Name des Slaves-Typs */ + const char *product_desc; /**< Genauere Beschreibung des Slave-Typs */ - ec_slave_features_t features; /**< Features des Slave-Typs */ + ec_slave_features_t features; /**< Features des Slave-Typs */ - const unsigned char *sm0; /**< Konfigurationsdaten des - ersten Sync-Managers */ - const unsigned char *sm1; /**< Konfigurationsdaten des - zweiten Sync-Managers */ - const unsigned char *sm2; /**< Konfigurationsdaten des - dritten Sync-Managers */ - const unsigned char *sm3; /**< Konfigurationsdaten des - vierten Sync-Managers */ + const unsigned char *sm0; /**< Konfigurationsdaten des + ersten Sync-Managers */ + const unsigned char *sm1; /**< Konfigurationsdaten des + zweiten Sync-Managers */ + const unsigned char *sm2; /**< Konfigurationsdaten des + dritten Sync-Managers */ + const unsigned char *sm3; /**< Konfigurationsdaten des + vierten Sync-Managers */ - const unsigned char *fmmu0; /**< Konfigurationsdaten - der ersten FMMU */ + const unsigned char *fmmu0; /**< Konfigurationsdaten + der ersten FMMU */ - unsigned int process_data_size; /**< Länge der Prozessdaten in Bytes */ + unsigned int process_data_size; /**< Länge der Prozessdaten in Bytes */ }; /*****************************************************************************/ @@ -73,9 +73,9 @@ struct ec_slave_type typedef struct slave_ident { - unsigned int vendor_id; /**< Hersteller-Code */ - unsigned int product_code; /**< Herstellerspezifischer Produktcode */ - const ec_slave_type_t *type; /**< Zeiger auf den entsprechenden Slave-Typ */ + unsigned int vendor_id; /**< Hersteller-Code */ + unsigned int product_code; /**< Herstellerspezifischer Produktcode */ + const ec_slave_type_t *type; /**< Zeiger auf den entsprechenden Typ */ } ec_slave_ident_t; diff --git a/mini/mini.c b/mini/mini.c index bac0b658a30c978b9606a65767db490ef3f287ba..8a0165a688ba450d3ef98ab368d32cffc384faf7 100644 --- a/mini/mini.c +++ b/mini/mini.c @@ -12,8 +12,8 @@ #include <linux/delay.h> #include <linux/timer.h> -#include "../include/EtherCAT_rt.h" -#include "../include/EtherCAT_si.h" +#include "../include/EtherCAT_rt.h" // Echtzeitschnittstelle +#include "../include/EtherCAT_si.h" // Slave-Interface-Makros /*****************************************************************************/ @@ -26,15 +26,13 @@ int dig1; struct timer_list timer; unsigned long last_start_jiffies; -/*****************************************************************************/ +ec_slave_init_t slaves[] = { + // Zeiger, Index, Herstellername, Produktname, Domäne + { &s_out, 9, "Beckhoff", "EL2004", 1 }, + { &s_in, 1, "Beckhoff", "EL3102", 1 } +}; -int __init check_slaves(void) -{ - s_in = EtherCAT_rt_register_slave(master, 1, "Beckhoff", "EL3102", 1); - s_out = EtherCAT_rt_register_slave(master, 9, "Beckhoff", "EL2004", 1); - - return s_in && s_out; -} +#define SLAVE_COUNT (sizeof(slaves) / sizeof(ec_slave_init_t)) /*****************************************************************************/ @@ -69,14 +67,16 @@ int __init init_mini_module(void) goto out_return; } - if (!check_slaves()) { + //EtherCAT_rt_debug_level(master, 2); + + if (EtherCAT_rt_register_slave_list(master, slaves, SLAVE_COUNT)) { printk(KERN_ERR "Could not register slaves!\n"); goto out_release_master; } printk("Activating all EtherCAT slaves.\n"); - if (EtherCAT_rt_activate_slaves(master) != 0) { + if (EtherCAT_rt_activate_slaves(master)) { printk(KERN_ERR "EtherCAT: Could not activate slaves!\n"); goto out_release_master; } diff --git a/rt/msr_module.c b/rt/msr_module.c index 229a61a39cce1ecaaa2ff29acf8d6d44c931c786..e31e62d3dee068852c747fb2359d5153821ca909 100644 --- a/rt/msr_module.c +++ b/rt/msr_module.c @@ -57,17 +57,14 @@ ec_slave_t *s_in1, *s_out1, *s_out2, *s_out3; double value; int dig1; -/*****************************************************************************/ - -static int register_slaves(void) -{ - s_in1 = EtherCAT_rt_register_slave(master, 1, "Beckhoff", "EL3102", 0); - s_out1 = EtherCAT_rt_register_slave(master, 8, "Beckhoff", "EL2004", 0); - s_out2 = EtherCAT_rt_register_slave(master, 9, "Beckhoff", "EL2004", 0); - s_out3 = EtherCAT_rt_register_slave(master, 10, "Beckhoff", "EL2004", 0); +ec_slave_init_t slaves[] = { + {&s_in1, 1, "Beckhoff", "EL3102", 0}, + {&s_out1, 8, "Beckhoff", "EL2004", 0}, + {&s_out2, 9, "Beckhoff", "EL2004", 0}, + {&s_out3, 10, "Beckhoff", "EL2004", 0} +}; - return !s_in1 || !s_out1 || !s_out2 || !s_out3; -} +#define SLAVE_COUNT (sizeof(slaves) / sizeof(ec_slave_init_t)) /****************************************************************************** * @@ -194,28 +191,25 @@ int __init init_rt_module(void) goto out_msr_cleanup; } - printk("Registering EtherCAT slaves.\n"); - if (register_slaves()) { - printk(KERN_ERR "EtherCAT: Could not init slaves!\n"); + if (EtherCAT_rt_register_slave_list(master, slaves, SLAVE_COUNT)) { + printk(KERN_ERR "EtherCAT: Could not register slaves!\n"); goto out_release_master; } - printk("Activating all EtherCAT slaves.\n"); - if (EtherCAT_rt_activate_slaves(master) < 0) { - printk(KERN_ERR "EtherCAT: Could not activate slaves!\n"); - goto out_release_master; + printk(KERN_ERR "EtherCAT: Could not activate slaves!\n"); + goto out_release_master; } do_gettimeofday(&process_time); - msr_time_increment.tv_sec=0; - msr_time_increment.tv_usec=(unsigned int)(1000000/MSR_ABTASTFREQUENZ); + msr_time_increment.tv_sec = 0; + msr_time_increment.tv_usec = (unsigned int) (1000000 / MSR_ABTASTFREQUENZ); - ipipe_init_attr (&attr); - attr.name = "IPIPE-MSR-MODULE"; + ipipe_init_attr(&attr); + attr.name = "IPIPE-MSR-MODULE"; attr.priority = IPIPE_ROOT_PRIO + 1; - attr.entry = &domain_entry; - ipipe_register_domain(&this_domain,&attr); + attr.entry = &domain_entry; + ipipe_register_domain(&this_domain, &attr); return 0;