diff -r 60435f959e5c -r d75ef6b46e33 drivers/ec_module.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/ec_module.c Fri Dec 02 15:35:21 2005 +0000 @@ -0,0 +1,142 @@ +/****************************************************************************** + * + * ec_module.c + * + * EtherCAT-Master-Treiber + * + * Autoren: Wilhelm Hagemeister, Florian Pose + * + * $Id$ + * + * (C) Copyright IgH 2005 + * Ingenieurgemeinschaft IgH + * Heinz-Bäcker Str. 34 + * D-45356 Essen + * Tel.: +49 201/61 99 31 + * Fax.: +49 201/61 98 36 + * E-mail: sp@igh-essen.com + * + ******************************************************************************/ + +#include +#include +#include + +#include "ec_module.h" + +/******************************************************************************/ + +#define SUBVERSION_ID "$Id$" + +int ecat_master_count = 1; +EtherCAT_master_t *ecat_masters = NULL; + +/******************************************************************************/ + +MODULE_AUTHOR ("Wilhelm Hagemeister , Florian Pose "); +MODULE_DESCRIPTION ("EtherCAT master driver module"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(SUBVERSION_ID); + +module_param(ecat_master_count, int, 1); +MODULE_PARM_DESC(ecat_master_count, "Number of EtherCAT master to initialize."); + +module_init(ecat_init_module); +module_exit(ecat_cleanup_module); + +EXPORT_SYMBOL(EtherCAT_master); + +/******************************************************************************/ + +/** + Init-Funktion des EtherCAT-Master-Treibermodules + + Initialisiert soviele Master, wie im Parameter ecat_master_count + angegeben wurde (Default ist 1). + + @returns 0, wenn alles o.k., -1 bei ungueltiger Anzahl Master + oder zu wenig Speicher. +*/ + +int __init ecat_init_module(void) +{ + unsigned int i; + + printk(KERN_ERR "EtherCAT: Master driver %s\n", SUBVERSION_ID); + + if (ecat_master_count < 1) + { + printk(KERN_ERR "EtherCAT: Error - Illegal ecat_master_count: %i\n", + ecat_master_count); + return -1; + } + + printk(KERN_ERR "EtherCAT: Initializing %i EtherCAT master(s)...\n", + ecat_master_count); + + if ((ecat_masters = (EtherCAT_master_t *) kmalloc(sizeof(EtherCAT_master_t) + * ecat_master_count, + GFP_KERNEL)) == NULL) + { + printk(KERN_ERR "EtherCAT: Could not allocate memory for EtherCAT master(s)!\n"); + return -1; + } + + for (i = 0; i < ecat_master_count; i++) + { + EtherCAT_master_init(&ecat_masters[i]); + } + + printk(KERN_ERR "EtherCAT: Master driver initialized.\n"); + + return 0; +} + +/******************************************************************************/ + +/** + Cleanup-Funktion des EtherCAT-Master-Treibermoduls + + Entfernt alle Master-Instanzen. +*/ + +void __exit ecat_cleanup_module(void) +{ + unsigned int i; + + printk(KERN_ERR "EtherCAT: Cleaning up master driver...\n"); + + if (ecat_masters) + { + for (i = 0; i < ecat_master_count; i++) + { + EtherCAT_master_clear(&ecat_masters[i]); + } + + kfree(ecat_masters); + } + + printk(KERN_ERR "EtherCAT: Master driver cleaned up.\n"); +} + +/******************************************************************************/ + +/** + Gibt einen Zeiger auf einen bestimmten EtherCAT-Master zurueck. + + @param index Index des gewuenschten Masters + @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig. +*/ + +EtherCAT_master_t *EtherCAT_master(int index) +{ + if (index < 0 || index >= ecat_master_count) + { + printk(KERN_ERR "EtherCAT: Master %i does not exist!\n", index); + return NULL; + } + + return &ecat_masters[index]; +} + +/******************************************************************************/