diff --git a/master/canopen.c b/master/canopen.c index 3b45300652184ac84eb9e2266c7ef2b98343751f..6a7c27f284e8dfceb52d070a1b831a4e2540cc6a 100644 --- a/master/canopen.c +++ b/master/canopen.c @@ -115,7 +115,7 @@ int EtherCAT_rt_canopen_sdo_write(ec_slave_t *slave, /**< EtherCAT-Slave */ /*****************************************************************************/ /** - Schreibt ein CANopen-SDO (service data object). + Liest ein CANopen-SDO (service data object). */ int EtherCAT_rt_canopen_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */ @@ -202,6 +202,14 @@ int EtherCAT_rt_canopen_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */ /*****************************************************************************/ +/** + Schweibt ein CANopen-SDO (Variante mit Angabe des Masters und der Adresse). + + Siehe EtherCAT_rt_canopen_sdo_write() + + \return 0 wenn alles ok, < 0 bei Fehler + */ + int EtherCAT_rt_canopen_sdo_addr_write(ec_master_t *master, /**< EtherCAT-Master */ const char *addr, @@ -223,6 +231,14 @@ int EtherCAT_rt_canopen_sdo_addr_write(ec_master_t *master, /*****************************************************************************/ +/** + Liest ein CANopen-SDO (Variante mit Angabe des Masters und der Adresse). + + Siehe EtherCAT_rt_canopen_sdo_read() + + \return 0 wenn alles ok, < 0 bei Fehler + */ + int EtherCAT_rt_canopen_sdo_addr_read(ec_master_t *master, /**< EtherCAT-Slave */ const char *addr, diff --git a/master/device.c b/master/device.c index b45958e5cbb538e72e9e4fd98727e8543edd0c98..7018dd126932b5734907d8c5c1c7151a2192bc9e 100644 --- a/master/device.c +++ b/master/device.c @@ -21,6 +21,8 @@ /** EtherCAT-Geräte-Konstuktor. + + \return 0 wenn alles ok, < 0 bei Fehler (zu wenig Speicher) */ int ec_device_init(ec_device_t *device, /**< EtherCAT-Gerät */ @@ -52,7 +54,7 @@ int ec_device_init(ec_device_t *device, /**< EtherCAT-Ger EtherCAT-Geräte-Destuktor. Gibt den dynamisch allozierten Speicher des - EtherCAT-Gerätes (die beiden Socket-Buffer) wieder frei. + EtherCAT-Gerätes (den Sende-Socket-Buffer) wieder frei. */ void ec_device_clear(ec_device_t *device /**< EtherCAT-Gerät */) @@ -84,11 +86,6 @@ int ec_device_open(ec_device_t *device /**< EtherCAT-Ger { unsigned int i; - if (!device) { - EC_ERR("Trying to open a NULL device!\n"); - return -1; - } - if (!device->dev) { EC_ERR("No net_device to open!\n"); return -1; @@ -96,16 +93,16 @@ int ec_device_open(ec_device_t *device /**< EtherCAT-Ger if (device->open) { EC_WARN("Device already opened!\n"); + return 0; } - else { - // Device could have received frames before - for (i = 0; i < 4; i++) ec_device_call_isr(device); - // Reset old device state - device->state = EC_DEVICE_STATE_READY; + // Device could have received frames before + for (i = 0; i < 4; i++) ec_device_call_isr(device); - if (device->dev->open(device->dev) == 0) device->open = 1; - } + // Reset old device state + device->state = EC_DEVICE_STATE_READY; + + if (device->dev->open(device->dev) == 0) device->open = 1; return device->open ? 0 : -1; } @@ -115,8 +112,8 @@ int ec_device_open(ec_device_t *device /**< EtherCAT-Ger /** Führt die stop()-Funktion des net_devices aus. - \return 0 bei Erfolg, < 0: Kein Gerät zum Schliessen oder - Schliessen fehlgeschlagen. + \return 0 bei Erfolg, < 0: Kein Gerät zum Schließen oder + Schließen fehlgeschlagen. */ int ec_device_close(ec_device_t *device /**< EtherCAT-Gerät */) @@ -146,25 +143,21 @@ int ec_device_close(ec_device_t *device /**< EtherCAT-Ger uint8_t *ec_device_prepare(ec_device_t *device /**< EtherCAT-Gerät */) { - // Clear transmit socket buffer and reserve space for Ethernet-II header - skb_trim(device->tx_skb, 0); - skb_reserve(device->tx_skb, ETH_HLEN); + skb_trim(device->tx_skb, 0); // Auf Länge 0 abschneiden + skb_reserve(device->tx_skb, ETH_HLEN); // Reserve für Ethernet-II-Header - // Erstmal Speicher für maximal langen Frame reservieren + // Vorerst Speicher für maximal langen Frame reservieren return skb_put(device->tx_skb, EC_MAX_FRAME_SIZE); } /*****************************************************************************/ /** - Sendet einen Rahmen über das EtherCAT-Gerät. - - Kopiert die zu sendenden Daten in den statischen Socket- - Buffer, fügt den Ethernat-II-Header hinzu und ruft die - start_xmit()-Funktion der Netzwerkkarte auf. + Sendet den Inhalt des Socket-Buffers. - \return 0 bei Erfolg, < 0: Vorheriger Rahmen noch - nicht empfangen, oder kein Speicher mehr vorhanden + Schneidet den Inhalt des Socket-Buffers auf die (nun bekannte) Größe zu, + fügt den Ethernet-II-Header an und ruft die start_xmit()-Funktion der + Netzwerkkarte auf. */ void ec_device_send(ec_device_t *device, /**< EtherCAT-Gerät */ @@ -173,7 +166,7 @@ void ec_device_send(ec_device_t *device, /**< EtherCAT-Ger { struct ethhdr *eth; - // Framegroesse auf (jetzt bekannte) Laenge abschneiden + // Framegröße auf (jetzt bekannte) Länge abschneiden skb_trim(device->tx_skb, length); // Ethernet-II-Header hinzufuegen @@ -213,7 +206,7 @@ unsigned int ec_device_received(const ec_device_t *device) /** Gibt die empfangenen Daten zurück. - \return Adresse auf empfangene Daten. + \return Zeiger auf empfangene Daten. */ uint8_t *ec_device_data(ec_device_t *device) @@ -269,7 +262,7 @@ void ec_device_debug(const ec_device_t *device /**< EtherCAT-Ger { EC_DBG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); ec_data_print(device->tx_skb->data + ETH_HLEN, device->tx_skb->len); - EC_DBG("------------------------------------------------\n"); + EC_DBG("--------------------------------------\n"); ec_data_print_diff(device->tx_skb->data + ETH_HLEN, device->rx_data, device->rx_data_size); EC_DBG("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); @@ -344,6 +337,8 @@ void EtherCAT_dev_state(ec_device_t *device, /**< EtherCAT-Ger /** Prüft, ob das Net-Device \a dev zum registrierten EtherCAT-Gerät gehört. + + \return 0 wenn nein, nicht-null wenn ja. */ int EtherCAT_dev_is_ec(const ec_device_t *device, /**< EtherCAT-Gerät */ @@ -355,7 +350,16 @@ int EtherCAT_dev_is_ec(const ec_device_t *device, /**< EtherCAT-Ger /*****************************************************************************/ -void EtherCAT_dev_receive(ec_device_t *device, const void *data, size_t size) +/** + Nimmt einen Empfangenen Rahmen entgegen. + + Kopiert die empfangenen Daten in den Receive-Buffer. +*/ + +void EtherCAT_dev_receive(ec_device_t *device, /**< EtherCAT-Gerät */ + const void *data, /**< Zeiger auf empfangene Daten */ + size_t size /**< Größe der empfangenen Daten */ + ) { // Copy received data to ethercat-device buffer memcpy(device->rx_data, data, size); diff --git a/master/domain.c b/master/domain.c index 5ac73f7bade2b43bbc6688f40343f5eed3388a74..c20a8c1064d1bebf9787bef498b9742643387892 100644 --- a/master/domain.c +++ b/master/domain.c @@ -62,7 +62,7 @@ void ec_domain_clear(ec_domain_t *domain /**< Dom /** Registriert ein Feld in einer Domäne. - \returns 0 bei Erfolg, < 0 bei Fehler + \return 0 bei Erfolg, < 0 bei Fehler */ int ec_domain_reg_field(ec_domain_t *domain, /**< Domäne */ @@ -99,7 +99,12 @@ int ec_domain_reg_field(ec_domain_t *domain, /**< Dom /*****************************************************************************/ /** - \returns 0 bei Erfolg, < 0 bei Fehler + Erzeugt eine Domäne. + + Reserviert den Speicher einer Domäne, berechnet die logischen Adressen der + FMMUs und setzt die Prozessdatenzeiger der registrierten Felder. + + \return 0 bei Erfolg, < 0 bei Fehler */ int ec_domain_alloc(ec_domain_t *domain, /**< Domäne */ @@ -182,7 +187,7 @@ int ec_domain_alloc(ec_domain_t *domain, /**< Dom *****************************************************************************/ /** - Registriert einer Domäne ein Datenfeld hinzu. + Registriert ein Datenfeld innerhalb einer Domäne. \return Zeiger auf den Slave bei Erfolg, sonst NULL */ @@ -258,7 +263,7 @@ ec_slave_t *EtherCAT_rt_register_slave_field( /*****************************************************************************/ /** - Sendet und empfängt Prozessdaten der angegebenen Domäne + Sendet und empfängt Prozessdaten der angegebenen Domäne. \return 0 bei Erfolg, sonst < 0 */ diff --git a/master/frame.c b/master/frame.c index 001988f4186fc4b69f22b5301df81fe51312525e..7d1a4baaac25358817ac64323202a09dfb7025ae 100644 --- a/master/frame.c +++ b/master/frame.c @@ -317,7 +317,7 @@ int ec_frame_send(ec_frame_t *frame /**< Rahmen zum Senden */) /*****************************************************************************/ /** - Empfängt einen gesendeten Rahmen. + Wertet empfangene Daten zu einem Rahmen aus. \return 0 bei Erfolg, sonst < 0 */ diff --git a/master/master.c b/master/master.c index 5461a699ffe2f1d1c410884b50483445ace6ca27..63d816e11edc5036912e05b5bdb76a95f078bbf2 100644 --- a/master/master.c +++ b/master/master.c @@ -112,8 +112,8 @@ void ec_master_clear_slaves(ec_master_t *master /**< EtherCAT-Master */) /** Öffnet das EtherCAT-Geraet des Masters. - \return 0, wenn alles o.k., < 0, wenn kein Gerät registriert wurde oder - es nicht geoeffnet werden konnte. + \return 0 wenn alles ok, < 0 wenn kein Gerät registriert wurde oder + es nicht geoeffnet werden konnte. */ int ec_master_open(ec_master_t *master /**< Der EtherCAT-Master */) @@ -151,9 +151,12 @@ void ec_master_close(ec_master_t *master /**< EtherCAT-Master */) /*****************************************************************************/ /** - Durchsucht den Bus nach Slaves. + Durchsucht den EtherCAT-Bus nach Slaves. - @return 0 bei Erfolg, sonst < 0 + Erstellt ein Array mit allen Slave-Informationen die für den + weiteren Betrieb notwendig sind. + + \return 0 bei Erfolg, sonst < 0 */ int ec_scan_for_slaves(ec_master_t *master /**< EtherCAT-Master */) @@ -234,7 +237,9 @@ int ec_scan_for_slaves(ec_master_t *master /**< EtherCAT-Master */) /*****************************************************************************/ /** - Gibt von Zeit zu Zeit die Anzahl verlorener Frames aus. + Gibt die Anzahl verlorener Frames aus. + + Die Ausgabe erfolgt gesammelt höchstens einmal pro Sekunde. */ void ec_output_lost_frames(ec_master_t *master /**< EtherCAT-Master */) @@ -426,7 +431,7 @@ ec_domain_t *EtherCAT_rt_master_register_domain(ec_master_t *master, Konfiguriert alle Slaves und setzt den Operational-Zustand. Führt die komplette Konfiguration und Aktivierunge aller registrierten - Slaves durch. Setzt Sync-Manager und FMMU's, führt die entsprechenden + Slaves durch. Setzt Sync-Manager und FMMUs, führt die entsprechenden Zustandsübergänge durch, bis der Slave betriebsbereit ist. \return 0 bei Erfolg, sonst < 0 @@ -480,7 +485,7 @@ int EtherCAT_rt_master_activate(ec_master_t *master /**< EtherCAT-Master */) // Check and reset CRC fault counters ec_slave_check_crc(slave); - // Resetting FMMU's + // Resetting FMMUs if (slave->base_fmmu_count) { memset(data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count); ec_frame_init_npwr(&frame, master, slave->station_address, 0x0600, diff --git a/master/module.c b/master/module.c index a21508b8e15e2dd0a7940c111e77d4da0b78281a..9c14df4e7f46d72f603cbd470559b469a91df1ac 100644 --- a/master/module.c +++ b/master/module.c @@ -63,8 +63,8 @@ MODULE_PARM_DESC(ec_master_count, "Number of EtherCAT master to initialize."); Initialisiert soviele Master, wie im Parameter ec_master_count angegeben wurde (Default ist 1). - @returns 0, wenn alles o.k., -1 bei ungueltiger Anzahl Master - oder zu wenig Speicher. + \return 0 wenn alles ok, < 0 bei ungültiger Anzahl Master + oder zu wenig Speicher. */ int __init ec_init_module(void) @@ -140,23 +140,22 @@ void __exit ec_cleanup_module(void) /** Registeriert das EtherCAT-Geraet fuer einen EtherCAT-Master. - @param master_index Index des EtherCAT-Masters - @param dev Das net_device des EtherCAT-Geraetes - @param isr Funktionszeiger auf die Interrupt-Service-Routine - @param module Zeiger auf das Modul (fuer try_module_lock()) - - @return 0, wenn alles o.k., - < 0, wenn bereits ein Geraet registriert oder das Geraet nicht - geoeffnet werden konnte. + \return 0 wenn alles ok, oder < 0 wenn bereits ein Gerät registriert + oder das Geraet nicht geöffnet werden konnte. */ ec_device_t *EtherCAT_dev_register(unsigned int master_index, - struct net_device *dev, + /**< Index des EtherCAT-Masters */ + struct net_device *net_dev, + /**< net_device des EtherCAT-Gerätes */ irqreturn_t (*isr)(int, void *, struct pt_regs *), - struct module *module) + /**< Interrupt-Service-Routine */ + struct module *module + /**< Zeiger auf das Modul */ + ) { - ec_device_t *ecd; + ec_device_t *device; ec_master_t *master; if (master_index >= ec_master_count) { @@ -164,7 +163,7 @@ ec_device_t *EtherCAT_dev_register(unsigned int master_index, return NULL; } - if (!dev) { + if (!net_dev) { EC_WARN("Device is NULL!\n"); return NULL; } @@ -176,30 +175,31 @@ ec_device_t *EtherCAT_dev_register(unsigned int master_index, return NULL; } - ecd = &master->device; + device = &master->device; - if (ec_device_init(ecd, master) < 0) return NULL; + if (ec_device_init(device, master) < 0) return NULL; - ecd->dev = dev; - ecd->tx_skb->dev = dev; - ecd->isr = isr; - ecd->module = module; + device->dev = net_dev; + device->tx_skb->dev = net_dev; + device->isr = isr; + device->module = module; master->device_registered = 1; - return ecd; + return device; } /*****************************************************************************/ /** - Entfernt das EtherCAT-Geraet eines EtherCAT-Masters. - - @param master_index Der Index des EtherCAT-Masters - @param ecd Das EtherCAT-Geraet + Hebt die Registrierung eines EtherCAT-Gerätes auf. */ -void EtherCAT_dev_unregister(unsigned int master_index, ec_device_t *ecd) +void EtherCAT_dev_unregister(unsigned int master_index, + /**< Index des EtherCAT-Masters */ + ec_device_t *device + /**< EtherCAT-Geraet */ + ) { ec_master_t *master; @@ -210,13 +210,13 @@ void EtherCAT_dev_unregister(unsigned int master_index, ec_device_t *ecd) master = ec_masters + master_index; - if (!master->device_registered || &master->device != ecd) { + if (!master->device_registered || &master->device != device) { EC_WARN("Unable to unregister device!\n"); return; } master->device_registered = 0; - ec_device_clear(ecd); + ec_device_clear(device); } /****************************************************************************** @@ -230,11 +230,12 @@ void EtherCAT_dev_unregister(unsigned int master_index, ec_device_t *ecd) Gibt einen Zeiger auf den reservierten EtherCAT-Master zurueck. - @param index Index des gewuenschten Masters - @returns Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig. + \return Zeiger auf EtherCAT-Master oder NULL, wenn Parameter ungueltig. */ -ec_master_t *EtherCAT_rt_request_master(unsigned int index) +ec_master_t *EtherCAT_rt_request_master(unsigned int index + /**< EtherCAT-Master-Index */ + ) { ec_master_t *master; @@ -293,11 +294,9 @@ ec_master_t *EtherCAT_rt_request_master(unsigned int index) /** Gibt einen zuvor angeforderten EtherCAT-Master wieder frei. - - @param master Zeiger auf den freizugebenden EtherCAT-Master. */ -void EtherCAT_rt_release_master(ec_master_t *master) +void EtherCAT_rt_release_master(ec_master_t *master /**< EtherCAT-Masdter */) { unsigned int i, found; diff --git a/master/slave.c b/master/slave.c index 15201bc329341c1ac47aa714065b30ba926e064a..e4e97da844bc5df2c3f15d89898e707b365654e8 100644 --- a/master/slave.c +++ b/master/slave.c @@ -58,6 +58,8 @@ void ec_slave_clear(ec_slave_t *slave /**< EtherCAT-Slave */) /** Liest alle benötigten Informationen aus einem Slave. + + \return 0 wenn alles ok, < 0 bei Fehler. */ int ec_slave_fetch(ec_slave_t *slave /**< EtherCAT-Slave */) @@ -186,7 +188,7 @@ int ec_slave_sii_read(ec_slave_t *slave, /** Bestätigt einen Fehler beim Zustandswechsel. - FIXME Funktioniert noch nicht... + \todo Funktioniert noch nicht... */ void ec_slave_state_ack(ec_slave_t *slave, @@ -342,6 +344,8 @@ int ec_slave_set_fmmu(ec_slave_t *slave, /**< EtherCAT-Slave */ if (slave->fmmus[i].domain == domain && slave->fmmus[i].sync == sync) return 0; + // Neue FMMU reservieren... + if (slave->fmmu_count >= slave->base_fmmu_count) { EC_ERR("Slave %i FMMU limit reached!\n", slave->ring_position); return -1; diff --git a/master/types.h b/master/types.h index 83702f420465639a1a6002d99a02df24a44e82d3..f266fdd41e9a8a2eabf90d73c7d3d176496bcd6a 100644 --- a/master/types.h +++ b/master/types.h @@ -55,7 +55,7 @@ ec_sync_t; Diese Beschreibung dient zur Konfiguration einer bestimmten Slave-Art. Sie enthält die Konfigurationsdaten für die - Slave-internen Sync-Manager und FMMU's. + Slave-internen Sync-Manager und FMMUs. */ typedef struct ec_slave_type diff --git a/rt/msr_module.c b/rt/msr_module.c index c65b5b88537961df6e04a0c3ec672985227b286b..f025703a6161dd25175be286a1f4139628e4d76b 100644 --- a/rt/msr_module.c +++ b/rt/msr_module.c @@ -132,7 +132,7 @@ int __init init_rt_module(void) goto out_msr_cleanup; } - EtherCAT_rt_master_print(master); + //EtherCAT_rt_master_print(master); printk(KERN_INFO "Registering domain...\n");